@pallasoft/ps-core-components 2.16.0 → 2.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,18 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PsButton = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const ps_design_system_1 = require("@pallasoft/ps-design-system");
6
+ const ps_button_classes_1 = require("../constants/ps-button-classes");
6
7
  const ps_spinner_1 = require("./ps-spinner");
7
- const sizeClassNames = {
8
- compact: 'ps-control-compact px-3 py-2 text-sm',
9
- default: 'ps-control ps-control-padding text-sm',
10
- large: 'ps-control-large px-5 py-3 text-sm',
11
- };
12
- const variantClassNames = {
13
- danger: 'border-danger bg-danger text-white enabled:hover:opacity-90',
14
- ghost: 'border-transparent bg-transparent text-ink/60 enabled:hover:text-ink',
15
- primary: 'border-primary bg-primary text-[color:var(--ps-color-primary-contrast)] enabled:hover:border-primary-dark enabled:hover:bg-primary-dark',
16
- secondary: 'ps-liquid ps-liquid-control bg-white/72 text-ink enabled:hover:border-primary/30 enabled:hover:text-primary dark:border-white/16 dark:bg-white/12 dark:enabled:hover:text-white',
17
- surface: 'ps-liquid ps-liquid-control bg-white/72 text-ink enabled:hover:border-primary/30 dark:border-white/16 dark:bg-white/12',
18
- };
19
- const PsButton = ({ children, className, disabled, isLabelHiddenOnMobile = false, isLoading = false, leadingIcon, loadingLabel, size = 'default', trailingIcon, type = 'button', variant = 'secondary', ...props }) => ((0, jsx_runtime_1.jsxs)("button", { className: ps_design_system_1.PallasoftClassNameService.merge('ps-focus-ring relative inline-flex max-w-full items-center justify-center gap-2 rounded-full border text-center font-semibold disabled:cursor-not-allowed disabled:opacity-50', sizeClassNames[size], isLabelHiddenOnMobile && leadingIcon ? 'min-w-11 max-sm:px-0' : '', variantClassNames[variant], className), "aria-busy": isLoading || undefined, disabled: disabled || isLoading, type: type, ...props, children: [isLoading ? ((0, jsx_runtime_1.jsx)(ps_spinner_1.PsSpinner, { className: 'absolute inset-0 m-auto', color: 'current', label: loadingLabel !== null && loadingLabel !== undefined ? loadingLabel : 'Loading', size: 'small' })) : null, (0, jsx_runtime_1.jsxs)("span", { "aria-hidden": isLoading || undefined, className: ps_design_system_1.PallasoftClassNameService.merge('inline-flex min-w-0 items-center gap-2', isLoading ? 'invisible' : ''), children: [leadingIcon ? (0, jsx_runtime_1.jsx)("span", { className: 'shrink-0', children: leadingIcon }) : null, (0, jsx_runtime_1.jsx)("span", { className: isLabelHiddenOnMobile && leadingIcon ? 'sr-only sm:not-sr-only sm:truncate' : 'truncate', children: children }), trailingIcon ? (0, jsx_runtime_1.jsx)("span", { className: 'shrink-0', children: trailingIcon }) : null] })] }));
8
+ const PsButton = ({ children, className, disabled, isLabelHiddenOnMobile = false, isLoading = false, leadingIcon, loadingLabel, size = 'default', trailingIcon, type = 'button', variant = 'secondary', ...props }) => ((0, jsx_runtime_1.jsxs)("button", { className: ps_design_system_1.PallasoftClassNameService.merge(ps_button_classes_1.PsButtonBaseClassName, 'disabled:cursor-not-allowed disabled:opacity-50', ps_button_classes_1.PsButtonSizeClassNames[size], isLabelHiddenOnMobile && leadingIcon ? 'min-w-11 max-sm:px-0' : '', ps_button_classes_1.PsButtonVariantClassNames[variant], className), "aria-busy": isLoading || undefined, disabled: disabled || isLoading, type: type, ...props, children: [isLoading ? ((0, jsx_runtime_1.jsx)(ps_spinner_1.PsSpinner, { className: 'absolute inset-0 m-auto', color: 'current', label: loadingLabel !== null && loadingLabel !== undefined ? loadingLabel : 'Loading', size: 'small' })) : null, (0, jsx_runtime_1.jsxs)("span", { "aria-hidden": isLoading || undefined, className: ps_design_system_1.PallasoftClassNameService.merge('inline-flex min-w-0 items-center gap-2', isLoading ? 'invisible' : ''), children: [leadingIcon ? (0, jsx_runtime_1.jsx)("span", { className: 'shrink-0', children: leadingIcon }) : null, (0, jsx_runtime_1.jsx)("span", { className: isLabelHiddenOnMobile && leadingIcon ? 'sr-only sm:not-sr-only sm:truncate' : 'truncate', children: children }), trailingIcon ? (0, jsx_runtime_1.jsx)("span", { className: 'shrink-0', children: trailingIcon }) : null] })] }));
20
9
  exports.PsButton = PsButton;
