@pallasoft/ps-core-components 1.2.0 → 1.4.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.
@@ -37,5 +37,6 @@ exports.PsAccordion = void 0;
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const AccordionPrimitive = __importStar(require("@radix-ui/react-accordion"));
39
39
  const ps_design_system_1 = require("@pallasoft/ps-design-system");
40
- const PsAccordion = ({ children, className, isOpen, label, onToggle, trailing, }) => ((0, jsx_runtime_1.jsx)(AccordionPrimitive.Root, { type: 'single', collapsible: true, value: isOpen ? 'open' : '', onValueChange: onToggle, className: ps_design_system_1.PallasoftClassNameService.merge('overflow-hidden rounded-2xl border border-line/70 bg-mist/60', className), children: (0, jsx_runtime_1.jsxs)(AccordionPrimitive.Item, { value: 'open', children: [(0, jsx_runtime_1.jsx)(AccordionPrimitive.Header, { children: (0, jsx_runtime_1.jsxs)(AccordionPrimitive.Trigger, { className: 'ps-focus-ring flex w-full items-center justify-between gap-3 px-4 py-3.5', children: [(0, jsx_runtime_1.jsx)("span", { className: 'text-body-2 font-semibold text-ink', children: label }), trailing] }) }), (0, jsx_runtime_1.jsx)(AccordionPrimitive.Content, { className: 'ps-accordion-content', children: (0, jsx_runtime_1.jsx)("div", { className: 'border-t border-line/70 p-4', children: children }) })] }) }));
40
+ const ps_icons_1 = require("@pallasoft/ps-icons");
41
+ const PsAccordion = ({ children, className, isOpen, label, onToggle, trailing, }) => ((0, jsx_runtime_1.jsx)(AccordionPrimitive.Root, { type: 'single', collapsible: true, value: isOpen ? 'open' : '', onValueChange: onToggle, className: ps_design_system_1.PallasoftClassNameService.merge('overflow-hidden rounded-ps-card border border-line/70 bg-surface/60 transition-colors duration-200', isOpen ? 'border-primary/25 bg-surface' : 'hover:border-line hover:bg-surface/90', className), children: (0, jsx_runtime_1.jsxs)(AccordionPrimitive.Item, { value: 'open', children: [(0, jsx_runtime_1.jsx)(AccordionPrimitive.Header, { children: (0, jsx_runtime_1.jsxs)(AccordionPrimitive.Trigger, { className: 'ps-focus-ring flex w-full items-center justify-between gap-3 px-4 py-3.5 text-left', children: [(0, jsx_runtime_1.jsx)("span", { className: 'text-body-2 font-semibold text-ink', children: label }), (0, jsx_runtime_1.jsxs)("span", { className: 'flex shrink-0 items-center gap-2', children: [trailing, (0, jsx_runtime_1.jsx)(ps_icons_1.PsIcon, { iconKey: ps_icons_1.PsIconKey.ChevronRight, className: ps_design_system_1.PallasoftClassNameService.merge('h-4 w-4 text-ink/40 transition-transform duration-200', isOpen ? 'rotate-90 text-primary' : '') })] })] }) }), (0, jsx_runtime_1.jsx)(AccordionPrimitive.Content, { className: 'ps-accordion-content', children: (0, jsx_runtime_1.jsx)("div", { className: 'border-t border-line/70 p-4', children: children }) })] }) }));
41
42
  exports.PsAccordion = PsAccordion;
