@pallasoft/ps-core-components 2.33.0 → 2.35.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.
Files changed (144) hide show
  1. package/dist/analytics/index.d.ts +12 -0
  2. package/dist/analytics/index.js +28 -0
  3. package/dist/analytics/report-client-error.d.ts +1 -0
  4. package/dist/analytics/report-client-error.js +6 -0
  5. package/dist/components/ps-analytics-provider.d.ts +15 -0
  6. package/dist/components/ps-analytics-provider.js +73 -0
  7. package/dist/components/ps-client-error-reporter.d.ts +5 -0
  8. package/dist/components/ps-client-error-reporter.js +22 -0
  9. package/dist/components/ps-consent-banner.d.ts +11 -0
  10. package/dist/components/ps-consent-banner.js +21 -0
  11. package/dist/constants/ps-analytics-config.d.ts +20 -0
  12. package/dist/constants/ps-analytics-config.js +23 -0
  13. package/dist/constants/ps-client-error-config.d.ts +23 -0
  14. package/dist/constants/ps-client-error-config.js +17 -0
  15. package/dist/esm/analytics/index.js +12 -0
  16. package/dist/esm/analytics/report-client-error.js +2 -0
  17. package/dist/esm/components/ps-accordion.js +2 -2
  18. package/dist/esm/components/ps-action-tile.js +2 -2
  19. package/dist/esm/components/ps-active-filter-chip.js +1 -1
  20. package/dist/esm/components/ps-analytics-provider.js +69 -0
  21. package/dist/esm/components/ps-app-store-buttons.js +3 -3
  22. package/dist/esm/components/ps-audio-spectrum.js +1 -1
  23. package/dist/esm/components/ps-badge.js +2 -2
  24. package/dist/esm/components/ps-button.js +2 -2
  25. package/dist/esm/components/ps-capped-list.js +2 -2
  26. package/dist/esm/components/ps-card-block-skeleton.js +2 -2
  27. package/dist/esm/components/ps-card.js +3 -3
  28. package/dist/esm/components/ps-client-error-reporter.js +18 -0
  29. package/dist/esm/components/ps-client-only.js +1 -1
  30. package/dist/esm/components/ps-consent-banner.js +17 -0
  31. package/dist/esm/components/ps-drag-overlay.js +2 -2
  32. package/dist/esm/components/ps-draggable-grid.js +5 -5
  33. package/dist/esm/components/ps-fab.js +1 -1
  34. package/dist/esm/components/ps-faq-answer.js +1 -1
  35. package/dist/esm/components/ps-feature-card.js +1 -1
  36. package/dist/esm/components/ps-feature-grid.js +3 -3
  37. package/dist/esm/components/ps-form-fields-skeleton.js +3 -3
  38. package/dist/esm/components/ps-form-footer.js +1 -1
  39. package/dist/esm/components/ps-form-page-skeleton.js +4 -4
  40. package/dist/esm/components/ps-icon-button.js +1 -1
  41. package/dist/esm/components/ps-icon-link.js +1 -1
  42. package/dist/esm/components/ps-infinite-scroll.js +1 -1
  43. package/dist/esm/components/ps-intro-skeleton.js +1 -1
  44. package/dist/esm/components/ps-layer.js +1 -1
  45. package/dist/esm/components/ps-link-button.js +1 -1
  46. package/dist/esm/components/ps-link-tile-grid.js +1 -1
  47. package/dist/esm/components/ps-list-tile.js +2 -2
  48. package/dist/esm/components/ps-metric-card.js +2 -2
  49. package/dist/esm/components/ps-metric-grid-skeleton.js +1 -1
  50. package/dist/esm/components/ps-metric-grid.js +2 -2
  51. package/dist/esm/components/ps-metric-row.js +2 -2
  52. package/dist/esm/components/ps-navigation-progress.js +2 -2
  53. package/dist/esm/components/ps-page-header.js +2 -2
  54. package/dist/esm/components/ps-page-skeleton.js +6 -6
  55. package/dist/esm/components/ps-pallasoft-mark.js +1 -1
  56. package/dist/esm/components/ps-pallasoft-sign-in-button.js +2 -2
  57. package/dist/esm/components/ps-pill.js +2 -2
  58. package/dist/esm/components/ps-rating-display.js +2 -2
  59. package/dist/esm/components/ps-scaled-preview.js +2 -2
  60. package/dist/esm/components/ps-section-header.js +3 -3
  61. package/dist/esm/components/ps-section-panel-skeleton.js +1 -1
  62. package/dist/esm/components/ps-signed-amount.js +1 -1
  63. package/dist/esm/components/ps-site-header.js +2 -2
  64. package/dist/esm/components/ps-skeleton-card.js +2 -2
  65. package/dist/esm/components/ps-skeleton-list.js +4 -4
  66. package/dist/esm/components/ps-skeleton-media.js +3 -3
  67. package/dist/esm/components/ps-skeleton-table.js +4 -4
  68. package/dist/esm/components/ps-skeleton-text.js +3 -3
  69. package/dist/esm/components/ps-skeleton.js +3 -3
  70. package/dist/esm/components/ps-sortable-list.js +5 -5
  71. package/dist/esm/components/ps-start-panel.js +1 -1
  72. package/dist/esm/components/ps-step-list.js +2 -2
  73. package/dist/esm/components/ps-step-progress.js +1 -1
  74. package/dist/esm/components/ps-store-badge.js +1 -1
  75. package/dist/esm/components/ps-tab-row-skeleton.js +2 -2
  76. package/dist/esm/components/ps-table-list-skeleton.js +2 -2
  77. package/dist/esm/components/ps-table-page-skeleton.js +2 -2
  78. package/dist/esm/components/ps-theme-controller.js +2 -2
  79. package/dist/esm/components/ps-tool-card-grid.js +2 -2
  80. package/dist/esm/components/ps-voice-orb.js +1 -1
  81. package/dist/esm/constants/ps-analytics-config.js +20 -0
  82. package/dist/esm/constants/ps-client-error-config.js +14 -0
  83. package/dist/esm/constants/ps-draggable-grid.js +1 -1
  84. package/dist/esm/constants/ps-rating-display-config.js +1 -1
  85. package/dist/esm/constants/ps-skeleton-config.js +1 -1
  86. package/dist/esm/constants/ps-step-marker-class-names.js +1 -1
  87. package/dist/esm/constants/ps-store-badge-config.js +1 -1
  88. package/dist/esm/hooks/use-consent.js +17 -0
  89. package/dist/esm/hooks/use-ps-drag-sensors.js +1 -1
  90. package/dist/esm/hooks/use-ps-exit-transition.js +1 -1
  91. package/dist/esm/hooks/use-ps-hydrated.js +1 -1
  92. package/dist/esm/hooks/use-ps-layer-z-index.js +1 -1
  93. package/dist/esm/hooks/use-ps-navigation-progress.js +1 -1
  94. package/dist/esm/hooks/use-ps-optimistic-fetcher.js +2 -2
  95. package/dist/esm/hooks/use-ps-optimistic-save.js +2 -2
  96. package/dist/esm/hooks/use-ps-scroll-lock.js +1 -1
  97. package/dist/esm/index.js +173 -173
  98. package/dist/esm/models/analytics-csp-input.js +1 -0
  99. package/dist/esm/models/analytics-csp-origins.js +1 -0
  100. package/dist/esm/models/ps-client-error-payload.js +1 -0
  101. package/dist/esm/models/ps-client-error-settings.js +1 -0
  102. package/dist/esm/models/ps-consent-api.js +1 -0
  103. package/dist/esm/models/ps-consent-choice.js +1 -0
  104. package/dist/esm/models/ps-consent-state.js +1 -0
  105. package/dist/esm/models/ps-gtag-window.js +1 -0
  106. package/dist/esm/services/analytics-csp-service.js +27 -0
  107. package/dist/esm/services/ps-analytics-key-service.js +8 -0
  108. package/dist/esm/services/ps-client-error-service.js +72 -0
  109. package/dist/esm/services/ps-consent-service.js +57 -0
  110. package/dist/esm/services/ps-google-analytics-service.js +41 -0
  111. package/dist/esm/services/ps-optimistic-save-service.js +1 -1
  112. package/dist/esm/services/ps-post-hog-service.js +18 -0
  113. package/dist/esm/services/ps-skeleton-class-service.js +1 -1
  114. package/dist/hooks/use-consent.d.ts +2 -0
  115. package/dist/hooks/use-consent.js +21 -0
  116. package/dist/models/analytics-csp-input.d.ts +7 -0
  117. package/dist/models/analytics-csp-input.js +2 -0
  118. package/dist/models/analytics-csp-origins.d.ts +5 -0
  119. package/dist/models/analytics-csp-origins.js +2 -0
  120. package/dist/models/ps-client-error-payload.d.ts +9 -0
  121. package/dist/models/ps-client-error-payload.js +2 -0
  122. package/dist/models/ps-client-error-settings.d.ts +4 -0
  123. package/dist/models/ps-client-error-settings.js +2 -0
  124. package/dist/models/ps-consent-api.d.ts +9 -0
  125. package/dist/models/ps-consent-api.js +2 -0
  126. package/dist/models/ps-consent-choice.d.ts +1 -0
  127. package/dist/models/ps-consent-choice.js +2 -0
  128. package/dist/models/ps-consent-state.d.ts +5 -0
  129. package/dist/models/ps-consent-state.js +2 -0
  130. package/dist/models/ps-gtag-window.d.ts +4 -0
  131. package/dist/models/ps-gtag-window.js +2 -0
  132. package/dist/services/analytics-csp-service.d.ts +7 -0
  133. package/dist/services/analytics-csp-service.js +31 -0
  134. package/dist/services/ps-analytics-key-service.d.ts +3 -0
  135. package/dist/services/ps-analytics-key-service.js +12 -0
  136. package/dist/services/ps-client-error-service.d.ts +14 -0
  137. package/dist/services/ps-client-error-service.js +76 -0
  138. package/dist/services/ps-consent-service.d.ts +15 -0
  139. package/dist/services/ps-consent-service.js +61 -0
  140. package/dist/services/ps-google-analytics-service.d.ts +6 -0
  141. package/dist/services/ps-google-analytics-service.js +45 -0
  142. package/dist/services/ps-post-hog-service.d.ts +4 -0
  143. package/dist/services/ps-post-hog-service.js +55 -0
  144. package/package.json +17 -2
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsPageSkeletonConfig } from '../constants/ps-page-skeleton-config';
4
- import { PsSkeletonShape } from '../constants/ps-skeleton-shape';
5
- import { PsSkeleton } from './ps-skeleton';
3
+ import { PsPageSkeletonConfig } from '../constants/ps-page-skeleton-config.js';
4
+ import { PsSkeletonShape } from '../constants/ps-skeleton-shape.js';
5
+ import { PsSkeleton } from './ps-skeleton.js';
6
6
  export const PsFormFieldsSkeleton = ({ columnsClassName = PsPageSkeletonConfig.formColumnsClassName, fields = PsPageSkeletonConfig.formFields, }) => (_jsx("div", { className: PallasoftClassNameService.merge('grid gap-4', columnsClassName), children: fields.map((field) => (_jsxs("div", { className: 'flex flex-col gap-2', children: [_jsx(PsSkeleton, { className: PsPageSkeletonConfig.formLabelClassName }), _jsx(PsSkeleton, { className: 'h-ps-control w-full', shape: PsSkeletonShape.Block })] }, field))) }));
