@veracity/vui 4.0.0-alpha.375407.2602201014 → 4.0.0-alpha.375407.2602230852
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/button/button.d.ts.map +1 -1
- package/dist/button/button.js +48 -39
- package/dist/button/button.js.map +1 -1
- package/dist/button/theme.js +0 -106
- package/dist/button/theme.js.map +1 -1
- package/dist/notification/notificationAction.js +1 -0
- package/dist/notification/notificationAction.js.map +1 -1
- package/dist/notification/theme.js +1 -1
- package/dist/notification/theme.js.map +1 -1
- package/dist/sidemenuV2/sidemenuItemV2.d.ts.map +1 -1
- package/dist/sidemenuV2/sidemenuItemV2.js +5 -7
- package/dist/sidemenuV2/sidemenuItemV2.js.map +1 -1
- package/dist/sidemenuV2/theme.js +34 -3
- package/dist/sidemenuV2/theme.js.map +1 -1
- package/dist/table/tr.js +8 -2
- package/dist/table/tr.js.map +1 -1
- package/dist/theme/components.d.ts +31 -1
- package/dist/theme/defaultTheme.d.ts +31 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.d.ts","names":[],"sources":["../../src/button/button.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"button.d.ts","names":[],"sources":["../../src/button/button.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgFa,UAAA,qBAAU,eAAA,WAYtB,kBAAA,CAZsB,YAAA,EAAA,cAAA,GAAA,oBAAA,GAAA,WAAA,GAAA,cAAA,GAAA,gBAAA,GAAA,iBAAA,GAAA,eAAA,GAAA,gBAAA,GAAA,mBAAA,GAAA,qBAAA,GAAA,sBAAA,GAAA,oBAAA,GAAA,gBAAA,GAAA,mBAAA,GAAA,qBAAA,GAAA,sBAAA,GAAA,oBAAA,GAAA,gBAAA,GAAA,iBAAA,GAAA,YAAA,GAAA,iBAAA,GAAA,iBAAA,GAAA,iBAAA,GAAA,YAAA,GAAA,YAAA,GAAA,mBAAA,GAAA,mBAAA,GAAA,gBAAA,GAAA,gBAAA,GAAA,SAAA,GAAA,cAAA,GAAA,YAAA,GAAA,cAAA,GAAA,eAAA,GAAA,YAAA,GAAA,eAAA,GAAA,iBAAA,GAAA,mBAAA,GAAA,iBAAA,GAAA,aAAA,GAAA,aAAA,GAAA,eAAA,GAAA,cAAA,GAAA,kBAAA,GAAA,SAAA,GAAA,gBAAA,GAAA,cAAA,GAAA,UAAA,GAAA,QAAA,GAAA,QAAA,GAAA,QAAA,GAAA,cAAA,GAAA,WAAA,GAAA,eAAA,GAAA,YAAA,GAAA,iBAAA,GAAA,oBAAA,GAAA,iBAAA,GAAA,wBAAA,GAAA,qBAAA,GAAA,sBAAA,GAAA,aAAA,GAAA,eAAA,GAAA,WAAA,GAAA,kBAAA,GAAA,WAAA,GAAA,eAAA,GAAA,gBAAA,GAAA,UAAA,GAAA,cAAA,GAAA,aAAA,GAAA,cAAA,GAAA,cAAA,GAAA,aAAA,GAAA,WAAA,GAAA,QAAA,GAAA,UAAA,GAAA,WAAA,GAAA,SAAA,GAAA,eAAA,GAAA,uBAAA,GAAA,cAAA,GAAA,aAAA,GAAA,UAAA,GAAA,WAAA,GAAA,aAAA,GAAA,cAAA,GAAA,aAAA,GAAA,cAAA,GAAA,WAAA,GAAA,cAAA,GAAA,gBAAA,GAAA,iBAAA,GAAA,eAAA,GAAA,YAAA,GAAA,YAAA,GAAA,YAAA,GAAA,eAAA,GAAA,iBAAA,GAAA,kBAAA,GAAA,gBAAA,GAAA,aAAA,GAAA,aAAA,GAAA,WAAA,GAAA,WAAA,GAAA,kBAAA,GAAA,kBAAA,GAAA,mBAAA,GAAA,gBAAA,GAAA,cAAA,GAAA,oBAAA,GAAA,eAAA,GAAA,eAAA,GAAA,WAAA,GAAA,UAAA,GAAA,UAAA,GAAA,UAAA,GAAA,WAAA,GAAA,WAAA,GAAA,eAAA,GAAA,uBAAA,GAAA,uBAAA,GAAA,6BAAA,GAAA,oBAAA,GAAA,eAAA,GAAA,aAAA,GAAA,cAAA,GAAA,eAAA,GAAA,eAAA,GAAA,UAAA,GAAA,kBAAA,GAAA,mBAAA,GAAA,cAAA,GAAA,kBAAA,GAAA,kBAAA,GAAA,eAAA,GAAA,iBAAA,GAAA,kBAAA,GAAA,sBAAA,GAAA,cAAA,GAAA,YAAA;;iBAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;cA4OV,MAAA,EAoNP,YAAA,WAAuB,WAAA;EAC3B,IAAA,SAAa,UAAA;EACb,IAAA,SAAa,UAAA;AAAA"}
|
package/dist/button/button.js
CHANGED
|
@@ -19,7 +19,6 @@ const DEFAULT_BOX_SHADOW = "md";
|
|
|
19
19
|
const DEFAULT_DISABLED_OPACITY = .5;
|
|
20
20
|
const BUTTON_TYPE = "button";
|
|
21
21
|
const FOCUS_RING_SIZE = 3;
|
|
22
|
-
const MENU_FOCUS_BORDER_WIDTH = 3;
|
|
23
22
|
const ContentWrapper = styled.span`
|
|
24
23
|
visibility: hidden;
|
|
25
24
|
`;
|
|
@@ -43,29 +42,6 @@ const ButtonBase = styled.buttonBox`
|
|
|
43
42
|
transition-duration: var(--vui-button-transition-duration, fast);
|
|
44
43
|
user-select: none;
|
|
45
44
|
width: fit-content;
|
|
46
|
-
|
|
47
|
-
/* Menu variant focus states - default removes focus ring
|
|
48
|
-
* Used when focusAsBorder class is NOT present (standard focus ring behavior)
|
|
49
|
-
*/
|
|
50
|
-
&.vui-button-variant-menuDark:not(.focusAsBorder):focus,
|
|
51
|
-
&.vui-button-variant-menuDark:not(.focusAsBorder):focus-visible,
|
|
52
|
-
&.vui-button-variant-menuLight:not(.focusAsBorder):focus,
|
|
53
|
-
&.vui-button-variant-menuLight:not(.focusAsBorder):focus-visible {
|
|
54
|
-
box-shadow: none;
|
|
55
|
-
outline: none;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/* Menu variant focus states - with border indicator for accessibility
|
|
59
|
-
* Used when focusAsBorder class IS present (alternative focus indication via border)
|
|
60
|
-
* Color: theme menuLight/menuDark.focusBorderBottomColor
|
|
61
|
-
*/
|
|
62
|
-
&.vui-button-variant-menuDark.focusAsBorder:focus,
|
|
63
|
-
&.vui-button-variant-menuDark.focusAsBorder:focus-visible,
|
|
64
|
-
&.vui-button-variant-menuLight.focusAsBorder:focus,
|
|
65
|
-
&.vui-button-variant-menuLight.focusAsBorder:focus-visible {
|
|
66
|
-
transition: border-bottom 0s linear;
|
|
67
|
-
border-bottom: ${MENU_FOCUS_BORDER_WIDTH}px solid var(--color-sky-blue-90); /* theme: focusBorderBottomColor */
|
|
68
|
-
}
|
|
69
45
|
`;
|
|
70
46
|
/**
|
|
71
47
|
* Extracts a numeric value from various input types (number, string, etc.)
|
|
@@ -272,17 +248,54 @@ const Button = vui((props, ref) => {
|
|
|
272
248
|
const plValue = computed.spacing.pl;
|
|
273
249
|
const prValue = computed.spacing.pr;
|
|
274
250
|
const hValue = computed.h;
|
|
275
|
-
const
|
|
276
|
-
|
|
277
|
-
|
|
251
|
+
const propsWithVars = useMemo(() => {
|
|
252
|
+
const cssVarMappings = {
|
|
253
|
+
base: {
|
|
254
|
+
bg: "--vui-button-bg",
|
|
255
|
+
borderColor: "--vui-button-border-color",
|
|
256
|
+
color: "--vui-button-color",
|
|
257
|
+
hoverBg: "--vui-button-hover-bg",
|
|
258
|
+
hoverBorderColor: "--vui-button-hover-border-color",
|
|
259
|
+
hoverColor: "--vui-button-hover-color",
|
|
260
|
+
activeBg: "--vui-button-active-bg",
|
|
261
|
+
activeBorderColor: "--vui-button-active-border-color",
|
|
262
|
+
activeColor: "--vui-button-active-color"
|
|
263
|
+
},
|
|
264
|
+
active: {
|
|
265
|
+
bg: "--vui-button-active-bg",
|
|
266
|
+
borderColor: "--vui-button-active-border-color",
|
|
267
|
+
color: "--vui-button-active-color",
|
|
268
|
+
hoverBg: "--vui-button-active-hover-bg",
|
|
269
|
+
hoverBorderColor: "--vui-button-active-hover-border-color",
|
|
270
|
+
hoverColor: "--vui-button-active-hover-color"
|
|
271
|
+
},
|
|
272
|
+
disabled: {
|
|
273
|
+
bg: "--vui-button-disabled-bg",
|
|
274
|
+
borderColor: "--vui-button-disabled-border-color",
|
|
275
|
+
color: "--vui-button-disabled-color",
|
|
276
|
+
opacity: "--vui-button-disabled-opacity"
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
const wrapWithVars = (props, mapping) => {
|
|
280
|
+
if (!props || Object.keys(props).length === 0) return {};
|
|
281
|
+
const result = {};
|
|
282
|
+
const wrappedKeys = new Set(Object.keys(mapping));
|
|
283
|
+
Object.entries(props).forEach(([key, value]) => {
|
|
284
|
+
if (wrappedKeys.has(key) && value !== void 0) result[key] = `var(${mapping[key]}, ${value})`;
|
|
285
|
+
else if (!wrappedKeys.has(key)) result[key] = value;
|
|
286
|
+
});
|
|
287
|
+
return result;
|
|
288
|
+
};
|
|
278
289
|
return {
|
|
279
|
-
...
|
|
280
|
-
...
|
|
281
|
-
...
|
|
282
|
-
...color !== void 0 && { color: `var(--vui-button-disabled-color, ${color})` },
|
|
283
|
-
...opacity !== void 0 && { opacity: `var(--vui-button-disabled-opacity, ${opacity})` }
|
|
290
|
+
...wrapWithVars(computed.buttonStyles, cssVarMappings.base),
|
|
291
|
+
...wrapWithVars(computed.activeProps, cssVarMappings.active),
|
|
292
|
+
...wrapWithVars(computed.disabledProps, cssVarMappings.disabled)
|
|
284
293
|
};
|
|
285
|
-
}, [
|
|
294
|
+
}, [
|
|
295
|
+
computed.buttonStyles,
|
|
296
|
+
computed.activeProps,
|
|
297
|
+
computed.disabledProps
|
|
298
|
+
]);
|
|
286
299
|
const finalProps = useMemo(() => ({
|
|
287
300
|
borderWidth: `var(--vui-button-border-width, ${borderWidth}px)`,
|
|
288
301
|
className: computed.buttonClassName,
|
|
@@ -295,9 +308,7 @@ const Button = vui((props, ref) => {
|
|
|
295
308
|
title: title || "",
|
|
296
309
|
type: BUTTON_TYPE,
|
|
297
310
|
variant: finalVariant,
|
|
298
|
-
...
|
|
299
|
-
...computed.activeProps,
|
|
300
|
-
...disabledPropsWithVars,
|
|
311
|
+
...propsWithVars,
|
|
301
312
|
...computed.aliasedProps,
|
|
302
313
|
...rest
|
|
303
314
|
}), [
|
|
@@ -305,9 +316,7 @@ const Button = vui((props, ref) => {
|
|
|
305
316
|
plValue,
|
|
306
317
|
prValue,
|
|
307
318
|
computed.buttonClassName,
|
|
308
|
-
|
|
309
|
-
computed.activeProps,
|
|
310
|
-
disabledPropsWithVars,
|
|
319
|
+
propsWithVars,
|
|
311
320
|
computed.aliasedProps,
|
|
312
321
|
hValue,
|
|
313
322
|
disabled,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.js","names":[],"sources":["../../src/button/button.tsx"],"sourcesContent":["import { Fragment, useMemo, useCallback } from 'react'\n\nimport { useButtonGroupContext } from '../buttonGroup/context'\nimport type { VuiComponent } from '../core'\nimport { styled, useStyleConfig, vui } from '../core'\nimport type { SystemProps } from '../system'\nimport { activeClassName, cs, filterUndefined, isReactText, isString } from '../utils'\nimport type { ButtonProps } from './button.types'\nimport ButtonIcon from './buttonIcon'\nimport ButtonText from './buttonText'\nimport { buttonStateMapping, loadingIconProps } from './consts'\nimport { ButtonProvider } from './context'\n\n// Types for internal use\ninterface ButtonStyleContainer {\n borderWidth?: number\n h?: number\n spaceX?: number\n disabledBg?: string\n disabledBorderColor?: string\n disabledColor?: string\n disabledOpacity?: number\n activeBg?: string\n activeBorderBg?: string\n activeColor?: string\n borderRadius?: number\n [key: string]: any\n}\n\ninterface ButtonComputedStyles {\n borderColor: string\n activeBorderColor: string\n activeColor: string\n hoverBorderColor: string\n hoverColor: string\n [key: string]: any\n}\n\ninterface SpacingProps {\n borderWidth: number\n pl: string\n pr: string\n}\n\ninterface ComputedResult {\n styles: { container?: ButtonStyleContainer; [key: string]: any }\n borderWidth: number\n h: number\n spaceX: number\n buttonStyles: ButtonComputedStyles\n spacing: SpacingProps\n disabledProps: SystemProps\n activeProps: SystemProps\n aliasedProps: SystemProps\n buttonClassName: string\n}\n\n// Constants - TODO: Move to theme tokens for better maintainability\nconst DEFAULT_BORDER_WIDTH = 1\nconst DEFAULT_BOX_SHADOW = 'md'\nconst DEFAULT_DISABLED_OPACITY = 0.5\nconst BUTTON_TYPE = 'button'\nconst FOCUS_RING_SIZE = 3\nconst MENU_FOCUS_BORDER_WIDTH = 3 // Width of focus border for menu variants\n\n// Memoized styled components\nconst ContentWrapper = styled.span`\n visibility: hidden;\n`\n\n// StateWrapper overlays the button content during state transitions (loading, success, error)\n// Positioned absolutely to avoid layout shifts and uses pointer-events: none on parent\nconst StateWrapper = styled.span`\n bottom: 0;\n display: flex;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n`\n\nexport const ButtonBase = styled.buttonBox<ButtonProps>`\n align-items: center;\n display: inline-flex;\n flex-shrink: 0;\n font-weight: var(--vui-button-font-weight, medium);\n justify-content: center;\n line-height: normal;\n overflow: hidden;\n position: relative;\n transition-duration: var(--vui-button-transition-duration, fast);\n user-select: none;\n width: fit-content;\n\n /* Menu variant focus states - default removes focus ring\n * Used when focusAsBorder class is NOT present (standard focus ring behavior)\n */\n &.vui-button-variant-menuDark:not(.focusAsBorder):focus,\n &.vui-button-variant-menuDark:not(.focusAsBorder):focus-visible,\n &.vui-button-variant-menuLight:not(.focusAsBorder):focus,\n &.vui-button-variant-menuLight:not(.focusAsBorder):focus-visible {\n box-shadow: none;\n outline: none;\n }\n\n /* Menu variant focus states - with border indicator for accessibility\n * Used when focusAsBorder class IS present (alternative focus indication via border)\n * Color: theme menuLight/menuDark.focusBorderBottomColor\n */\n &.vui-button-variant-menuDark.focusAsBorder:focus,\n &.vui-button-variant-menuDark.focusAsBorder:focus-visible,\n &.vui-button-variant-menuLight.focusAsBorder:focus,\n &.vui-button-variant-menuLight.focusAsBorder:focus-visible {\n transition: border-bottom 0s linear;\n border-bottom: ${MENU_FOCUS_BORDER_WIDTH}px solid var(--color-sky-blue-90); /* theme: focusBorderBottomColor */\n }\n`\n\n/**\n * Extracts a numeric value from various input types (number, string, etc.)\n * @param value - Value to extract number from\n * @param fallback - Default value if extraction fails\n * @returns Extracted number or fallback\n */\nconst extractNumericValue = (value: any, fallback: number = DEFAULT_BORDER_WIDTH): number => {\n if (typeof value === 'number') return value\n if (typeof value === 'string') {\n const parsed = parseInt(value, 10)\n if (!isNaN(parsed)) return parsed\n }\n return fallback\n}\n\n/**\n * Consolidated hook for computing all button styles and props.\n * Combines theme resolution, spacing, state-based styles, and className generation.\n * Reduces memoization overhead by computing all derived values in a single pass.\n *\n * @param mergedProps - Combined props from ButtonGroup context and component props\n * @param variant - Resolved variant object with theme overrides\n * @param borderWidthProp - Optional border width override from props\n * @param icon - Main icon (replaces all content when present)\n * @param iconLeft - Left icon slot\n * @param iconRight - Right icon slot\n * @param isLoading - Loading state flag\n * @param isSplit - Deprecated: Split layout mode\n * @param disabled - Disabled state flag\n * @param isActive - Active state flag\n * @param isRound - Round/pill-shaped borders flag\n * @param isElevated - Box shadow elevation flag\n * @param hasState - Whether button has a state overlay\n * @param isFullWidth - Full width layout flag\n * @param className - Additional CSS classes\n * @param variantProp - Variant name for class generation\n * @returns Computed styles, spacing, props, and className\n */\nconst useButtonComputed = (\n mergedProps: ButtonProps & SystemProps,\n variant: { variant?: string },\n borderWidthProp: any, // Keep as any due to complex BorderWidthProp type from xstyled\n icon: any,\n iconLeft: any,\n iconRight: any,\n isLoading: boolean,\n isSplit: boolean,\n disabled: boolean,\n isActive: boolean,\n isRound: boolean,\n isElevated: boolean,\n hasState: boolean,\n isFullWidth: boolean,\n className: string | undefined,\n variantProp: string | undefined,\n): ComputedResult => {\n const styles = useStyleConfig('Button', { ...mergedProps, ...variant }) || {}\n\n return useMemo(() => {\n // Theme and style resolution\n const container = styles.container || {}\n const { borderWidth = DEFAULT_BORDER_WIDTH, h = 32, spaceX = 0, ...buttonStyles } = container\n\n // Normalize button styles with fallbacks for text colors only\n const normalizedStyles = {\n ...buttonStyles,\n activeColor: buttonStyles.activeColor ?? buttonStyles.color,\n hoverColor: buttonStyles.hoverColor ?? buttonStyles.color,\n }\n\n // Spacing calculations\n // borderWidth value used for spacing calculations (affects padding adjustments)\n const border = extractNumericValue(borderWidthProp) || borderWidth || DEFAULT_BORDER_WIDTH\n const spaceXItem = spaceX - border\n const spaceXText = spaceX * 2 - border\n\n const spacing = {\n borderWidth: border, // Store borderWidth for use in finalProps\n pl: `var(--vui-button-px-start, ${icon || iconLeft || isLoading ? spaceXItem : spaceXText}px)`,\n pr: `var(--vui-button-px-end, ${icon || iconRight ? spaceXItem : spaceXText}px)`,\n }\n\n // Disabled state props with CSS variable overrides\n // Theme tokens (like landGreen.70) are resolved by styled system, then wrapped in CSS variables\n // This allows both theme resolution and CSS variable overrides to work together\n const disabledProps = disabled\n ? filterUndefined({\n 'aria-disabled': disabled,\n bg: container?.disabledBg ?? undefined,\n borderColor: container?.disabledBorderColor ?? undefined,\n color: container?.disabledColor ?? undefined,\n hoverBg: container?.disabledBg ?? normalizedStyles.bg,\n hoverBorderColor: container?.disabledBorderColor ?? normalizedStyles.borderColor,\n hoverColor: container?.disabledColor ?? normalizedStyles.color,\n activeBg: container?.disabledBg ?? normalizedStyles.bg,\n cursor: 'not-allowed',\n opacity: container?.disabledOpacity ?? DEFAULT_DISABLED_OPACITY,\n })\n : {}\n\n // Active state props - prevents hover effects when button is active\n // Active state (also called \"loading\" in VUI Next) should not be interactive\n const activeProps = isActive\n ? filterUndefined({\n bg: container?.activeBg,\n borderColor: container?.activeBorderColor,\n color: container?.activeColor,\n hoverBg: container?.activeBg,\n hoverBorderColor: container?.activeBorderColor,\n hoverColor: container?.activeColor,\n cursor: 'default',\n })\n : {}\n\n // Aliased props (computed properties)\n const aliasedProps = filterUndefined({\n borderRadius: isRound ? h / 2 : `var(--vui-button-border-radius, ${container?.borderRadius || 0}px)`,\n boxShadow: isElevated ? `var(--vui-button-box-shadow, ${DEFAULT_BOX_SHADOW})` : undefined,\n minW: icon ? 0 : `var(--vui-button-min-w, auto)`,\n pointerEvents: hasState ? 'none' : undefined,\n w: isFullWidth ? '100%' : undefined,\n })\n\n // Class name generation\n const buttonClassName = cs(\n 'vui-button',\n className,\n isActive && activeClassName,\n variantProp ? `vui-button-variant-${variantProp}` : undefined,\n )\n\n return {\n styles,\n borderWidth,\n h,\n spaceX,\n buttonStyles: normalizedStyles,\n spacing,\n disabledProps,\n activeProps,\n aliasedProps,\n buttonClassName,\n }\n }, [\n styles,\n mergedProps,\n variant,\n borderWidthProp,\n icon,\n iconLeft,\n iconRight,\n isLoading,\n isSplit,\n disabled,\n isActive,\n isRound,\n isElevated,\n hasState,\n isFullWidth,\n className,\n variantProp,\n ])\n}\n\n/**\n * Unified icon renderer for all button icon positions.\n * Converts string icon names to ButtonIcon components with appropriate margins.\n *\n * @param iconProp - Icon name string or React element\n * @param position - Icon position: 'main' (center), 'left', or 'right'\n * @param isLoading - Whether to show loading spinner (only applies to left position)\n * @returns Rendered icon or null\n */\nconst renderButtonIcon = (\n iconProp: any,\n position: 'main' | 'left' | 'right' = 'main',\n isLoading: boolean = false,\n): React.ReactElement | null => {\n // Handle loading state for left icon\n if (position === 'left' && isLoading) {\n return <ButtonIcon {...loadingIconProps} ml={0} />\n }\n\n if (!iconProp) return null\n\n // Return existing React elements as-is\n if (!isString(iconProp)) return iconProp\n\n // Apply position-specific margins for string icon names\n switch (position) {\n case 'left':\n return <ButtonIcon name={iconProp} ml={0} />\n case 'right':\n return <ButtonIcon name={iconProp} mr={0} />\n case 'main':\n default:\n return <ButtonIcon name={iconProp} />\n }\n}\n\n/**\n * Renders the button content (text or children).\n * Wraps text strings in ButtonText component with optional truncation.\n *\n * @param children - React children content\n * @param text - Text string to render\n * @param isTruncated - Whether to enable text truncation\n * @returns Rendered content\n */\nconst renderContent = (children: any, text: any, isTruncated: boolean): React.ReactNode => {\n if (children) return children\n if (isReactText(text)) return <ButtonText isTruncated={isTruncated} text={text} />\n return text\n}\n\n/**\n * Button Component\n *\n * A versatile button component that supports multiple states, sizes, variants, and behaviors.\n * Part of the VUI design system with built-in accessibility features.\n *\n */\nexport const Button = vui<'button', ButtonProps>((props, ref) => {\n const buttonGroupProps = useButtonGroupContext()\n const mergedProps = { ...buttonGroupProps, ...props }\n const {\n borderWidth: borderWidthProp,\n children,\n className,\n colorScheme,\n disabled,\n dropDownIcon = 'falAngleDown',\n icon,\n iconLeft,\n iconRight: iconRightProp,\n isActive,\n isDropDown,\n isElevated,\n isFullWidth,\n isLoading,\n isRound,\n isSplit,\n isTruncated,\n size,\n state = '',\n stateMapping,\n text,\n title,\n variant: variantProp,\n ...rest\n } = mergedProps\n\n // Memoized calculations\n const hasState = useMemo(() => Boolean(state) && state !== 'idle', [state])\n const states = useMemo(() => ({ ...buttonStateMapping, ...stateMapping }), [stateMapping])\n const stateData = useMemo(() => states[state] ?? {}, [states, state])\n const { iconProps: stateIconProps, ...stateProps } = stateData\n\n const iconRight = useMemo(() => (isDropDown ? 'falAngleDown' : iconRightProp), [isDropDown, iconRightProp])\n\n const variantForTheme = useMemo(\n () =>\n filterUndefined({\n variant: stateData?.variant ?? variantProp,\n }),\n [stateData?.variant, variantProp],\n )\n\n // Consolidated computation of all button styles and props\n const computed = useButtonComputed(\n mergedProps,\n variantForTheme,\n borderWidthProp,\n icon,\n iconLeft,\n iconRight,\n isLoading ?? false,\n isSplit ?? false,\n disabled ?? false,\n isActive ?? false,\n isRound ?? false,\n isElevated ?? false,\n hasState,\n isFullWidth ?? false,\n className,\n variantProp,\n )\n\n // Memoized context value\n const hasTextContent = Boolean(children || text)\n const contextValue = useMemo(\n () => filterUndefined({ disabled, size, variant: variantForTheme.variant, isDropDown, hasTextContent }),\n [disabled, size, variantForTheme.variant, isDropDown, hasTextContent],\n )\n\n // Memoized content wrapper\n const Content = useMemo(() => (hasState ? ContentWrapper : Fragment), [hasState])\n\n // Optimized event handler - prevents event bubbling during state overlay interactions\n // This ensures clicks on the state overlay (loading/success/error) don't trigger button actions\n const handleStateClick = useCallback((e: { stopPropagation: () => void }) => {\n e.stopPropagation()\n }, [])\n\n // Memoized final props - using primitives to avoid object reference changes\n const finalVariant = (stateData?.variant ?? variantProp) as string | undefined\n\n // Extract primitive values for stable dependencies\n const borderWidth = computed.spacing.borderWidth\n const plValue = computed.spacing.pl\n const prValue = computed.spacing.pr\n const hValue = computed.h\n\n // Wrap disabled props with CSS variables for customization\n const disabledPropsWithVars = useMemo(() => {\n if (!computed.disabledProps || Object.keys(computed.disabledProps).length === 0) return {}\n\n const { bg, borderColor, color, opacity, ...otherDisabledProps } = computed.disabledProps\n\n return {\n ...otherDisabledProps,\n ...(bg !== undefined && { bg: `var(--vui-button-disabled-bg, ${bg})` }),\n ...(borderColor !== undefined && { borderColor: `var(--vui-button-disabled-border-color, ${borderColor})` }),\n ...(color !== undefined && { color: `var(--vui-button-disabled-color, ${color})` }),\n ...(opacity !== undefined && { opacity: `var(--vui-button-disabled-opacity, ${opacity})` }),\n }\n }, [computed.disabledProps])\n\n const finalProps = useMemo(\n () => ({\n borderWidth: `var(--vui-button-border-width, ${borderWidth}px)`,\n className: computed.buttonClassName,\n disabled,\n focusRing: FOCUS_RING_SIZE,\n h: `var(--vui-button-h, ${hValue}px)`,\n pl: plValue,\n pr: prValue,\n ref,\n title: title || '',\n type: BUTTON_TYPE as 'button',\n variant: finalVariant,\n ...computed.buttonStyles,\n ...computed.activeProps,\n ...disabledPropsWithVars,\n ...computed.aliasedProps,\n ...rest,\n }),\n [\n borderWidth,\n plValue,\n prValue,\n computed.buttonClassName,\n computed.buttonStyles,\n computed.activeProps,\n disabledPropsWithVars,\n computed.aliasedProps,\n hValue,\n disabled,\n ref,\n title,\n finalVariant,\n rest,\n ],\n )\n\n // Render icon elements (not memoized to avoid stale references)\n const mainIcon = renderButtonIcon(icon, 'main')\n const leftIcon = renderButtonIcon(iconLeft, 'left', isLoading ?? false)\n const rightIcon = renderButtonIcon(iconRight, 'right')\n const contentElement = renderContent(children, text, isTruncated ?? false)\n\n return (\n <ButtonProvider value={contextValue}>\n <ButtonBase {...finalProps}>\n {hasState && (\n <StateWrapper onClick={handleStateClick} {...stateProps}>\n <ButtonIcon m=\"auto\" {...stateIconProps} />\n </StateWrapper>\n )}\n\n <Content>\n {mainIcon}\n {!icon && (\n <>\n {leftIcon}\n {contentElement}\n {rightIcon}\n </>\n )}\n {icon && isDropDown && rightIcon}\n </Content>\n </ButtonBase>\n </ButtonProvider>\n )\n}) as VuiComponent<'button', ButtonProps> & {\n Icon: typeof ButtonIcon\n Text: typeof ButtonText\n}\n\nButton.Icon = ButtonIcon\nButton.Text = ButtonText\nButton.displayName = 'Button'\n\nexport default Button\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"button.js","names":[],"sources":["../../src/button/button.tsx"],"sourcesContent":["import { Fragment, useMemo, useCallback } from 'react'\n\nimport { useButtonGroupContext } from '../buttonGroup/context'\nimport type { VuiComponent } from '../core'\nimport { styled, useStyleConfig, vui } from '../core'\nimport type { SystemProps } from '../system'\nimport { activeClassName, cs, filterUndefined, isReactText, isString } from '../utils'\nimport type { ButtonProps } from './button.types'\nimport ButtonIcon from './buttonIcon'\nimport ButtonText from './buttonText'\nimport { buttonStateMapping, loadingIconProps } from './consts'\nimport { ButtonProvider } from './context'\n\n// Types for internal use\ninterface ButtonStyleContainer {\n borderWidth?: number\n h?: number\n spaceX?: number\n disabledBg?: string\n disabledBorderColor?: string\n disabledColor?: string\n disabledOpacity?: number\n activeBg?: string\n activeBorderBg?: string\n activeColor?: string\n borderRadius?: number\n [key: string]: any\n}\n\ninterface ButtonComputedStyles {\n borderColor: string\n activeBorderColor: string\n activeColor: string\n hoverBorderColor: string\n hoverColor: string\n [key: string]: any\n}\n\ninterface SpacingProps {\n borderWidth: number\n pl: string\n pr: string\n}\n\ninterface ComputedResult {\n styles: { container?: ButtonStyleContainer; [key: string]: any }\n borderWidth: number\n h: number\n spaceX: number\n buttonStyles: ButtonComputedStyles\n spacing: SpacingProps\n disabledProps: SystemProps\n activeProps: SystemProps\n aliasedProps: SystemProps\n buttonClassName: string\n}\n\n// Constants - TODO: Move to theme tokens for better maintainability\nconst DEFAULT_BORDER_WIDTH = 1\nconst DEFAULT_BOX_SHADOW = 'md'\nconst DEFAULT_DISABLED_OPACITY = 0.5\nconst BUTTON_TYPE = 'button'\nconst FOCUS_RING_SIZE = 3\n\n// Memoized styled components\nconst ContentWrapper = styled.span`\n visibility: hidden;\n`\n\n// StateWrapper overlays the button content during state transitions (loading, success, error)\n// Positioned absolutely to avoid layout shifts and uses pointer-events: none on parent\nconst StateWrapper = styled.span`\n bottom: 0;\n display: flex;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n`\n\nexport const ButtonBase = styled.buttonBox<ButtonProps>`\n align-items: center;\n display: inline-flex;\n flex-shrink: 0;\n font-weight: var(--vui-button-font-weight, medium);\n justify-content: center;\n line-height: normal;\n overflow: hidden;\n position: relative;\n transition-duration: var(--vui-button-transition-duration, fast);\n user-select: none;\n width: fit-content;\n`\n\n/**\n * Extracts a numeric value from various input types (number, string, etc.)\n * @param value - Value to extract number from\n * @param fallback - Default value if extraction fails\n * @returns Extracted number or fallback\n */\nconst extractNumericValue = (value: any, fallback: number = DEFAULT_BORDER_WIDTH): number => {\n if (typeof value === 'number') return value\n if (typeof value === 'string') {\n const parsed = parseInt(value, 10)\n if (!isNaN(parsed)) return parsed\n }\n return fallback\n}\n\n/**\n * Consolidated hook for computing all button styles and props.\n * Combines theme resolution, spacing, state-based styles, and className generation.\n * Reduces memoization overhead by computing all derived values in a single pass.\n *\n * @param mergedProps - Combined props from ButtonGroup context and component props\n * @param variant - Resolved variant object with theme overrides\n * @param borderWidthProp - Optional border width override from props\n * @param icon - Main icon (replaces all content when present)\n * @param iconLeft - Left icon slot\n * @param iconRight - Right icon slot\n * @param isLoading - Loading state flag\n * @param isSplit - Deprecated: Split layout mode\n * @param disabled - Disabled state flag\n * @param isActive - Active state flag\n * @param isRound - Round/pill-shaped borders flag\n * @param isElevated - Box shadow elevation flag\n * @param hasState - Whether button has a state overlay\n * @param isFullWidth - Full width layout flag\n * @param className - Additional CSS classes\n * @param variantProp - Variant name for class generation\n * @returns Computed styles, spacing, props, and className\n */\nconst useButtonComputed = (\n mergedProps: ButtonProps & SystemProps,\n variant: { variant?: string },\n borderWidthProp: any, // Keep as any due to complex BorderWidthProp type from xstyled\n icon: any,\n iconLeft: any,\n iconRight: any,\n isLoading: boolean,\n isSplit: boolean,\n disabled: boolean,\n isActive: boolean,\n isRound: boolean,\n isElevated: boolean,\n hasState: boolean,\n isFullWidth: boolean,\n className: string | undefined,\n variantProp: string | undefined,\n): ComputedResult => {\n const styles = useStyleConfig('Button', { ...mergedProps, ...variant }) || {}\n\n return useMemo(() => {\n // Theme and style resolution\n const container = styles.container || {}\n const { borderWidth = DEFAULT_BORDER_WIDTH, h = 32, spaceX = 0, ...buttonStyles } = container\n\n // Normalize button styles with fallbacks for text colors only\n const normalizedStyles = {\n ...buttonStyles,\n activeColor: buttonStyles.activeColor ?? buttonStyles.color,\n hoverColor: buttonStyles.hoverColor ?? buttonStyles.color,\n }\n\n // Spacing calculations\n // borderWidth value used for spacing calculations (affects padding adjustments)\n const border = extractNumericValue(borderWidthProp) || borderWidth || DEFAULT_BORDER_WIDTH\n const spaceXItem = spaceX - border\n const spaceXText = spaceX * 2 - border\n\n const spacing = {\n borderWidth: border, // Store borderWidth for use in finalProps\n pl: `var(--vui-button-px-start, ${icon || iconLeft || isLoading ? spaceXItem : spaceXText}px)`,\n pr: `var(--vui-button-px-end, ${icon || iconRight ? spaceXItem : spaceXText}px)`,\n }\n\n // Disabled state props with CSS variable overrides\n // Theme tokens (like landGreen.70) are resolved by styled system, then wrapped in CSS variables\n // This allows both theme resolution and CSS variable overrides to work together\n const disabledProps = disabled\n ? filterUndefined({\n 'aria-disabled': disabled,\n bg: container?.disabledBg ?? undefined,\n borderColor: container?.disabledBorderColor ?? undefined,\n color: container?.disabledColor ?? undefined,\n hoverBg: container?.disabledBg ?? normalizedStyles.bg,\n hoverBorderColor: container?.disabledBorderColor ?? normalizedStyles.borderColor,\n hoverColor: container?.disabledColor ?? normalizedStyles.color,\n activeBg: container?.disabledBg ?? normalizedStyles.bg,\n cursor: 'not-allowed',\n opacity: container?.disabledOpacity ?? DEFAULT_DISABLED_OPACITY,\n })\n : {}\n\n // Active state props - prevents hover effects when button is active\n // Active state (also called \"loading\" in VUI Next) should not be interactive\n const activeProps = isActive\n ? filterUndefined({\n bg: container?.activeBg,\n borderColor: container?.activeBorderColor,\n color: container?.activeColor,\n hoverBg: container?.activeBg,\n hoverBorderColor: container?.activeBorderColor,\n hoverColor: container?.activeColor,\n cursor: 'default',\n })\n : {}\n\n // Aliased props (computed properties)\n const aliasedProps = filterUndefined({\n borderRadius: isRound ? h / 2 : `var(--vui-button-border-radius, ${container?.borderRadius || 0}px)`,\n boxShadow: isElevated ? `var(--vui-button-box-shadow, ${DEFAULT_BOX_SHADOW})` : undefined,\n minW: icon ? 0 : `var(--vui-button-min-w, auto)`,\n pointerEvents: hasState ? 'none' : undefined,\n w: isFullWidth ? '100%' : undefined,\n })\n\n // Class name generation\n const buttonClassName = cs(\n 'vui-button',\n className,\n isActive && activeClassName,\n variantProp ? `vui-button-variant-${variantProp}` : undefined,\n )\n\n return {\n styles,\n borderWidth,\n h,\n spaceX,\n buttonStyles: normalizedStyles,\n spacing,\n disabledProps,\n activeProps,\n aliasedProps,\n buttonClassName,\n }\n }, [\n styles,\n mergedProps,\n variant,\n borderWidthProp,\n icon,\n iconLeft,\n iconRight,\n isLoading,\n isSplit,\n disabled,\n isActive,\n isRound,\n isElevated,\n hasState,\n isFullWidth,\n className,\n variantProp,\n ])\n}\n\n/**\n * Unified icon renderer for all button icon positions.\n * Converts string icon names to ButtonIcon components with appropriate margins.\n *\n * @param iconProp - Icon name string or React element\n * @param position - Icon position: 'main' (center), 'left', or 'right'\n * @param isLoading - Whether to show loading spinner (only applies to left position)\n * @returns Rendered icon or null\n */\nconst renderButtonIcon = (\n iconProp: any,\n position: 'main' | 'left' | 'right' = 'main',\n isLoading: boolean = false,\n): React.ReactElement | null => {\n // Handle loading state for left icon\n if (position === 'left' && isLoading) {\n return <ButtonIcon {...loadingIconProps} ml={0} />\n }\n\n if (!iconProp) return null\n\n // Return existing React elements as-is\n if (!isString(iconProp)) return iconProp\n\n // Apply position-specific margins for string icon names\n switch (position) {\n case 'left':\n return <ButtonIcon name={iconProp} ml={0} />\n case 'right':\n return <ButtonIcon name={iconProp} mr={0} />\n case 'main':\n default:\n return <ButtonIcon name={iconProp} />\n }\n}\n\n/**\n * Renders the button content (text or children).\n * Wraps text strings in ButtonText component with optional truncation.\n *\n * @param children - React children content\n * @param text - Text string to render\n * @param isTruncated - Whether to enable text truncation\n * @returns Rendered content\n */\nconst renderContent = (children: any, text: any, isTruncated: boolean): React.ReactNode => {\n if (children) return children\n if (isReactText(text)) return <ButtonText isTruncated={isTruncated} text={text} />\n return text\n}\n\n/**\n * Button Component\n *\n * A versatile button component that supports multiple states, sizes, variants, and behaviors.\n * Part of the VUI design system with built-in accessibility features.\n *\n */\nexport const Button = vui<'button', ButtonProps>((props, ref) => {\n const buttonGroupProps = useButtonGroupContext()\n const mergedProps = { ...buttonGroupProps, ...props }\n const {\n borderWidth: borderWidthProp,\n children,\n className,\n colorScheme,\n disabled,\n dropDownIcon = 'falAngleDown',\n icon,\n iconLeft,\n iconRight: iconRightProp,\n isActive,\n isDropDown,\n isElevated,\n isFullWidth,\n isLoading,\n isRound,\n isSplit,\n isTruncated,\n size,\n state = '',\n stateMapping,\n text,\n title,\n variant: variantProp,\n ...rest\n } = mergedProps\n\n // Memoized calculations\n const hasState = useMemo(() => Boolean(state) && state !== 'idle', [state])\n const states = useMemo(() => ({ ...buttonStateMapping, ...stateMapping }), [stateMapping])\n const stateData = useMemo(() => states[state] ?? {}, [states, state])\n const { iconProps: stateIconProps, ...stateProps } = stateData\n\n const iconRight = useMemo(() => (isDropDown ? 'falAngleDown' : iconRightProp), [isDropDown, iconRightProp])\n\n const variantForTheme = useMemo(\n () =>\n filterUndefined({\n variant: stateData?.variant ?? variantProp,\n }),\n [stateData?.variant, variantProp],\n )\n\n // Consolidated computation of all button styles and props\n const computed = useButtonComputed(\n mergedProps,\n variantForTheme,\n borderWidthProp,\n icon,\n iconLeft,\n iconRight,\n isLoading ?? false,\n isSplit ?? false,\n disabled ?? false,\n isActive ?? false,\n isRound ?? false,\n isElevated ?? false,\n hasState,\n isFullWidth ?? false,\n className,\n variantProp,\n )\n\n // Memoized context value\n const hasTextContent = Boolean(children || text)\n const contextValue = useMemo(\n () => filterUndefined({ disabled, size, variant: variantForTheme.variant, isDropDown, hasTextContent }),\n [disabled, size, variantForTheme.variant, isDropDown, hasTextContent],\n )\n\n // Memoized content wrapper\n const Content = useMemo(() => (hasState ? ContentWrapper : Fragment), [hasState])\n\n // Optimized event handler - prevents event bubbling during state overlay interactions\n // This ensures clicks on the state overlay (loading/success/error) don't trigger button actions\n const handleStateClick = useCallback((e: { stopPropagation: () => void }) => {\n e.stopPropagation()\n }, [])\n\n // Memoized final props - using primitives to avoid object reference changes\n const finalVariant = (stateData?.variant ?? variantProp) as string | undefined\n\n // Extract primitive values for stable dependencies\n const borderWidth = computed.spacing.borderWidth\n const plValue = computed.spacing.pl\n const prValue = computed.spacing.pr\n const hValue = computed.h\n\n // Wrap props with CSS variables for customization\n // Combines base, active, and disabled props into a single flat object with CSS variable support\n const propsWithVars = useMemo(() => {\n // Define CSS variable mappings for each prop type\n const cssVarMappings = {\n base: {\n bg: '--vui-button-bg',\n borderColor: '--vui-button-border-color',\n color: '--vui-button-color',\n hoverBg: '--vui-button-hover-bg',\n hoverBorderColor: '--vui-button-hover-border-color',\n hoverColor: '--vui-button-hover-color',\n activeBg: '--vui-button-active-bg',\n activeBorderColor: '--vui-button-active-border-color',\n activeColor: '--vui-button-active-color',\n },\n active: {\n bg: '--vui-button-active-bg',\n borderColor: '--vui-button-active-border-color',\n color: '--vui-button-active-color',\n hoverBg: '--vui-button-active-hover-bg',\n hoverBorderColor: '--vui-button-active-hover-border-color',\n hoverColor: '--vui-button-active-hover-color',\n },\n disabled: {\n bg: '--vui-button-disabled-bg',\n borderColor: '--vui-button-disabled-border-color',\n color: '--vui-button-disabled-color',\n opacity: '--vui-button-disabled-opacity',\n },\n }\n\n // Helper to wrap props with CSS variables\n const wrapWithVars = (props: Record<string, any>, mapping: Record<string, string>) => {\n if (!props || Object.keys(props).length === 0) return {}\n\n const result: Record<string, any> = {}\n const wrappedKeys = new Set(Object.keys(mapping))\n\n // Wrap mapped properties with CSS variables\n Object.entries(props).forEach(([key, value]) => {\n if (wrappedKeys.has(key) && value !== undefined) {\n result[key] = `var(${mapping[key]}, ${value})`\n } else if (!wrappedKeys.has(key)) {\n result[key] = value\n }\n })\n\n return result\n }\n\n // Merge all wrapped props into a single flat object (order matters: base → active → disabled)\n return {\n ...wrapWithVars(computed.buttonStyles, cssVarMappings.base),\n ...wrapWithVars(computed.activeProps, cssVarMappings.active),\n ...wrapWithVars(computed.disabledProps, cssVarMappings.disabled),\n }\n }, [computed.buttonStyles, computed.activeProps, computed.disabledProps])\n\n const finalProps = useMemo(\n () => ({\n borderWidth: `var(--vui-button-border-width, ${borderWidth}px)`,\n className: computed.buttonClassName,\n disabled,\n focusRing: FOCUS_RING_SIZE,\n h: `var(--vui-button-h, ${hValue}px)`,\n pl: plValue,\n pr: prValue,\n ref,\n title: title || '',\n type: BUTTON_TYPE as 'button',\n variant: finalVariant,\n ...propsWithVars,\n ...computed.aliasedProps,\n ...rest,\n }),\n [\n borderWidth,\n plValue,\n prValue,\n computed.buttonClassName,\n propsWithVars,\n computed.aliasedProps,\n hValue,\n disabled,\n ref,\n title,\n finalVariant,\n rest,\n ],\n )\n\n // Render icon elements (not memoized to avoid stale references)\n const mainIcon = renderButtonIcon(icon, 'main')\n const leftIcon = renderButtonIcon(iconLeft, 'left', isLoading ?? false)\n const rightIcon = renderButtonIcon(iconRight, 'right')\n const contentElement = renderContent(children, text, isTruncated ?? false)\n\n return (\n <ButtonProvider value={contextValue}>\n <ButtonBase {...finalProps}>\n {hasState && (\n <StateWrapper onClick={handleStateClick} {...stateProps}>\n <ButtonIcon m=\"auto\" {...stateIconProps} />\n </StateWrapper>\n )}\n\n <Content>\n {mainIcon}\n {!icon && (\n <>\n {leftIcon}\n {contentElement}\n {rightIcon}\n </>\n )}\n {icon && isDropDown && rightIcon}\n </Content>\n </ButtonBase>\n </ButtonProvider>\n )\n}) as VuiComponent<'button', ButtonProps> & {\n Icon: typeof ButtonIcon\n Text: typeof ButtonText\n}\n\nButton.Icon = ButtonIcon\nButton.Text = ButtonText\nButton.displayName = 'Button'\n\nexport default Button\n"],"mappings":"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"}
|
package/dist/button/theme.js
CHANGED
|
@@ -115,28 +115,6 @@ const variants = {
|
|
|
115
115
|
activeBg: "var(--action-contrast-subtle-pressed)",
|
|
116
116
|
activeColor: "var(--action-contrast-solid)"
|
|
117
117
|
} },
|
|
118
|
-
blueOutlined: { container: {
|
|
119
|
-
bg: "var(--color-opacity-none)",
|
|
120
|
-
borderColor: "var(--action-blue-solid)",
|
|
121
|
-
color: "var(--action-blue-solid)",
|
|
122
|
-
hoverBg: "var(--color-opacity-none)",
|
|
123
|
-
hoverBorderColor: "var(--action-blue-solid-hover)",
|
|
124
|
-
hoverColor: "var(--action-blue-solid-hover)",
|
|
125
|
-
activeBg: "var(--color-opacity-none)",
|
|
126
|
-
activeBorderColor: "var(--action-blue-solid-pressed)",
|
|
127
|
-
activeColor: "var(--action-blue-solid-pressed)"
|
|
128
|
-
} },
|
|
129
|
-
blueText: { container: {
|
|
130
|
-
bg: "var(--color-opacity-none)",
|
|
131
|
-
borderColor: "var(--color-opacity-none)",
|
|
132
|
-
color: "var(--action-blue-solid)",
|
|
133
|
-
hoverBg: "var(--color-opacity-none)",
|
|
134
|
-
hoverBorderColor: "var(--color-opacity-none)",
|
|
135
|
-
hoverColor: "var(--action-blue-solid-hover)",
|
|
136
|
-
activeBg: "var(--color-opacity-none)",
|
|
137
|
-
activeBorderColor: "var(--color-opacity-none)",
|
|
138
|
-
activeColor: "var(--action-blue-solid-pressed)"
|
|
139
|
-
} },
|
|
140
118
|
solidGreen: { container: {
|
|
141
119
|
bg: "var(--action-success-solid)",
|
|
142
120
|
borderColor: "var(--action-success-solid)",
|
|
@@ -146,15 +124,6 @@ const variants = {
|
|
|
146
124
|
activeBg: "var(--action-success-solid-pressed)",
|
|
147
125
|
activeBorderColor: "var(--action-success-solid-pressed)"
|
|
148
126
|
} },
|
|
149
|
-
subtleGreen: { container: {
|
|
150
|
-
bg: "var(--action-success-subtle)",
|
|
151
|
-
borderColor: "var(--action-success-subtle)",
|
|
152
|
-
color: "var(--action-success-subtle-inverse)",
|
|
153
|
-
hoverBg: "var(--action-success-subtle-hover)",
|
|
154
|
-
hoverBorderColor: "var(--action-success-subtle-hover)",
|
|
155
|
-
activeBg: "var(--action-success-subtle-pressed)",
|
|
156
|
-
activeBorderColor: "var(--action-success-subtle-pressed)"
|
|
157
|
-
} },
|
|
158
127
|
solidRed: { container: {
|
|
159
128
|
bg: "var(--action-danger-solid)",
|
|
160
129
|
borderColor: "var(--action-danger-solid)",
|
|
@@ -163,81 +132,6 @@ const variants = {
|
|
|
163
132
|
hoverBorderColor: "var(--action-danger-solid-hover)",
|
|
164
133
|
activeBg: "var(--action-danger-solid-pressed)",
|
|
165
134
|
activeBorderColor: "var(--action-danger-solid-pressed)"
|
|
166
|
-
} },
|
|
167
|
-
subtleRed: { container: {
|
|
168
|
-
bg: "var(--action-danger-subtle)",
|
|
169
|
-
borderColor: "var(--action-danger-subtle)",
|
|
170
|
-
color: "var(--action-danger-subtle-inverse)",
|
|
171
|
-
hoverBg: "var(--action-danger-subtle-hover)",
|
|
172
|
-
hoverBorderColor: "var(--action-danger-subtle-hover)",
|
|
173
|
-
activeBg: "var(--action-danger-subtle-pressed)",
|
|
174
|
-
activeBorderColor: "var(--action-danger-subtle-pressed)"
|
|
175
|
-
} },
|
|
176
|
-
solidBlue: { container: {
|
|
177
|
-
bg: "var(--action-blue-solid)",
|
|
178
|
-
borderColor: "var(--action-blue-solid)",
|
|
179
|
-
color: "var(--action-blue-solid-inverse)",
|
|
180
|
-
hoverBg: "var(--action-blue-solid-hover)",
|
|
181
|
-
hoverBorderColor: "var(--action-blue-solid-hover)",
|
|
182
|
-
activeBg: "var(--action-blue-solid-pressed)",
|
|
183
|
-
activeBorderColor: "var(--action-blue-solid-pressed)"
|
|
184
|
-
} },
|
|
185
|
-
subtleBlue: { container: {
|
|
186
|
-
bg: "var(--action-blue-subtle)",
|
|
187
|
-
borderColor: "var(--action-blue-subtle)",
|
|
188
|
-
color: "var(--action-blue-subtle-inverse)",
|
|
189
|
-
hoverBg: "var(--action-blue-subtle-hover)",
|
|
190
|
-
hoverBorderColor: "var(--action-blue-subtle-hover)",
|
|
191
|
-
activeBg: "var(--action-blue-subtle-pressed)",
|
|
192
|
-
activeBorderColor: "var(--action-blue-subtle-pressed)"
|
|
193
|
-
} },
|
|
194
|
-
solidYellow: { container: {
|
|
195
|
-
bg: "var(--action-yellow-solid)",
|
|
196
|
-
borderColor: "var(--action-yellow-solid)",
|
|
197
|
-
color: "var(--action-yellow-solid-inverse)",
|
|
198
|
-
hoverBg: "var(--action-yellow-solid-hover)",
|
|
199
|
-
hoverBorderColor: "var(--action-yellow-solid-hover)",
|
|
200
|
-
activeBg: "var(--action-yellow-solid-pressed)",
|
|
201
|
-
activeBorderColor: "var(--action-yellow-solid-pressed)"
|
|
202
|
-
} },
|
|
203
|
-
subtleYellow: { container: {
|
|
204
|
-
bg: "var(--action-yellow-subtle)",
|
|
205
|
-
borderColor: "var(--action-yellow-subtle)",
|
|
206
|
-
color: "var(--action-yellow-subtle-inverse)",
|
|
207
|
-
hoverBg: "var(--action-yellow-subtle-hover)",
|
|
208
|
-
hoverBorderColor: "var(--action-yellow-subtle-hover)",
|
|
209
|
-
activeBg: "var(--action-yellow-subtle-pressed)",
|
|
210
|
-
activeBorderColor: "var(--action-yellow-subtle-pressed)"
|
|
211
|
-
} },
|
|
212
|
-
menuLight: { container: {
|
|
213
|
-
bg: "#ffffff",
|
|
214
|
-
hoverBg: "#D3EEF8",
|
|
215
|
-
activeBg: "#E9F7FC",
|
|
216
|
-
disabledBg: "#F8F7F7",
|
|
217
|
-
borderColor: "transparent",
|
|
218
|
-
hoverBorderColor: "#003591",
|
|
219
|
-
activeBorderColor: "#003591",
|
|
220
|
-
color: "#1A1A19",
|
|
221
|
-
hoverColor: "#1A1A19",
|
|
222
|
-
activeColor: "#003591",
|
|
223
|
-
disabledColor: "#908D89",
|
|
224
|
-
disabledBorderColor: "transparent",
|
|
225
|
-
disabledOpacity: "1"
|
|
226
|
-
} },
|
|
227
|
-
menuDark: { container: {
|
|
228
|
-
bg: "#0F204B",
|
|
229
|
-
hoverBg: "#003591",
|
|
230
|
-
activeBg: "#0041B2",
|
|
231
|
-
disabledBg: "#0F204B",
|
|
232
|
-
borderColor: "transparent",
|
|
233
|
-
hoverBorderColor: "#91FFB4",
|
|
234
|
-
activeBorderColor: "#91FFB4",
|
|
235
|
-
color: "#FFFFFF",
|
|
236
|
-
hoverColor: "#FFFFFF",
|
|
237
|
-
activeColor: "#91FFBA",
|
|
238
|
-
disabledColor: "#FFFFFF",
|
|
239
|
-
disabledBorderColor: "transparent",
|
|
240
|
-
disabledOpacity: "1"
|
|
241
135
|
} }
|
|
242
136
|
};
|
|
243
137
|
variants.buttonGroupDefault = { container: {
|
package/dist/button/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","names":[],"sources":["../../src/button/theme.ts"],"sourcesContent":["const baseStyle = {}\n\nconst defaultProps = {\n size: 'lg',\n variant: 'primaryDark',\n fontWeight: 'medium',\n}\n\nconst parts = ['container', 'icon', 'text']\n\nconst sizes = {\n sm: {\n container: {\n fontSize: 'xs',\n h: 24,\n minW: 48,\n spaceX: 4,\n },\n icon: {\n size: 'xs',\n mr: '5px', // spaceX(4) - border(1) + 1 = 4px, but add 1px for better spacing\n ml: '5px',\n },\n text: {},\n },\n md: {\n container: {\n fontSize: 'sm',\n h: 32,\n minW: 64,\n spaceX: 6,\n },\n icon: {\n size: 'sm',\n mr: '7px', // spaceX(6) - border(1) + 1 = 6px + 1px\n ml: '7px',\n },\n text: {},\n },\n lg: {\n container: {\n fontSize: 'md',\n h: 40,\n minW: 80,\n spaceX: 8,\n },\n icon: {\n size: 'md',\n mr: '9px', // spaceX(8) - border(1) + 1 = 8px + 1px\n ml: '9px',\n },\n text: {},\n },\n xl: {\n container: {\n fontSize: 'lg',\n h: 48,\n minW: 96,\n spaceX: 10,\n },\n icon: {\n size: 'lg',\n mr: '11px', // spaceX(10) - border(1) + 1 = 10px + 1px\n ml: '11px',\n },\n text: {},\n },\n}\n\nconst variants: Record<string, Record<string, Record<string, string>>> = {\n primaryDark: {\n container: {\n bg: 'var(--action-brand-solid)',\n borderColor: 'var(--action-brand-solid)',\n color: 'var(--action-brand-solid-inverse)',\n hoverBg: 'var(--action-brand-solid-hover)',\n activeBg: 'var(--action-brand-solid-pressed)',\n },\n },\n secondaryDark: {\n container: {\n bg: 'var(--color-opacity-none)',\n borderColor: 'var(--action-brand-solid)',\n color: 'var(--action-brand-solid)',\n hoverBg: 'var(--action-brand-subtle-hover)',\n activeBg: 'var(--action-brand-subtle-pressed)',\n },\n },\n tertiaryDark: {\n container: {\n bg: 'var(--color-opacity-none)',\n borderColor: 'var(--color-opacity-none)',\n color: 'var(--action-brand-solid)',\n hoverBg: 'var(--action-brand-subtle-hover)',\n activeBg: 'var(--action-brand-subtle-pressed)',\n },\n },\n // TODO: Rename to 'primaryContrast', 'secondaryContrast', 'tertiaryContrast' in future breaking change\n // to align with VUI Next token naming (--action-contrast-*). Requires migration guide for consumers.\n primaryLight: {\n container: {\n bg: 'var(--action-contrast-solid)',\n borderColor: 'var(--action-contrast-solid)',\n color: 'var(--action-contrast-solid-inverse)',\n hoverBg: 'var(--action-contrast-solid-hover)',\n activeBg: 'var(--action-contrast-solid-pressed)',\n },\n },\n secondaryLight: {\n container: {\n bg: 'var(--color-opacity-none)',\n borderColor: 'var(--action-contrast-solid)',\n color: 'var(--action-contrast-solid)',\n hoverBg: 'var(--action-contrast-subtle-hover)',\n hoverColor: 'var(--action-contrast-solid)',\n activeBg: 'var(--action-contrast-subtle-pressed)',\n activeColor: 'var(--action-contrast-solid)',\n },\n },\n tertiaryLight: {\n container: {\n bg: 'var(--color-opacity-none)',\n borderColor: 'var(--color-opacity-none)',\n color: 'var(--action-contrast-solid)',\n hoverBg: 'var(--action-contrast-subtle-hover)',\n hoverColor: 'var(--action-contrast-solid)',\n activeBg: 'var(--action-contrast-subtle-pressed)',\n activeColor: 'var(--action-contrast-solid)',\n },\n },\n\n blueOutlined: {\n container: {\n bg: 'var(--color-opacity-none)',\n borderColor: 'var(--action-blue-solid)',\n color: 'var(--action-blue-solid)',\n hoverBg: 'var(--color-opacity-none)',\n hoverBorderColor: 'var(--action-blue-solid-hover)',\n hoverColor: 'var(--action-blue-solid-hover)',\n activeBg: 'var(--color-opacity-none)',\n activeBorderColor: 'var(--action-blue-solid-pressed)',\n activeColor: 'var(--action-blue-solid-pressed)',\n },\n },\n blueText: {\n container: {\n bg: 'var(--color-opacity-none)',\n borderColor: 'var(--color-opacity-none)',\n color: 'var(--action-blue-solid)',\n hoverBg: 'var(--color-opacity-none)',\n hoverBorderColor: 'var(--color-opacity-none)',\n hoverColor: 'var(--action-blue-solid-hover)',\n activeBg: 'var(--color-opacity-none)',\n activeBorderColor: 'var(--color-opacity-none)',\n activeColor: 'var(--action-blue-solid-pressed)',\n },\n },\n\n solidGreen: {\n container: {\n bg: 'var(--action-success-solid)',\n borderColor: 'var(--action-success-solid)',\n color: 'var(--action-success-solid-inverse)',\n hoverBg: 'var(--action-success-solid-hover)',\n hoverBorderColor: 'var(--action-success-solid-hover)',\n activeBg: 'var(--action-success-solid-pressed)',\n activeBorderColor: 'var(--action-success-solid-pressed)',\n },\n },\n subtleGreen: {\n container: {\n bg: 'var(--action-success-subtle)',\n borderColor: 'var(--action-success-subtle)',\n color: 'var(--action-success-subtle-inverse)',\n hoverBg: 'var(--action-success-subtle-hover)',\n hoverBorderColor: 'var(--action-success-subtle-hover)',\n activeBg: 'var(--action-success-subtle-pressed)',\n activeBorderColor: 'var(--action-success-subtle-pressed)',\n },\n },\n solidRed: {\n container: {\n bg: 'var(--action-danger-solid)',\n borderColor: 'var(--action-danger-solid)',\n color: 'var(--action-danger-solid-inverse)',\n hoverBg: 'var(--action-danger-solid-hover)',\n hoverBorderColor: 'var(--action-danger-solid-hover)',\n activeBg: 'var(--action-danger-solid-pressed)',\n activeBorderColor: 'var(--action-danger-solid-pressed)',\n },\n },\n // subtleRed is an internal variant, used in notification; based on primaryDark\n subtleRed: {\n container: {\n bg: 'var(--action-danger-subtle)',\n borderColor: 'var(--action-danger-subtle)',\n color: 'var(--action-danger-subtle-inverse)',\n hoverBg: 'var(--action-danger-subtle-hover)',\n hoverBorderColor: 'var(--action-danger-subtle-hover)',\n activeBg: 'var(--action-danger-subtle-pressed)',\n activeBorderColor: 'var(--action-danger-subtle-pressed)',\n },\n },\n solidBlue: {\n container: {\n bg: 'var(--action-blue-solid)',\n borderColor: 'var(--action-blue-solid)',\n color: 'var(--action-blue-solid-inverse)',\n hoverBg: 'var(--action-blue-solid-hover)',\n hoverBorderColor: 'var(--action-blue-solid-hover)',\n activeBg: 'var(--action-blue-solid-pressed)',\n activeBorderColor: 'var(--action-blue-solid-pressed)',\n },\n },\n // subtleBlue is an internal variant, used in notification; based on primaryDark\n subtleBlue: {\n container: {\n bg: 'var(--action-blue-subtle)',\n borderColor: 'var(--action-blue-subtle)',\n color: 'var(--action-blue-subtle-inverse)',\n hoverBg: 'var(--action-blue-subtle-hover)',\n hoverBorderColor: 'var(--action-blue-subtle-hover)',\n activeBg: 'var(--action-blue-subtle-pressed)',\n activeBorderColor: 'var(--action-blue-subtle-pressed)',\n },\n },\n solidYellow: {\n container: {\n bg: 'var(--action-yellow-solid)',\n borderColor: 'var(--action-yellow-solid)',\n color: 'var(--action-yellow-solid-inverse)',\n hoverBg: 'var(--action-yellow-solid-hover)',\n hoverBorderColor: 'var(--action-yellow-solid-hover)',\n activeBg: 'var(--action-yellow-solid-pressed)',\n activeBorderColor: 'var(--action-yellow-solid-pressed)',\n },\n },\n // subtleYellow is an internal variant, used in notification; based on primaryDark\n subtleYellow: {\n container: {\n bg: 'var(--action-yellow-subtle)',\n borderColor: 'var(--action-yellow-subtle)',\n color: 'var(--action-yellow-subtle-inverse)',\n hoverBg: 'var(--action-yellow-subtle-hover)',\n hoverBorderColor: 'var(--action-yellow-subtle-hover)',\n activeBg: 'var(--action-yellow-subtle-pressed)',\n activeBorderColor: 'var(--action-yellow-subtle-pressed)',\n },\n },\n menuLight: {\n container: {\n bg: '#ffffff',\n hoverBg: '#D3EEF8',\n activeBg: '#E9F7FC',\n disabledBg: '#F8F7F7',\n borderColor: 'transparent',\n hoverBorderColor: '#003591',\n activeBorderColor: '#003591',\n color: '#1A1A19',\n hoverColor: '#1A1A19',\n activeColor: '#003591',\n disabledColor: '#908D89',\n disabledBorderColor: 'transparent',\n disabledOpacity: '1',\n },\n },\n menuDark: {\n container: {\n bg: '#0F204B',\n hoverBg: '#003591',\n activeBg: '#0041B2',\n disabledBg: '#0F204B',\n borderColor: 'transparent',\n hoverBorderColor: '#91FFB4',\n activeBorderColor: '#91FFB4',\n color: '#FFFFFF',\n hoverColor: '#FFFFFF',\n activeColor: '#91FFBA',\n disabledColor: '#FFFFFF',\n disabledBorderColor: 'transparent',\n disabledOpacity: '1',\n },\n },\n}\n\n// buttonGroupDefault is an internal variant, used in ButtonGroup; based on secondaryDark\nvariants.buttonGroupDefault = {\n container: {\n bg: 'var(--color-opacity-none)',\n borderColor: 'var(--control-placeholder)',\n color: 'var(--action-brand-solid)',\n hoverBg: 'var(--action-brand-subtle-hover)',\n activeBg: 'var(--action-brand-subtle-pressed)',\n },\n}\n\n// buttonGroupRounded is an internal variant\nvariants.buttonGroupRounded = {\n container: {\n bg: 'var(--background-default)',\n borderColor: 'var(--utility-border-subtle)',\n color: 'var(--foreground-default)',\n hoverBg: 'var(--action-brand-subtle-hover)',\n hoverBorderColor: 'var(--action-brand-subtle-hover)',\n hoverColor: 'var(--action-brand-subtle-inverse)',\n activeBg: 'var(--action-brand-solid-pressed)',\n activeBorderColor: 'var(--action-brand-solid-pressed)',\n activeColor: 'var(--action-brand-solid-inverse)',\n borderRadius: '1000',\n marginRight: 'var(--vui-button-group-rounded-spacing, 22px)',\n },\n}\n\nexport default {\n baseStyle,\n defaultProps,\n parts,\n sizes,\n variants,\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"theme.js","names":[],"sources":["../../src/button/theme.ts"],"sourcesContent":["const baseStyle = {}\n\nconst defaultProps = {\n size: 'lg',\n variant: 'primaryDark',\n fontWeight: 'medium',\n}\n\nconst parts = ['container', 'icon', 'text']\n\nconst sizes = {\n sm: {\n container: {\n fontSize: 'xs',\n h: 24,\n minW: 48,\n spaceX: 4,\n },\n icon: {\n size: 'xs',\n mr: '5px', // spaceX(4) - border(1) + 1 = 4px, but add 1px for better spacing\n ml: '5px',\n },\n text: {},\n },\n md: {\n container: {\n fontSize: 'sm',\n h: 32,\n minW: 64,\n spaceX: 6,\n },\n icon: {\n size: 'sm',\n mr: '7px', // spaceX(6) - border(1) + 1 = 6px + 1px\n ml: '7px',\n },\n text: {},\n },\n lg: {\n container: {\n fontSize: 'md',\n h: 40,\n minW: 80,\n spaceX: 8,\n },\n icon: {\n size: 'md',\n mr: '9px', // spaceX(8) - border(1) + 1 = 8px + 1px\n ml: '9px',\n },\n text: {},\n },\n xl: {\n container: {\n fontSize: 'lg',\n h: 48,\n minW: 96,\n spaceX: 10,\n },\n icon: {\n size: 'lg',\n mr: '11px', // spaceX(10) - border(1) + 1 = 10px + 1px\n ml: '11px',\n },\n text: {},\n },\n}\n\nconst variants: Record<string, Record<string, Record<string, string>>> = {\n primaryDark: {\n container: {\n bg: 'var(--action-brand-solid)',\n borderColor: 'var(--action-brand-solid)',\n color: 'var(--action-brand-solid-inverse)',\n hoverBg: 'var(--action-brand-solid-hover)',\n activeBg: 'var(--action-brand-solid-pressed)',\n },\n },\n secondaryDark: {\n container: {\n bg: 'var(--color-opacity-none)',\n borderColor: 'var(--action-brand-solid)',\n color: 'var(--action-brand-solid)',\n hoverBg: 'var(--action-brand-subtle-hover)',\n activeBg: 'var(--action-brand-subtle-pressed)',\n },\n },\n tertiaryDark: {\n container: {\n bg: 'var(--color-opacity-none)',\n borderColor: 'var(--color-opacity-none)',\n color: 'var(--action-brand-solid)',\n hoverBg: 'var(--action-brand-subtle-hover)',\n activeBg: 'var(--action-brand-subtle-pressed)',\n },\n },\n // TODO: Rename to 'primaryContrast', 'secondaryContrast', 'tertiaryContrast' in future breaking change\n // to align with VUI Next token naming (--action-contrast-*). Requires migration guide for consumers.\n primaryLight: {\n container: {\n bg: 'var(--action-contrast-solid)',\n borderColor: 'var(--action-contrast-solid)',\n color: 'var(--action-contrast-solid-inverse)',\n hoverBg: 'var(--action-contrast-solid-hover)',\n activeBg: 'var(--action-contrast-solid-pressed)',\n },\n },\n secondaryLight: {\n container: {\n bg: 'var(--color-opacity-none)',\n borderColor: 'var(--action-contrast-solid)',\n color: 'var(--action-contrast-solid)',\n hoverBg: 'var(--action-contrast-subtle-hover)',\n hoverColor: 'var(--action-contrast-solid)',\n activeBg: 'var(--action-contrast-subtle-pressed)',\n activeColor: 'var(--action-contrast-solid)',\n },\n },\n tertiaryLight: {\n container: {\n bg: 'var(--color-opacity-none)',\n borderColor: 'var(--color-opacity-none)',\n color: 'var(--action-contrast-solid)',\n hoverBg: 'var(--action-contrast-subtle-hover)',\n hoverColor: 'var(--action-contrast-solid)',\n activeBg: 'var(--action-contrast-subtle-pressed)',\n activeColor: 'var(--action-contrast-solid)',\n },\n },\n\n solidGreen: {\n container: {\n bg: 'var(--action-success-solid)',\n borderColor: 'var(--action-success-solid)',\n color: 'var(--action-success-solid-inverse)',\n hoverBg: 'var(--action-success-solid-hover)',\n hoverBorderColor: 'var(--action-success-solid-hover)',\n activeBg: 'var(--action-success-solid-pressed)',\n activeBorderColor: 'var(--action-success-solid-pressed)',\n },\n },\n\n solidRed: {\n container: {\n bg: 'var(--action-danger-solid)',\n borderColor: 'var(--action-danger-solid)',\n color: 'var(--action-danger-solid-inverse)',\n hoverBg: 'var(--action-danger-solid-hover)',\n hoverBorderColor: 'var(--action-danger-solid-hover)',\n activeBg: 'var(--action-danger-solid-pressed)',\n activeBorderColor: 'var(--action-danger-solid-pressed)',\n },\n },\n}\n\n// buttonGroupDefault is an internal variant, used in ButtonGroup; based on secondaryDark\nvariants.buttonGroupDefault = {\n container: {\n bg: 'var(--color-opacity-none)',\n borderColor: 'var(--control-placeholder)',\n color: 'var(--action-brand-solid)',\n hoverBg: 'var(--action-brand-subtle-hover)',\n activeBg: 'var(--action-brand-subtle-pressed)',\n },\n}\n\n// buttonGroupRounded is an internal variant\nvariants.buttonGroupRounded = {\n container: {\n bg: 'var(--background-default)',\n borderColor: 'var(--utility-border-subtle)',\n color: 'var(--foreground-default)',\n hoverBg: 'var(--action-brand-subtle-hover)',\n hoverBorderColor: 'var(--action-brand-subtle-hover)',\n hoverColor: 'var(--action-brand-subtle-inverse)',\n activeBg: 'var(--action-brand-solid-pressed)',\n activeBorderColor: 'var(--action-brand-solid-pressed)',\n activeColor: 'var(--action-brand-solid-inverse)',\n borderRadius: '1000',\n marginRight: 'var(--vui-button-group-rounded-spacing, 22px)',\n },\n}\n\nexport default {\n baseStyle,\n defaultProps,\n parts,\n sizes,\n variants,\n}\n"],"mappings":";AAAA,MAAM,YAAY,EAAE;AAEpB,MAAM,eAAe;CACnB,MAAM;CACN,SAAS;CACT,YAAY;CACb;AAED,MAAM,QAAQ;CAAC;CAAa;CAAQ;CAAO;AAE3C,MAAM,QAAQ;CACZ,IAAI;EACF,WAAW;GACT,UAAU;GACV,GAAG;GACH,MAAM;GACN,QAAQ;GACT;EACD,MAAM;GACJ,MAAM;GACN,IAAI;GACJ,IAAI;GACL;EACD,MAAM,EAAE;EACT;CACD,IAAI;EACF,WAAW;GACT,UAAU;GACV,GAAG;GACH,MAAM;GACN,QAAQ;GACT;EACD,MAAM;GACJ,MAAM;GACN,IAAI;GACJ,IAAI;GACL;EACD,MAAM,EAAE;EACT;CACD,IAAI;EACF,WAAW;GACT,UAAU;GACV,GAAG;GACH,MAAM;GACN,QAAQ;GACT;EACD,MAAM;GACJ,MAAM;GACN,IAAI;GACJ,IAAI;GACL;EACD,MAAM,EAAE;EACT;CACD,IAAI;EACF,WAAW;GACT,UAAU;GACV,GAAG;GACH,MAAM;GACN,QAAQ;GACT;EACD,MAAM;GACJ,MAAM;GACN,IAAI;GACJ,IAAI;GACL;EACD,MAAM,EAAE;EACT;CACF;AAED,MAAM,WAAmE;CACvE,aAAa,EACX,WAAW;EACT,IAAI;EACJ,aAAa;EACb,OAAO;EACP,SAAS;EACT,UAAU;EACX,EACF;CACD,eAAe,EACb,WAAW;EACT,IAAI;EACJ,aAAa;EACb,OAAO;EACP,SAAS;EACT,UAAU;EACX,EACF;CACD,cAAc,EACZ,WAAW;EACT,IAAI;EACJ,aAAa;EACb,OAAO;EACP,SAAS;EACT,UAAU;EACX,EACF;CAGD,cAAc,EACZ,WAAW;EACT,IAAI;EACJ,aAAa;EACb,OAAO;EACP,SAAS;EACT,UAAU;EACX,EACF;CACD,gBAAgB,EACd,WAAW;EACT,IAAI;EACJ,aAAa;EACb,OAAO;EACP,SAAS;EACT,YAAY;EACZ,UAAU;EACV,aAAa;EACd,EACF;CACD,eAAe,EACb,WAAW;EACT,IAAI;EACJ,aAAa;EACb,OAAO;EACP,SAAS;EACT,YAAY;EACZ,UAAU;EACV,aAAa;EACd,EACF;CAED,YAAY,EACV,WAAW;EACT,IAAI;EACJ,aAAa;EACb,OAAO;EACP,SAAS;EACT,kBAAkB;EAClB,UAAU;EACV,mBAAmB;EACpB,EACF;CAED,UAAU,EACR,WAAW;EACT,IAAI;EACJ,aAAa;EACb,OAAO;EACP,SAAS;EACT,kBAAkB;EAClB,UAAU;EACV,mBAAmB;EACpB,EACF;CACF;AAGD,SAAS,qBAAqB,EAC5B,WAAW;CACT,IAAI;CACJ,aAAa;CACb,OAAO;CACP,SAAS;CACT,UAAU;CACX,EACF;AAGD,SAAS,qBAAqB,EAC5B,WAAW;CACT,IAAI;CACJ,aAAa;CACb,OAAO;CACP,SAAS;CACT,kBAAkB;CAClB,YAAY;CACZ,UAAU;CACV,mBAAmB;CACnB,aAAa;CACb,cAAc;CACd,aAAa;CACd,EACF;AAED,oBAAe;CACb;CACA;CACA;CACA;CACA;CACD"}
|
|
@@ -12,6 +12,7 @@ const NotificationAction = vui((props, ref) => {
|
|
|
12
12
|
const { children, className, ...rest } = props;
|
|
13
13
|
const styles = useStyleConfig("Notification", useNotificationContext());
|
|
14
14
|
const enhancedChild = isValidElement(children) && typeof children.type !== "string" ? cloneElement(children, {
|
|
15
|
+
size: "md",
|
|
15
16
|
bg: styles.action?.bg,
|
|
16
17
|
borderColor: styles.action?.borderColor,
|
|
17
18
|
color: styles.action?.color,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notificationAction.js","names":[],"sources":["../../src/notification/notificationAction.tsx"],"sourcesContent":["import { cloneElement, isValidElement } from 'react'\n\nimport Box from '../box'\nimport type { BoxProps } from '../box'\nimport { useStyleConfig, vui } from '../core'\nimport { cs } from '../utils'\nimport { useNotificationContext } from './context'\n\n/** Displays an action button within the Notification. */\nexport const NotificationAction = vui<'div', BoxProps>((props, ref) => {\n const { children, className, ...rest } = props\n const styles = useStyleConfig('Notification', useNotificationContext())\n\n // Clone child and apply color overrides from notification theme\n const enhancedChild =\n isValidElement(children) && typeof children.type !== 'string'\n ? cloneElement(children as any, {\n bg: styles.action?.bg,\n borderColor: styles.action?.borderColor,\n color: styles.action?.color,\n hoverBg: styles.action?.hoverBg,\n hoverColor: styles.action?.hoverColor,\n activeBg: styles.action?.activeBg,\n activeColor: styles.action?.activeColor,\n ...(children.props as any),\n })\n : children\n\n return (\n <Box className={cs('vui-notificationAction', className)} ref={ref} {...styles.actionBox} {...rest}>\n {enhancedChild}\n </Box>\n )\n})\n\nNotificationAction.displayName = 'NotificationAction'\nexport default NotificationAction\n"],"mappings":";;;;;;;;;;AASA,MAAa,qBAAqB,KAAsB,OAAO,QAAQ;CACrE,MAAM,EAAE,UAAU,WAAW,GAAG,SAAS;CACzC,MAAM,SAAS,eAAe,gBAAgB,wBAAwB,CAAC;CAGvE,MAAM,gBACJ,eAAe,SAAS,IAAI,OAAO,SAAS,SAAS,WACjD,aAAa,UAAiB;EAC5B,IAAI,OAAO,QAAQ;EACnB,aAAa,OAAO,QAAQ;EAC5B,OAAO,OAAO,QAAQ;EACtB,SAAS,OAAO,QAAQ;EACxB,YAAY,OAAO,QAAQ;EAC3B,UAAU,OAAO,QAAQ;EACzB,aAAa,OAAO,QAAQ;EAC5B,GAAI,SAAS;EACd,CAAC,GACF;AAEN,QACE,oBAAC;EAAI,WAAW,GAAG,0BAA0B,UAAU;EAAO;EAAK,GAAI,OAAO;EAAW,GAAI;YAC1F;GACG;EAER;AAEF,mBAAmB,cAAc"}
|
|
1
|
+
{"version":3,"file":"notificationAction.js","names":[],"sources":["../../src/notification/notificationAction.tsx"],"sourcesContent":["import { cloneElement, isValidElement } from 'react'\n\nimport Box from '../box'\nimport type { BoxProps } from '../box'\nimport { useStyleConfig, vui } from '../core'\nimport { cs } from '../utils'\nimport { useNotificationContext } from './context'\n\n/** Displays an action button within the Notification. */\nexport const NotificationAction = vui<'div', BoxProps>((props, ref) => {\n const { children, className, ...rest } = props\n const styles = useStyleConfig('Notification', useNotificationContext())\n\n // Clone child and apply color overrides from notification theme\n const enhancedChild =\n isValidElement(children) && typeof children.type !== 'string'\n ? cloneElement(children as any, {\n size: 'md',\n bg: styles.action?.bg,\n borderColor: styles.action?.borderColor,\n color: styles.action?.color,\n hoverBg: styles.action?.hoverBg,\n hoverColor: styles.action?.hoverColor,\n activeBg: styles.action?.activeBg,\n activeColor: styles.action?.activeColor,\n ...(children.props as any),\n })\n : children\n\n return (\n <Box className={cs('vui-notificationAction', className)} ref={ref} {...styles.actionBox} {...rest}>\n {enhancedChild}\n </Box>\n )\n})\n\nNotificationAction.displayName = 'NotificationAction'\nexport default NotificationAction\n"],"mappings":";;;;;;;;;;AASA,MAAa,qBAAqB,KAAsB,OAAO,QAAQ;CACrE,MAAM,EAAE,UAAU,WAAW,GAAG,SAAS;CACzC,MAAM,SAAS,eAAe,gBAAgB,wBAAwB,CAAC;CAGvE,MAAM,gBACJ,eAAe,SAAS,IAAI,OAAO,SAAS,SAAS,WACjD,aAAa,UAAiB;EAC5B,MAAM;EACN,IAAI,OAAO,QAAQ;EACnB,aAAa,OAAO,QAAQ;EAC5B,OAAO,OAAO,QAAQ;EACtB,SAAS,OAAO,QAAQ;EACxB,YAAY,OAAO,QAAQ;EAC3B,UAAU,OAAO,QAAQ;EACzB,aAAa,OAAO,QAAQ;EAC5B,GAAI,SAAS;EACd,CAAC,GACF;AAEN,QACE,oBAAC;EAAI,WAAW,GAAG,0BAA0B,UAAU;EAAO;EAAK,GAAI,OAAO;EAAW,GAAI;YAC1F;GACG;EAER;AAEF,mBAAmB,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","names":[],"sources":["../../src/notification/theme.ts"],"sourcesContent":["const baseStyle = {\n container: {\n borderRadius: 'var(--notification-border-radius, md)',\n borderWidth: 'var(--notification-border-width, 1px)',\n },\n button: {\n mt: 'var(--notification-button-margin-top, 8px)',\n mr: 'var(--notification-button-margin-right, 8px)',\n mb: 'var(--notification-button-margin-bottom, 0)',\n ml: 'var(--notification-button-margin-left, 0)',\n minW: 'var(--notification-button-width, 32px)',\n h: 'var(--notification-button-height, 32px)',\n },\n icon: {\n ml: 'var(--notification-icon-margin-left, 16px)',\n },\n text: {\n flex: '1',\n lineHeight: 'var(--notification-text-line-height, 24px)',\n minW: 0,\n mx: 'var(--notification-text-margin-x, 16px)',\n my: 'var(--notification-text-margin-y, 16px)',\n },\n actionBox: {\n alignSelf: 'flex-end',\n my: 'var(--notification-action-margin-y, 8px)',\n
|
|
1
|
+
{"version":3,"file":"theme.js","names":[],"sources":["../../src/notification/theme.ts"],"sourcesContent":["const baseStyle = {\n container: {\n borderRadius: 'var(--notification-border-radius, md)',\n borderWidth: 'var(--notification-border-width, 1px)',\n },\n button: {\n mt: 'var(--notification-button-margin-top, 8px)',\n mr: 'var(--notification-button-margin-right, 8px)',\n mb: 'var(--notification-button-margin-bottom, 0)',\n ml: 'var(--notification-button-margin-left, 0)',\n minW: 'var(--notification-button-width, 32px)',\n h: 'var(--notification-button-height, 32px)',\n },\n icon: {\n ml: 'var(--notification-icon-margin-left, 16px)',\n },\n text: {\n flex: '1',\n lineHeight: 'var(--notification-text-line-height, 24px)',\n minW: 0,\n mx: 'var(--notification-text-margin-x, 16px)',\n my: 'var(--notification-text-margin-y, 16px)',\n },\n actionBox: {\n alignSelf: 'flex-end',\n my: 'var(--notification-action-margin-y, 8px)',\n mx: 'var(--notification-action-margin-x, 8px)',\n },\n}\n\nconst parts = ['container', 'button', 'icon', 'text', 'title', 'actionBox', 'action']\n\nconst sizes = {}\n\nconst subtleBlue = {\n container: {\n bg: 'var(--action-brand-subtle)',\n borderColor: 'var(--action-brand-inverse)',\n color: 'var(--action-brand-subtle-inverse)',\n },\n button: {\n borderColor: 'var(--color-opacity-none)',\n color: 'var(--action-brand-subtle-inverse)',\n hoverBg: 'var(--action-brand-subtle-hover)',\n hoverColor: 'var(--action-brand-subtle-inverse)',\n activeBg: 'var(--action-brand-subtle-pressed)',\n activeColor: 'var(--action-brand-subtle-inverse)',\n },\n action: {\n bg: 'var(--action-brand-solid)',\n borderColor: 'var(--action-brand-solid)',\n color: 'var(--action-brand-solid-inverse)',\n hoverBg: 'var(--action-brand-solid-hover)',\n hoverColor: 'var(--action-brand-solid-inverse)',\n activeBg: 'var(--action-brand-solid-pressed)',\n activeColor: 'var(--action-brand-solid-inverse)',\n },\n}\n\nconst subtleRed = {\n container: {\n bg: 'var(--action-danger-subtle)',\n borderColor: 'var(--action-danger-inverse)',\n color: 'var(--action-danger-subtle-inverse)',\n },\n button: {\n borderColor: 'var(--color-opacity-none)',\n color: 'var(--action-danger-subtle-inverse)',\n hoverBg: 'var(--action-danger-subtle-hover)',\n hoverColor: 'var(--action-danger-subtle-inverse)',\n activeBg: 'var(--action-danger-subtle-pressed)',\n activeColor: 'var(--action-danger-subtle-inverse)',\n },\n action: {\n bg: 'var(--action-danger-solid)',\n borderColor: 'var(--action-danger-solid)',\n color: 'var(--action-danger-solid-inverse)',\n hoverBg: 'var(--action-danger-solid-hover)',\n hoverColor: 'var(--action-danger-solid-inverse)',\n activeBg: 'var(--action-danger-solid-pressed)',\n activeColor: 'var(--action-danger-solid-inverse)',\n },\n}\n\nconst subtleYellow = {\n container: {\n bg: 'var(--action-yellow-subtle)',\n borderColor: 'var(--action-yellow-inverse)',\n color: 'var(--action-yellow-subtle-inverse)',\n },\n button: {\n borderColor: 'var(--color-opacity-none)',\n color: 'var(--action-yellow-subtle-inverse)',\n hoverBg: 'var(--action-yellow-subtle-hover)',\n hoverColor: 'var(--action-yellow-subtle-inverse)',\n activeBg: 'var(--action-yellow-subtle-pressed)',\n activeColor: 'var(--action-yellow-subtle-inverse)',\n },\n action: {\n bg: 'var(--action-yellow-solid)',\n borderColor: 'var(--action-yellow-solid)',\n color: 'var(--action-yellow-solid-inverse)',\n hoverBg: 'var(--action-yellow-solid-hover)',\n hoverColor: 'var(--action-yellow-solid-inverse)',\n activeBg: 'var(--action-yellow-solid-pressed)',\n activeColor: 'var(--action-yellow-solid-inverse)',\n },\n}\n\nconst subtleGreen = {\n container: {\n bg: 'var(--action-success-subtle)',\n borderColor: 'var(--action-success-inverse)',\n color: 'var(--action-success-subtle-inverse)',\n },\n button: {\n borderColor: 'var(--color-opacity-none)',\n color: 'var(--action-success-subtle-inverse)',\n hoverBg: 'var(--action-success-subtle-hover)',\n hoverColor: 'var(--action-success-subtle-inverse)',\n activeBg: 'var(--action-success-subtle-pressed)',\n activeColor: 'var(--action-success-subtle-inverse)',\n },\n action: {\n bg: 'var(--action-success-solid)',\n borderColor: 'var(--action-success-solid)',\n color: 'var(--action-success-solid-inverse)',\n hoverBg: 'var(--action-success-solid-hover)',\n hoverColor: 'var(--action-success-solid-inverse)',\n activeBg: 'var(--action-success-solid-pressed)',\n activeColor: 'var(--action-success-solid-inverse)',\n },\n}\n\nconst variants = {\n subtleBlue,\n subtleRed,\n subtleYellow,\n subtleGreen,\n}\n\nexport default {\n baseStyle,\n parts,\n sizes,\n variants,\n}\n"],"mappings":";AAAA,MAAM,YAAY;CAChB,WAAW;EACT,cAAc;EACd,aAAa;EACd;CACD,QAAQ;EACN,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,MAAM;EACN,GAAG;EACJ;CACD,MAAM,EACJ,IAAI,8CACL;CACD,MAAM;EACJ,MAAM;EACN,YAAY;EACZ,MAAM;EACN,IAAI;EACJ,IAAI;EACL;CACD,WAAW;EACT,WAAW;EACX,IAAI;EACJ,IAAI;EACL;CACF;AAED,MAAM,QAAQ;CAAC;CAAa;CAAU;CAAQ;CAAQ;CAAS;CAAa;CAAS;AAErF,MAAM,QAAQ,EAAE;AAsGhB,MAAM,WAAW;CACf,YArGiB;EACjB,WAAW;GACT,IAAI;GACJ,aAAa;GACb,OAAO;GACR;EACD,QAAQ;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACT,YAAY;GACZ,UAAU;GACV,aAAa;GACd;EACD,QAAQ;GACN,IAAI;GACJ,aAAa;GACb,OAAO;GACP,SAAS;GACT,YAAY;GACZ,UAAU;GACV,aAAa;GACd;EACF;CA+EC,WA7EgB;EAChB,WAAW;GACT,IAAI;GACJ,aAAa;GACb,OAAO;GACR;EACD,QAAQ;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACT,YAAY;GACZ,UAAU;GACV,aAAa;GACd;EACD,QAAQ;GACN,IAAI;GACJ,aAAa;GACb,OAAO;GACP,SAAS;GACT,YAAY;GACZ,UAAU;GACV,aAAa;GACd;EACF;CAuDC,cArDmB;EACnB,WAAW;GACT,IAAI;GACJ,aAAa;GACb,OAAO;GACR;EACD,QAAQ;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACT,YAAY;GACZ,UAAU;GACV,aAAa;GACd;EACD,QAAQ;GACN,IAAI;GACJ,aAAa;GACb,OAAO;GACP,SAAS;GACT,YAAY;GACZ,UAAU;GACV,aAAa;GACd;EACF;CA+BC,aA7BkB;EAClB,WAAW;GACT,IAAI;GACJ,aAAa;GACb,OAAO;GACR;EACD,QAAQ;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACT,YAAY;GACZ,UAAU;GACV,aAAa;GACd;EACD,QAAQ;GACN,IAAI;GACJ,aAAa;GACb,OAAO;GACP,SAAS;GACT,YAAY;GACZ,UAAU;GACV,aAAa;GACd;EACF;CAOA;AAED,oBAAe;CACb;CACA;CACA;CACA;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidemenuItemV2.d.ts","names":[],"sources":["../../src/sidemenuV2/sidemenuItemV2.tsx"],"mappings":";;;;;;;cAmFa,cAAA,
|
|
1
|
+
{"version":3,"file":"sidemenuItemV2.d.ts","names":[],"sources":["../../src/sidemenuV2/sidemenuItemV2.tsx"],"mappings":";;;;;;;cAmFa,cAAA,EAoOP,YAAA,QAAoB,mBAAA"}
|
|
@@ -103,10 +103,7 @@ const SidemenuItemV2 = vui((props, ref) => {
|
|
|
103
103
|
size,
|
|
104
104
|
level
|
|
105
105
|
]);
|
|
106
|
-
const themeValues = useMemo(() => ({
|
|
107
|
-
activeColor: isDark ? "digiGreen.main" : "seaBlue.main",
|
|
108
|
-
buttonVariant: isDark ? "menuDark" : "menuLight"
|
|
109
|
-
}), [isDark]);
|
|
106
|
+
const themeValues = useMemo(() => ({ activeColor: isDark ? "digiGreen.main" : "seaBlue.main" }), [isDark]);
|
|
110
107
|
const handleClick = useCallback((event) => {
|
|
111
108
|
if (!computedStates.isDisabled) {
|
|
112
109
|
const targetTag = event.target;
|
|
@@ -122,12 +119,13 @@ const SidemenuItemV2 = vui((props, ref) => {
|
|
|
122
119
|
}, [onClick, computedStates.isDisabled]);
|
|
123
120
|
const buttonStyles = useMemo(() => ({
|
|
124
121
|
...styles && "item" in styles && styles.item ? styles.item : {},
|
|
122
|
+
...styles && "button" in styles && styles.button ? styles.button : {},
|
|
125
123
|
borderLeftColor: isExactlyActive ? themeValues.activeColor : "transparent",
|
|
126
124
|
transitionProperty: "background-color, border-color, color, transform, opacity",
|
|
127
125
|
size: computedStates.buttonSize,
|
|
128
126
|
h: computedStates.buttonSize === "lg" ? 40 : 36,
|
|
129
127
|
iconSize: computedStates.iconSize,
|
|
130
|
-
variant:
|
|
128
|
+
variant: "tertiaryDark",
|
|
131
129
|
onClick: handleClick,
|
|
132
130
|
disabled: computedStates.isDisabled,
|
|
133
131
|
role: "button",
|
|
@@ -150,7 +148,7 @@ const SidemenuItemV2 = vui((props, ref) => {
|
|
|
150
148
|
return {
|
|
151
149
|
"aria-label": ariaLabel,
|
|
152
150
|
className: "vui-sidemenu-item-expand",
|
|
153
|
-
variant:
|
|
151
|
+
variant: "tertiaryDark",
|
|
154
152
|
icon: chevronIcon,
|
|
155
153
|
size: "sm",
|
|
156
154
|
pl: "4px",
|
|
@@ -162,7 +160,7 @@ const SidemenuItemV2 = vui((props, ref) => {
|
|
|
162
160
|
hoverBg: "transparent",
|
|
163
161
|
activeBg: "transparent"
|
|
164
162
|
};
|
|
165
|
-
}, [isSubmenuOpen
|
|
163
|
+
}, [isSubmenuOpen]);
|
|
166
164
|
const renderPopover = () => /* @__PURE__ */ jsx(SidemenuPopover, {
|
|
167
165
|
isDark,
|
|
168
166
|
className,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidemenuItemV2.js","names":["colors"],"sources":["../../src/sidemenuV2/sidemenuItemV2.tsx"],"sourcesContent":["import type { MouseEvent } from 'react'\nimport { useEffect, useMemo, useCallback } from 'react'\n\nimport Box from '../box'\nimport Button from '../button'\nimport type { VuiComponent } from '../core'\nimport { omitThemingProps, styled, th, vui } from '../core'\nimport Popover from '../popover'\nimport { colors } from '../theme'\nimport Tooltip from '../tooltip'\nimport { cs, generateMenuItemId } from '../utils'\nimport { collapsedWidth, expandedWidth } from './consts'\nimport SidemenuItemContent from './SidemenuItemContent'\nimport type { SidemenuItemV2Props } from './sidemenuV2.types'\nimport useSidemenuItem from './useSidemenuItem'\n\nexport const PopoverHovered = styled.div<{ hoverColor: string }>`\n &:hover .vui-sidemenu-item-popover .vui-button.vui-button {\n background: ${p => th.color(p.hoverColor)};\n }\n &:hover div:last-child .vui-sidemenu-item-content > .vui-box > .vui-button.vui-button {\n background: ${p => th.color(p.hoverColor)};\n }\n`\n\n// SidemenuPopover component extracted from inline Popover logic\nconst SidemenuPopover = ({\n isDark,\n className,\n buttonStyles,\n isExactlyActive,\n icon,\n title,\n isMenuExpanded,\n children,\n}: {\n isDark: boolean\n className?: string\n buttonStyles: any\n isExactlyActive: boolean\n icon?: any\n title: string\n isMenuExpanded: boolean\n children: React.ReactNode\n}) => (\n <Popover offset={[0, collapsedWidth - expandedWidth - 2]} placement=\"right-start\" trigger=\"mouseenter\">\n {({ isOpen }: { isOpen: boolean }) => (\n <PopoverHovered hoverColor={isDark ? colors.seaBlue.main : colors.skyBlue.selected}>\n <Popover.Trigger as={Box} className={cs('vui-sidemenu-item-popover', className)}>\n <Button\n {...buttonStyles}\n borderLeft={`3px solid ${isDark ? 'digiGreen.main' : 'seaBlue.main'}`}\n isActive={isExactlyActive}\n className={cs('focusAsBorder')}\n >\n <SidemenuItemContent\n icon={icon}\n iconSize={buttonStyles.iconSize}\n title={title}\n isMenuExpanded={isMenuExpanded}\n />\n </Button>\n </Popover.Trigger>\n <Popover.Content elevation=\"none\" className={cs('vui-sidemenu-item-content', className)}>\n <Box flexDirection=\"column\" justifyContent=\"start\" w=\"100%\">\n <Button\n {...buttonStyles}\n borderLeftColor={'transparent!important'}\n minW={'240px'}\n isActive={isOpen && isExactlyActive}\n className={cs('focusAsBorder')}\n >\n <SidemenuItemContent title={title} isInPopover={true} />\n </Button>\n {children}\n </Box>\n </Popover.Content>\n </PopoverHovered>\n )}\n </Popover>\n)\n\n/** A menu item. */\nexport const SidemenuItemV2 = vui<'button', SidemenuItemV2Props>((props, ref) => {\n const {\n children,\n className,\n disabled = false,\n icon,\n isActive = false,\n isExpanded = true,\n itemId,\n level = 0,\n onBottom = false,\n onClick,\n onCollapse,\n onExpand,\n title,\n ...rest\n } = omitThemingProps(props)\n\n // Use consistent itemId generation - prioritize provided itemId, then use utility function\n const computedItemId = itemId || generateMenuItemId(title, level) || `item-${Math.random().toString(36).substr(2, 9)}`\n\n const { isDark, isMenuExpanded, styles, size, isSubmenuOpen, toggleSubmenu } = useSidemenuItem(computedItemId)\n\n // Use the isActive prop directly - parent should handle exact path matching\n const isExactlyActive = isActive\n\n useEffect(() => {\n // Only call onExpand/onCollapse if the main menu is expanded\n // This prevents child items from expanding the main menu when it's collapsed\n if (isMenuExpanded) {\n if (isSubmenuOpen) onExpand?.()\n if (!isSubmenuOpen) onCollapse?.()\n }\n }, [isSubmenuOpen, onExpand, onCollapse, isMenuExpanded])\n\n // Memoized computed values for better performance\n const computedStates = useMemo(() => {\n const hasChildren = !!children\n const isSubmenuCollapsed = hasChildren && !isSubmenuOpen\n // Only allow submenu expansion when main menu is expanded\n const isSubmenuExpanded = hasChildren && isSubmenuOpen && isMenuExpanded\n const shouldShowExpandButton = hasChildren && isMenuExpanded\n const buttonSize = level < 1 ? ('lg' as const) : ('md' as const)\n const iconSize = level < 1 ? ('sm' as const) : ('xs' as const)\n\n const states = {\n hasChildren,\n hasChildrenCollapsed: isSubmenuCollapsed,\n hasChildrenExpanded: isSubmenuExpanded,\n shouldShowExpandButton,\n buttonSize,\n iconSize,\n isDisabled: disabled,\n shouldShowBorder: !hasChildren || isSubmenuOpen,\n }\n\n return states\n }, [children, isSubmenuOpen, isMenuExpanded, disabled, size, level])\n\n // Memoized theme values to prevent recalculation\n const themeValues = useMemo(\n () => ({\n activeColor: isDark ? 'digiGreen.main' : 'seaBlue.main',\n buttonVariant: isDark ? 'menuDark' : 'menuLight',\n }),\n [isDark],\n )\n\n // Optimized stable callback\n const handleClick = useCallback(\n (event: MouseEvent) => {\n if (!computedStates.isDisabled) {\n const targetTag = event.target as HTMLElement\n if (\n (targetTag.classList.contains('vui-tagText') || targetTag.classList.contains('vui-tag')) &&\n typeof window !== 'undefined' &&\n (targetTag.parentElement?.dataset.link || targetTag?.dataset.link)\n ) {\n const url = atob(targetTag.parentElement?.dataset.link ?? targetTag?.dataset.link ?? '')\n window.open(url, '_blank', 'noopener,noreferrer')\n } else {\n event?.stopPropagation?.()\n onClick?.()\n }\n }\n toggleSubmenu?.()\n },\n [onClick, computedStates.isDisabled],\n )\n\n // Memoized button styles - Major performance improvement\n const buttonStyles = useMemo(\n () => ({\n // Get base item styles from theme\n ...(styles && 'item' in styles && styles.item ? styles.item : {}),\n\n // Dynamic border color based on active state\n borderLeftColor: isExactlyActive ? themeValues.activeColor : 'transparent',\n\n // Animation properties (enhanced from theme)\n transitionProperty: 'background-color, border-color, color, transform, opacity',\n\n // Button specific properties\n size: computedStates.buttonSize,\n h: computedStates.buttonSize === 'lg' ? 40 : 36,\n iconSize: computedStates.iconSize,\n variant: themeValues.buttonVariant,\n\n // Event handlers\n onClick: handleClick,\n disabled: computedStates.isDisabled,\n\n // Accessibility\n role: 'button',\n tabIndex: computedStates.isDisabled ? -1 : 0,\n 'aria-disabled': computedStates.isDisabled,\n 'aria-pressed': isExactlyActive,\n\n // Merge custom props\n ...rest,\n }),\n [\n // Dependencies grouped logically - simplified since computedStates contains most values\n styles,\n computedStates,\n isExactlyActive,\n themeValues,\n handleClick,\n rest,\n ],\n )\n\n // Memoized expand/collapse button properties\n const expandButtonProps = useMemo(() => {\n const isExpanded = isSubmenuOpen\n const chevronIcon = isExpanded ? 'falChevronUp' : 'falChevronDown'\n const ariaLabel = isExpanded ? 'Collapse' : 'Expand'\n\n return {\n 'aria-label': ariaLabel,\n className: 'vui-sidemenu-item-expand',\n variant: themeValues.buttonVariant,\n icon: chevronIcon,\n size: 'sm' as const,\n pl: '4px',\n pr: '16px',\n ml: 'auto',\n h: '100%',\n border: 'none',\n bg: 'transparent',\n hoverBg: 'transparent',\n activeBg: 'transparent',\n }\n }, [isSubmenuOpen, themeValues.buttonVariant])\n\n // Helper: Render collapsed popover\n const renderPopover = () => (\n <SidemenuPopover\n isDark={isDark}\n className={className}\n buttonStyles={buttonStyles}\n isExactlyActive={isExactlyActive}\n icon={icon}\n title={title}\n isMenuExpanded={isMenuExpanded}\n >\n {children ? children : undefined}\n </SidemenuPopover>\n )\n\n // Helper: Render expanded button\n const renderButton = () => {\n if (level === 0 && !isMenuExpanded) {\n return (\n <Tooltip text={title} placement=\"right\" offset={[0, -200]}>\n <Button\n className={cs('vui-sidemenu-item focusAsBorder', isExactlyActive && 'vui-sidemenu-item--active', className)}\n {...buttonStyles}\n isActive={isExactlyActive}\n >\n <SidemenuItemContent icon={icon} iconSize={buttonStyles.iconSize} />\n {isMenuExpanded && computedStates.shouldShowExpandButton && <Button {...expandButtonProps} />}{' '}\n </Button>\n </Tooltip>\n )\n }\n\n return (\n <Button\n className={cs('vui-sidemenu-item focusAsBorder', isExactlyActive && 'vui-sidemenu-item--active', className)}\n {...buttonStyles}\n isActive={isExactlyActive}\n title={!isMenuExpanded ? title : undefined}\n >\n <SidemenuItemContent\n icon={icon}\n iconSize={buttonStyles.iconSize}\n title={title}\n isMenuExpanded={isMenuExpanded}\n badge={props.badge}\n badgeLinkUrl={props.badgeLinkUrl}\n />\n {isMenuExpanded && computedStates.shouldShowExpandButton && <Button {...expandButtonProps} />}{' '}\n {/* Expand/Collapse button */}\n </Button>\n )\n // No leftover return, handled above\n }\n\n // Helper: Render expanded children\n const renderChildren = () => (\n <Box flexDirection=\"column\" justifyContent=\"start\" w=\"100%\">\n {children}\n </Box>\n )\n\n const shouldShowPopover = Boolean(!isMenuExpanded && level === 0 && !!children)\n const shouldShowChildren = computedStates.hasChildrenExpanded\n\n return (\n <Box flexDirection=\"column\" ref={ref} w=\"100%\" mt={onBottom ? 'auto' : 0} id={computedItemId}>\n {shouldShowPopover && renderPopover()}\n {!shouldShowPopover && renderButton()}\n {shouldShowChildren && renderChildren()}\n </Box>\n )\n}) as VuiComponent<'div', SidemenuItemV2Props>\n\nSidemenuItemV2.displayName = 'SidemenuItemV2'\n\nexport default SidemenuItemV2\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sidemenuItemV2.js","names":["colors"],"sources":["../../src/sidemenuV2/sidemenuItemV2.tsx"],"sourcesContent":["import type { MouseEvent } from 'react'\nimport { useEffect, useMemo, useCallback } from 'react'\n\nimport Box from '../box'\nimport Button from '../button'\nimport type { VuiComponent } from '../core'\nimport { omitThemingProps, styled, th, vui } from '../core'\nimport Popover from '../popover'\nimport { colors } from '../theme'\nimport Tooltip from '../tooltip'\nimport { cs, generateMenuItemId } from '../utils'\nimport { collapsedWidth, expandedWidth } from './consts'\nimport SidemenuItemContent from './SidemenuItemContent'\nimport type { SidemenuItemV2Props } from './sidemenuV2.types'\nimport useSidemenuItem from './useSidemenuItem'\n\nexport const PopoverHovered = styled.div<{ hoverColor: string }>`\n &:hover .vui-sidemenu-item-popover .vui-button.vui-button {\n background: ${p => th.color(p.hoverColor)};\n }\n &:hover div:last-child .vui-sidemenu-item-content > .vui-box > .vui-button.vui-button {\n background: ${p => th.color(p.hoverColor)};\n }\n`\n\n// SidemenuPopover component extracted from inline Popover logic\nconst SidemenuPopover = ({\n isDark,\n className,\n buttonStyles,\n isExactlyActive,\n icon,\n title,\n isMenuExpanded,\n children,\n}: {\n isDark: boolean\n className?: string\n buttonStyles: any\n isExactlyActive: boolean\n icon?: any\n title: string\n isMenuExpanded: boolean\n children: React.ReactNode\n}) => (\n <Popover offset={[0, collapsedWidth - expandedWidth - 2]} placement=\"right-start\" trigger=\"mouseenter\">\n {({ isOpen }: { isOpen: boolean }) => (\n <PopoverHovered hoverColor={isDark ? colors.seaBlue.main : colors.skyBlue.selected}>\n <Popover.Trigger as={Box} className={cs('vui-sidemenu-item-popover', className)}>\n <Button\n {...buttonStyles}\n borderLeft={`3px solid ${isDark ? 'digiGreen.main' : 'seaBlue.main'}`}\n isActive={isExactlyActive}\n className={cs('focusAsBorder')}\n >\n <SidemenuItemContent\n icon={icon}\n iconSize={buttonStyles.iconSize}\n title={title}\n isMenuExpanded={isMenuExpanded}\n />\n </Button>\n </Popover.Trigger>\n <Popover.Content elevation=\"none\" className={cs('vui-sidemenu-item-content', className)}>\n <Box flexDirection=\"column\" justifyContent=\"start\" w=\"100%\">\n <Button\n {...buttonStyles}\n borderLeftColor={'transparent!important'}\n minW={'240px'}\n isActive={isOpen && isExactlyActive}\n className={cs('focusAsBorder')}\n >\n <SidemenuItemContent title={title} isInPopover={true} />\n </Button>\n {children}\n </Box>\n </Popover.Content>\n </PopoverHovered>\n )}\n </Popover>\n)\n\n/** A menu item. */\nexport const SidemenuItemV2 = vui<'button', SidemenuItemV2Props>((props, ref) => {\n const {\n children,\n className,\n disabled = false,\n icon,\n isActive = false,\n isExpanded = true,\n itemId,\n level = 0,\n onBottom = false,\n onClick,\n onCollapse,\n onExpand,\n title,\n ...rest\n } = omitThemingProps(props)\n\n // Use consistent itemId generation - prioritize provided itemId, then use utility function\n const computedItemId = itemId || generateMenuItemId(title, level) || `item-${Math.random().toString(36).substr(2, 9)}`\n\n const { isDark, isMenuExpanded, styles, size, isSubmenuOpen, toggleSubmenu } = useSidemenuItem(computedItemId)\n\n // Use the isActive prop directly - parent should handle exact path matching\n const isExactlyActive = isActive\n\n useEffect(() => {\n // Only call onExpand/onCollapse if the main menu is expanded\n // This prevents child items from expanding the main menu when it's collapsed\n if (isMenuExpanded) {\n if (isSubmenuOpen) onExpand?.()\n if (!isSubmenuOpen) onCollapse?.()\n }\n }, [isSubmenuOpen, onExpand, onCollapse, isMenuExpanded])\n\n // Memoized computed values for better performance\n const computedStates = useMemo(() => {\n const hasChildren = !!children\n const isSubmenuCollapsed = hasChildren && !isSubmenuOpen\n // Only allow submenu expansion when main menu is expanded\n const isSubmenuExpanded = hasChildren && isSubmenuOpen && isMenuExpanded\n const shouldShowExpandButton = hasChildren && isMenuExpanded\n const buttonSize = level < 1 ? ('lg' as const) : ('md' as const)\n const iconSize = level < 1 ? ('sm' as const) : ('xs' as const)\n\n const states = {\n hasChildren,\n hasChildrenCollapsed: isSubmenuCollapsed,\n hasChildrenExpanded: isSubmenuExpanded,\n shouldShowExpandButton,\n buttonSize,\n iconSize,\n isDisabled: disabled,\n shouldShowBorder: !hasChildren || isSubmenuOpen,\n }\n\n return states\n }, [children, isSubmenuOpen, isMenuExpanded, disabled, size, level])\n\n // Memoized theme values to prevent recalculation\n const themeValues = useMemo(\n () => ({\n activeColor: isDark ? 'digiGreen.main' : 'seaBlue.main',\n }),\n [isDark],\n )\n\n // Optimized stable callback\n const handleClick = useCallback(\n (event: MouseEvent) => {\n if (!computedStates.isDisabled) {\n const targetTag = event.target as HTMLElement\n if (\n (targetTag.classList.contains('vui-tagText') || targetTag.classList.contains('vui-tag')) &&\n typeof window !== 'undefined' &&\n (targetTag.parentElement?.dataset.link || targetTag?.dataset.link)\n ) {\n const url = atob(targetTag.parentElement?.dataset.link ?? targetTag?.dataset.link ?? '')\n window.open(url, '_blank', 'noopener,noreferrer')\n } else {\n event?.stopPropagation?.()\n onClick?.()\n }\n }\n toggleSubmenu?.()\n },\n [onClick, computedStates.isDisabled],\n )\n\n // Memoized button styles - Major performance improvement\n const buttonStyles = useMemo(\n () => ({\n // Get base item styles from theme\n ...(styles && 'item' in styles && styles.item ? styles.item : {}),\n\n // Apply button theme styles from SideMenuV2 theme (replaces removed menuLight/menuDark variants)\n ...(styles && 'button' in styles && styles.button ? styles.button : {}),\n\n // Dynamic border color based on active state\n borderLeftColor: isExactlyActive ? themeValues.activeColor : 'transparent',\n\n // Animation properties (enhanced from theme)\n transitionProperty: 'background-color, border-color, color, transform, opacity',\n\n // Button specific properties\n size: computedStates.buttonSize,\n h: computedStates.buttonSize === 'lg' ? 40 : 36,\n iconSize: computedStates.iconSize,\n variant: 'tertiaryDark', // Use base variant, theme overrides applied above\n\n // Event handlers\n onClick: handleClick,\n disabled: computedStates.isDisabled,\n\n // Accessibility\n role: 'button',\n tabIndex: computedStates.isDisabled ? -1 : 0,\n 'aria-disabled': computedStates.isDisabled,\n 'aria-pressed': isExactlyActive,\n\n // Merge custom props\n ...rest,\n }),\n [\n // Dependencies grouped logically - simplified since computedStates contains most values\n styles,\n computedStates,\n isExactlyActive,\n themeValues,\n handleClick,\n rest,\n ],\n )\n\n // Memoized expand/collapse button properties\n const expandButtonProps = useMemo(() => {\n const isExpanded = isSubmenuOpen\n const chevronIcon = isExpanded ? 'falChevronUp' : 'falChevronDown'\n const ariaLabel = isExpanded ? 'Collapse' : 'Expand'\n\n return {\n 'aria-label': ariaLabel,\n className: 'vui-sidemenu-item-expand',\n variant: 'tertiaryDark', // Use base variant, styling from parent\n icon: chevronIcon,\n size: 'sm' as const,\n pl: '4px',\n pr: '16px',\n ml: 'auto',\n h: '100%',\n border: 'none',\n bg: 'transparent',\n hoverBg: 'transparent',\n activeBg: 'transparent',\n }\n }, [isSubmenuOpen])\n\n // Helper: Render collapsed popover\n const renderPopover = () => (\n <SidemenuPopover\n isDark={isDark}\n className={className}\n buttonStyles={buttonStyles}\n isExactlyActive={isExactlyActive}\n icon={icon}\n title={title}\n isMenuExpanded={isMenuExpanded}\n >\n {children ? children : undefined}\n </SidemenuPopover>\n )\n\n // Helper: Render expanded button\n const renderButton = () => {\n if (level === 0 && !isMenuExpanded) {\n return (\n <Tooltip text={title} placement=\"right\" offset={[0, -200]}>\n <Button\n className={cs('vui-sidemenu-item focusAsBorder', isExactlyActive && 'vui-sidemenu-item--active', className)}\n {...buttonStyles}\n isActive={isExactlyActive}\n >\n <SidemenuItemContent icon={icon} iconSize={buttonStyles.iconSize} />\n {isMenuExpanded && computedStates.shouldShowExpandButton && <Button {...expandButtonProps} />}{' '}\n </Button>\n </Tooltip>\n )\n }\n\n return (\n <Button\n className={cs('vui-sidemenu-item focusAsBorder', isExactlyActive && 'vui-sidemenu-item--active', className)}\n {...buttonStyles}\n isActive={isExactlyActive}\n title={!isMenuExpanded ? title : undefined}\n >\n <SidemenuItemContent\n icon={icon}\n iconSize={buttonStyles.iconSize}\n title={title}\n isMenuExpanded={isMenuExpanded}\n badge={props.badge}\n badgeLinkUrl={props.badgeLinkUrl}\n />\n {isMenuExpanded && computedStates.shouldShowExpandButton && <Button {...expandButtonProps} />}{' '}\n {/* Expand/Collapse button */}\n </Button>\n )\n // No leftover return, handled above\n }\n\n // Helper: Render expanded children\n const renderChildren = () => (\n <Box flexDirection=\"column\" justifyContent=\"start\" w=\"100%\">\n {children}\n </Box>\n )\n\n const shouldShowPopover = Boolean(!isMenuExpanded && level === 0 && !!children)\n const shouldShowChildren = computedStates.hasChildrenExpanded\n\n return (\n <Box flexDirection=\"column\" ref={ref} w=\"100%\" mt={onBottom ? 'auto' : 0} id={computedItemId}>\n {shouldShowPopover && renderPopover()}\n {!shouldShowPopover && renderButton()}\n {shouldShowChildren && renderChildren()}\n </Box>\n )\n}) as VuiComponent<'div', SidemenuItemV2Props>\n\nSidemenuItemV2.displayName = 'SidemenuItemV2'\n\nexport default SidemenuItemV2\n"],"mappings":"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"}
|
package/dist/sidemenuV2/theme.js
CHANGED
|
@@ -57,7 +57,8 @@ const parts = [
|
|
|
57
57
|
"bottom",
|
|
58
58
|
"toggleButton",
|
|
59
59
|
"item",
|
|
60
|
-
"sidemenuTop"
|
|
60
|
+
"sidemenuTop",
|
|
61
|
+
"button"
|
|
61
62
|
];
|
|
62
63
|
const sizes = {
|
|
63
64
|
sm: { toggleButton: {
|
|
@@ -80,7 +81,22 @@ const variants = {
|
|
|
80
81
|
variant: "tertiaryDark",
|
|
81
82
|
hoverBg: "sandstone.95"
|
|
82
83
|
},
|
|
83
|
-
item: { color: "darkBlue.main" }
|
|
84
|
+
item: { color: "darkBlue.main" },
|
|
85
|
+
button: {
|
|
86
|
+
bg: "#ffffff",
|
|
87
|
+
hoverBg: "#D3EEF8",
|
|
88
|
+
activeBg: "#E9F7FC",
|
|
89
|
+
disabledBg: "#F8F7F7",
|
|
90
|
+
borderColor: "transparent",
|
|
91
|
+
hoverBorderColor: "#003591",
|
|
92
|
+
activeBorderColor: "#003591",
|
|
93
|
+
color: "#1A1A19",
|
|
94
|
+
hoverColor: "#1A1A19",
|
|
95
|
+
activeColor: "#003591",
|
|
96
|
+
disabledColor: "#908D89",
|
|
97
|
+
disabledBorderColor: "transparent",
|
|
98
|
+
disabledOpacity: "1"
|
|
99
|
+
}
|
|
84
100
|
},
|
|
85
101
|
dark: {
|
|
86
102
|
container: {
|
|
@@ -94,7 +110,22 @@ const variants = {
|
|
|
94
110
|
bg: "darkBlue.main"
|
|
95
111
|
},
|
|
96
112
|
toggleButton: { variant: "tertiaryLight" },
|
|
97
|
-
item: { color: "white" }
|
|
113
|
+
item: { color: "white" },
|
|
114
|
+
button: {
|
|
115
|
+
bg: "#0F204B",
|
|
116
|
+
hoverBg: "#003591",
|
|
117
|
+
activeBg: "#0041B2",
|
|
118
|
+
disabledBg: "#0F204B",
|
|
119
|
+
borderColor: "transparent",
|
|
120
|
+
hoverBorderColor: "#91FFB4",
|
|
121
|
+
activeBorderColor: "#91FFB4",
|
|
122
|
+
color: "#FFFFFF",
|
|
123
|
+
hoverColor: "#FFFFFF",
|
|
124
|
+
activeColor: "#91FFBA",
|
|
125
|
+
disabledColor: "#FFFFFF",
|
|
126
|
+
disabledBorderColor: "transparent",
|
|
127
|
+
disabledOpacity: "1"
|
|
128
|
+
}
|
|
98
129
|
}
|
|
99
130
|
};
|
|
100
131
|
var theme_default = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","names":[],"sources":["../../src/sidemenuV2/theme.ts"],"sourcesContent":["const baseStyle = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n transition: 'width 0.2s ease-in-out',\n },\n content: {\n flex: 1,\n overflowY: 'auto',\n overflowX: 'hidden',\n },\n bottom: {\n flexShrink: 0,\n borderTop: `1px solid transparent`,\n display: 'flex',\n alignItems: 'center',\n },\n item: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n flexDirection: 'row',\n w: '100%',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n textDecoration: 'none',\n outline: 'none',\n px: 0,\n borderLeft: '3px solid transparent',\n },\n sidemenuTop: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px 16px',\n minHeight: '64px',\n },\n // Add toggle button configuration\n toggleButton: {\n baseHeight: 52,\n basePadding: 2,\n expandedPaddingMultiplier: 5,\n collapsedWidth: '100%',\n expandedWidth: '52px',\n transition: 'padding 0.2s ease-in-out, width 0.2s ease-in-out',\n },\n}\n\nconst defaultProps = {\n size: 'md',\n variant: 'light',\n}\n\nconst parts = ['container', 'content', 'bottom', 'toggleButton', 'item', 'sidemenuTop']\n\nconst sizes = {\n sm: {\n toggleButton: {\n baseHeight: 44,\n basePadding: 1.5,\n },\n },\n md: {\n toggleButton: {\n baseHeight: 52,\n basePadding: 2,\n },\n },\n lg: {\n toggleButton: {\n baseHeight: 60,\n basePadding: 2.5,\n },\n },\n}\n\nconst variants = {\n light: {\n container: {\n bg: 'white',\n },\n toggleButton: {\n variant: 'tertiaryDark',\n hoverBg: 'sandstone.95',\n },\n item: {\n color: 'darkBlue.main',\n },\n },\n dark: {\n container: {\n bg: 'darkBlue.main',\n color: 'white',\n boxShadow: '2px 0 4px rgba(0, 0, 0, 0.3)',\n },\n bottom: {\n borderTopColor: 'rgba(255, 255, 255, 0.1)',\n },\n sidemenuTop: {\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n bg: 'darkBlue.main',\n },\n toggleButton: {\n variant: 'tertiaryLight',\n },\n item: {\n color: 'white',\n },\n },\n}\n\nexport default {\n baseStyle,\n defaultProps,\n parts,\n sizes,\n variants,\n}\n"],"mappings":";AAAA,MAAM,YAAY;CAChB,WAAW;EACT,SAAS;EACT,eAAe;EACf,UAAU;EACV,YAAY;EACb;CACD,SAAS;EACP,MAAM;EACN,WAAW;EACX,WAAW;EACZ;CACD,QAAQ;EACN,YAAY;EACZ,WAAW;EACX,SAAS;EACT,YAAY;EACb;CACD,MAAM;EACJ,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,eAAe;EACf,GAAG;EACH,QAAQ;EACR,QAAQ;EACR,YAAY;EACZ,gBAAgB;EAChB,SAAS;EACT,IAAI;EACJ,YAAY;EACb;CACD,aAAa;EACX,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,SAAS;EACT,WAAW;EACZ;CAED,cAAc;EACZ,YAAY;EACZ,aAAa;EACb,2BAA2B;EAC3B,gBAAgB;EAChB,eAAe;EACf,YAAY;EACb;CACF;AAED,MAAM,eAAe;CACnB,MAAM;CACN,SAAS;CACV;AAED,MAAM,QAAQ;CAAC;CAAa;CAAW;CAAU;CAAgB;CAAQ;
|
|
1
|
+
{"version":3,"file":"theme.js","names":[],"sources":["../../src/sidemenuV2/theme.ts"],"sourcesContent":["const baseStyle = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n transition: 'width 0.2s ease-in-out',\n },\n content: {\n flex: 1,\n overflowY: 'auto',\n overflowX: 'hidden',\n },\n bottom: {\n flexShrink: 0,\n borderTop: `1px solid transparent`,\n display: 'flex',\n alignItems: 'center',\n },\n item: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n flexDirection: 'row',\n w: '100%',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n textDecoration: 'none',\n outline: 'none',\n px: 0,\n borderLeft: '3px solid transparent',\n },\n sidemenuTop: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px 16px',\n minHeight: '64px',\n },\n // Add toggle button configuration\n toggleButton: {\n baseHeight: 52,\n basePadding: 2,\n expandedPaddingMultiplier: 5,\n collapsedWidth: '100%',\n expandedWidth: '52px',\n transition: 'padding 0.2s ease-in-out, width 0.2s ease-in-out',\n },\n}\n\nconst defaultProps = {\n size: 'md',\n variant: 'light',\n}\n\nconst parts = ['container', 'content', 'bottom', 'toggleButton', 'item', 'sidemenuTop', 'button']\n\nconst sizes = {\n sm: {\n toggleButton: {\n baseHeight: 44,\n basePadding: 1.5,\n },\n },\n md: {\n toggleButton: {\n baseHeight: 52,\n basePadding: 2,\n },\n },\n lg: {\n toggleButton: {\n baseHeight: 60,\n basePadding: 2.5,\n },\n },\n}\n\nconst variants = {\n light: {\n container: {\n bg: 'white',\n },\n toggleButton: {\n variant: 'tertiaryDark',\n hoverBg: 'sandstone.95',\n },\n item: {\n color: 'darkBlue.main',\n },\n button: {\n bg: '#ffffff',\n hoverBg: '#D3EEF8',\n activeBg: '#E9F7FC',\n disabledBg: '#F8F7F7',\n borderColor: 'transparent',\n hoverBorderColor: '#003591',\n activeBorderColor: '#003591',\n color: '#1A1A19',\n hoverColor: '#1A1A19',\n activeColor: '#003591',\n disabledColor: '#908D89',\n disabledBorderColor: 'transparent',\n disabledOpacity: '1',\n },\n },\n dark: {\n container: {\n bg: 'darkBlue.main',\n color: 'white',\n boxShadow: '2px 0 4px rgba(0, 0, 0, 0.3)',\n },\n bottom: {\n borderTopColor: 'rgba(255, 255, 255, 0.1)',\n },\n sidemenuTop: {\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n bg: 'darkBlue.main',\n },\n toggleButton: {\n variant: 'tertiaryLight',\n },\n item: {\n color: 'white',\n },\n button: {\n bg: '#0F204B',\n hoverBg: '#003591',\n activeBg: '#0041B2',\n disabledBg: '#0F204B',\n borderColor: 'transparent',\n hoverBorderColor: '#91FFB4',\n activeBorderColor: '#91FFB4',\n color: '#FFFFFF',\n hoverColor: '#FFFFFF',\n activeColor: '#91FFBA',\n disabledColor: '#FFFFFF',\n disabledBorderColor: 'transparent',\n disabledOpacity: '1',\n },\n },\n}\n\nexport default {\n baseStyle,\n defaultProps,\n parts,\n sizes,\n variants,\n}\n"],"mappings":";AAAA,MAAM,YAAY;CAChB,WAAW;EACT,SAAS;EACT,eAAe;EACf,UAAU;EACV,YAAY;EACb;CACD,SAAS;EACP,MAAM;EACN,WAAW;EACX,WAAW;EACZ;CACD,QAAQ;EACN,YAAY;EACZ,WAAW;EACX,SAAS;EACT,YAAY;EACb;CACD,MAAM;EACJ,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,eAAe;EACf,GAAG;EACH,QAAQ;EACR,QAAQ;EACR,YAAY;EACZ,gBAAgB;EAChB,SAAS;EACT,IAAI;EACJ,YAAY;EACb;CACD,aAAa;EACX,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,SAAS;EACT,WAAW;EACZ;CAED,cAAc;EACZ,YAAY;EACZ,aAAa;EACb,2BAA2B;EAC3B,gBAAgB;EAChB,eAAe;EACf,YAAY;EACb;CACF;AAED,MAAM,eAAe;CACnB,MAAM;CACN,SAAS;CACV;AAED,MAAM,QAAQ;CAAC;CAAa;CAAW;CAAU;CAAgB;CAAQ;CAAe;CAAS;AAEjG,MAAM,QAAQ;CACZ,IAAI,EACF,cAAc;EACZ,YAAY;EACZ,aAAa;EACd,EACF;CACD,IAAI,EACF,cAAc;EACZ,YAAY;EACZ,aAAa;EACd,EACF;CACD,IAAI,EACF,cAAc;EACZ,YAAY;EACZ,aAAa;EACd,EACF;CACF;AAED,MAAM,WAAW;CACf,OAAO;EACL,WAAW,EACT,IAAI,SACL;EACD,cAAc;GACZ,SAAS;GACT,SAAS;GACV;EACD,MAAM,EACJ,OAAO,iBACR;EACD,QAAQ;GACN,IAAI;GACJ,SAAS;GACT,UAAU;GACV,YAAY;GACZ,aAAa;GACb,kBAAkB;GAClB,mBAAmB;GACnB,OAAO;GACP,YAAY;GACZ,aAAa;GACb,eAAe;GACf,qBAAqB;GACrB,iBAAiB;GAClB;EACF;CACD,MAAM;EACJ,WAAW;GACT,IAAI;GACJ,OAAO;GACP,WAAW;GACZ;EACD,QAAQ,EACN,gBAAgB,4BACjB;EACD,aAAa;GACX,cAAc;GACd,IAAI;GACL;EACD,cAAc,EACZ,SAAS,iBACV;EACD,MAAM,EACJ,OAAO,SACR;EACD,QAAQ;GACN,IAAI;GACJ,SAAS;GACT,UAAU;GACV,YAAY;GACZ,aAAa;GACb,kBAAkB;GAClB,mBAAmB;GACnB,OAAO;GACP,YAAY;GACZ,aAAa;GACb,eAAe;GACf,qBAAqB;GACrB,iBAAiB;GAClB;EACF;CACF;AAED,oBAAe;CACb;CACA;CACA;CACA;CACA;CACD"}
|
package/dist/table/tr.js
CHANGED
|
@@ -36,12 +36,18 @@ const Tr = vui((props, ref) => {
|
|
|
36
36
|
const selectedProps = isSelected ? { bg: "skyBlue.selected" } : {};
|
|
37
37
|
rest.children = /* @__PURE__ */ jsxs(Fragment$1, { children: [nested !== void 0 && /* @__PURE__ */ jsx(Td, {
|
|
38
38
|
maxW: 16,
|
|
39
|
-
px:
|
|
39
|
+
px: 1,
|
|
40
40
|
textAlign: "center",
|
|
41
41
|
children: nested ? /* @__PURE__ */ jsx(Button, {
|
|
42
|
+
size: "sm",
|
|
42
43
|
icon: buttonClassName(isExpanded),
|
|
43
44
|
onClick: onToggle,
|
|
44
|
-
variant: "
|
|
45
|
+
variant: "tertiaryDark",
|
|
46
|
+
style: {
|
|
47
|
+
"--vui-button-color": "var(--action-blue-subtle-inverse)",
|
|
48
|
+
"--vui-button-hover-bg": "var(--action-blue-subtle-hover)",
|
|
49
|
+
"--vui-button-active-bg": "var(--action-blue-subtle-pressed)"
|
|
50
|
+
}
|
|
45
51
|
}) : null
|
|
46
52
|
}), rest.children] });
|
|
47
53
|
return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(TrBase, {
|
package/dist/table/tr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tr.js","names":[],"sources":["../../src/table/tr.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\n\nimport Button from '../button'\nimport { styled, useStyleConfig, vui } from '../core'\nimport { cs } from '../utils'\nimport { useTableContext } from './context'\nimport type { TrProps } from './table.types'\nimport Td from './td'\n\nconst trClassName = 'vui-tr'\nconst buttonClassName = (isExpanded?: boolean) => `falAngle${isExpanded ? 'Down' : 'Right'}`\n\nexport const TrBase = styled.trBox`\n position: relative;\n transition-duration: fast;\n`\n\n/** Displays Table row that can contain heading or data cells. */\nexport const Tr = vui<'tr', TrProps>((props, ref) => {\n const { className, isExpanded: isExpandedProp, isSelected, nested, onCollapsed, onExpanded, ...rest } = props\n const { variant } = useTableContext() ?? {}\n const styles = useStyleConfig('Table', useTableContext())\n const [isExpanded, setIsExpanded] = useState(isExpandedProp)\n\n useEffect(() => {\n setIsExpanded(isExpandedProp)\n }, [isExpandedProp])\n\n const onToggle = () => {\n if (isExpanded) {\n setIsExpanded(false)\n onCollapsed?.()\n } else {\n setIsExpanded(true)\n onExpanded?.()\n }\n }\n\n const selectedProps = isSelected ? { bg: 'skyBlue.selected' } : {}\n\n rest.children = (\n <>\n {nested !== undefined && (\n <Td maxW={16} px={
|
|
1
|
+
{"version":3,"file":"tr.js","names":[],"sources":["../../src/table/tr.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\n\nimport Button from '../button'\nimport { styled, useStyleConfig, vui } from '../core'\nimport { cs } from '../utils'\nimport { useTableContext } from './context'\nimport type { TrProps } from './table.types'\nimport Td from './td'\n\nconst trClassName = 'vui-tr'\nconst buttonClassName = (isExpanded?: boolean) => `falAngle${isExpanded ? 'Down' : 'Right'}`\n\nexport const TrBase = styled.trBox`\n position: relative;\n transition-duration: fast;\n`\n\n/** Displays Table row that can contain heading or data cells. */\nexport const Tr = vui<'tr', TrProps>((props, ref) => {\n const { className, isExpanded: isExpandedProp, isSelected, nested, onCollapsed, onExpanded, ...rest } = props\n const { variant } = useTableContext() ?? {}\n const styles = useStyleConfig('Table', useTableContext())\n const [isExpanded, setIsExpanded] = useState(isExpandedProp)\n\n useEffect(() => {\n setIsExpanded(isExpandedProp)\n }, [isExpandedProp])\n\n const onToggle = () => {\n if (isExpanded) {\n setIsExpanded(false)\n onCollapsed?.()\n } else {\n setIsExpanded(true)\n onExpanded?.()\n }\n }\n\n const selectedProps = isSelected ? { bg: 'skyBlue.selected' } : {}\n\n rest.children = (\n <>\n {nested !== undefined && (\n <Td maxW={16} px={1} textAlign=\"center\">\n {nested ? (\n <Button\n size=\"sm\"\n icon={buttonClassName(isExpanded)}\n onClick={onToggle}\n variant=\"tertiaryDark\"\n style={\n {\n '--vui-button-color': 'var(--action-blue-subtle-inverse)',\n '--vui-button-hover-bg': 'var(--action-blue-subtle-hover)',\n '--vui-button-active-bg': 'var(--action-blue-subtle-pressed)',\n } as React.CSSProperties\n }\n />\n ) : null}\n </Td>\n )}\n {rest.children}\n </>\n )\n\n return (\n <>\n <TrBase\n className={cs(trClassName, `${trClassName}-${isExpanded ? 'expanded' : 'collapsed'}`, className)}\n data-selected={Boolean(isSelected)}\n data-variant={variant}\n ref={ref}\n {...styles.tr}\n {...selectedProps}\n {...rest}\n />\n {isExpanded && nested}\n </>\n )\n})\n\nTr.displayName = 'Tr'\nexport default Tr\n"],"mappings":";;;;;;;;;;;AASA,MAAM,cAAc;AACpB,MAAM,mBAAmB,eAAyB,WAAW,aAAa,SAAS;AAEnF,MAAa,SAAS,OAAO,KAAK;;;;;AAMlC,MAAa,KAAK,KAAoB,OAAO,QAAQ;CACnD,MAAM,EAAE,WAAW,YAAY,gBAAgB,YAAY,QAAQ,aAAa,YAAY,GAAG,SAAS;CACxG,MAAM,EAAE,YAAY,iBAAiB,IAAI,EAAE;CAC3C,MAAM,SAAS,eAAe,SAAS,iBAAiB,CAAC;CACzD,MAAM,CAAC,YAAY,iBAAiB,SAAS,eAAe;AAE5D,iBAAgB;AACd,gBAAc,eAAe;IAC5B,CAAC,eAAe,CAAC;CAEpB,MAAM,iBAAiB;AACrB,MAAI,YAAY;AACd,iBAAc,MAAM;AACpB,kBAAe;SACV;AACL,iBAAc,KAAK;AACnB,iBAAc;;;CAIlB,MAAM,gBAAgB,aAAa,EAAE,IAAI,oBAAoB,GAAG,EAAE;AAElE,MAAK,WACH,8CACG,WAAW,UACV,oBAAC;EAAG,MAAM;EAAI,IAAI;EAAG,WAAU;YAC5B,SACC,oBAAC;GACC,MAAK;GACL,MAAM,gBAAgB,WAAW;GACjC,SAAS;GACT,SAAQ;GACR,OACE;IACE,sBAAsB;IACtB,yBAAyB;IACzB,0BAA0B;IAC3B;IAEH,GACA;GACD,EAEN,KAAK,YACL;AAGL,QACE,8CACE,oBAAC;EACC,WAAW,GAAG,aAAa,GAAG,YAAY,GAAG,aAAa,aAAa,eAAe,UAAU;EAChG,iBAAe,QAAQ,WAAW;EAClC,gBAAc;EACT;EACL,GAAI,OAAO;EACX,GAAI;EACJ,GAAI;GACJ,EACD,cAAc,UACd;EAEL;AAEF,GAAG,cAAc"}
|
|
@@ -1529,7 +1529,7 @@ declare const _default: {
|
|
|
1529
1529
|
actionBox: {
|
|
1530
1530
|
alignSelf: string;
|
|
1531
1531
|
my: string;
|
|
1532
|
-
|
|
1532
|
+
mx: string;
|
|
1533
1533
|
};
|
|
1534
1534
|
};
|
|
1535
1535
|
parts: string[];
|
|
@@ -2445,6 +2445,21 @@ declare const _default: {
|
|
|
2445
2445
|
item: {
|
|
2446
2446
|
color: string;
|
|
2447
2447
|
};
|
|
2448
|
+
button: {
|
|
2449
|
+
bg: string;
|
|
2450
|
+
hoverBg: string;
|
|
2451
|
+
activeBg: string;
|
|
2452
|
+
disabledBg: string;
|
|
2453
|
+
borderColor: string;
|
|
2454
|
+
hoverBorderColor: string;
|
|
2455
|
+
activeBorderColor: string;
|
|
2456
|
+
color: string;
|
|
2457
|
+
hoverColor: string;
|
|
2458
|
+
activeColor: string;
|
|
2459
|
+
disabledColor: string;
|
|
2460
|
+
disabledBorderColor: string;
|
|
2461
|
+
disabledOpacity: string;
|
|
2462
|
+
};
|
|
2448
2463
|
};
|
|
2449
2464
|
dark: {
|
|
2450
2465
|
container: {
|
|
@@ -2465,6 +2480,21 @@ declare const _default: {
|
|
|
2465
2480
|
item: {
|
|
2466
2481
|
color: string;
|
|
2467
2482
|
};
|
|
2483
|
+
button: {
|
|
2484
|
+
bg: string;
|
|
2485
|
+
hoverBg: string;
|
|
2486
|
+
activeBg: string;
|
|
2487
|
+
disabledBg: string;
|
|
2488
|
+
borderColor: string;
|
|
2489
|
+
hoverBorderColor: string;
|
|
2490
|
+
activeBorderColor: string;
|
|
2491
|
+
color: string;
|
|
2492
|
+
hoverColor: string;
|
|
2493
|
+
activeColor: string;
|
|
2494
|
+
disabledColor: string;
|
|
2495
|
+
disabledBorderColor: string;
|
|
2496
|
+
disabledOpacity: string;
|
|
2497
|
+
};
|
|
2468
2498
|
};
|
|
2469
2499
|
};
|
|
2470
2500
|
};
|
|
@@ -2047,7 +2047,7 @@ declare const defaultTheme: {
|
|
|
2047
2047
|
actionBox: {
|
|
2048
2048
|
alignSelf: string;
|
|
2049
2049
|
my: string;
|
|
2050
|
-
|
|
2050
|
+
mx: string;
|
|
2051
2051
|
};
|
|
2052
2052
|
};
|
|
2053
2053
|
parts: string[];
|
|
@@ -2963,6 +2963,21 @@ declare const defaultTheme: {
|
|
|
2963
2963
|
item: {
|
|
2964
2964
|
color: string;
|
|
2965
2965
|
};
|
|
2966
|
+
button: {
|
|
2967
|
+
bg: string;
|
|
2968
|
+
hoverBg: string;
|
|
2969
|
+
activeBg: string;
|
|
2970
|
+
disabledBg: string;
|
|
2971
|
+
borderColor: string;
|
|
2972
|
+
hoverBorderColor: string;
|
|
2973
|
+
activeBorderColor: string;
|
|
2974
|
+
color: string;
|
|
2975
|
+
hoverColor: string;
|
|
2976
|
+
activeColor: string;
|
|
2977
|
+
disabledColor: string;
|
|
2978
|
+
disabledBorderColor: string;
|
|
2979
|
+
disabledOpacity: string;
|
|
2980
|
+
};
|
|
2966
2981
|
};
|
|
2967
2982
|
dark: {
|
|
2968
2983
|
container: {
|
|
@@ -2983,6 +2998,21 @@ declare const defaultTheme: {
|
|
|
2983
2998
|
item: {
|
|
2984
2999
|
color: string;
|
|
2985
3000
|
};
|
|
3001
|
+
button: {
|
|
3002
|
+
bg: string;
|
|
3003
|
+
hoverBg: string;
|
|
3004
|
+
activeBg: string;
|
|
3005
|
+
disabledBg: string;
|
|
3006
|
+
borderColor: string;
|
|
3007
|
+
hoverBorderColor: string;
|
|
3008
|
+
activeBorderColor: string;
|
|
3009
|
+
color: string;
|
|
3010
|
+
hoverColor: string;
|
|
3011
|
+
activeColor: string;
|
|
3012
|
+
disabledColor: string;
|
|
3013
|
+
disabledBorderColor: string;
|
|
3014
|
+
disabledOpacity: string;
|
|
3015
|
+
};
|
|
2986
3016
|
};
|
|
2987
3017
|
};
|
|
2988
3018
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@veracity/vui",
|
|
3
|
-
"version": "4.0.0-alpha.375407.
|
|
3
|
+
"version": "4.0.0-alpha.375407.2602230852",
|
|
4
4
|
"description": "Veracity UI is a React component library crafted for use within Veracity applications and pages. Based on Styled Components and @xstyled.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"author": "Veracity",
|