@@ -0,0 +1,20 @@
1
+ import type { CSSProperties, ElementType, ReactNode } from 'react';
2
+ import { TypedObject } from '@portabletext/types';
3
+ export interface PsPortableTextProps {
4
+ bodyClasses?: string;
5
+ containerClasses?: string;
6
+ containerStyles?: CSSProperties;
7
+ headerClasses?: string;
8
+ isLargeBodyFont?: boolean;
9
+ linkClassName?: string;
10
+ LinkComponent?: ElementType<{
11
+ 'aria-label'?: string;
12
+ children?: ReactNode;
13
+ className?: string;
14
+ href: string;
15
+ rel?: string;
16
+ }>;
17
+ listClasses?: string;
18
+ text: TypedObject[];
19
+ }
20
+ export declare const PsPortableText: ({ bodyClasses, containerClasses, containerStyles, headerClasses, isLargeBodyFont, linkClassName, LinkComponent, listClasses, text, }: PsPortableTextProps) => import("react").JSX.Element;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsPortableText = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("@portabletext/react");
6
+ const ps_design_system_1 = require("@pallasoft/ps-design-system");
7
+ const PsPortableText = ({ bodyClasses = 'text-ink', containerClasses = '', containerStyles = {}, headerClasses = 'text-ink', isLargeBodyFont = false, linkClassName = 'text-primary underline', LinkComponent = 'a', listClasses = 'text-ink', text, }) => {
8
+ const hasContainerStyles = Object.keys(containerStyles).length > 0;
9
+ const getBodyClass = hasContainerStyles ? '' : bodyClasses;
10
+ const getHeaderClass = hasContainerStyles ? '' : headerClasses;
11
+ const getListClass = hasContainerStyles ? '' : listClasses;
12
+ const components = {
13
+ marks: {
14
+ link: ({ children, value }) => {
15
+ const rel = !value.href.startsWith('/') ? 'noreferrer noopener' : undefined;
16
+ return ((0, jsx_runtime_1.jsx)(LinkComponent, { href: value.href, rel: rel, className: linkClassName, "aria-label": value.children, children: children }));
17
+ },
18
+ },
19
+ list: {
20
+ bullet: ({ children }) => (0, jsx_runtime_1.jsx)("ul", { className: 'mb-3 mt-1 list-disc ml-4', children: children }),
21
+ number: ({ children }) => (0, jsx_runtime_1.jsx)("ol", { className: 'mb-3 mt-1 list-decimal ml-4', children: children }),
22
+ },
23
+ listItem: {
24
+ bullet: ({ children }) => ((0, jsx_runtime_1.jsx)("li", { className: ps_design_system_1.PallasoftClassNameService.merge('md:text-body-2 max-md:text-body-3', getListClass), children: children })),
25
+ number: ({ children }) => ((0, jsx_runtime_1.jsx)("li", { className: ps_design_system_1.PallasoftClassNameService.merge('md:text-body-2 max-md:text-body-3', getListClass), children: children })),
26
+ },
27
+ block: {
28
+ normal: ({ children }) => ((0, jsx_runtime_1.jsx)("p", { className: ps_design_system_1.PallasoftClassNameService.merge(isLargeBodyFont ? 'text-body-1' : 'text-body-2', 'whitespace-pre-line', getBodyClass), children: children })),
29
+ h2: ({ children }) => ((0, jsx_runtime_1.jsx)("h2", { className: ps_design_system_1.PallasoftClassNameService.merge('text-header-1 py-2', getHeaderClass), children: children })),
30
+ h3: ({ children }) => ((0, jsx_runtime_1.jsx)("h3", { className: ps_design_system_1.PallasoftClassNameService.merge('text-header-2 py-2', getHeaderClass), children: children })),
31
+ h4: ({ children }) => ((0, jsx_runtime_1.jsx)("h4", { className: ps_design_system_1.PallasoftClassNameService.merge('text-header-3 py-2', getHeaderClass), children: children })),
32
+ h5: ({ children }) => ((0, jsx_runtime_1.jsx)("h5", { className: ps_design_system_1.PallasoftClassNameService.merge('text-header-3 py-1', getHeaderClass), children: children })),
33
+ h6: ({ children }) => ((0, jsx_runtime_1.jsx)("h6", { className: ps_design_system_1.PallasoftClassNameService.merge('text-header-4 py-1', getHeaderClass), children: children })),
34
+ },
35
+ };
36
+ return ((0, jsx_runtime_1.jsx)("div", { className: containerClasses, style: containerStyles, children: (0, jsx_runtime_1.jsx)(react_1.PortableText, { value: text, components: components }) }));
37
+ };
38
+ exports.PsPortableText = PsPortableText;
@@ -7,8 +7,9 @@ export interface PsSiteHeaderProps {
7
7
  logoAlt?: string;
8
8
  logoClassName?: string;
9
9
  logoSrc: string;
10
+ logoSrcMobile?: string;
10
11
  onBack?: () => void;
11
12
  showLabel?: boolean;
12
13
  trailing?: ReactNode;
13
14
  }