@@ -1,3 +1,3 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { PsButton } from './ps-button';
2
+ import { PsButton } from './ps-button.js';
3
3
  export const PsFormFooter = ({ isSaving, isSecondaryVisible = true, isSubmitDisabled, onSecondary, savingLabel, secondaryLabel, submitLabel, }) => (_jsxs("div", { className: 'sticky bottom-0 z-docked -mx-4 flex justify-end gap-2 border-t border-line bg-surface/90 px-4 py-3 backdrop-blur sm:bottom-4 sm:mx-0 sm:border-0 sm:bg-transparent sm:px-0 sm:py-0 sm:backdrop-blur-none', children: [isSecondaryVisible ? (_jsx(PsButton, { disabled: isSaving, onClick: onSecondary, type: 'button', variant: 'surface', children: secondaryLabel })) : null, _jsx(PsButton, { disabled: isSubmitDisabled || isSaving, isLoading: isSaving, loadingLabel: savingLabel, type: 'submit', variant: 'primary', children: submitLabel })] }));
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { PsPageSkeletonConfig } from '../constants/ps-page-skeleton-config';
3
- import { PsFormFieldsSkeleton } from './ps-form-fields-skeleton';
4
- import { PsPageSkeleton } from './ps-page-skeleton';
5
- import { PsSectionPanelSkeleton } from './ps-section-panel-skeleton';
2
+ import { PsPageSkeletonConfig } from '../constants/ps-page-skeleton-config.js';
3
+ import { PsFormFieldsSkeleton } from './ps-form-fields-skeleton.js';
4
+ import { PsPageSkeleton } from './ps-page-skeleton.js';
5
+ import { PsSectionPanelSkeleton } from './ps-section-panel-skeleton.js';
6
6
  export const PsFormPageSkeleton = ({ loadingLabel, title }) => (_jsx(PsPageSkeleton, { hasActions: true, loadingLabel: loadingLabel, title: title, children: PsPageSkeletonConfig.formSections.map((section) => (_jsx(PsSectionPanelSkeleton, { children: _jsx(PsFormFieldsSkeleton, {}) }, section))) }));
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
3
  import { PsIcon } from '@pallasoft/ps-icons';