@@ -9,5 +9,5 @@ const positionClassNames = {
9
9
  'bottom-left': 'bottom-6 left-6',
10
10
  'bottom-center': 'bottom-6 left-1/2 -translate-x-1/2',
11
11
  };
12
- const PsFab = ({ className, position = 'bottom-right', ...props }) => ((0, jsx_runtime_1.jsx)(ps_button_1.PsButton, { size: 'large', variant: 'primary', className: ps_design_system_1.PallasoftClassNameService.merge('fixed z-docked h-14 w-14 shrink-0 !px-0 shadow-lg', positionClassNames[position], className), ...props }));
12
+ const PsFab = ({ className, position = 'bottom-right', ...props }) => ((0, jsx_runtime_1.jsx)(ps_button_1.PsButton, { size: 'large', variant: 'primary', className: ps_design_system_1.PallasoftClassNameService.merge('!fixed z-docked h-14 w-14 shrink-0 !px-0 shadow-lg', positionClassNames[position], className), ...props }));
13
13
  exports.PsFab = PsFab;
@@ -0,0 +1,7 @@
1
+ import { type PsIconKey } from '@pallasoft/ps-icons';
2
+ export interface PsFeatureCardProps {
3
+ description: string;
4
+ iconKey: PsIconKey;
5
+ title: string;
6
+ }
7
+ export declare const PsFeatureCard: ({ description, iconKey, title }: PsFeatureCardProps) => import("react").JSX.Element;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsFeatureCard = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const ps_icons_1 = require("@pallasoft/ps-icons");
6
+ const ps_card_1 = require("./ps-card");
7
+ const PsFeatureCard = ({ description, iconKey, title }) => ((0, jsx_runtime_1.jsxs)(ps_card_1.PsCard, { className: 'h-full text-center', density: 'spacious', children: [(0, jsx_runtime_1.jsx)("span", { className: 'ps-icon-surface mx-auto h-12 w-12', children: (0, jsx_runtime_1.jsx)(ps_icons_1.PsIcon, { className: 'h-6 w-6', iconKey: iconKey }) }), (0, jsx_runtime_1.jsx)("h3", { className: 'text-header-4 mb-2 mt-4 text-ink', children: title }), (0, jsx_runtime_1.jsx)("p", { className: 'text-body-2 text-ink/60', children: description })] }));
8
+ exports.PsFeatureCard = PsFeatureCard;
@@ -1,7 +1,8 @@
1
1
  import type { PsFeatureCardData } from '../models/ps-feature-card-data';
2
2
  export interface PsFeatureGridProps {
3
+ description?: string;
3
4
  eyebrow: string;
4
5
  features: PsFeatureCardData[];
5
6
  title: string;
6
7
  }
7
- export declare const PsFeatureGrid: ({ eyebrow, features, title }: PsFeatureGridProps) => import("react").JSX.Element;
8
+ export declare const PsFeatureGrid: ({ description, eyebrow, features, title }: PsFeatureGridProps) => import("react").JSX.Element;
@@ -2,9 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PsFeatureGrid = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const ps_icons_1 = require("@pallasoft/ps-icons");
6
5
  const ps_motion_components_1 = require("@pallasoft/ps-motion-components");
7
6
  const ps_website_section_config_1 = require("../constants/ps-website-section-config");
8
- const ps_card_1 = require("./ps-card");
9
- const PsFeatureGrid = ({ eyebrow, features, title }) => ((0, jsx_runtime_1.jsxs)("div", { className: 'flex w-full flex-col items-center gap-8', children: [(0, jsx_runtime_1.jsxs)(ps_motion_components_1.PsScrollReveal, { className: 'text-center', children: [(0, jsx_runtime_1.jsx)("span", { className: 'ps-eyebrow mb-3 block', children: eyebrow }), (0, jsx_runtime_1.jsx)("h2", { className: 'text-header-2 text-ink', children: title })] }), (0, jsx_runtime_1.jsx)(ps_motion_components_1.PsStaggerContainer, { className: 'grid w-full grid-cols-1 gap-5 md:grid-cols-3', staggerDelay: ps_website_section_config_1.PsWebsiteSectionConfig.staggerDelay, children: features.map((feature) => ((0, jsx_runtime_1.jsx)(ps_motion_components_1.PsStaggerItem, { children: (0, jsx_runtime_1.jsxs)(ps_card_1.PsCard, { className: 'h-full text-center', density: 'spacious', children: [(0, jsx_runtime_1.jsx)("span", { className: 'ps-icon-surface mx-auto h-12 w-12', children: (0, jsx_runtime_1.jsx)(ps_icons_1.PsIcon, { className: 'h-6 w-6', iconKey: feature.iconKey }) }), (0, jsx_runtime_1.jsx)("h3", { className: 'text-header-4 mb-2 mt-4 text-ink', children: feature.title }), (0, jsx_runtime_1.jsx)("p", { className: 'text-body-2 text-ink/60', children: feature.description })] }) }, feature.title))) })] }));
7
+ const ps_feature_card_1 = require("./ps-feature-card");
8
+ const ps_section_intro_1 = require("./ps-section-intro");
9
+ const PsFeatureGrid = ({ description, eyebrow, features, title }) => ((0, jsx_runtime_1.jsxs)("div", { className: 'flex w-full flex-col items-center gap-8', children: [(0, jsx_runtime_1.jsx)(ps_section_intro_1.PsSectionIntro, { description: description, eyebrow: eyebrow, title: title }), (0, jsx_runtime_1.jsx)(ps_motion_components_1.PsStaggerContainer, { className: 'grid w-full grid-cols-1 gap-5 md:grid-cols-3', staggerDelay: ps_website_section_config_1.PsWebsiteSectionConfig.staggerDelay, children: features.map((feature) => ((0, jsx_runtime_1.jsx)(ps_motion_components_1.PsStaggerItem, { children: (0, jsx_runtime_1.jsx)(ps_feature_card_1.PsFeatureCard, { description: feature.description, iconKey: feature.iconKey, title: feature.title }) }, feature.title))) })] }));
10
10
  exports.PsFeatureGrid = PsFeatureGrid;