14
- export declare const PsSiteHeader: ({ centerContent, homeHref, label, LinkComponent, logoAlt, logoClassName, logoSrc, onBack, showLabel, trailing, }: PsSiteHeaderProps) => import("react").JSX.Element;
15
+ export declare const PsSiteHeader: ({ centerContent, homeHref, label, LinkComponent, logoAlt, logoClassName, logoSrc, logoSrcMobile, onBack, showLabel, trailing, }: PsSiteHeaderProps) => import("react").JSX.Element;
@@ -5,9 +5,9 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const ps_design_system_1 = require("@pallasoft/ps-design-system");
6
6
  const ps_icons_1 = require("@pallasoft/ps-icons");
7
7
  const logoLinkClassName = 'flex shrink-0 items-center gap-2.5';
8
- const PsSiteHeader = ({ centerContent, homeHref, label, LinkComponent, logoAlt, logoClassName, logoSrc, onBack, showLabel = false, trailing, }) => {
8
+ const PsSiteHeader = ({ centerContent, homeHref, label, LinkComponent, logoAlt, logoClassName, logoSrc, logoSrcMobile, onBack, showLabel = false, trailing, }) => {
9
9
  const logoLabel = `${label} home`;
10
- const logoContent = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("img", { alt: logoAlt ?? label, className: ps_design_system_1.PallasoftClassNameService.merge('h-8 w-auto', logoClassName), src: logoSrc }), showLabel ? (0, jsx_runtime_1.jsx)("span", { className: 'text-base font-bold text-ink', children: label }) : null] }));
10
+ const logoContent = logoSrcMobile ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("img", { alt: logoAlt ?? label, className: ps_design_system_1.PallasoftClassNameService.merge('hidden h-8 w-auto sm:block', logoClassName), src: logoSrc }), (0, jsx_runtime_1.jsx)("img", { alt: logoAlt ?? label, className: ps_design_system_1.PallasoftClassNameService.merge('h-8 w-auto sm:hidden', logoClassName), src: logoSrcMobile }), showLabel ? (0, jsx_runtime_1.jsx)("span", { className: 'text-base font-bold text-ink', children: label }) : null] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("img", { alt: logoAlt ?? label, className: ps_design_system_1.PallasoftClassNameService.merge('h-8 w-auto', logoClassName), src: logoSrc }), showLabel ? (0, jsx_runtime_1.jsx)("span", { className: 'text-base font-bold text-ink', children: label }) : null] }));
11
11
  const logoLink = LinkComponent ? ((0, jsx_runtime_1.jsx)(LinkComponent, { "aria-label": logoLabel, className: logoLinkClassName, to: homeHref, children: logoContent })) : ((0, jsx_runtime_1.jsx)("a", { "aria-label": logoLabel, className: logoLinkClassName, href: homeHref, children: logoContent }));
12
12
  return ((0, jsx_runtime_1.jsx)("header", { className: 'fixed inset-x-0 top-0 z-header px-6 pt-4', children: (0, jsx_runtime_1.jsxs)("nav", { className: 'ps-glass mx-auto flex max-w-6xl items-center gap-3 rounded-ps-card px-5 py-3', children: [onBack ? ((0, jsx_runtime_1.jsx)("button", { "aria-label": 'Back', className: 'ps-focus-ring flex h-9 w-9 shrink-0 items-center justify-center rounded-full text-ink md:hidden', onClick: onBack, type: 'button', children: (0, jsx_runtime_1.jsx)(ps_icons_1.PsIcon, { iconKey: ps_icons_1.PsIconKey.ChevronRight, width: 20, height: 20, className: 'rotate-180' }) })) : null, (0, jsx_runtime_1.jsx)("div", { className: onBack ? 'hidden md:flex' : 'contents', children: logoLink }), (0, jsx_runtime_1.jsx)("div", { className: 'flex min-w-0 flex-1 items-center justify-center gap-3', children: centerContent }), trailing ? (0, jsx_runtime_1.jsx)("div", { className: 'flex shrink-0 items-center gap-2.5', children: trailing }) : null] }) }));