4
- import { PsIconActionConfig } from '../constants/ps-icon-action-config';
4
+ import { PsIconActionConfig } from '../constants/ps-icon-action-config.js';
5
5
  export const PsIconButton = ({ className, iconKey, label, size = 'default', type, ...props }) => (_jsx("button", { ...props, "aria-label": label, className: PallasoftClassNameService.merge(PsIconActionConfig.className, PsIconActionConfig.sizeClassNames[size], PsIconActionConfig.disabledClassName, className), title: label, type: type === 'submit' || type === 'reset' ? type : 'button', children: _jsx(PsIcon, { "aria-hidden": 'true', className: PsIconActionConfig.iconClassName, iconKey: iconKey }) }));
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
3
  import { PsIcon } from '@pallasoft/ps-icons';
4
- import { PsIconActionConfig } from '../constants/ps-icon-action-config';
4
+ import { PsIconActionConfig } from '../constants/ps-icon-action-config.js';
5
5
  export const PsIconLink = ({ className, href, iconKey, label, LinkComponent, size = 'default', }) => {
6
6
  const linkClassName = PallasoftClassNameService.merge(PsIconActionConfig.className, PsIconActionConfig.sizeClassNames[size], className);
7
7
  const icon = (_jsx(PsIcon, { "aria-hidden": 'true', className: PsIconActionConfig.iconClassName, iconKey: iconKey }));
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import InfiniteScroll from 'react-infinite-scroll-component';
3
- import { PsSpinner } from './ps-spinner';
3
+ import { PsSpinner } from './ps-spinner.js';
4
4
  const defaultLoader = (_jsx("div", { className: 'flex w-full justify-center py-8', children: _jsx(PsSpinner, {}) }));
5
5
  export const PsInfiniteScroll = ({ children, className, dataLength, hasMore, loader, next, }) => (_jsx(InfiniteScroll, { className: className, dataLength: dataLength, hasMore: hasMore, loader: loader !== null && loader !== undefined ? loader : defaultLoader, next: next, children: children }));
@@ -1,3 +1,3 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { PsSkeleton } from './ps-skeleton';
2
+ import { PsSkeleton } from './ps-skeleton.js';
3
3
  export const PsIntroSkeleton = () => (_jsxs("div", { className: 'mx-auto flex w-full max-w-3xl flex-col items-center gap-4', children: [_jsx(PsSkeleton, { height: '0.875rem', radius: '999px', width: '6rem' }), _jsx(PsSkeleton, { height: '2.5rem', radius: '0.75rem', width: '70%' }), _jsx(PsSkeleton, { height: '1.125rem', radius: '0.5rem', width: '85%' })] }));
@@ -1,3 +1,3 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { PsLayerContext } from '../contexts/ps-layer-context';
2
+ import { PsLayerContext } from '../contexts/ps-layer-context.js';
3
3
  export const PsLayer = ({ children, zIndex }) => (_jsx(PsLayerContext.Provider, { value: zIndex, children: children }));
@@ -1,6 +1,6 @@
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, PsLinkButtonVariantClassNames, } from '../constants/ps-button-classes';
3
+ import { PsButtonBaseClassName, PsButtonSizeClassNames, PsLinkButtonVariantClassNames, } from '../constants/ps-button-classes.js';
4
4
  export const PsLinkButton = ({ children, className, href, leadingIcon, LinkComponent, size = 'default', trailingIcon, variant = 'secondary', ...props }) => {
5
5
  const linkClassName = PallasoftClassNameService.merge(PsButtonBaseClassName, PsButtonSizeClassNames[size], PsLinkButtonVariantClassNames[variant], className);
6
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] }));
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { PsIcon, PsIconKey } from '@pallasoft/ps-icons';
3
3
  import { PsStaggerContainer, PsStaggerItem } from '@pallasoft/ps-motion-components';
4
- import { PsWebsiteSectionConfig } from '../constants/ps-website-section-config';
4
+ import { PsWebsiteSectionConfig } from '../constants/ps-website-section-config.js';
5
5
  const tileClassName = 'ps-pressable ps-focus-ring group flex h-full items-center justify-between gap-3 rounded-ps-card border border-line bg-surface px-4 py-3 transition-colors hover:border-primary/50';