@@ -0,0 +1,11 @@
1
+ import type { AnchorHTMLAttributes, ElementType, ReactNode } from 'react';
2
+ export interface PsLinkButtonProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
3
+ children: ReactNode;
4
+ href: string;
5
+ leadingIcon?: ReactNode;
6
+ LinkComponent?: ElementType;
7
+ size?: 'compact' | 'default' | 'large';
8
+ trailingIcon?: ReactNode;
9
+ variant?: 'danger' | 'ghost' | 'primary' | 'secondary' | 'surface';
10
+ }
11
+ export declare const PsLinkButton: ({ children, className, href, leadingIcon, LinkComponent, size, trailingIcon, variant, ...props }: PsLinkButtonProps) => import("react").JSX.Element;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsLinkButton = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const ps_design_system_1 = require("@pallasoft/ps-design-system");
6
+ const ps_button_classes_1 = require("../constants/ps-button-classes");
7
+ const PsLinkButton = ({ children, className, href, leadingIcon, LinkComponent, size = 'default', trailingIcon, variant = 'secondary', ...props }) => {
8
+ const linkClassName = ps_design_system_1.PallasoftClassNameService.merge(ps_button_classes_1.PsButtonBaseClassName, ps_button_classes_1.PsButtonSizeClassNames[size], ps_button_classes_1.PsLinkButtonVariantClassNames[variant], className);
9
+ const content = ((0, jsx_runtime_1.jsxs)("span", { className: 'inline-flex min-w-0 items-center gap-2', children: [leadingIcon ? (0, jsx_runtime_1.jsx)("span", { className: 'shrink-0', children: leadingIcon }) : null, (0, jsx_runtime_1.jsx)("span", { className: 'truncate', children: children }), trailingIcon ? (0, jsx_runtime_1.jsx)("span", { className: 'shrink-0', children: trailingIcon }) : null] }));
10
+ return LinkComponent ? ((0, jsx_runtime_1.jsx)(LinkComponent, { className: linkClassName, prefetch: 'intent', to: href, ...props, children: content })) : ((0, jsx_runtime_1.jsx)("a", { className: linkClassName, href: href, ...props, children: content }));
11
+ };
12
+ exports.PsLinkButton = PsLinkButton;
@@ -0,0 +1 @@
1
+ export declare const PsPageBackdrop: () => import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsPageBackdrop = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const PsPageBackdrop = () => ((0, jsx_runtime_1.jsx)("div", { "aria-hidden": 'true', className: "pointer-events-none fixed inset-0 -z-10 bg-[linear-gradient(180deg,rgb(var(--ps-color-surface-rgb)/0.82),transparent_42%),linear-gradient(135deg,rgb(var(--ps-color-primary-rgb)/0.1),transparent_36%),linear-gradient(315deg,rgb(var(--ps-color-accent-rgb)/0.08),transparent_40%)] before:absolute before:inset-0 before:bg-[linear-gradient(rgb(var(--ps-color-line-rgb)/0.44)_1px,transparent_1px),linear-gradient(90deg,rgb(var(--ps-color-line-rgb)/0.44)_1px,transparent_1px)] before:bg-[length:4rem_4rem] before:content-[''] before:[mask-image:linear-gradient(180deg,rgb(0_0_0/0.54),transparent_72%)]" }));
6
+ exports.PsPageBackdrop = PsPageBackdrop;
@@ -0,0 +1,6 @@
1
+ export interface PsSectionIntroProps {
2
+ description?: string;
3
+ eyebrow: string;
4
+ title: string;
5
+ }
6
+ export declare const PsSectionIntro: ({ description, eyebrow, title }: PsSectionIntroProps) => import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsSectionIntro = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const ps_motion_components_1 = require("@pallasoft/ps-motion-components");
6
+ const PsSectionIntro = ({ description, eyebrow, title }) => ((0, jsx_runtime_1.jsxs)(ps_motion_components_1.PsScrollReveal, { className: 'mx-auto flex max-w-2xl flex-col items-center gap-3 text-center', children: [(0, jsx_runtime_1.jsx)("span", { className: 'ps-eyebrow block', children: eyebrow }), (0, jsx_runtime_1.jsx)("h2", { className: 'text-header-2 text-ink', children: title }), description ? (0, jsx_runtime_1.jsx)("p", { className: 'text-body-1 text-ink/60', children: description }) : null] }));
7
+ exports.PsSectionIntro = PsSectionIntro;
@@ -0,0 +1,20 @@
1
+ export declare const PsButtonBaseClassName = "ps-focus-ring relative inline-flex max-w-full items-center justify-center gap-2 rounded-full border text-center font-semibold";
2
+ export declare const PsButtonSizeClassNames: {
3
+ compact: string;
4
+ default: string;
5
+ large: string;
6
+ };
7
+ export declare const PsButtonVariantClassNames: {
8
+ danger: string;
9
+ ghost: string;
10
+ primary: string;
11
+ secondary: string;
12
+ surface: string;
13
+ };
14
+ export declare const PsLinkButtonVariantClassNames: {
15
+ danger: string;
16
+ ghost: string;
17
+ primary: string;
18
+ secondary: string;
19
+ surface: string;
20
+ };
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsLinkButtonVariantClassNames = exports.PsButtonVariantClassNames = exports.PsButtonSizeClassNames = exports.PsButtonBaseClassName = void 0;
4
+ exports.PsButtonBaseClassName = 'ps-focus-ring relative inline-flex max-w-full items-center justify-center gap-2 rounded-full border text-center font-semibold';
5
+ exports.PsButtonSizeClassNames = {
6
+ compact: 'ps-control-compact px-3 py-2 text-sm',
7
+ default: 'ps-control ps-control-padding text-sm',
8
+ large: 'ps-control-large px-5 py-3 text-sm',
9
+ };
10
+ exports.PsButtonVariantClassNames = {
11
+ danger: 'border-danger bg-danger text-white enabled:hover:opacity-90',
12
+ ghost: 'border-transparent bg-transparent text-ink/60 enabled:hover:text-ink',
13
+ primary: 'border-primary bg-primary text-[color:var(--ps-color-primary-contrast)] enabled:hover:border-primary-dark enabled:hover:bg-primary-dark',
14
+ secondary: 'ps-liquid ps-liquid-control bg-white/72 text-ink enabled:hover:border-primary/30 enabled:hover:text-primary dark:border-white/16 dark:bg-white/12 dark:enabled:hover:text-white',
15
+ surface: 'ps-liquid ps-liquid-control bg-white/72 text-ink enabled:hover:border-primary/30 dark:border-white/16 dark:bg-white/12',
16
+ };
17
+ exports.PsLinkButtonVariantClassNames = {
18
+ danger: 'border-danger bg-danger text-white hover:opacity-90',
19
+ ghost: 'border-transparent bg-transparent text-ink/60 hover:text-ink',
20
+ primary: 'border-primary bg-primary text-[color:var(--ps-color-primary-contrast)] hover:border-primary-dark hover:bg-primary-dark',
21
+ secondary: 'ps-liquid ps-liquid-control bg-white/72 text-ink hover:border-primary/30 hover:text-primary dark:border-white/16 dark:bg-white/12 dark:hover:text-white',
22
+ surface: 'ps-liquid ps-liquid-control bg-white/72 text-ink hover:border-primary/30 dark:border-white/16 dark:bg-white/12',
23
+ };
@@ -74,10 +74,10 @@ exports.PsVoiceOrbCadenceByState = {
74
74
  };