13
13
  };
@@ -2,10 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.usePsAudioSpectrum = void 0;
4
4
  const react_1 = require("react");
5
- const DefaultBarCount = 12;
6
- const DefaultFftSize = 128;
7
- const DefaultSmoothing = 0.75;
8
5
  const usePsAudioSpectrum = (audioElement, options = {}) => {
6
+ const DefaultBarCount = 12;
7
+ const DefaultFftSize = 128;
8
+ const DefaultSmoothing = 0.75;
9
9
  const barCount = typeof options.barCount === 'number' ? options.barCount : DefaultBarCount;
10
10
  const fftSize = typeof options.fftSize === 'number' ? options.fftSize : DefaultFftSize;
11
11
  const smoothing = typeof options.smoothing === 'number' ? options.smoothing : DefaultSmoothing;
@@ -50,12 +50,15 @@ const usePsAudioSpectrum = (audioElement, options = {}) => {
50
50
  if (audioContext.state === 'suspended')
51
51
  audioContext.resume().catch(() => undefined);
52
52
  };
53
+ const gestureEvents = ['touchend', 'mousedown', 'keydown'];
53
54
  resumeAudioContext();
54
55
  audioElement.addEventListener('play', resumeAudioContext);
56
+ gestureEvents.forEach((eventName) => document.addEventListener(eventName, resumeAudioContext, { once: true }));
55
57
  animationFrame = requestAnimationFrame(tick);
56
58
  return () => {
57
59
  cancelAnimationFrame(animationFrame);
58
60
  audioElement.removeEventListener('play', resumeAudioContext);
61
+ gestureEvents.forEach((eventName) => document.removeEventListener(eventName, resumeAudioContext));
59
62
  source.disconnect();
60
63
  analyser.disconnect();
61
64
  audioContext.close().catch(() => undefined);
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ export * from './components/ps-infinite-scroll';
11
11
  export * from './components/ps-list-tile';
12
12
  export * from './components/ps-metric-card';
13
13
  export * from './components/ps-pill';
14
+ export * from './components/ps-portable-text';
14
15
  export * from './components/ps-reflective-app-shell';
15
16
  export * from './components/ps-section-header';
16
17
  export * from './components/ps-site-header';
package/dist/index.js CHANGED
@@ -27,6 +27,7 @@ __exportStar(require("./components/ps-infinite-scroll"), exports);
27
27
  __exportStar(require("./components/ps-list-tile"), exports);
28
28
  __exportStar(require("./components/ps-metric-card"), exports);
29
29
  __exportStar(require("./components/ps-pill"), exports);
30
+ __exportStar(require("./components/ps-portable-text"), exports);
30
31
  __exportStar(require("./components/ps-reflective-app-shell"), exports);
31
32
  __exportStar(require("./components/ps-section-header"), exports);
32
33
  __exportStar(require("./components/ps-site-header"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pallasoft/ps-core-components",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "private": false,
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -28,8 +28,10 @@
28
28
  "release": "semantic-release"
29
29
  },
30
30
  "dependencies": {
31
- "@pallasoft/ps-design-system": "^1.0.0",
32
- "@pallasoft/ps-icons": "^1.0.0",
31
+ "@pallasoft/ps-design-system": "^1.1.0",
32
+ "@pallasoft/ps-icons": "^1.1.0",
33
+ "@portabletext/react": "^3.2.4",
34
+ "@portabletext/types": "^2.0.13",
33
35
  "@radix-ui/react-accordion": "^1.2.12",
34
36
  "react-infinite-scroll-component": "^6.1.1"
35
37
  },