6
6
  export const PsLinkTileGrid = ({ LinkComponent, tiles }) => {
7
7
  const renderTile = (tile, content) => LinkComponent ? (_jsx(LinkComponent, { "aria-label": tile.ariaLabel, className: tileClassName, prefetch: 'intent', to: tile.href, children: content })) : (_jsx("a", { "aria-label": tile.ariaLabel, className: tileClassName, href: tile.href, children: content }));
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsSkeleton } from './ps-skeleton';
4
- import { PsSkeletonGroup } from './ps-skeleton-group';
3
+ import { PsSkeleton } from './ps-skeleton.js';
4
+ import { PsSkeletonGroup } from './ps-skeleton-group.js';
5
5
  const densityClassNames = {
6
6
  compact: 'py-2',
7
7
  normal: 'py-2.5',
@@ -1,5 +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 { PsSkeleton } from './ps-skeleton';
4
- import { PsSkeletonGroup } from './ps-skeleton-group';
3
+ import { PsSkeleton } from './ps-skeleton.js';
4
+ import { PsSkeletonGroup } from './ps-skeleton-group.js';
5
5
  export const PsMetricCard = ({ changeLabel, className, icon, isLoading = false, label, value, }) => isLoading ? (_jsxs(PsSkeletonGroup, { className: PallasoftClassNameService.merge('ps-metric-card flex min-w-0 flex-col gap-3 p-3.5 sm:p-4', className), label: label, children: [_jsx(PsSkeleton, { className: 'h-2.5 w-24' }), _jsx(PsSkeleton, { className: 'h-6 w-32' })] })) : (_jsx("section", { className: PallasoftClassNameService.merge('ps-metric-card min-w-0 p-3.5 sm:p-4', className), children: _jsxs("div", { className: 'flex items-start justify-between gap-3', children: [_jsxs("div", { className: 'min-w-0', children: [_jsx("p", { className: 'ps-eyebrow truncate', children: label }), _jsx("p", { className: 'mt-2 truncate text-2xl font-semibold text-ink', children: value }), changeLabel ? _jsx("p", { className: 'mt-1 text-sm text-slate-500', children: changeLabel }) : null] }), icon ? (_jsx("div", { className: 'flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-primary-soft text-primary', children: icon })) : null] }) }));
@@ -1,3 +1,3 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { PsMetricCard } from './ps-metric-card';
2
+ import { PsMetricCard } from './ps-metric-card.js';
3
3
  export const PsMetricGridSkeleton = ({ count }) => (_jsx("div", { className: 'grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4', children: Array.from({ length: count }, (_, index) => (_jsx(PsMetricCard, { isLoading: true, label: '', value: '' }, index))) }));
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsMetricGridColumns, PsMetricGridConfig } from '../constants/ps-metric-grid-config';
4
- import { PsMetricCard } from './ps-metric-card';
3
+ import { PsMetricGridColumns, PsMetricGridConfig } from '../constants/ps-metric-grid-config.js';
4
+ import { PsMetricCard } from './ps-metric-card.js';
5
5
  export const PsMetricGrid = ({ items }) => {
6
6
  const columns = PsMetricGridColumns[Math.min(items.length, PsMetricGridConfig.maxColumns)];
7
7
  return (_jsx("div", { className: PallasoftClassNameService.merge('grid grid-cols-1 gap-3', columns === undefined ? PsMetricGridColumns[PsMetricGridConfig.defaultColumns] : columns), children: items.map((item) => (_jsx(PsMetricCard, { label: item.label, value: item.value }, item.label))) }));
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { PsStaggerContainer, PsStaggerItem } from '@pallasoft/ps-motion-components';
3
- import { PsWebsiteSectionConfig } from '../constants/ps-website-section-config';
4
- import { PsMetricCard } from './ps-metric-card';
3
+ import { PsWebsiteSectionConfig } from '../constants/ps-website-section-config.js';
4
+ import { PsMetricCard } from './ps-metric-card.js';
5
5
  export const PsMetricRow = ({ metrics }) => (_jsx(PsStaggerContainer, { className: 'grid w-full grid-cols-1 gap-5 md:grid-cols-3', staggerDelay: PsWebsiteSectionConfig.staggerDelay, children: metrics.map((metric) => (_jsx(PsStaggerItem, { children: _jsx(PsMetricCard, { label: metric.label, value: metric.value }) }, metric.label))) }));
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService, PallasoftZIndex } from '@pallasoft/ps-design-system';
3
- import { PsNavigationProgressConfig } from '../constants/ps-navigation-progress-config';
4
- import { usePsNavigationProgress } from '../hooks/use-ps-navigation-progress';
3
+ import { PsNavigationProgressConfig } from '../constants/ps-navigation-progress-config.js';
4
+ import { usePsNavigationProgress } from '../hooks/use-ps-navigation-progress.js';
5
5
  export const PsNavigationProgress = ({ className, color = PsNavigationProgressConfig.defaultColor, delayMs = PsNavigationProgressConfig.showDelayMs, height = PsNavigationProgressConfig.defaultHeight, isLoading, label = PsNavigationProgressConfig.defaultLabel, progress, shadow = true, }) => {
6
6
  const { isAnimated, isVisible, width } = usePsNavigationProgress(isLoading !== undefined
7
7
  ? isLoading
@@ -1,4 +1,4 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { PsBackLink } from './ps-back-link';
3
- import { PsSectionHeader } from './ps-section-header';
2
+ import { PsBackLink } from './ps-back-link.js';
3
+ import { PsSectionHeader } from './ps-section-header.js';
4
4
  export const PsPageHeader = ({ actions, backLink, title }) => (_jsx(PsSectionHeader, { leading: backLink ? _jsx(PsBackLink, { ...backLink }) : undefined, title: title, trailing: actions ? (_jsx("div", { className: 'flex flex-wrap items-center justify-end gap-2', children: actions })) : undefined }));
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { PsSkeletonShape } from '../constants/ps-skeleton-shape';
3
- import { PsPageHeader } from './ps-page-header';
4
- import { PsPageLayout } from './ps-page-layout';
5
- import { PsPageStack } from './ps-page-stack';
6
- import { PsSectionHeader } from './ps-section-header';
7
- import { PsSkeleton } from './ps-skeleton';
2
+ import { PsSkeletonShape } from '../constants/ps-skeleton-shape.js';
3
+ import { PsPageHeader } from './ps-page-header.js';
4
+ import { PsPageLayout } from './ps-page-layout.js';
5
+ import { PsPageStack } from './ps-page-stack.js';
6
+ import { PsSectionHeader } from './ps-section-header.js';
7
+ import { PsSkeleton } from './ps-skeleton.js';
8
8
  export const PsPageSkeleton = ({ children, hasActions = false, isNarrow = false, loadingLabel, title, }) => (_jsx(PsPageLayout, { isNarrow: isNarrow, children: _jsxs(PsPageStack, { children: [title === undefined ? (_jsx(PsSectionHeader, { isLoading: true, title: loadingLabel, trailing: hasActions })) : (_jsx(PsPageHeader, { actions: hasActions ? (_jsx(PsSkeleton, { height: '2.5rem', radius: '9999px', shape: PsSkeletonShape.Block, width: '9rem' })) : undefined, title: title })), children] }) }));
@@ -1,3 +1,3 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { PsPallasoftMarkConfig } from '../constants/ps-pallasoft-mark-config';
2
+ import { PsPallasoftMarkConfig } from '../constants/ps-pallasoft-mark-config.js';
3
3
  export const PsPallasoftMark = ({ className, title }) => (_jsxs("svg", { "aria-hidden": title === undefined ? true : undefined, className: className, fill: 'none', role: title === undefined ? undefined : 'img', viewBox: PsPallasoftMarkConfig.viewBox, xmlns: 'http://www.w3.org/2000/svg', children: [title === undefined ? null : _jsx("title", { children: title }), _jsx("path", { clipRule: 'evenodd', d: PsPallasoftMarkConfig.primaryPath, fill: PsPallasoftMarkConfig.primaryColor, fillRule: 'evenodd' }), _jsx("path", { clipRule: 'evenodd', d: PsPallasoftMarkConfig.secondaryPath, fill: PsPallasoftMarkConfig.secondaryColor, fillRule: 'evenodd' })] }));
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsPallasoftSignInClasses } from '../constants/ps-pallasoft-sign-in-classes';
4
- import { PsPallasoftMark } from './ps-pallasoft-mark';
3
+ import { PsPallasoftSignInClasses } from '../constants/ps-pallasoft-sign-in-classes.js';
4
+ import { PsPallasoftMark } from './ps-pallasoft-mark.js';
5
5
  export const PsPallasoftSignInButton = ({ children, className, href, LinkComponent, size = 'default', ...props }) => {
6
6
  const linkClassName = PallasoftClassNameService.merge(PsPallasoftSignInClasses.base, PsPallasoftSignInClasses.sizes[size], className);
7
7
  const content = (_jsxs(_Fragment, { children: [_jsx(PsPallasoftMark, { className: PallasoftClassNameService.merge('shrink-0', PsPallasoftSignInClasses.markSizes[size]) }), _jsx("span", { className: 'truncate', children: children })] }));
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsSkeletonShape } from '../constants/ps-skeleton-shape';
4
- import { PsSkeleton } from './ps-skeleton';
3
+ import { PsSkeletonShape } from '../constants/ps-skeleton-shape.js';
4
+ import { PsSkeleton } from './ps-skeleton.js';
5
5
  const toneClassNames = {
6
6
  danger: 'bg-rose-50 text-rose-700 ring-rose-100 dark:bg-rose-500/18 dark:text-rose-100 dark:ring-rose-300/22',
7
7
  neutral: 'bg-slate-100 text-slate-700 ring-slate-200 dark:bg-white/10 dark:text-slate-100 dark:ring-white/12',
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
3
  import { PsIcon, PsIconKey } from '@pallasoft/ps-icons';
4
- import { PsRatingDisplayConfig } from '../constants/ps-rating-display-config';
5
- import { PsRatingDisplaySize } from '../constants/ps-rating-display-size';
4
+ import { PsRatingDisplayConfig } from '../constants/ps-rating-display-config.js';
5
+ import { PsRatingDisplaySize } from '../constants/ps-rating-display-size.js';
6
6
  export const PsRatingDisplay = ({ className, label, max = PsRatingDisplayConfig.defaultMax, score, size = PsRatingDisplaySize.Medium, }) => (_jsx("div", { "aria-label": label, className: PallasoftClassNameService.merge('flex items-center gap-1', className), role: 'img', children: Array.from({ length: max }, (_, index) => index + 1).map((value) => (_jsx(PsIcon, { className: PallasoftClassNameService.merge(PsRatingDisplayConfig.iconClassNames[size], value <= score
7
7
  ? PsRatingDisplayConfig.filledClassName
8
8
  : PsRatingDisplayConfig.emptyClassName), iconKey: PsIconKey.Star }, value))) }));
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsScaledPreviewConfig } from '../constants/ps-scaled-preview-config';
4
- import { usePsElementSize } from '../hooks/use-ps-element-size';
3
+ import { PsScaledPreviewConfig } from '../constants/ps-scaled-preview-config.js';
4
+ import { usePsElementSize } from '../hooks/use-ps-element-size.js';
5
5
  export const PsScaledPreview = ({ children, className, designWidth = PsScaledPreviewConfig.designWidth, isDecorative = true, }) => {
6
6
  const [frameRef, frame] = usePsElementSize();
7
7
  const [contentRef, content] = usePsElementSize();
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { PsSkeletonShape } from '../constants/ps-skeleton-shape';
3
- import { PsSkeleton } from './ps-skeleton';
4
- import { PsSkeletonGroup } from './ps-skeleton-group';
2
+ import { PsSkeletonShape } from '../constants/ps-skeleton-shape.js';
3
+ import { PsSkeleton } from './ps-skeleton.js';
4
+ import { PsSkeletonGroup } from './ps-skeleton-group.js';
5
5
  export const PsSectionHeader = ({ description, eyebrow, isLoading = false, leading, title, trailing, }) => isLoading ? (_jsxs(PsSkeletonGroup, { className: 'flex flex-wrap items-end justify-between gap-x-4 gap-y-3', label: title, children: [_jsxs("div", { className: 'flex min-w-0 flex-1 basis-auto flex-col gap-2', children: [eyebrow ? _jsx(PsSkeleton, { className: 'h-2.5 w-24' }) : null, _jsx(PsSkeleton, { className: 'h-6 w-52' }), description ? _jsx(PsSkeleton, { className: 'h-3 w-72' }) : null] }), trailing ? _jsx(PsSkeleton, { className: 'h-ps-control w-32', shape: PsSkeletonShape.Block }) : null] })) : (_jsxs("div", { className: 'flex flex-wrap items-end justify-between gap-x-4 gap-y-3', children: [_jsxs("div", { className: 'flex min-w-0 flex-1 basis-auto flex-col gap-2', children: [leading, eyebrow ? (_jsx("p", { className: 'text-[0.68rem] font-semibold uppercase tracking-[0.22em] text-ink/50', children: eyebrow })) : null, _jsx("h1", { className: 'break-words text-xl font-extrabold text-ink sm:text-2xl', children: title }), description ? (_jsx("p", { className: 'max-w-3xl text-sm leading-6 text-ink/60', children: description })) : null] }), trailing ? (_jsx("div", { className: 'flex w-full shrink-0 items-center justify-end sm:ml-auto sm:w-auto', children: trailing })) : null] }));
@@ -1,3 +1,3 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { PsSkeleton } from './ps-skeleton';
2
+ import { PsSkeleton } from './ps-skeleton.js';
3
3
  export const PsSectionPanelSkeleton = ({ children, title }) => (_jsxs("section", { className: 'ps-section', children: [_jsx("div", { className: 'flex min-h-10 items-center', children: title === undefined ? (_jsx(PsSkeleton, { className: 'h-4 w-44' })) : (_jsx("h2", { className: 'text-base font-semibold text-ink', children: title })) }), _jsx("div", { className: 'flex min-w-0 flex-col gap-4', children: children })] }));
@@ -1,7 +1,7 @@
1
1
  import { jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
3
  import { AmountDirection, Common } from '@pallasoft/ps-utilities';
4
- import { PsAmountDirectionClasses } from '../constants/ps-amount-direction-classes';
4
+ import { PsAmountDirectionClasses } from '../constants/ps-amount-direction-classes.js';
5
5
  export const PsSignedAmount = ({ amount, className, formatted }) => {
6
6
  const direction = Common.AmountService.direction(amount);
7
7
  return (_jsxs("span", { className: PallasoftClassNameService.merge('tabular-nums', PsAmountDirectionClasses[direction], className), children: [direction === AmountDirection.In ? '+' : '', formatted] }));
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
3
  import { PsIcon, PsIconKey } from '@pallasoft/ps-icons';
4
- import { PsSiteHeaderConfig } from '../constants/ps-site-header-config';
5
- import { usePsPublishedHeight } from '../hooks/use-ps-published-height';
4
+ import { PsSiteHeaderConfig } from '../constants/ps-site-header-config.js';
5
+ import { usePsPublishedHeight } from '../hooks/use-ps-published-height.js';
6
6
  const logoLinkClassName = 'flex shrink-0 items-center gap-2.5';
7
7
  export const PsSiteHeader = ({ centerContent, className, homeHref, label, LinkComponent, logoAlt, logoClassName, logoSrc, logoSrcDark, logoSrcMobile, logoSrcMobileDark, navClassName, onBack, showLabel = false, trailing, }) => {
8
8
  const headerRef = usePsPublishedHeight(PsSiteHeaderConfig.heightVariable);
@@ -1,5 +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 { PsSkeleton } from './ps-skeleton';
4
- import { PsSkeletonGroup } from './ps-skeleton-group';
3
+ import { PsSkeleton } from './ps-skeleton.js';
4
+ import { PsSkeletonGroup } from './ps-skeleton-group.js';
5
5
  export const PsSkeletonCard = ({ className }) => (_jsxs(PsSkeletonGroup, { className: PallasoftClassNameService.merge('flex flex-col gap-3 rounded-[1.25rem] border border-line bg-surface p-5', className), children: [_jsx(PsSkeleton, { className: 'h-2.5 w-24' }), _jsx(PsSkeleton, { className: 'h-6 w-32' })] }));
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsSkeletonConfig } from '../constants/ps-skeleton-config';
4
- import { PsSkeletonShape } from '../constants/ps-skeleton-shape';
5
- import { PsSkeleton } from './ps-skeleton';
6
- import { PsSkeletonGroup } from './ps-skeleton-group';
3
+ import { PsSkeletonConfig } from '../constants/ps-skeleton-config.js';
4
+ import { PsSkeletonShape } from '../constants/ps-skeleton-shape.js';
5
+ import { PsSkeleton } from './ps-skeleton.js';
6
+ import { PsSkeletonGroup } from './ps-skeleton-group.js';
7
7
  export const PsSkeletonList = ({ className, hasLeading = false, hasTrailing = true, rows = 4, title = false, }) => (_jsxs(PsSkeletonGroup, { className: PallasoftClassNameService.merge('flex flex-col', className), children: [title ? _jsx(PsSkeleton, { className: 'mx-3 mb-3 h-2.5 w-24' }) : null, Array.from({ length: rows }, (_, index) => (_jsxs("div", { className: 'flex min-h-11 items-center gap-3 px-3 py-2.5', children: [hasLeading ? _jsx(PsSkeleton, { shape: PsSkeletonShape.Circle }) : null, _jsx(PsSkeleton, { className: PsSkeletonConfig.lineWidths[index % PsSkeletonConfig.lineWidths.length] }), hasTrailing ? _jsx(PsSkeleton, { className: 'ml-auto h-2.5 w-20 shrink-0' }) : null] }, index)))] }));
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsSkeletonShape } from '../constants/ps-skeleton-shape';
4
- import { PsSkeleton } from './ps-skeleton';
5
- import { PsSkeletonGroup } from './ps-skeleton-group';
3
+ import { PsSkeletonShape } from '../constants/ps-skeleton-shape.js';
4
+ import { PsSkeleton } from './ps-skeleton.js';
5
+ import { PsSkeletonGroup } from './ps-skeleton-group.js';
6
6
  export const PsSkeletonMedia = ({ aspect = '16 / 9', className, hasCaption = true, label, }) => (_jsxs(PsSkeletonGroup, { className: PallasoftClassNameService.merge('w-full', className), label: label, children: [_jsx(PsSkeleton, { aspect: aspect, radius: 'var(--ps-radius-card, 1rem)', shape: PsSkeletonShape.Block }), hasCaption ? _jsx(PsSkeleton, { lines: 2, shape: PsSkeletonShape.Text }) : null] }));
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsSkeletonConfig } from '../constants/ps-skeleton-config';
4
- import { PsSkeletonShape } from '../constants/ps-skeleton-shape';
5
- import { PsSkeleton } from './ps-skeleton';
6
- import { PsSkeletonGroup } from './ps-skeleton-group';
3
+ import { PsSkeletonConfig } from '../constants/ps-skeleton-config.js';
4
+ import { PsSkeletonShape } from '../constants/ps-skeleton-shape.js';
5
+ import { PsSkeleton } from './ps-skeleton.js';
6
+ import { PsSkeletonGroup } from './ps-skeleton-group.js';
7
7
  export const PsSkeletonTable = ({ alignments, className, columns = 4, hasFooter = false, hasToolbar = false, isFramed = true, rows = 6, }) => {
8
8
  const gridTemplateColumns = `minmax(0, 2fr) repeat(${Math.max(columns - 1, 0)}, minmax(0, 1fr))`;
9
9
  const isRight = (columnIndex) => alignments !== undefined
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsSkeletonConfig } from '../constants/ps-skeleton-config';
4
- import { PsSkeletonShape } from '../constants/ps-skeleton-shape';
5
- import { PsSkeleton } from './ps-skeleton';
3
+ import { PsSkeletonConfig } from '../constants/ps-skeleton-config.js';
4
+ import { PsSkeletonShape } from '../constants/ps-skeleton-shape.js';
5
+ import { PsSkeleton } from './ps-skeleton.js';
6
6
  export const PsSkeletonText = ({ className, lines = PsSkeletonConfig.defaultTextLines, }) => (_jsx(PsSkeleton, { className: PallasoftClassNameService.merge('w-full', className), lines: lines, shape: PsSkeletonShape.Text }));
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsSkeletonConfig } from '../constants/ps-skeleton-config';
4
- import { PsSkeletonShape } from '../constants/ps-skeleton-shape';
5
- import { PsSkeletonClassService } from '../services/ps-skeleton-class-service';
3
+ import { PsSkeletonConfig } from '../constants/ps-skeleton-config.js';
4
+ import { PsSkeletonShape } from '../constants/ps-skeleton-shape.js';
5
+ import { PsSkeletonClassService } from '../services/ps-skeleton-class-service.js';
6
6
  const sizeStyle = (props) => {
7
7
  const style = {};
8
8
  if (props.width !== undefined)
@@ -3,11 +3,11 @@ import { useState } from 'react';
3
3
  import { DndContext, closestCenter, } from '@dnd-kit/core';
4
4
  import { SortableContext, horizontalListSortingStrategy, useSortable, verticalListSortingStrategy, } from '@dnd-kit/sortable';
5
5
  import { CSS } from '@dnd-kit/utilities';
6
- import { PsDragClasses, PsDragConfig, PsDragListLiftFrames } from '../constants/ps-drag-config';
7
- import { usePsDragSensors } from '../hooks/use-ps-drag-sensors';
8
- import { usePsReducedMotion } from '../hooks/use-ps-reduced-motion';
9
- import { PsDragGrip } from './ps-drag-grip';
10
- import { PsDragOverlay } from './ps-drag-overlay';
6
+ import { PsDragClasses, PsDragConfig, PsDragListLiftFrames } from '../constants/ps-drag-config.js';
7
+ import { usePsDragSensors } from '../hooks/use-ps-drag-sensors.js';
8
+ import { usePsReducedMotion } from '../hooks/use-ps-reduced-motion.js';
9
+ import { PsDragGrip } from './ps-drag-grip.js';
10
+ import { PsDragOverlay } from './ps-drag-overlay.js';
11
11
  const PsSortableListHandle = ({ attributes, className, icon, label, listeners, setActivatorNodeRef, }) => (_jsx("button", { ...attributes, ...listeners, "aria-label": label, className: className === undefined ? PsDragClasses.handle : className, ref: setActivatorNodeRef, title: label, type: 'button', children: icon === undefined ? _jsx(PsDragGrip, {}) : icon }));
12
12
  const PsSortableListRow = ({ className, handleClassName, handleIcon, getHandleLabel, index, isDisabled, item, renderItem, }) => {
13
13
  const isReduced = usePsReducedMotion();
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { PsCard } from './ps-card';
2
+ import { PsCard } from './ps-card.js';
3
3
  export const PsStartPanel = ({ actions, description, highlight, preview, steps, title, }) => (_jsx(PsCard, { density: 'spacious', children: _jsxs("div", { className: preview
4
4
  ? 'grid items-center gap-10 xl:grid-cols-[minmax(0,5fr)_minmax(0,7fr)]'
5
5
  : 'grid items-center gap-10', children: [_jsxs("div", { className: 'flex flex-col gap-7', children: [_jsxs("div", { className: 'flex flex-col gap-3', children: [_jsx("h2", { className: 'text-3xl font-extrabold leading-tight text-ink', children: title }), _jsx("p", { className: 'max-w-md text-sm leading-6 text-ink/60', children: description })] }), highlight, steps === undefined ? null : (_jsx("ol", { className: 'flex flex-col gap-4', children: steps.map((step, index) => (_jsxs("li", { className: 'flex items-start gap-4', children: [_jsx("span", { className: 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full border border-line/60 text-sm font-bold text-ink/70', children: index + 1 }), _jsxs("span", { className: 'flex min-w-0 flex-col gap-0.5', children: [_jsx("span", { className: 'text-sm font-bold text-ink', children: step.title }), _jsx("span", { className: 'text-sm leading-5 text-ink/55', children: step.description })] })] }, step.id))) })), actions] }), preview === undefined ? null : _jsx("div", { className: 'relative hidden xl:block', children: preview })] }) }));
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { PsStepMarkerClassNames } from '../constants/ps-step-marker-class-names';
3
- import { PsStepState } from '../constants/ps-step-state';
2
+ import { PsStepMarkerClassNames } from '../constants/ps-step-marker-class-names.js';
3
+ import { PsStepState } from '../constants/ps-step-state.js';
4
4
  export const PsStepList = ({ steps }) => (_jsx("ol", { className: 'flex flex-col rounded-ps-panel border border-line bg-surface', children: steps.map((step, index) => (_jsxs("li", { "aria-current": step.state === PsStepState.current ? 'step' : undefined, className: 'relative flex gap-4 border-b border-line/70 px-5 py-4 last:border-0', children: [_jsx("span", { className: `flex h-8 w-8 shrink-0 items-center justify-center rounded-full border text-sm font-semibold ${PsStepMarkerClassNames[step.state]}`, children: step.state === PsStepState.done ? _jsx("span", { "aria-hidden": 'true', children: "\u2713" }) : index + 1 }), _jsxs("div", { className: 'flex min-w-0 flex-1 flex-col gap-3', children: [_jsxs("div", { className: 'flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between', children: [_jsxs("div", { className: 'min-w-0', children: [_jsx("h3", { className: step.state === PsStepState.upcoming
5
5
  ? 'text-sm font-semibold text-ink/50'
6
6
  : 'text-sm font-semibold text-ink', children: step.title }), _jsx("p", { className: 'mt-0.5 text-sm text-ink/60', children: step.description })] }), step.actions ? (_jsx("div", { className: 'flex shrink-0 flex-wrap items-center gap-2', children: step.actions })) : null] }), step.content ? _jsx("div", { className: 'min-w-0', children: step.content }) : null] })] }, step.id))) }));
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsStepProgressConfig } from '../constants/ps-step-progress-config';
3
+ import { PsStepProgressConfig } from '../constants/ps-step-progress-config.js';
4
4
  export const PsStepProgress = ({ className, label = PsStepProgressConfig.defaultLabel, total, value, }) => {
5
5
  const steps = Math.max(total, PsStepProgressConfig.minimumTotal);
6
6
  const done = Math.min(Math.max(value, 0), steps);
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
3
- import { PsStoreBadgeClasses, PsStoreBadgeConfig } from '../constants/ps-store-badge-config';
3
+ import { PsStoreBadgeClasses, PsStoreBadgeConfig } from '../constants/ps-store-badge-config.js';
4
4
  export const PsStoreBadge = ({ className, href, labels, onPress, platform, size = 'default', }) => {
5
5
  const platformData = PsStoreBadgeConfig.platforms[platform];
6
6
  const shownLabels = labels === undefined ? platformData.labels : labels;
@@ -1,4 +1,4 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { PsSkeletonShape } from '../constants/ps-skeleton-shape';
3
- import { PsSkeleton } from './ps-skeleton';
2
+ import { PsSkeletonShape } from '../constants/ps-skeleton-shape.js';
3
+ import { PsSkeleton } from './ps-skeleton.js';
4
4
  export const PsTabRowSkeleton = () => (_jsx(PsSkeleton, { height: '2.75rem', radius: '9999px', shape: PsSkeletonShape.Block, width: '100%' }));
@@ -1,4 +1,4 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { PsPageSkeletonConfig } from '../constants/ps-page-skeleton-config';
3
- import { PsSkeletonTable } from './ps-skeleton-table';
2
+ import { PsPageSkeletonConfig } from '../constants/ps-page-skeleton-config.js';
3
+ import { PsSkeletonTable } from './ps-skeleton-table.js';
4
4
  export const PsTableListSkeleton = () => (_jsx(PsSkeletonTable, { columns: PsPageSkeletonConfig.tableColumns, hasToolbar: true, rows: PsPageSkeletonConfig.tableRows }));
@@ -1,4 +1,4 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { PsPageSkeleton } from './ps-page-skeleton';
3
- import { PsTableListSkeleton } from './ps-table-list-skeleton';
2
+ import { PsPageSkeleton } from './ps-page-skeleton.js';
3
+ import { PsTableListSkeleton } from './ps-table-list-skeleton.js';
4
4
  export const PsTablePageSkeleton = ({ isNarrow = false, loadingLabel, title, }) => (_jsx(PsPageSkeleton, { hasActions: true, isNarrow: isNarrow, loadingLabel: loadingLabel, title: title, children: _jsx(PsTableListSkeleton, {}) }));
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { usePsThemeMode } from '../hooks/use-ps-theme-mode';
3
- import { PsThemeToggle } from './ps-theme-toggle';
2
+ import { usePsThemeMode } from '../hooks/use-ps-theme-mode.js';
3
+ import { PsThemeToggle } from './ps-theme-toggle.js';
4
4
  export const PsThemeController = () => {
5
5
  const { resolvedMode, toggle } = usePsThemeMode();
6
6
  if (resolvedMode === null)
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { PsIcon, PsIconKey } from '@pallasoft/ps-icons';
3
3
  import { PsStaggerContainer, PsStaggerItem } from '@pallasoft/ps-motion-components';
4
- import { PsWebsiteSectionConfig } from '../constants/ps-website-section-config';
5
- import { PsCard } from './ps-card';
4
+ import { PsWebsiteSectionConfig } from '../constants/ps-website-section-config.js';
5
+ import { PsCard } from './ps-card.js';
6
6
  const cardLinkClassName = 'ps-pressable ps-focus-ring block h-full rounded-ps-card';
7
7
  export const PsToolCardGrid = ({ cards, LinkComponent }) => {
8
8
  const renderCard = (card, content) => LinkComponent ? (_jsx(LinkComponent, { "aria-label": card.ariaLabel, className: cardLinkClassName, prefetch: 'intent', to: card.href, children: content })) : (_jsx("a", { "aria-label": card.ariaLabel, className: cardLinkClassName, href: card.href, children: content }));
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useRef } from 'react';
3
3
  import { PallasoftClassNameService } from '@pallasoft/ps-design-system';
4
- import { PsVoiceOrbCadenceByState, PsVoiceOrbConfig, PsVoiceOrbThemes, } from '../constants/ps-voice-orb';
4
+ import { PsVoiceOrbCadenceByState, PsVoiceOrbConfig, PsVoiceOrbThemes, } from '../constants/ps-voice-orb.js';
5
5
  const clamp = (value, min, max) => Math.max(min, Math.min(max, value));
6
6
  const approach = (current, target, factor) => current + (target - current) * factor;
7
7
  const buildRimMask = (innerStopPercent) => `radial-gradient(circle, transparent ${innerStopPercent}%, black ${innerStopPercent + 6}%, black 92%, transparent 97%)`;
@@ -0,0 +1,20 @@
1
+ export const PsAnalyticsConfig = {
2
+ offValues: ['', '_'],
3
+ defaultConsentCookieName: 'ps_consent',
4
+ defaultRequireConsent: true,
5
+ consentGranted: 'granted',
6
+ consentDenied: 'denied',
7
+ consentMaxAgeSeconds: 31536000,
8
+ defaultTagManagerUrl: 'https://www.googletagmanager.com',
9
+ tagManagerScriptPath: '/gtag/js?id=',
10
+ scriptAttribute: 'data-ps-analytics',
11
+ postHog: {
12
+ defaults: '2026-05-30',
13
+ personProfiles: 'identified_only',
14
+ autocapture: true,
15
+ capturePageleave: true,
16
+ captureExceptions: true,
17
+ pageviewEvent: '$pageview',
18
+ },
19
+ listSeparator: ',',
20
+ };
@@ -0,0 +1,14 @@
1
+ export const PsClientErrorConfig = {
2
+ maxReportsPerPage: 10,
3
+ maxStackLength: 2048,
4
+ maxMessageLength: 500,
5
+ maxContextLength: 200,
6
+ jsonContentType: 'application/json',
7
+ emailPattern: /[^\s@"'()<>]+@[^\s@"'()<>]+\.[^\s@"'()<>]+/g,
8
+ redactedValue: '[redacted]',
9
+ unknownMessage: 'Unknown error',
10
+ botPattern: /bot|crawl|spider|slurp|headless/i,
11
+ mobilePattern: /mobi|android|iphone|ipad/i,
12
+ userAgentClasses: { bot: 'bot', mobile: 'mobile', desktop: 'desktop', unknown: 'unknown' },
13
+ sources: { error: 'error', rejection: 'unhandledrejection', boundary: 'boundary' },
14
+ };
@@ -1,4 +1,4 @@
1
- import { PsDragClasses, PsDragConfig, PsDragLiftFrames } from './ps-drag-config';
1
+ import { PsDragClasses, PsDragConfig, PsDragLiftFrames } from './ps-drag-config.js';
2
2
  export const PsDraggableGridConfig = PsDragConfig;
3
3
  export const PsDraggableGridClasses = {
4
4
  handle: PsDragClasses.handle,
@@ -1,4 +1,4 @@
1
- import { PsRatingDisplaySize } from './ps-rating-display-size';
1
+ import { PsRatingDisplaySize } from './ps-rating-display-size.js';
2
2
  export const PsRatingDisplayConfig = {
3
3
  defaultMax: 5,
4
4
  filledClassName: 'fill-current text-primary',
@@ -1,4 +1,4 @@
1
- import { PsSkeletonShape } from './ps-skeleton-shape';
1
+ import { PsSkeletonShape } from './ps-skeleton-shape.js';
2
2
  export const PsSkeletonConfig = {
3
3
  defaultTextLines: 3,
4
4
  lastLineWidth: 'w-2/3',
@@ -1,4 +1,4 @@
1
- import { PsStepState } from './ps-step-state';
1
+ import { PsStepState } from './ps-step-state.js';
2
2
  export const PsStepMarkerClassNames = {
3
3
  [PsStepState.done]: 'border-success bg-success text-white',
4
4
  [PsStepState.current]: 'border-primary bg-primary/10 text-primary',
@@ -1,4 +1,4 @@
1
- import { PsStorePlatform } from './ps-store-platform';
1
+ import { PsStorePlatform } from './ps-store-platform.js';
2
2
  export const PsStoreBadgeConfig = {
3
3
  logoViewBox: '0 0 24 24',
4
4
  platforms: {
@@ -0,0 +1,17 @@
1
+ import { useCallback, useSyncExternalStore } from 'react';
2
+ import { PsAnalyticsConfig } from '../constants/ps-analytics-config.js';
3
+ import { PsConsentService } from '../services/ps-consent-service.js';
4
+ export const useConsent = (consentCookieName = PsAnalyticsConfig.defaultConsentCookieName) => {
5
+ const state = useSyncExternalStore((listener) => PsConsentService.subscribe(listener), () => PsConsentService.snapshot(consentCookieName), () => PsConsentService.serverState);
6
+ const accept = useCallback(() => PsConsentService.choose(consentCookieName, PsAnalyticsConfig.consentGranted), [consentCookieName]);
7
+ const reject = useCallback(() => PsConsentService.choose(consentCookieName, PsAnalyticsConfig.consentDenied), [consentCookieName]);
8
+ const reopen = useCallback(() => PsConsentService.reopen(consentCookieName), [consentCookieName]);
9
+ return {
10
+ choice: state.choice,
11
+ isGranted: state.choice === PsAnalyticsConfig.consentGranted,
12
+ isBannerOpen: state === PsConsentService.serverState ? false : state.choice === null || state.isReopened,
13
+ accept,
14
+ reject,
15
+ reopen,
16
+ };
17
+ };
@@ -1,6 +1,6 @@
1
1
  import { KeyboardSensor, MouseSensor, TouchSensor, useSensor, useSensors, } from '@dnd-kit/core';
2
2
  import { sortableKeyboardCoordinates } from '@dnd-kit/sortable';
3
- import { PsDragConfig } from '../constants/ps-drag-config';
3
+ import { PsDragConfig } from '../constants/ps-drag-config.js';
4
4
  export const usePsDragSensors = () => useSensors(useSensor(MouseSensor, {
5
5
  activationConstraint: { distance: PsDragConfig.activationDistance },
6
6
  }), useSensor(TouchSensor, {
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useRef, useState } from 'react';
2
- import { usePsReducedMotion } from './use-ps-reduced-motion';
2
+ import { usePsReducedMotion } from './use-ps-reduced-motion.js';
3
3
  export const usePsExitTransition = (isOpen, durationMs = 180) => {
4
4
  const [shouldRender, setShouldRender] = useState(isOpen);
5
5
  const [isClosing, setIsClosing] = useState(false);