75
75
  exports.PsVoiceOrbThemes = {
76
76
  default: {
77
- glass: 'radial-gradient(circle at 32% 28%, rgb(255 255 255 / 0.95), transparent 46%), radial-gradient(circle, rgb(255 255 255 / 0.92), rgb(var(--ps-color-accent-rgb) / 0.5) 58%, rgb(var(--ps-color-primary-rgb) / 0.75) 100%)',
78
- rim: 'conic-gradient(rgb(var(--ps-color-primary-rgb)), rgb(var(--ps-color-accent-rgb)), rgb(255 255 255), rgb(var(--ps-color-secondary-rgb)), rgb(var(--ps-color-primary-rgb)))',
77
+ glass: 'radial-gradient(circle at 32% 28%, rgb(255 255 255 / 0.95), transparent 46%), radial-gradient(circle, rgb(255 255 255 / 0.92), rgb(var(--ps-color-secondary-rgb) / 0.55) 58%, rgb(var(--ps-color-primary-rgb) / 0.75) 100%)',
78
+ rim: 'conic-gradient(rgb(var(--ps-color-primary-rgb)), rgb(var(--ps-color-secondary-rgb)), rgb(255 255 255), rgb(var(--ps-color-secondary-rgb)), rgb(var(--ps-color-primary-rgb)))',
79
79
  ripple: 'rgb(var(--ps-color-primary-rgb) / 0.6)',
80
- core: 'radial-gradient(circle, rgb(255 255 255), rgb(var(--ps-color-accent-rgb) / 0.75) 35%, transparent 70%)',
80
+ core: 'radial-gradient(circle, rgb(255 255 255), rgb(var(--ps-color-secondary-rgb) / 0.75) 35%, transparent 70%)',
81
81
  },
82
82
  error: {
83
83
  glass: 'radial-gradient(circle at 32% 28%, rgb(255 255 255 / 0.95), transparent 46%), radial-gradient(circle, rgb(255 255 255 / 0.92), rgb(var(--ps-color-danger-rgb) / 0.45) 58%, rgb(var(--ps-color-danger-rgb) / 0.7) 100%)',
@@ -1,16 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
+ import { PsButtonBaseClassName, PsButtonSizeClassNames, PsButtonVariantClassNames, } from '../constants/ps-button-classes';
3
4
  import { PsSpinner } from './ps-spinner';
4
- const sizeClassNames = {
5
- compact: 'ps-control-compact px-3 py-2 text-sm',
6
- default: 'ps-control ps-control-padding text-sm',
7
- large: 'ps-control-large px-5 py-3 text-sm',
8
- };
9
- const variantClassNames = {
10
- danger: 'border-danger bg-danger text-white enabled:hover:opacity-90',
11
- ghost: 'border-transparent bg-transparent text-ink/60 enabled:hover:text-ink',
12
- primary: 'border-primary bg-primary text-[color:var(--ps-color-primary-contrast)] enabled:hover:border-primary-dark enabled:hover:bg-primary-dark',
13
- secondary: 'ps-liquid ps-liquid-control bg-white/72 text-ink enabled:hover:border-primary/30 enabled:hover:text-primary dark:border-white/16 dark:bg-white/12 dark:enabled:hover:text-white',
14
- surface: 'ps-liquid ps-liquid-control bg-white/72 text-ink enabled:hover:border-primary/30 dark:border-white/16 dark:bg-white/12',
15
- };
16
- export const PsButton = ({ children, className, disabled, isLabelHiddenOnMobile = false, isLoading = false, leadingIcon, loadingLabel, size = 'default', trailingIcon, type = 'button', variant = 'secondary', ...props }) => (_jsxs("button", { className: PallasoftClassNameService.merge('ps-focus-ring relative inline-flex max-w-full items-center justify-center gap-2 rounded-full border text-center font-semibold disabled:cursor-not-allowed disabled:opacity-50', sizeClassNames[size], isLabelHiddenOnMobile && leadingIcon ? 'min-w-11 max-sm:px-0' : '', variantClassNames[variant], className), "aria-busy": isLoading || undefined, disabled: disabled || isLoading, type: type, ...props, children: [isLoading ? (_jsx(PsSpinner, { className: 'absolute inset-0 m-auto', color: 'current', label: loadingLabel !== null && loadingLabel !== undefined ? loadingLabel : 'Loading', size: 'small' })) : null, _jsxs("span", { "aria-hidden": isLoading || undefined, className: PallasoftClassNameService.merge('inline-flex min-w-0 items-center gap-2', isLoading ? 'invisible' : ''), children: [leadingIcon ? _jsx("span", { className: 'shrink-0', children: leadingIcon }) : null, _jsx("span", { className: isLabelHiddenOnMobile && leadingIcon ? 'sr-only sm:not-sr-only sm:truncate' : 'truncate', children: children }), trailingIcon ? _jsx("span", { className: 'shrink-0', children: trailingIcon }) : null] })] }));
5
+ export const PsButton = ({ children, className, disabled, isLabelHiddenOnMobile = false, isLoading = false, leadingIcon, loadingLabel, size = 'default', trailingIcon, type = 'button', variant = 'secondary', ...props }) => (_jsxs("button", { className: PallasoftClassNameService.merge(PsButtonBaseClassName, 'disabled:cursor-not-allowed disabled:opacity-50', PsButtonSizeClassNames[size], isLabelHiddenOnMobile && leadingIcon ? 'min-w-11 max-sm:px-0' : '', PsButtonVariantClassNames[variant], className), "aria-busy": isLoading || undefined, disabled: disabled || isLoading, type: type, ...props, children: [isLoading ? (_jsx(PsSpinner, { className: 'absolute inset-0 m-auto', color: 'current', label: loadingLabel !== null && loadingLabel !== undefined ? loadingLabel : 'Loading', size: 'small' })) : null, _jsxs("span", { "aria-hidden": isLoading || undefined, className: PallasoftClassNameService.merge('inline-flex min-w-0 items-center gap-2', isLoading ? 'invisible' : ''), children: [leadingIcon ? _jsx("span", { className: 'shrink-0', children: leadingIcon }) : null, _jsx("span", { className: isLabelHiddenOnMobile && leadingIcon ? 'sr-only sm:not-sr-only sm:truncate' : 'truncate', children: children }), trailingIcon ? _jsx("span", { className: 'shrink-0', children: trailingIcon }) : null] })] }));
@@ -6,4 +6,4 @@ const positionClassNames = {
6
6
  'bottom-left': 'bottom-6 left-6',
7
7
  'bottom-center': 'bottom-6 left-1/2 -translate-x-1/2',
8
8
  };
9
- export const PsFab = ({ className, position = 'bottom-right', ...props }) => (_jsx(PsButton, { size: 'large', variant: 'primary', className: PallasoftClassNameService.merge('fixed z-docked h-14 w-14 shrink-0 !px-0 shadow-lg', positionClassNames[position], className), ...props }));
9
+ export const PsFab = ({ className, position = 'bottom-right', ...props }) => (_jsx(PsButton, { size: 'large', variant: 'primary', className: PallasoftClassNameService.merge('!fixed z-docked h-14 w-14 shrink-0 !px-0 shadow-lg', positionClassNames[position], className), ...props }));
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { PsIcon } from '@pallasoft/ps-icons';
3
+ import { PsCard } from './ps-card';
4
+ export const PsFeatureCard = ({ description, iconKey, title }) => (_jsxs(PsCard, { className: 'h-full text-center', density: 'spacious', children: [_jsx("span", { className: 'ps-icon-surface mx-auto h-12 w-12', children: _jsx(PsIcon, { className: 'h-6 w-6', iconKey: iconKey }) }), _jsx("h3", { className: 'text-header-4 mb-2 mt-4 text-ink', children: title }), _jsx("p", { className: 'text-body-2 text-ink/60', children: description })] }));
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { PsIcon } from '@pallasoft/ps-icons';
3
- import { PsScrollReveal, PsStaggerContainer, PsStaggerItem } from '@pallasoft/ps-motion-components';
2
+ import { PsStaggerContainer, PsStaggerItem } from '@pallasoft/ps-motion-components';
4
3
  import { PsWebsiteSectionConfig } from '../constants/ps-website-section-config';
5
- import { PsCard } from './ps-card';
6
- export const PsFeatureGrid = ({ eyebrow, features, title }) => (_jsxs("div", { className: 'flex w-full flex-col items-center gap-8', children: [_jsxs(PsScrollReveal, { className: 'text-center', children: [_jsx("span", { className: 'ps-eyebrow mb-3 block', children: eyebrow }), _jsx("h2", { className: 'text-header-2 text-ink', children: title })] }), _jsx(PsStaggerContainer, { className: 'grid w-full grid-cols-1 gap-5 md:grid-cols-3', staggerDelay: PsWebsiteSectionConfig.staggerDelay, children: features.map((feature) => (_jsx(PsStaggerItem, { children: _jsxs(PsCard, { className: 'h-full text-center', density: 'spacious', children: [_jsx("span", { className: 'ps-icon-surface mx-auto h-12 w-12', children: _jsx(PsIcon, { className: 'h-6 w-6', iconKey: feature.iconKey }) }), _jsx("h3", { className: 'text-header-4 mb-2 mt-4 text-ink', children: feature.title }), _jsx("p", { className: 'text-body-2 text-ink/60', children: feature.description })] }) }, feature.title))) })] }));
4
+ import { PsFeatureCard } from './ps-feature-card';
5
+ import { PsSectionIntro } from './ps-section-intro';
6
+ export const PsFeatureGrid = ({ description, eyebrow, features, title }) => (_jsxs("div", { className: 'flex w-full flex-col items-center gap-8', children: [_jsx(PsSectionIntro, { description: description, eyebrow: eyebrow, title: title }), _jsx(PsStaggerContainer, { className: 'grid w-full grid-cols-1 gap-5 md:grid-cols-3', staggerDelay: PsWebsiteSectionConfig.staggerDelay, children: features.map((feature) => (_jsx(PsStaggerItem, { children: _jsx(PsFeatureCard, { description: feature.description, iconKey: feature.iconKey, title: feature.title }) }, feature.title))) })] }));
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
+ import { PsButtonBaseClassName, PsButtonSizeClassNames, PsLinkButtonVariantClassNames, } from '../constants/ps-button-classes';
4
+ export const PsLinkButton = ({ children, className, href, leadingIcon, LinkComponent, size = 'default', trailingIcon, variant = 'secondary', ...props }) => {
5
+ const linkClassName = PallasoftClassNameService.merge(PsButtonBaseClassName, PsButtonSizeClassNames[size], PsLinkButtonVariantClassNames[variant], className);
6
+ const content = (_jsxs("span", { className: 'inline-flex min-w-0 items-center gap-2', children: [leadingIcon ? _jsx("span", { className: 'shrink-0', children: leadingIcon }) : null, _jsx("span", { className: 'truncate', children: children }), trailingIcon ? _jsx("span", { className: 'shrink-0', children: trailingIcon }) : null] }));
7
+ return LinkComponent ? (_jsx(LinkComponent, { className: linkClassName, prefetch: 'intent', to: href, ...props, children: content })) : (_jsx("a", { className: linkClassName, href: href, ...props, children: content }));
8
+ };
@@ -0,0 +1,2 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export const PsPageBackdrop = () => (_jsx("div", { "aria-hidden": 'true', className: "pointer-events-none fixed inset-0 -z-10 bg-[linear-gradient(180deg,rgb(var(--ps-color-surface-rgb)/0.82),transparent_42%),linear-gradient(135deg,rgb(var(--ps-color-primary-rgb)/0.1),transparent_36%),linear-gradient(315deg,rgb(var(--ps-color-accent-rgb)/0.08),transparent_40%)] before:absolute before:inset-0 before:bg-[linear-gradient(rgb(var(--ps-color-line-rgb)/0.44)_1px,transparent_1px),linear-gradient(90deg,rgb(var(--ps-color-line-rgb)/0.44)_1px,transparent_1px)] before:bg-[length:4rem_4rem] before:content-[''] before:[mask-image:linear-gradient(180deg,rgb(0_0_0/0.54),transparent_72%)]" }));
@@ -0,0 +1,3 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { PsScrollReveal } from '@pallasoft/ps-motion-components';
3
+ export const PsSectionIntro = ({ description, eyebrow, title }) => (_jsxs(PsScrollReveal, { className: 'mx-auto flex max-w-2xl flex-col items-center gap-3 text-center', children: [_jsx("span", { className: 'ps-eyebrow block', children: eyebrow }), _jsx("h2", { className: 'text-header-2 text-ink', children: title }), description ? _jsx("p", { className: 'text-body-1 text-ink/60', children: description }) : null] }));
@@ -0,0 +1,20 @@
1
+ export const PsButtonBaseClassName = 'ps-focus-ring relative inline-flex max-w-full items-center justify-center gap-2 rounded-full border text-center font-semibold';
2
+ export const PsButtonSizeClassNames = {
3
+ compact: 'ps-control-compact px-3 py-2 text-sm',
4
+ default: 'ps-control ps-control-padding text-sm',
5
+ large: 'ps-control-large px-5 py-3 text-sm',
6
+ };
7
+ export const PsButtonVariantClassNames = {
8
+ danger: 'border-danger bg-danger text-white enabled:hover:opacity-90',
9
+ ghost: 'border-transparent bg-transparent text-ink/60 enabled:hover:text-ink',
10
+ primary: 'border-primary bg-primary text-[color:var(--ps-color-primary-contrast)] enabled:hover:border-primary-dark enabled:hover:bg-primary-dark',
11
+ secondary: 'ps-liquid ps-liquid-control bg-white/72 text-ink enabled:hover:border-primary/30 enabled:hover:text-primary dark:border-white/16 dark:bg-white/12 dark:enabled:hover:text-white',
12
+ surface: 'ps-liquid ps-liquid-control bg-white/72 text-ink enabled:hover:border-primary/30 dark:border-white/16 dark:bg-white/12',
13
+ };
14
+ export const PsLinkButtonVariantClassNames = {
15
+ danger: 'border-danger bg-danger text-white hover:opacity-90',
16
+ ghost: 'border-transparent bg-transparent text-ink/60 hover:text-ink',
17
+ primary: 'border-primary bg-primary text-[color:var(--ps-color-primary-contrast)] hover:border-primary-dark hover:bg-primary-dark',
18
+ secondary: 'ps-liquid ps-liquid-control bg-white/72 text-ink hover:border-primary/30 hover:text-primary dark:border-white/16 dark:bg-white/12 dark:hover:text-white',
19
+ surface: 'ps-liquid ps-liquid-control bg-white/72 text-ink hover:border-primary/30 dark:border-white/16 dark:bg-white/12',
20
+ };
@@ -71,10 +71,10 @@ export const PsVoiceOrbCadenceByState = {
71
71
  };
72
72
  export const PsVoiceOrbThemes = {
73
73
  default: {
74
- glass: 'radial-gradient(circle at 32% 28%, rgb(255 255 255 / 0.95), transparent 46%), radial-gradient(circle, rgb(255 255 255 / 0.92), rgb(var(--ps-color-accent-rgb) / 0.5) 58%, rgb(var(--ps-color-primary-rgb) / 0.75) 100%)',
75
- rim: 'conic-gradient(rgb(var(--ps-color-primary-rgb)), rgb(var(--ps-color-accent-rgb)), rgb(255 255 255), rgb(var(--ps-color-secondary-rgb)), rgb(var(--ps-color-primary-rgb)))',
74
+ glass: 'radial-gradient(circle at 32% 28%, rgb(255 255 255 / 0.95), transparent 46%), radial-gradient(circle, rgb(255 255 255 / 0.92), rgb(var(--ps-color-secondary-rgb) / 0.55) 58%, rgb(var(--ps-color-primary-rgb) / 0.75) 100%)',
75
+ rim: 'conic-gradient(rgb(var(--ps-color-primary-rgb)), rgb(var(--ps-color-secondary-rgb)), rgb(255 255 255), rgb(var(--ps-color-secondary-rgb)), rgb(var(--ps-color-primary-rgb)))',
76
76
  ripple: 'rgb(var(--ps-color-primary-rgb) / 0.6)',
77
- core: 'radial-gradient(circle, rgb(255 255 255), rgb(var(--ps-color-accent-rgb) / 0.75) 35%, transparent 70%)',
77
+ core: 'radial-gradient(circle, rgb(255 255 255), rgb(var(--ps-color-secondary-rgb) / 0.75) 35%, transparent 70%)',
78
78
  },
79
79
  error: {
80
80
  glass: 'radial-gradient(circle at 32% 28%, rgb(255 255 255 / 0.95), transparent 46%), radial-gradient(circle, rgb(255 255 255 / 0.92), rgb(var(--ps-color-danger-rgb) / 0.45) 58%, rgb(var(--ps-color-danger-rgb) / 0.7) 100%)',
package/dist/esm/index.js CHANGED
@@ -5,6 +5,7 @@ export * from './components/ps-audio-spectrum';
5
5
  export * from './constants/ps-audio-spectrum-config';
6
6
  export * from './components/ps-badge';
7
7
  export * from './components/ps-button';
8
+ export * from './components/ps-link-button';
8
9
  export * from './components/ps-card';
9
10
  export * from './components/ps-draggable-grid';
10
11
  export * from './components/ps-empty-state';
@@ -61,6 +62,9 @@ export * from './components/ps-card-block-skeleton';
61
62
  export * from './components/ps-data-boundary';
62
63
  export * from './components/ps-faq-answer';
63
64
  export * from './components/ps-feature-grid';
65
+ export * from './components/ps-feature-card';
66
+ export * from './components/ps-page-backdrop';
67
+ export * from './components/ps-section-intro';
64
68
  export * from './components/ps-form-fields-skeleton';
65
69
  export * from './components/ps-form-page-skeleton';
66
70
  export * from './components/ps-icon-button';
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export * from './components/ps-audio-spectrum';
5
5
  export * from './constants/ps-audio-spectrum-config';
6
6
  export * from './components/ps-badge';
7
7
  export * from './components/ps-button';
8
+ export * from './components/ps-link-button';
8
9
  export * from './components/ps-card';
9
10
  export * from './components/ps-draggable-grid';
10
11
  export * from './components/ps-empty-state';
@@ -61,6 +62,9 @@ export * from './components/ps-card-block-skeleton';
61
62
  export * from './components/ps-data-boundary';
62
63
  export * from './components/ps-faq-answer';
63
64
  export * from './components/ps-feature-grid';
65
+ export * from './components/ps-feature-card';
66
+ export * from './components/ps-page-backdrop';
67
+ export * from './components/ps-section-intro';
64
68
  export * from './components/ps-form-fields-skeleton';
65
69
  export * from './components/ps-form-page-skeleton';
66
70
  export * from './components/ps-icon-button';
package/dist/index.js CHANGED
@@ -21,6 +21,7 @@ __exportStar(require("./components/ps-audio-spectrum"), exports);
21
21
  __exportStar(require("./constants/ps-audio-spectrum-config"), exports);
22
22
  __exportStar(require("./components/ps-badge"), exports);
23
23
  __exportStar(require("./components/ps-button"), exports);
24
+ __exportStar(require("./components/ps-link-button"), exports);
24
25
  __exportStar(require("./components/ps-card"), exports);
25
26
  __exportStar(require("./components/ps-draggable-grid"), exports);
26
27
  __exportStar(require("./components/ps-empty-state"), exports);
@@ -77,6 +78,9 @@ __exportStar(require("./components/ps-card-block-skeleton"), exports);
77
78
  __exportStar(require("./components/ps-data-boundary"), exports);
78
79
  __exportStar(require("./components/ps-faq-answer"), exports);
79
80
  __exportStar(require("./components/ps-feature-grid"), exports);
81
+ __exportStar(require("./components/ps-feature-card"), exports);
82
+ __exportStar(require("./components/ps-page-backdrop"), exports);
83
+ __exportStar(require("./components/ps-section-intro"), exports);
80
84
  __exportStar(require("./components/ps-form-fields-skeleton"), exports);
81
85
  __exportStar(require("./components/ps-form-page-skeleton"), exports);
82
86
  __exportStar(require("./components/ps-icon-button"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pallasoft/ps-core-components",
3
- "version": "2.16.0",
3
+ "version": "2.17.0",
4
4
  "private": false,
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/esm/index.js",