@flamingo-stack/openframe-frontend-core 0.0.315 → 0.0.316
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-7U4YFQX2.js → chunk-2Y4DLBFO.js} +96 -92
- package/dist/{chunk-7U4YFQX2.js.map → chunk-2Y4DLBFO.js.map} +1 -1
- package/dist/{chunk-HATCNFQL.cjs → chunk-4MCMPYEM.cjs} +12 -12
- package/dist/{chunk-HATCNFQL.cjs.map → chunk-4MCMPYEM.cjs.map} +1 -1
- package/dist/{chunk-VY5YF4B7.js → chunk-4NVA6W3J.js} +27 -22
- package/dist/chunk-4NVA6W3J.js.map +1 -0
- package/dist/chunk-4V3TCOFC.cjs +394 -0
- package/dist/chunk-4V3TCOFC.cjs.map +1 -0
- package/dist/{chunk-A2H6TFS4.cjs → chunk-63A53WQN.cjs} +33 -33
- package/dist/{chunk-A2H6TFS4.cjs.map → chunk-63A53WQN.cjs.map} +1 -1
- package/dist/{chunk-6W54MBU2.js → chunk-64DZ2J7Q.js} +5 -5
- package/dist/{chunk-47JZOP7Y.js → chunk-6KERXOFE.js} +3 -3
- package/dist/{chunk-JALO4TAZ.js → chunk-AI5X5JTD.js} +4 -4
- package/dist/chunk-CSLMCBZV.js +1464 -0
- package/dist/chunk-CSLMCBZV.js.map +1 -0
- package/dist/{chunk-BSAFGQVW.cjs → chunk-CUNMBP3A.cjs} +13 -13
- package/dist/{chunk-BSAFGQVW.cjs.map → chunk-CUNMBP3A.cjs.map} +1 -1
- package/dist/{chunk-TVNILN2F.cjs → chunk-DHVL36CA.cjs} +40 -40
- package/dist/{chunk-TVNILN2F.cjs.map → chunk-DHVL36CA.cjs.map} +1 -1
- package/dist/chunk-FCEVVNWY.cjs +1916 -0
- package/dist/chunk-FCEVVNWY.cjs.map +1 -0
- package/dist/chunk-FOVX3W3C.cjs +1464 -0
- package/dist/chunk-FOVX3W3C.cjs.map +1 -0
- package/dist/{chunk-4D37W55K.js → chunk-GHVVOST5.js} +95 -116
- package/dist/chunk-GHVVOST5.js.map +1 -0
- package/dist/{chunk-TRSDXD23.js → chunk-JAZM3A7E.js} +2 -2
- package/dist/{chunk-TK6OABYF.js → chunk-JEBL5PQK.js} +21 -35
- package/dist/{chunk-TK6OABYF.js.map → chunk-JEBL5PQK.js.map} +1 -1
- package/dist/{chunk-5ATH263N.cjs → chunk-L5JSGNT3.cjs} +35 -35
- package/dist/{chunk-5ATH263N.cjs.map → chunk-L5JSGNT3.cjs.map} +1 -1
- package/dist/{chunk-TQ7CMFSY.cjs → chunk-LAMDFGE3.cjs} +41 -36
- package/dist/chunk-LAMDFGE3.cjs.map +1 -0
- package/dist/{chunk-V4IIBNTA.js → chunk-LQHMXPOJ.js} +5 -5
- package/dist/{chunk-LGLPNWS6.cjs → chunk-LWNPMLIH.cjs} +3 -3
- package/dist/{chunk-LGLPNWS6.cjs.map → chunk-LWNPMLIH.cjs.map} +1 -1
- package/dist/chunk-M3NULYCR.js +1916 -0
- package/dist/chunk-M3NULYCR.js.map +1 -0
- package/dist/{chunk-MOOV4ORG.js → chunk-OKGZK6TT.js} +3 -3
- package/dist/{chunk-WFHNXCI3.cjs → chunk-OLEW7FYZ.cjs} +123 -144
- package/dist/chunk-OLEW7FYZ.cjs.map +1 -0
- package/dist/chunk-PIJ4JLJU.js +394 -0
- package/dist/chunk-PIJ4JLJU.js.map +1 -0
- package/dist/{chunk-E4CQ4RUG.js → chunk-Q4AMYLKX.js} +11 -11
- package/dist/{chunk-FQOTC3UU.cjs → chunk-QJGRP2YE.cjs} +4 -4
- package/dist/{chunk-FQOTC3UU.cjs.map → chunk-QJGRP2YE.cjs.map} +1 -1
- package/dist/{chunk-ZPK5HW7B.cjs → chunk-UGDGUO26.cjs} +3 -3
- package/dist/{chunk-ZPK5HW7B.cjs.map → chunk-UGDGUO26.cjs.map} +1 -1
- package/dist/{chunk-QW6OL4NY.cjs → chunk-VCE3ZEN3.cjs} +5 -5
- package/dist/{chunk-QW6OL4NY.cjs.map → chunk-VCE3ZEN3.cjs.map} +1 -1
- package/dist/{chunk-2JPSWDSM.cjs → chunk-XAQJ4ZLY.cjs} +447 -443
- package/dist/{chunk-2JPSWDSM.cjs.map → chunk-XAQJ4ZLY.cjs.map} +1 -1
- package/dist/{chunk-2MLMZAK4.js → chunk-YFGDZFUG.js} +4 -4
- package/dist/{chunk-VFIWQGJZ.js → chunk-Z3YORGG4.js} +2 -2
- package/dist/{chunk-OSEKWT6X.cjs → chunk-ZYGVJXJ5.cjs} +33 -47
- package/dist/chunk-ZYGVJXJ5.cjs.map +1 -0
- package/dist/components/case-studies/index.cjs +18 -18
- package/dist/components/case-studies/index.cjs.map +1 -1
- package/dist/components/case-studies/index.js +8 -8
- package/dist/components/chat/index.cjs +8 -8
- package/dist/components/chat/index.js +7 -7
- package/dist/components/contact/index.cjs +9 -9
- package/dist/components/contact/index.js +8 -8
- package/dist/components/docs/doc-viewer.d.ts +4 -0
- package/dist/components/docs/doc-viewer.d.ts.map +1 -1
- package/dist/components/docs/index.cjs +11 -11
- package/dist/components/docs/index.js +10 -10
- package/dist/components/embeds/index.cjs +9 -9
- package/dist/components/embeds/index.js +8 -8
- package/dist/components/faq/faq-document-page.d.ts +18 -20
- package/dist/components/faq/faq-document-page.d.ts.map +1 -1
- package/dist/components/faq/index.cjs +10 -10
- package/dist/components/faq/index.js +9 -9
- package/dist/components/features/index.cjs +8 -8
- package/dist/components/features/index.js +7 -7
- package/dist/components/help-center-pages/delivery-page.d.ts +27 -0
- package/dist/components/help-center-pages/delivery-page.d.ts.map +1 -0
- package/dist/components/help-center-pages/index.cjs +164 -0
- package/dist/components/help-center-pages/index.cjs.map +1 -0
- package/dist/components/help-center-pages/index.d.ts +25 -0
- package/dist/components/help-center-pages/index.d.ts.map +1 -0
- package/dist/components/help-center-pages/index.js +164 -0
- package/dist/components/help-center-pages/index.js.map +1 -0
- package/dist/components/help-center-pages/onboarding-guides-catalog-page.d.ts +41 -0
- package/dist/components/help-center-pages/onboarding-guides-catalog-page.d.ts.map +1 -0
- package/dist/components/help-center-pages/product-releases-list-page.d.ts +34 -0
- package/dist/components/help-center-pages/product-releases-list-page.d.ts.map +1 -0
- package/dist/components/help-center-pages/roadmap-page.d.ts +40 -0
- package/dist/components/help-center-pages/roadmap-page.d.ts.map +1 -0
- package/dist/components/icons/index.cjs +3 -3
- package/dist/components/icons/index.js +2 -2
- package/dist/components/index.cjs +177 -1555
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +348 -1726
- package/dist/components/index.js.map +1 -1
- package/dist/components/layout/page-layout.d.ts +4 -1
- package/dist/components/layout/page-layout.d.ts.map +1 -1
- package/dist/components/layout/title-block.d.ts +5 -1
- package/dist/components/layout/title-block.d.ts.map +1 -1
- package/dist/components/navigation/index.cjs +8 -8
- package/dist/components/navigation/index.js +7 -7
- package/dist/components/onboarding-guides/index.cjs +15 -364
- package/dist/components/onboarding-guides/index.cjs.map +1 -1
- package/dist/components/onboarding-guides/index.js +20 -369
- package/dist/components/onboarding-guides/index.js.map +1 -1
- package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts +9 -1
- package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts.map +1 -1
- package/dist/components/related-content/index.cjs +10 -10
- package/dist/components/related-content/index.js +9 -9
- package/dist/components/shared/dev-section/dev-section-page.d.ts +7 -1
- package/dist/components/shared/dev-section/dev-section-page.d.ts.map +1 -1
- package/dist/components/shared/dev-section/dev-section-view.d.ts +7 -1
- package/dist/components/shared/dev-section/dev-section-view.d.ts.map +1 -1
- package/dist/components/shared/legal-document/legal-document-page.d.ts +5 -1
- package/dist/components/shared/legal-document/legal-document-page.d.ts.map +1 -1
- package/dist/components/shared/product-release/release-detail-page.d.ts +11 -2
- package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
- package/dist/components/tickets/help-center-list.d.ts +5 -1
- package/dist/components/tickets/help-center-list.d.ts.map +1 -1
- package/dist/components/tickets/index.cjs +15 -1882
- package/dist/components/tickets/index.cjs.map +1 -1
- package/dist/components/tickets/index.js +28 -1895
- package/dist/components/tickets/index.js.map +1 -1
- package/dist/components/ui/file-manager/index.cjs +53 -53
- package/dist/components/ui/file-manager/index.cjs.map +1 -1
- package/dist/components/ui/file-manager/index.js +4 -4
- package/dist/components/ui/index.cjs +8 -8
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.js +7 -7
- package/dist/hooks/index.cjs +5 -5
- package/dist/hooks/index.js +4 -4
- package/dist/index.cjs +10 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +9 -9
- package/package.json +7 -1
- package/src/components/docs/doc-viewer.tsx +21 -34
- package/src/components/faq/faq-document-page.tsx +33 -60
- package/src/components/help-center-pages/delivery-page.tsx +45 -0
- package/src/components/help-center-pages/index.ts +41 -0
- package/src/components/help-center-pages/onboarding-guides-catalog-page.tsx +66 -0
- package/src/components/help-center-pages/product-releases-list-page.tsx +58 -0
- package/src/components/help-center-pages/roadmap-page.tsx +68 -0
- package/src/components/layout/page-layout.tsx +11 -0
- package/src/components/layout/title-block.tsx +15 -2
- package/src/components/onboarding-guides/onboarding-guide-detail-view.tsx +30 -19
- package/src/components/shared/dev-section/dev-section-page.tsx +29 -19
- package/src/components/shared/dev-section/dev-section-view.tsx +26 -19
- package/src/components/shared/legal-document/legal-document-page.tsx +19 -23
- package/src/components/shared/product-release/release-detail-page.tsx +36 -36
- package/src/components/tickets/help-center-list.tsx +11 -3
- package/dist/chunk-4D37W55K.js.map +0 -1
- package/dist/chunk-OSEKWT6X.cjs.map +0 -1
- package/dist/chunk-TQ7CMFSY.cjs.map +0 -1
- package/dist/chunk-VY5YF4B7.js.map +0 -1
- package/dist/chunk-WFHNXCI3.cjs.map +0 -1
- /package/dist/{chunk-6W54MBU2.js.map → chunk-64DZ2J7Q.js.map} +0 -0
- /package/dist/{chunk-47JZOP7Y.js.map → chunk-6KERXOFE.js.map} +0 -0
- /package/dist/{chunk-JALO4TAZ.js.map → chunk-AI5X5JTD.js.map} +0 -0
- /package/dist/{chunk-TRSDXD23.js.map → chunk-JAZM3A7E.js.map} +0 -0
- /package/dist/{chunk-V4IIBNTA.js.map → chunk-LQHMXPOJ.js.map} +0 -0
- /package/dist/{chunk-MOOV4ORG.js.map → chunk-OKGZK6TT.js.map} +0 -0
- /package/dist/{chunk-E4CQ4RUG.js.map → chunk-Q4AMYLKX.js.map} +0 -0
- /package/dist/{chunk-2MLMZAK4.js.map → chunk-YFGDZFUG.js.map} +0 -0
- /package/dist/{chunk-VFIWQGJZ.js.map → chunk-Z3YORGG4.js.map} +0 -0
package/dist/components/index.js
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
"use client";
|
|
3
|
+
import "../chunk-GZ4C3XW6.js";
|
|
4
|
+
import {
|
|
5
|
+
GROUP_PAGE_SIZE,
|
|
6
|
+
RelatedContentSection
|
|
7
|
+
} from "../chunk-OKGZK6TT.js";
|
|
8
|
+
import {
|
|
9
|
+
DeliveryLists,
|
|
10
|
+
DeliveryTable,
|
|
11
|
+
LegalDocumentPage,
|
|
12
|
+
MediaGalleryStrip,
|
|
13
|
+
PersistentPagination,
|
|
14
|
+
PersistentPaginationWrapper,
|
|
15
|
+
ProductReleasesView,
|
|
16
|
+
ReleaseDetailPage,
|
|
17
|
+
ReleaseDetailSkeleton,
|
|
18
|
+
RoadmapGrid,
|
|
19
|
+
RoadmapGridSkeleton,
|
|
20
|
+
RoadmapView,
|
|
21
|
+
useLegalDocs,
|
|
22
|
+
usePaginationLoading,
|
|
23
|
+
useRoadmapVoting
|
|
24
|
+
} from "../chunk-CSLMCBZV.js";
|
|
3
25
|
import {
|
|
4
26
|
AnnouncementBarSkeleton,
|
|
5
27
|
ArticleLayoutSkeleton,
|
|
@@ -32,22 +54,17 @@ import {
|
|
|
32
54
|
useDocNavigation,
|
|
33
55
|
useDocumentTree,
|
|
34
56
|
useScrollSpy
|
|
35
|
-
} from "../chunk-
|
|
36
|
-
import "../chunk-GZ4C3XW6.js";
|
|
57
|
+
} from "../chunk-GHVVOST5.js";
|
|
37
58
|
import {
|
|
38
59
|
FileDownloadCard,
|
|
39
60
|
GoogleSheetsViewer,
|
|
40
61
|
PdfViewer
|
|
41
|
-
} from "../chunk-
|
|
62
|
+
} from "../chunk-64DZ2J7Q.js";
|
|
42
63
|
import {
|
|
43
64
|
FaqAccordion,
|
|
44
65
|
FaqDocumentPage,
|
|
45
66
|
FaqSection
|
|
46
|
-
} from "../chunk-
|
|
47
|
-
import {
|
|
48
|
-
GROUP_PAGE_SIZE,
|
|
49
|
-
RelatedContentSection
|
|
50
|
-
} from "../chunk-MOOV4ORG.js";
|
|
67
|
+
} from "../chunk-JEBL5PQK.js";
|
|
51
68
|
import {
|
|
52
69
|
DeliveryRow,
|
|
53
70
|
DevCardRowContent,
|
|
@@ -57,13 +74,12 @@ import {
|
|
|
57
74
|
DevSectionView,
|
|
58
75
|
EmptyState,
|
|
59
76
|
UnifiedPagination,
|
|
60
|
-
init_unified_pagination
|
|
61
|
-
|
|
62
|
-
} from "../chunk-VY5YF4B7.js";
|
|
77
|
+
init_unified_pagination
|
|
78
|
+
} from "../chunk-4NVA6W3J.js";
|
|
63
79
|
import {
|
|
64
80
|
ArticleAuthorByline,
|
|
65
81
|
DetailPageSkeleton
|
|
66
|
-
} from "../chunk-
|
|
82
|
+
} from "../chunk-Z3YORGG4.js";
|
|
67
83
|
import {
|
|
68
84
|
DocSearchBar,
|
|
69
85
|
DocSearchResultRow,
|
|
@@ -71,10 +87,8 @@ import {
|
|
|
71
87
|
mapDocSearchResults,
|
|
72
88
|
resolveSearchResultAction,
|
|
73
89
|
useDocSearch
|
|
74
|
-
} from "../chunk-
|
|
75
|
-
import
|
|
76
|
-
useSelfFetch
|
|
77
|
-
} from "../chunk-TRSDXD23.js";
|
|
90
|
+
} from "../chunk-6KERXOFE.js";
|
|
91
|
+
import "../chunk-JAZM3A7E.js";
|
|
78
92
|
import "../chunk-4XLJWX2N.js";
|
|
79
93
|
import {
|
|
80
94
|
ADMIN_APPROVAL_REQUEST_CONTEXT_TYPE,
|
|
@@ -258,7 +272,6 @@ import {
|
|
|
258
272
|
DEFAULT_CUSTOM_STATUS_COLOR,
|
|
259
273
|
DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID,
|
|
260
274
|
DEFAULT_THEME,
|
|
261
|
-
DEV_SECTION_PARAM_KEYS,
|
|
262
275
|
DashboardInfoCard,
|
|
263
276
|
DataRoomDocCard,
|
|
264
277
|
DataRoomDocCardSkeleton,
|
|
@@ -670,7 +683,6 @@ import {
|
|
|
670
683
|
defaultTableIdForDocumentType,
|
|
671
684
|
deriveColumns,
|
|
672
685
|
detectAspectRatio,
|
|
673
|
-
devSectionAnchorId,
|
|
674
686
|
escapeMarkdownInline,
|
|
675
687
|
executeNavigation,
|
|
676
688
|
executeNavigationImperative,
|
|
@@ -688,9 +700,7 @@ import {
|
|
|
688
700
|
formatBioText,
|
|
689
701
|
formatChatAttachmentMarkdownForBubble,
|
|
690
702
|
formatInvestorUpdatePeriod,
|
|
691
|
-
formatLegalDate,
|
|
692
703
|
formatRelativeTime,
|
|
693
|
-
formatReleaseDate,
|
|
694
704
|
formatSingularLookupInvocation,
|
|
695
705
|
getApprovalMeta,
|
|
696
706
|
getCaptionsUrl,
|
|
@@ -748,7 +758,6 @@ import {
|
|
|
748
758
|
remarkMentionChips,
|
|
749
759
|
renderChatInlineEntityCard,
|
|
750
760
|
resolutionToStatus,
|
|
751
|
-
resolveContentHref,
|
|
752
761
|
resolveExternalNavigation,
|
|
753
762
|
resolveOnboardingIcon,
|
|
754
763
|
resolveSourceIcon,
|
|
@@ -780,7 +789,6 @@ import {
|
|
|
780
789
|
useDataTableContext,
|
|
781
790
|
useDynamicTheme,
|
|
782
791
|
useEmptyStateConfig,
|
|
783
|
-
useEntityCardLink,
|
|
784
792
|
useFiltersDropdown,
|
|
785
793
|
useJetStreamDialogSubscription,
|
|
786
794
|
useLoading,
|
|
@@ -806,15 +814,13 @@ import {
|
|
|
806
814
|
useVideoOriginPreconnect,
|
|
807
815
|
useVideoWarmup,
|
|
808
816
|
usesCanonicalStatusStyle
|
|
809
|
-
} from "../chunk-
|
|
817
|
+
} from "../chunk-2Y4DLBFO.js";
|
|
810
818
|
import {
|
|
811
819
|
CommandApprovalToast,
|
|
812
|
-
STICKY_HEADER_OFFSET_PX,
|
|
813
820
|
ToastCard,
|
|
814
821
|
Toaster,
|
|
815
822
|
applyProxyAuth,
|
|
816
823
|
clearEmbedProxyAuth,
|
|
817
|
-
contentFetch,
|
|
818
824
|
dotColorByVariant,
|
|
819
825
|
embedAuthedFetch,
|
|
820
826
|
getAppType,
|
|
@@ -825,9 +831,9 @@ import {
|
|
|
825
831
|
showCommandApprovalToast,
|
|
826
832
|
showToast,
|
|
827
833
|
useOnboardingState,
|
|
828
|
-
useScrollToHash,
|
|
829
834
|
useToast
|
|
830
|
-
} from "../chunk-
|
|
835
|
+
} from "../chunk-Q4AMYLKX.js";
|
|
836
|
+
import "../chunk-J7AV6H63.js";
|
|
831
837
|
import {
|
|
832
838
|
useChatRuntime,
|
|
833
839
|
useEndpointsRuntime
|
|
@@ -835,7 +841,6 @@ import {
|
|
|
835
841
|
import "../chunk-EL5YVPD5.js";
|
|
836
842
|
import {
|
|
837
843
|
init_next_navigation,
|
|
838
|
-
usePathname,
|
|
839
844
|
useRouter,
|
|
840
845
|
useSearchParams
|
|
841
846
|
} from "../chunk-PLJLE4A4.js";
|
|
@@ -873,7 +878,8 @@ import {
|
|
|
873
878
|
SplitButton,
|
|
874
879
|
buttonVariants,
|
|
875
880
|
init_button2 as init_button
|
|
876
|
-
} from "../chunk-
|
|
881
|
+
} from "../chunk-AI5X5JTD.js";
|
|
882
|
+
import "../chunk-6U3IUD57.js";
|
|
877
883
|
import {
|
|
878
884
|
init_next_link,
|
|
879
885
|
next_link_default
|
|
@@ -1029,19 +1035,15 @@ import {
|
|
|
1029
1035
|
YouTubeIcon,
|
|
1030
1036
|
getDeviceTypeIcon,
|
|
1031
1037
|
renderSvgIcon
|
|
1032
|
-
} from "../chunk-
|
|
1038
|
+
} from "../chunk-LQHMXPOJ.js";
|
|
1039
|
+
import "../chunk-W72U7OU7.js";
|
|
1033
1040
|
import {
|
|
1034
1041
|
cn,
|
|
1035
1042
|
getBaseUrl,
|
|
1036
1043
|
init_cn
|
|
1037
1044
|
} from "../chunk-XTCBRQN2.js";
|
|
1038
|
-
import "../chunk-J7AV6H63.js";
|
|
1039
|
-
import "../chunk-6U3IUD57.js";
|
|
1040
|
-
import "../chunk-W72U7OU7.js";
|
|
1041
1045
|
import "../chunk-PHWQLKVE.js";
|
|
1042
|
-
import
|
|
1043
|
-
__toCommonJS
|
|
1044
|
-
} from "../chunk-GGWZFCYS.js";
|
|
1046
|
+
import "../chunk-GGWZFCYS.js";
|
|
1045
1047
|
|
|
1046
1048
|
// src/components/announcement-bar.tsx
|
|
1047
1049
|
import { useState, useEffect } from "react";
|
|
@@ -3206,164 +3208,8 @@ import { jsx as jsx23, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
|
3206
3208
|
// src/components/index.ts
|
|
3207
3209
|
init_pagination();
|
|
3208
3210
|
|
|
3209
|
-
// src/components/persistent-pagination.tsx
|
|
3210
|
-
init_cn();
|
|
3211
|
-
import { jsx as jsx24, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
3212
|
-
function PersistentPagination({
|
|
3213
|
-
isLoading,
|
|
3214
|
-
children,
|
|
3215
|
-
currentPage,
|
|
3216
|
-
totalPages,
|
|
3217
|
-
className,
|
|
3218
|
-
disabledOpacity = 0.5,
|
|
3219
|
-
transitionDuration = 300,
|
|
3220
|
-
showLoadingState = true
|
|
3221
|
-
}) {
|
|
3222
|
-
return /* @__PURE__ */ jsxs18(
|
|
3223
|
-
"div",
|
|
3224
|
-
{
|
|
3225
|
-
className: cn(
|
|
3226
|
-
"relative transition-all ease-in-out",
|
|
3227
|
-
"flex justify-center items-center",
|
|
3228
|
-
isLoading && "pointer-events-none",
|
|
3229
|
-
className
|
|
3230
|
-
),
|
|
3231
|
-
style: {
|
|
3232
|
-
opacity: isLoading ? disabledOpacity : 1,
|
|
3233
|
-
transitionDuration: `${transitionDuration}ms`
|
|
3234
|
-
},
|
|
3235
|
-
role: "navigation",
|
|
3236
|
-
"aria-label": "Pagination",
|
|
3237
|
-
"aria-busy": isLoading,
|
|
3238
|
-
"data-loading": isLoading,
|
|
3239
|
-
children: [
|
|
3240
|
-
isLoading && /* @__PURE__ */ jsxs18(
|
|
3241
|
-
"div",
|
|
3242
|
-
{
|
|
3243
|
-
className: "sr-only",
|
|
3244
|
-
role: "status",
|
|
3245
|
-
"aria-live": "polite",
|
|
3246
|
-
children: [
|
|
3247
|
-
"Pagination temporarily disabled while loading page ",
|
|
3248
|
-
currentPage,
|
|
3249
|
-
" of ",
|
|
3250
|
-
totalPages
|
|
3251
|
-
]
|
|
3252
|
-
}
|
|
3253
|
-
),
|
|
3254
|
-
/* @__PURE__ */ jsx24(
|
|
3255
|
-
"div",
|
|
3256
|
-
{
|
|
3257
|
-
className: cn(
|
|
3258
|
-
"relative transition-all ease-in-out",
|
|
3259
|
-
isLoading && "cursor-not-allowed"
|
|
3260
|
-
),
|
|
3261
|
-
style: {
|
|
3262
|
-
transitionDuration: `${transitionDuration}ms`
|
|
3263
|
-
},
|
|
3264
|
-
"aria-hidden": isLoading,
|
|
3265
|
-
children
|
|
3266
|
-
}
|
|
3267
|
-
)
|
|
3268
|
-
]
|
|
3269
|
-
}
|
|
3270
|
-
);
|
|
3271
|
-
}
|
|
3272
|
-
function usePaginationLoading(isLoading, currentPage, totalPages) {
|
|
3273
|
-
const shouldShowPagination = totalPages > 1 || isLoading;
|
|
3274
|
-
const paginationProps = {
|
|
3275
|
-
"aria-busy": isLoading,
|
|
3276
|
-
"data-loading": isLoading,
|
|
3277
|
-
"data-current-page": currentPage,
|
|
3278
|
-
"data-total-pages": totalPages
|
|
3279
|
-
};
|
|
3280
|
-
const getLoadingMessage = () => {
|
|
3281
|
-
if (isLoading) {
|
|
3282
|
-
return `Loading page ${currentPage} of ${totalPages}`;
|
|
3283
|
-
}
|
|
3284
|
-
return `Page ${currentPage} of ${totalPages}`;
|
|
3285
|
-
};
|
|
3286
|
-
return {
|
|
3287
|
-
shouldShowPagination,
|
|
3288
|
-
paginationProps,
|
|
3289
|
-
getLoadingMessage
|
|
3290
|
-
};
|
|
3291
|
-
}
|
|
3292
|
-
function PersistentPaginationWrapper({
|
|
3293
|
-
isLoading,
|
|
3294
|
-
currentPage,
|
|
3295
|
-
totalPages,
|
|
3296
|
-
onPageChange,
|
|
3297
|
-
className,
|
|
3298
|
-
variant = "vendor"
|
|
3299
|
-
}) {
|
|
3300
|
-
const { getLoadingMessage } = usePaginationLoading(
|
|
3301
|
-
isLoading,
|
|
3302
|
-
currentPage,
|
|
3303
|
-
totalPages
|
|
3304
|
-
);
|
|
3305
|
-
const hasResults = totalPages > 0;
|
|
3306
|
-
const displayTotalPages = hasResults ? totalPages : 1;
|
|
3307
|
-
const displayCurrentPage = hasResults ? currentPage : 1;
|
|
3308
|
-
const isPaginationDisabled = isLoading;
|
|
3309
|
-
const hasNoResults = !hasResults && !isLoading;
|
|
3310
|
-
const PaginationComponent = (init_unified_pagination(), __toCommonJS(unified_pagination_exports)).UnifiedPagination;
|
|
3311
|
-
return /* @__PURE__ */ jsxs18(
|
|
3312
|
-
"div",
|
|
3313
|
-
{
|
|
3314
|
-
className: cn(
|
|
3315
|
-
"relative transition-all ease-in-out flex justify-center items-center",
|
|
3316
|
-
(isPaginationDisabled || hasNoResults) && "pointer-events-none",
|
|
3317
|
-
className
|
|
3318
|
-
),
|
|
3319
|
-
style: {
|
|
3320
|
-
opacity: isPaginationDisabled ? 0.3 : hasNoResults ? 0.5 : 1,
|
|
3321
|
-
transitionDuration: "300ms"
|
|
3322
|
-
},
|
|
3323
|
-
role: "navigation",
|
|
3324
|
-
"aria-label": "Pagination",
|
|
3325
|
-
"aria-busy": isLoading,
|
|
3326
|
-
"data-loading": isLoading,
|
|
3327
|
-
"data-has-results": hasResults,
|
|
3328
|
-
children: [
|
|
3329
|
-
(isLoading || !hasResults) && /* @__PURE__ */ jsx24(
|
|
3330
|
-
"div",
|
|
3331
|
-
{
|
|
3332
|
-
className: "sr-only",
|
|
3333
|
-
role: "status",
|
|
3334
|
-
"aria-live": "polite",
|
|
3335
|
-
children: isLoading ? `Pagination temporarily disabled while loading page ${displayCurrentPage} of ${displayTotalPages}` : `No results available - pagination disabled`
|
|
3336
|
-
}
|
|
3337
|
-
),
|
|
3338
|
-
/* @__PURE__ */ jsx24(
|
|
3339
|
-
"div",
|
|
3340
|
-
{
|
|
3341
|
-
className: cn(
|
|
3342
|
-
"relative transition-all ease-in-out",
|
|
3343
|
-
isPaginationDisabled && "cursor-not-allowed"
|
|
3344
|
-
),
|
|
3345
|
-
style: {
|
|
3346
|
-
transitionDuration: "300ms"
|
|
3347
|
-
},
|
|
3348
|
-
"aria-hidden": isPaginationDisabled,
|
|
3349
|
-
children: /* @__PURE__ */ jsx24(
|
|
3350
|
-
PaginationComponent,
|
|
3351
|
-
{
|
|
3352
|
-
currentPage: displayCurrentPage,
|
|
3353
|
-
totalPages: displayTotalPages,
|
|
3354
|
-
onPageChange: hasResults ? onPageChange : () => {
|
|
3355
|
-
}
|
|
3356
|
-
}
|
|
3357
|
-
)
|
|
3358
|
-
}
|
|
3359
|
-
)
|
|
3360
|
-
]
|
|
3361
|
-
}
|
|
3362
|
-
);
|
|
3363
|
-
}
|
|
3364
|
-
|
|
3365
3211
|
// src/components/pricing-display.tsx
|
|
3366
|
-
import { jsx as
|
|
3212
|
+
import { jsx as jsx24, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
3367
3213
|
var PRICING_STYLES = {
|
|
3368
3214
|
// Comparison table style (current default)
|
|
3369
3215
|
comparison: {
|
|
@@ -3399,19 +3245,19 @@ function PricingDisplay({
|
|
|
3399
3245
|
styleConfig = PRICING_STYLES.comparison
|
|
3400
3246
|
}) {
|
|
3401
3247
|
if (typeof pricing === "string") {
|
|
3402
|
-
return /* @__PURE__ */
|
|
3248
|
+
return /* @__PURE__ */ jsx24(LegacyPricingDisplay, { pricing, className, styleConfig });
|
|
3403
3249
|
}
|
|
3404
3250
|
const pricingArray = Array.isArray(pricing) ? pricing : [pricing];
|
|
3405
3251
|
if (!pricingArray || pricingArray.length === 0) {
|
|
3406
|
-
return /* @__PURE__ */
|
|
3252
|
+
return /* @__PURE__ */ jsx24("span", { className: `${styleConfig.priceTextColor} ${styleConfig.priceTextSize} ${styleConfig.fontFamily} ${className}`, children: "No pricing data" });
|
|
3407
3253
|
}
|
|
3408
3254
|
if (pricingArray.length === 1) {
|
|
3409
3255
|
const item = pricingArray[0];
|
|
3410
3256
|
const price = item.ranges?.[0]?.min || 0;
|
|
3411
3257
|
const unit = item.ranges?.[0]?.unit;
|
|
3412
|
-
return /* @__PURE__ */
|
|
3413
|
-
/* @__PURE__ */
|
|
3414
|
-
unit && /* @__PURE__ */
|
|
3258
|
+
return /* @__PURE__ */ jsxs18("span", { className: `${styleConfig.fontFamily} ${className}`, children: [
|
|
3259
|
+
/* @__PURE__ */ jsx24("span", { className: `${styleConfig.priceTextColor} ${styleConfig.priceTextSize}`, children: formatPriceValue(price, styleConfig.showTildePrefix) }),
|
|
3260
|
+
unit && /* @__PURE__ */ jsxs18("span", { className: `${styleConfig.secondaryTextColor} ${styleConfig.secondaryTextSize}`, children: [
|
|
3415
3261
|
"/",
|
|
3416
3262
|
unit
|
|
3417
3263
|
] })
|
|
@@ -3419,9 +3265,9 @@ function PricingDisplay({
|
|
|
3419
3265
|
}
|
|
3420
3266
|
const priceValues = pricingArray.map((item) => formatPriceValue(item.ranges?.[0]?.min || 0, styleConfig.showTildePrefix));
|
|
3421
3267
|
const itemWithUnit = pricingArray.find((item) => item.ranges?.[0]?.unit);
|
|
3422
|
-
return /* @__PURE__ */
|
|
3423
|
-
/* @__PURE__ */
|
|
3424
|
-
itemWithUnit && itemWithUnit.ranges?.[0]?.unit && /* @__PURE__ */
|
|
3268
|
+
return /* @__PURE__ */ jsxs18("span", { className: `${styleConfig.fontFamily} ${className}`, children: [
|
|
3269
|
+
/* @__PURE__ */ jsx24("span", { className: `${styleConfig.priceTextColor} ${styleConfig.priceTextSize}`, children: priceValues.join(" | ") }),
|
|
3270
|
+
itemWithUnit && itemWithUnit.ranges?.[0]?.unit && /* @__PURE__ */ jsxs18("span", { className: `${styleConfig.secondaryTextColor} ${styleConfig.secondaryTextSize}`, children: [
|
|
3425
3271
|
"/",
|
|
3426
3272
|
itemWithUnit.ranges[0].unit
|
|
3427
3273
|
] })
|
|
@@ -3442,7 +3288,7 @@ function LegacyPricingDisplay({
|
|
|
3442
3288
|
styleConfig = PRICING_STYLES.comparison
|
|
3443
3289
|
}) {
|
|
3444
3290
|
if (pricing === "Free" || pricing === "No pricing data") {
|
|
3445
|
-
return /* @__PURE__ */
|
|
3291
|
+
return /* @__PURE__ */ jsx24("span", { className: `${styleConfig.priceTextColor} ${styleConfig.priceTextSize} ${styleConfig.fontFamily} ${className}`, children: pricing });
|
|
3446
3292
|
}
|
|
3447
3293
|
const parsePricing = (pricingStr) => {
|
|
3448
3294
|
if (pricingStr.includes(", ")) {
|
|
@@ -3498,9 +3344,9 @@ function LegacyPricingDisplay({
|
|
|
3498
3344
|
};
|
|
3499
3345
|
};
|
|
3500
3346
|
const { mainValue, secondaryInfo } = parsePricing(pricing);
|
|
3501
|
-
return /* @__PURE__ */
|
|
3502
|
-
/* @__PURE__ */
|
|
3503
|
-
secondaryInfo && /* @__PURE__ */
|
|
3347
|
+
return /* @__PURE__ */ jsxs18("span", { className: `${styleConfig.fontFamily} ${className}`, children: [
|
|
3348
|
+
/* @__PURE__ */ jsx24("span", { className: `${styleConfig.priceTextColor} ${styleConfig.priceTextSize}`, children: mainValue }),
|
|
3349
|
+
secondaryInfo && /* @__PURE__ */ jsx24("span", { className: `${styleConfig.secondaryTextColor} ${styleConfig.secondaryTextSize}`, children: secondaryInfo })
|
|
3504
3350
|
] });
|
|
3505
3351
|
}
|
|
3506
3352
|
function formatPricingForDisplay(pricing) {
|
|
@@ -3508,7 +3354,7 @@ function formatPricingForDisplay(pricing) {
|
|
|
3508
3354
|
}
|
|
3509
3355
|
|
|
3510
3356
|
// src/components/results-count.tsx
|
|
3511
|
-
import { Fragment as Fragment5, jsx as
|
|
3357
|
+
import { Fragment as Fragment5, jsx as jsx25, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
3512
3358
|
function ResultsCount({
|
|
3513
3359
|
currentPage,
|
|
3514
3360
|
pageSize,
|
|
@@ -3524,7 +3370,7 @@ function ResultsCount({
|
|
|
3524
3370
|
const plural = resultType === "vendors" ? "vendors" : "posts";
|
|
3525
3371
|
const singular = resultType === "vendors" ? "vendor" : "post";
|
|
3526
3372
|
const displayType = totalResults === 1 ? singular : plural;
|
|
3527
|
-
return /* @__PURE__ */
|
|
3373
|
+
return /* @__PURE__ */ jsx25("div", { className: "mb-6", children: /* @__PURE__ */ jsx25("p", { className: "text-ods-text-secondary text-sm font-['DM_Sans']", children: totalResults > 0 && /* @__PURE__ */ jsxs19(Fragment5, { children: [
|
|
3528
3374
|
"Showing ",
|
|
3529
3375
|
startIndex,
|
|
3530
3376
|
"-",
|
|
@@ -3533,7 +3379,7 @@ function ResultsCount({
|
|
|
3533
3379
|
totalResults,
|
|
3534
3380
|
" ",
|
|
3535
3381
|
displayType,
|
|
3536
|
-
sortingMessage && /* @__PURE__ */
|
|
3382
|
+
sortingMessage && /* @__PURE__ */ jsxs19("span", { className: "ml-2 text-ods-accent", children: [
|
|
3537
3383
|
"\u2022 ",
|
|
3538
3384
|
sortingMessage
|
|
3539
3385
|
] })
|
|
@@ -3543,7 +3389,7 @@ function ResultsCount({
|
|
|
3543
3389
|
// src/components/vendor-tag.tsx
|
|
3544
3390
|
init_cn();
|
|
3545
3391
|
import { Hand, Sparkles } from "lucide-react";
|
|
3546
|
-
import { jsx as
|
|
3392
|
+
import { jsx as jsx26, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
3547
3393
|
function VendorTag({
|
|
3548
3394
|
type,
|
|
3549
3395
|
text,
|
|
@@ -3562,89 +3408,89 @@ function VendorTag({
|
|
|
3562
3408
|
return {
|
|
3563
3409
|
text: "Placeholder",
|
|
3564
3410
|
textColor: "text-ods-text-primary",
|
|
3565
|
-
icon: /* @__PURE__ */
|
|
3411
|
+
icon: /* @__PURE__ */ jsx26("div", { className: "w-4 h-4 rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx26(Sparkles, { width: 10, height: 10, className: "text-ods-text-primary" }) })
|
|
3566
3412
|
};
|
|
3567
3413
|
case "ai":
|
|
3568
3414
|
return {
|
|
3569
3415
|
text: "AI Selected",
|
|
3570
3416
|
textColor: "text-ods-text-primary",
|
|
3571
|
-
icon: /* @__PURE__ */
|
|
3417
|
+
icon: /* @__PURE__ */ jsx26("div", { className: "w-4 h-4 rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx26(Sparkles, { width: 10, height: 10, className: "text-ods-text-primary" }) })
|
|
3572
3418
|
};
|
|
3573
3419
|
case "manual":
|
|
3574
3420
|
return {
|
|
3575
3421
|
text: "Manually Selected",
|
|
3576
3422
|
textColor: "text-ods-text-secondary",
|
|
3577
|
-
icon: /* @__PURE__ */
|
|
3423
|
+
icon: /* @__PURE__ */ jsx26("div", { className: "w-4 h-4 rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx26(Hand, { width: 10, height: 10, className: "text-ods-text-secondary" }) })
|
|
3578
3424
|
};
|
|
3579
3425
|
case "open-source":
|
|
3580
3426
|
return {
|
|
3581
3427
|
text: text || "Open Source",
|
|
3582
|
-
icon: /* @__PURE__ */
|
|
3428
|
+
icon: /* @__PURE__ */ jsx26(
|
|
3583
3429
|
"div",
|
|
3584
3430
|
{
|
|
3585
3431
|
className: "w-4 h-4 bg-ods-accent rounded-sm flex items-center justify-center flex-shrink-0",
|
|
3586
3432
|
style: accentColor ? { backgroundColor: accentColor } : void 0,
|
|
3587
|
-
children: /* @__PURE__ */
|
|
3433
|
+
children: /* @__PURE__ */ jsx26(OpenSourceIcon2, { width: 10, height: 10, className: "text-[#1A1A1A]" })
|
|
3588
3434
|
}
|
|
3589
3435
|
)
|
|
3590
3436
|
};
|
|
3591
3437
|
case "commercial":
|
|
3592
3438
|
return {
|
|
3593
3439
|
text: text || "Commercial Vendor",
|
|
3594
|
-
icon: /* @__PURE__ */
|
|
3440
|
+
icon: /* @__PURE__ */ jsx26("div", { className: "w-4 h-4 bg-ods-border rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx26(CoinsIcon2, { width: 10, height: 10, className: "text-ods-text-secondary" }) })
|
|
3595
3441
|
};
|
|
3596
3442
|
case "free":
|
|
3597
3443
|
return {
|
|
3598
3444
|
text: text || "Free",
|
|
3599
|
-
icon: /* @__PURE__ */
|
|
3445
|
+
icon: /* @__PURE__ */ jsx26("div", { className: "w-4 h-4 bg-ods-accent rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx26("span", { className: "text-[#1A1A1A] text-[8px] font-bold", children: "$" }) })
|
|
3600
3446
|
};
|
|
3601
3447
|
case "freemium":
|
|
3602
3448
|
return {
|
|
3603
3449
|
text: text || "Freemium",
|
|
3604
|
-
icon: /* @__PURE__ */
|
|
3450
|
+
icon: /* @__PURE__ */ jsx26("div", { className: "w-4 h-4 bg-ods-accent rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx26("span", { className: "text-[#1A1A1A] text-[8px] font-bold", children: "$" }) })
|
|
3605
3451
|
};
|
|
3606
3452
|
case "paid":
|
|
3607
3453
|
return {
|
|
3608
3454
|
text: text || "Paid",
|
|
3609
|
-
icon: /* @__PURE__ */
|
|
3455
|
+
icon: /* @__PURE__ */ jsx26("div", { className: "w-4 h-4 bg-ods-border rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx26(CoinsIcon2, { width: 10, height: 10, className: "text-ods-text-secondary" }) })
|
|
3610
3456
|
};
|
|
3611
3457
|
case "enterprise":
|
|
3612
3458
|
return {
|
|
3613
3459
|
text: text || "Enterprise",
|
|
3614
|
-
icon: /* @__PURE__ */
|
|
3460
|
+
icon: /* @__PURE__ */ jsx26("div", { className: "w-4 h-4 bg-ods-accent rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx26("span", { className: "text-[#1A1A1A] text-[8px] font-bold", children: "E" }) })
|
|
3615
3461
|
};
|
|
3616
3462
|
case "recommended":
|
|
3617
3463
|
return {
|
|
3618
3464
|
text: text || "Recommended",
|
|
3619
|
-
icon: /* @__PURE__ */
|
|
3465
|
+
icon: /* @__PURE__ */ jsx26("div", { className: "w-4 h-4 bg-ods-accent rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx26("span", { className: "text-[#1A1A1A] text-[8px] font-bold", children: "\u2605" }) })
|
|
3620
3466
|
};
|
|
3621
3467
|
case "classification":
|
|
3622
3468
|
const classificationType = text?.toLowerCase();
|
|
3623
3469
|
if (classificationType === "open_source") {
|
|
3624
3470
|
return {
|
|
3625
3471
|
text: "Open Source",
|
|
3626
|
-
icon: /* @__PURE__ */
|
|
3472
|
+
icon: /* @__PURE__ */ jsx26("div", { className: "w-4 h-4 bg-ods-accent rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx26(OpenSourceIcon2, { width: 10, height: 10, className: "text-[#1A1A1A]" }) })
|
|
3627
3473
|
};
|
|
3628
3474
|
} else if (classificationType === "commercial") {
|
|
3629
3475
|
return {
|
|
3630
3476
|
text: "Commercial Vendor",
|
|
3631
|
-
icon: /* @__PURE__ */
|
|
3477
|
+
icon: /* @__PURE__ */ jsx26("div", { className: "w-4 h-4 bg-ods-border rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx26(CoinsIcon2, { width: 10, height: 10, className: "text-ods-text-secondary" }) })
|
|
3632
3478
|
};
|
|
3633
3479
|
} else if (classificationType === "openframe_selected") {
|
|
3634
3480
|
return {
|
|
3635
3481
|
text: "OpenFrame Selected",
|
|
3636
|
-
icon: /* @__PURE__ */
|
|
3482
|
+
icon: /* @__PURE__ */ jsx26(OpenFrameLogo2, { lowerPathColor: "currentColor", upperPathColor: "currentColor", className: "h-4 w-4 text-ods-accent" })
|
|
3637
3483
|
};
|
|
3638
3484
|
} else {
|
|
3639
3485
|
return {
|
|
3640
3486
|
text: text || "Classification",
|
|
3641
|
-
icon: /* @__PURE__ */
|
|
3487
|
+
icon: /* @__PURE__ */ jsx26("div", { className: "w-4 h-4 bg-ods-accent rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx26("span", { className: "text-[#1A1A1A] text-[8px] font-bold", children: "C" }) })
|
|
3642
3488
|
};
|
|
3643
3489
|
}
|
|
3644
3490
|
case "openframe_selected":
|
|
3645
3491
|
return {
|
|
3646
3492
|
text: text || "OpenFrame Selected",
|
|
3647
|
-
icon: /* @__PURE__ */
|
|
3493
|
+
icon: /* @__PURE__ */ jsx26(OpenFrameLogo2, { lowerPathColor: "currentColor", upperPathColor: "currentColor", className: "h-4 w-4 text-ods-accent" })
|
|
3648
3494
|
};
|
|
3649
3495
|
default:
|
|
3650
3496
|
return {
|
|
@@ -3654,9 +3500,9 @@ function VendorTag({
|
|
|
3654
3500
|
}
|
|
3655
3501
|
};
|
|
3656
3502
|
const { text: displayText, icon, textColor } = getTagContent();
|
|
3657
|
-
return /* @__PURE__ */
|
|
3503
|
+
return /* @__PURE__ */ jsxs20("div", { className: cn(baseClasses, className, hidden && "invisible"), children: [
|
|
3658
3504
|
icon,
|
|
3659
|
-
/* @__PURE__ */
|
|
3505
|
+
/* @__PURE__ */ jsx26("span", { className: cn(
|
|
3660
3506
|
"font-mono font-semibold uppercase",
|
|
3661
3507
|
textColor ? textColor : "text-ods-text-primary",
|
|
3662
3508
|
size === "sm" ? "text-[10px]" : "text-xs"
|
|
@@ -3665,12 +3511,12 @@ function VendorTag({
|
|
|
3665
3511
|
}
|
|
3666
3512
|
|
|
3667
3513
|
// src/components/selection-source-badge.tsx
|
|
3668
|
-
import { jsx as
|
|
3514
|
+
import { jsx as jsx27 } from "react/jsx-runtime";
|
|
3669
3515
|
function SelectionSourceBadge({ source, hidden = false }) {
|
|
3670
3516
|
if (!source) {
|
|
3671
3517
|
return null;
|
|
3672
3518
|
}
|
|
3673
|
-
return /* @__PURE__ */
|
|
3519
|
+
return /* @__PURE__ */ jsx27(
|
|
3674
3520
|
VendorTag,
|
|
3675
3521
|
{
|
|
3676
3522
|
type: source?.toLowerCase(),
|
|
@@ -3683,26 +3529,26 @@ function SelectionSourceBadge({ source, hidden = false }) {
|
|
|
3683
3529
|
|
|
3684
3530
|
// src/components/user-display.tsx
|
|
3685
3531
|
init_cn();
|
|
3686
|
-
import { jsx as
|
|
3532
|
+
import { jsx as jsx28, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
3687
3533
|
function UserDisplay({ name, avatarUrl, subtitle, size = 32, className }) {
|
|
3688
|
-
return /* @__PURE__ */
|
|
3689
|
-
/* @__PURE__ */
|
|
3690
|
-
/* @__PURE__ */
|
|
3691
|
-
/* @__PURE__ */
|
|
3692
|
-
subtitle && /* @__PURE__ */
|
|
3534
|
+
return /* @__PURE__ */ jsxs21("div", { className: cn("flex items-center gap-2 min-w-0", className), children: [
|
|
3535
|
+
/* @__PURE__ */ jsx28(SquareAvatar2, { src: avatarUrl ?? void 0, fallbackName: name, size }),
|
|
3536
|
+
/* @__PURE__ */ jsxs21("div", { className: "min-w-0 flex-1", children: [
|
|
3537
|
+
/* @__PURE__ */ jsx28("p", { className: "font-['DM_Sans'] text-lg leading-[22px] text-ods-text-primary truncate", children: name }),
|
|
3538
|
+
subtitle && /* @__PURE__ */ jsx28("span", { className: "font-['DM_Sans'] text-md leading-[16px] text-ods-text-secondary truncate", children: subtitle })
|
|
3693
3539
|
] })
|
|
3694
3540
|
] });
|
|
3695
3541
|
}
|
|
3696
3542
|
|
|
3697
3543
|
// src/components/loading/content-skeleton.tsx
|
|
3698
3544
|
init_cn();
|
|
3699
|
-
import { jsx as
|
|
3545
|
+
import { jsx as jsx29, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
3700
3546
|
function ParagraphSkeleton({
|
|
3701
3547
|
className,
|
|
3702
3548
|
lines = 4
|
|
3703
3549
|
}) {
|
|
3704
3550
|
const lineWidths = ["w-full", "w-full", "w-5/6", "w-3/4", "w-4/5", "w-2/3"];
|
|
3705
|
-
return /* @__PURE__ */
|
|
3551
|
+
return /* @__PURE__ */ jsx29("div", { className: cn("space-y-2", className), children: Array.from({ length: lines }).map((_, index) => /* @__PURE__ */ jsx29(
|
|
3706
3552
|
TextSkeleton.Body,
|
|
3707
3553
|
{
|
|
3708
3554
|
className: lineWidths[index % lineWidths.length]
|
|
@@ -3716,14 +3562,14 @@ function ListSkeleton({
|
|
|
3716
3562
|
showIcons = false,
|
|
3717
3563
|
showActions = false
|
|
3718
3564
|
}) {
|
|
3719
|
-
return /* @__PURE__ */
|
|
3720
|
-
/* @__PURE__ */
|
|
3721
|
-
showIcons && /* @__PURE__ */
|
|
3722
|
-
/* @__PURE__ */
|
|
3565
|
+
return /* @__PURE__ */ jsx29("div", { className: cn("space-y-3", className), children: Array.from({ length: items }).map((_, index) => /* @__PURE__ */ jsxs22("div", { className: "flex items-center justify-between", children: [
|
|
3566
|
+
/* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-3", children: [
|
|
3567
|
+
showIcons && /* @__PURE__ */ jsx29(MediaSkeleton.Icon, { size: "sm" }),
|
|
3568
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-32 md:w-48" })
|
|
3723
3569
|
] }),
|
|
3724
|
-
showActions && /* @__PURE__ */
|
|
3725
|
-
/* @__PURE__ */
|
|
3726
|
-
/* @__PURE__ */
|
|
3570
|
+
showActions && /* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-2", children: [
|
|
3571
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-8" }),
|
|
3572
|
+
/* @__PURE__ */ jsx29(UnifiedSkeleton, { variant: "default", className: "w-4 h-4" })
|
|
3727
3573
|
] })
|
|
3728
3574
|
] }, index)) });
|
|
3729
3575
|
}
|
|
@@ -3732,14 +3578,14 @@ function TableSkeleton({
|
|
|
3732
3578
|
rows = 5,
|
|
3733
3579
|
columns = 4
|
|
3734
3580
|
}) {
|
|
3735
|
-
return /* @__PURE__ */
|
|
3736
|
-
/* @__PURE__ */
|
|
3737
|
-
/* @__PURE__ */
|
|
3581
|
+
return /* @__PURE__ */ jsxs22("div", { className: cn("space-y-4", className), children: [
|
|
3582
|
+
/* @__PURE__ */ jsx29("div", { className: "grid gap-4", style: { gridTemplateColumns: `repeat(${columns}, 1fr)` }, children: Array.from({ length: columns }).map((_, index) => /* @__PURE__ */ jsx29(TextSkeleton.Subheading, { className: "w-3/4" }, index)) }),
|
|
3583
|
+
/* @__PURE__ */ jsx29("div", { className: "space-y-3", children: Array.from({ length: rows }).map((_, rowIndex) => /* @__PURE__ */ jsx29(
|
|
3738
3584
|
"div",
|
|
3739
3585
|
{
|
|
3740
3586
|
className: "grid gap-4 py-2 border-b border-ods-divider",
|
|
3741
3587
|
style: { gridTemplateColumns: `repeat(${columns}, 1fr)` },
|
|
3742
|
-
children: Array.from({ length: columns }).map((_2, colIndex) => /* @__PURE__ */
|
|
3588
|
+
children: Array.from({ length: columns }).map((_2, colIndex) => /* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-2/3" }, colIndex))
|
|
3743
3589
|
},
|
|
3744
3590
|
rowIndex
|
|
3745
3591
|
)) })
|
|
@@ -3749,15 +3595,15 @@ function FormSkeleton({
|
|
|
3749
3595
|
className,
|
|
3750
3596
|
fields = 4
|
|
3751
3597
|
}) {
|
|
3752
|
-
return /* @__PURE__ */
|
|
3753
|
-
Array.from({ length: fields }).map((_, index) => /* @__PURE__ */
|
|
3754
|
-
/* @__PURE__ */
|
|
3755
|
-
/* @__PURE__ */
|
|
3756
|
-
index % 3 === 0 && /* @__PURE__ */
|
|
3598
|
+
return /* @__PURE__ */ jsxs22("div", { className: cn("space-y-6", className), children: [
|
|
3599
|
+
Array.from({ length: fields }).map((_, index) => /* @__PURE__ */ jsxs22("div", { className: "space-y-2", children: [
|
|
3600
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-24" }),
|
|
3601
|
+
/* @__PURE__ */ jsx29(InteractiveSkeleton.Input, {}),
|
|
3602
|
+
index % 3 === 0 && /* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-48" })
|
|
3757
3603
|
] }, index)),
|
|
3758
|
-
/* @__PURE__ */
|
|
3759
|
-
/* @__PURE__ */
|
|
3760
|
-
/* @__PURE__ */
|
|
3604
|
+
/* @__PURE__ */ jsxs22("div", { className: "flex gap-4 pt-4", children: [
|
|
3605
|
+
/* @__PURE__ */ jsx29(InteractiveSkeleton.Button, {}),
|
|
3606
|
+
/* @__PURE__ */ jsx29(InteractiveSkeleton.Button, { className: "bg-ods-border" })
|
|
3761
3607
|
] })
|
|
3762
3608
|
] });
|
|
3763
3609
|
}
|
|
@@ -3766,7 +3612,7 @@ function NavigationSkeleton({
|
|
|
3766
3612
|
items = 6,
|
|
3767
3613
|
horizontal = true
|
|
3768
3614
|
}) {
|
|
3769
|
-
return /* @__PURE__ */
|
|
3615
|
+
return /* @__PURE__ */ jsx29(
|
|
3770
3616
|
"nav",
|
|
3771
3617
|
{
|
|
3772
3618
|
className: cn(
|
|
@@ -3776,7 +3622,7 @@ function NavigationSkeleton({
|
|
|
3776
3622
|
),
|
|
3777
3623
|
role: "status",
|
|
3778
3624
|
"aria-label": "Loading navigation",
|
|
3779
|
-
children: Array.from({ length: items }).map((_, index) => /* @__PURE__ */
|
|
3625
|
+
children: Array.from({ length: items }).map((_, index) => /* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-16 md:w-20" }, index))
|
|
3780
3626
|
}
|
|
3781
3627
|
);
|
|
3782
3628
|
}
|
|
@@ -3785,32 +3631,32 @@ function ProfileSkeleton({
|
|
|
3785
3631
|
showBio = true,
|
|
3786
3632
|
showStats = true
|
|
3787
3633
|
}) {
|
|
3788
|
-
return /* @__PURE__ */
|
|
3789
|
-
/* @__PURE__ */
|
|
3790
|
-
/* @__PURE__ */
|
|
3791
|
-
/* @__PURE__ */
|
|
3792
|
-
/* @__PURE__ */
|
|
3793
|
-
/* @__PURE__ */
|
|
3794
|
-
/* @__PURE__ */
|
|
3634
|
+
return /* @__PURE__ */ jsxs22("div", { className: cn("space-y-4", className), children: [
|
|
3635
|
+
/* @__PURE__ */ jsxs22("div", { className: "flex items-start gap-4", children: [
|
|
3636
|
+
/* @__PURE__ */ jsx29(MediaSkeleton.Avatar, { size: "lg" }),
|
|
3637
|
+
/* @__PURE__ */ jsxs22("div", { className: "flex-1 space-y-2", children: [
|
|
3638
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Subheading, { className: "w-1/2" }),
|
|
3639
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-1/3" }),
|
|
3640
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-2/3" })
|
|
3795
3641
|
] })
|
|
3796
3642
|
] }),
|
|
3797
|
-
showBio && /* @__PURE__ */
|
|
3798
|
-
/* @__PURE__ */
|
|
3799
|
-
/* @__PURE__ */
|
|
3800
|
-
/* @__PURE__ */
|
|
3643
|
+
showBio && /* @__PURE__ */ jsxs22("div", { className: "space-y-2", children: [
|
|
3644
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-full" }),
|
|
3645
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-4/5" }),
|
|
3646
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-3/4" })
|
|
3801
3647
|
] }),
|
|
3802
|
-
showStats && /* @__PURE__ */
|
|
3803
|
-
/* @__PURE__ */
|
|
3804
|
-
/* @__PURE__ */
|
|
3805
|
-
/* @__PURE__ */
|
|
3648
|
+
showStats && /* @__PURE__ */ jsxs22("div", { className: "flex gap-6", children: [
|
|
3649
|
+
/* @__PURE__ */ jsxs22("div", { className: "text-center", children: [
|
|
3650
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Subheading, { className: "w-8 mx-auto" }),
|
|
3651
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-12 mx-auto" })
|
|
3806
3652
|
] }),
|
|
3807
|
-
/* @__PURE__ */
|
|
3808
|
-
/* @__PURE__ */
|
|
3809
|
-
/* @__PURE__ */
|
|
3653
|
+
/* @__PURE__ */ jsxs22("div", { className: "text-center", children: [
|
|
3654
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Subheading, { className: "w-8 mx-auto" }),
|
|
3655
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-16 mx-auto" })
|
|
3810
3656
|
] }),
|
|
3811
|
-
/* @__PURE__ */
|
|
3812
|
-
/* @__PURE__ */
|
|
3813
|
-
/* @__PURE__ */
|
|
3657
|
+
/* @__PURE__ */ jsxs22("div", { className: "text-center", children: [
|
|
3658
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Subheading, { className: "w-8 mx-auto" }),
|
|
3659
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-14 mx-auto" })
|
|
3814
3660
|
] })
|
|
3815
3661
|
] })
|
|
3816
3662
|
] });
|
|
@@ -3820,34 +3666,34 @@ function CommentSkeleton({
|
|
|
3820
3666
|
showRating = false,
|
|
3821
3667
|
showReplies = false
|
|
3822
3668
|
}) {
|
|
3823
|
-
return /* @__PURE__ */
|
|
3824
|
-
/* @__PURE__ */
|
|
3825
|
-
/* @__PURE__ */
|
|
3826
|
-
/* @__PURE__ */
|
|
3827
|
-
/* @__PURE__ */
|
|
3828
|
-
/* @__PURE__ */
|
|
3829
|
-
showRating && /* @__PURE__ */
|
|
3669
|
+
return /* @__PURE__ */ jsxs22("div", { className: cn("space-y-3", className), children: [
|
|
3670
|
+
/* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-3", children: [
|
|
3671
|
+
/* @__PURE__ */ jsx29(MediaSkeleton.Avatar, { size: "sm" }),
|
|
3672
|
+
/* @__PURE__ */ jsxs22("div", { className: "flex-1 flex items-center gap-4", children: [
|
|
3673
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-24" }),
|
|
3674
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-16" }),
|
|
3675
|
+
showRating && /* @__PURE__ */ jsx29("div", { className: "flex gap-1", children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsx29(MediaSkeleton.Icon, { size: "sm" }, i)) })
|
|
3830
3676
|
] })
|
|
3831
3677
|
] }),
|
|
3832
|
-
/* @__PURE__ */
|
|
3833
|
-
/* @__PURE__ */
|
|
3834
|
-
/* @__PURE__ */
|
|
3835
|
-
/* @__PURE__ */
|
|
3678
|
+
/* @__PURE__ */ jsxs22("div", { className: "ml-11 space-y-2", children: [
|
|
3679
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-full" }),
|
|
3680
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-3/4" }),
|
|
3681
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-1/2" })
|
|
3836
3682
|
] }),
|
|
3837
|
-
/* @__PURE__ */
|
|
3838
|
-
/* @__PURE__ */
|
|
3839
|
-
/* @__PURE__ */
|
|
3840
|
-
/* @__PURE__ */
|
|
3683
|
+
/* @__PURE__ */ jsxs22("div", { className: "ml-11 flex gap-4", children: [
|
|
3684
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-12" }),
|
|
3685
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-16" }),
|
|
3686
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-8" })
|
|
3841
3687
|
] }),
|
|
3842
|
-
showReplies && /* @__PURE__ */
|
|
3843
|
-
/* @__PURE__ */
|
|
3844
|
-
/* @__PURE__ */
|
|
3845
|
-
/* @__PURE__ */
|
|
3846
|
-
/* @__PURE__ */
|
|
3688
|
+
showReplies && /* @__PURE__ */ jsx29("div", { className: "ml-11 pl-4 border-l border-ods-divider space-y-4", children: Array.from({ length: 2 }).map((_, index) => /* @__PURE__ */ jsxs22("div", { className: "space-y-2", children: [
|
|
3689
|
+
/* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-3", children: [
|
|
3690
|
+
/* @__PURE__ */ jsx29(MediaSkeleton.Avatar, { size: "sm" }),
|
|
3691
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-20" }),
|
|
3692
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-12" })
|
|
3847
3693
|
] }),
|
|
3848
|
-
/* @__PURE__ */
|
|
3849
|
-
/* @__PURE__ */
|
|
3850
|
-
/* @__PURE__ */
|
|
3694
|
+
/* @__PURE__ */ jsxs22("div", { className: "ml-11", children: [
|
|
3695
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-full" }),
|
|
3696
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-2/3" })
|
|
3851
3697
|
] })
|
|
3852
3698
|
] }, index)) })
|
|
3853
3699
|
] });
|
|
@@ -3859,35 +3705,35 @@ function FeatureListSkeleton({
|
|
|
3859
3705
|
grouped = false
|
|
3860
3706
|
}) {
|
|
3861
3707
|
if (grouped) {
|
|
3862
|
-
return /* @__PURE__ */
|
|
3863
|
-
/* @__PURE__ */
|
|
3864
|
-
/* @__PURE__ */
|
|
3865
|
-
showIcons && /* @__PURE__ */
|
|
3866
|
-
/* @__PURE__ */
|
|
3708
|
+
return /* @__PURE__ */ jsx29("div", { className: cn("space-y-6", className), children: Array.from({ length: 3 }).map((_, groupIndex) => /* @__PURE__ */ jsxs22("div", { className: "space-y-3", children: [
|
|
3709
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Subheading, { className: "w-1/3" }),
|
|
3710
|
+
/* @__PURE__ */ jsx29("div", { className: "space-y-2", children: Array.from({ length: features / 3 }).map((_2, featureIndex) => /* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-3", children: [
|
|
3711
|
+
showIcons && /* @__PURE__ */ jsx29(MediaSkeleton.Icon, { size: "sm" }),
|
|
3712
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-2/3" })
|
|
3867
3713
|
] }, featureIndex)) })
|
|
3868
3714
|
] }, groupIndex)) });
|
|
3869
3715
|
}
|
|
3870
|
-
return /* @__PURE__ */
|
|
3871
|
-
showIcons && /* @__PURE__ */
|
|
3872
|
-
/* @__PURE__ */
|
|
3716
|
+
return /* @__PURE__ */ jsx29("div", { className: cn("space-y-3", className), children: Array.from({ length: features }).map((_, index) => /* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-3", children: [
|
|
3717
|
+
showIcons && /* @__PURE__ */ jsx29(MediaSkeleton.Icon, { size: "sm" }),
|
|
3718
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-2/3" })
|
|
3873
3719
|
] }, index)) });
|
|
3874
3720
|
}
|
|
3875
3721
|
function TimelineSkeleton({
|
|
3876
3722
|
className,
|
|
3877
3723
|
items = 5
|
|
3878
3724
|
}) {
|
|
3879
|
-
return /* @__PURE__ */
|
|
3880
|
-
/* @__PURE__ */
|
|
3881
|
-
/* @__PURE__ */
|
|
3882
|
-
index < items - 1 && /* @__PURE__ */
|
|
3725
|
+
return /* @__PURE__ */ jsx29("div", { className: cn("space-y-6", className), children: Array.from({ length: items }).map((_, index) => /* @__PURE__ */ jsxs22("div", { className: "flex gap-4", children: [
|
|
3726
|
+
/* @__PURE__ */ jsxs22("div", { className: "flex flex-col items-center", children: [
|
|
3727
|
+
/* @__PURE__ */ jsx29(MediaSkeleton.Icon, { size: "sm" }),
|
|
3728
|
+
index < items - 1 && /* @__PURE__ */ jsx29("div", { className: "w-px h-12 bg-ods-border mt-2" })
|
|
3883
3729
|
] }),
|
|
3884
|
-
/* @__PURE__ */
|
|
3885
|
-
/* @__PURE__ */
|
|
3886
|
-
/* @__PURE__ */
|
|
3887
|
-
/* @__PURE__ */
|
|
3730
|
+
/* @__PURE__ */ jsxs22("div", { className: "flex-1 space-y-2", children: [
|
|
3731
|
+
/* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-3", children: [
|
|
3732
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-1/3" }),
|
|
3733
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-16" })
|
|
3888
3734
|
] }),
|
|
3889
|
-
/* @__PURE__ */
|
|
3890
|
-
/* @__PURE__ */
|
|
3735
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-full" }),
|
|
3736
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-3/4" })
|
|
3891
3737
|
] })
|
|
3892
3738
|
] }, index)) });
|
|
3893
3739
|
}
|
|
@@ -3895,54 +3741,54 @@ function PricingSkeleton({
|
|
|
3895
3741
|
className,
|
|
3896
3742
|
plans = 3
|
|
3897
3743
|
}) {
|
|
3898
|
-
return /* @__PURE__ */
|
|
3744
|
+
return /* @__PURE__ */ jsx29("div", { className: cn(
|
|
3899
3745
|
"grid gap-6",
|
|
3900
3746
|
plans === 2 && "grid-cols-1 md:grid-cols-2",
|
|
3901
3747
|
plans === 3 && "grid-cols-1 md:grid-cols-3",
|
|
3902
3748
|
plans === 4 && "grid-cols-1 md:grid-cols-2 lg:grid-cols-4",
|
|
3903
3749
|
className
|
|
3904
|
-
), children: Array.from({ length: plans }).map((_, index) => /* @__PURE__ */
|
|
3905
|
-
/* @__PURE__ */
|
|
3906
|
-
/* @__PURE__ */
|
|
3907
|
-
/* @__PURE__ */
|
|
3908
|
-
/* @__PURE__ */
|
|
3750
|
+
), children: Array.from({ length: plans }).map((_, index) => /* @__PURE__ */ jsx29("div", { className: "bg-ods-card border border-ods-border rounded-lg p-6", children: /* @__PURE__ */ jsxs22("div", { className: "space-y-4", children: [
|
|
3751
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Subheading, { className: "w-1/2" }),
|
|
3752
|
+
/* @__PURE__ */ jsxs22("div", { className: "space-y-1", children: [
|
|
3753
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Heading, { className: "w-1/3" }),
|
|
3754
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Caption, { className: "w-1/4" })
|
|
3909
3755
|
] }),
|
|
3910
|
-
/* @__PURE__ */
|
|
3911
|
-
/* @__PURE__ */
|
|
3912
|
-
/* @__PURE__ */
|
|
3756
|
+
/* @__PURE__ */ jsx29("div", { className: "space-y-3 py-4", children: Array.from({ length: 5 }).map((_2, featureIndex) => /* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-2", children: [
|
|
3757
|
+
/* @__PURE__ */ jsx29(MediaSkeleton.Icon, { size: "sm" }),
|
|
3758
|
+
/* @__PURE__ */ jsx29(TextSkeleton.Body, { className: "w-3/4" })
|
|
3913
3759
|
] }, featureIndex)) }),
|
|
3914
|
-
/* @__PURE__ */
|
|
3760
|
+
/* @__PURE__ */ jsx29(InteractiveSkeleton.Button, { className: "w-full" })
|
|
3915
3761
|
] }) }, index)) });
|
|
3916
3762
|
}
|
|
3917
3763
|
|
|
3918
3764
|
// src/components/profile/ProfileLoadingSkeleton.tsx
|
|
3919
3765
|
init_cn();
|
|
3920
|
-
import { jsx as
|
|
3766
|
+
import { jsx as jsx30, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
3921
3767
|
function ProfileLoadingSkeleton({ className }) {
|
|
3922
|
-
return /* @__PURE__ */
|
|
3923
|
-
/* @__PURE__ */
|
|
3924
|
-
/* @__PURE__ */
|
|
3925
|
-
/* @__PURE__ */
|
|
3926
|
-
/* @__PURE__ */
|
|
3927
|
-
/* @__PURE__ */
|
|
3768
|
+
return /* @__PURE__ */ jsxs23("div", { className: cn("space-y-6", className), children: [
|
|
3769
|
+
/* @__PURE__ */ jsxs23("div", { className: "flex items-center space-x-4", children: [
|
|
3770
|
+
/* @__PURE__ */ jsx30("div", { className: "h-16 w-16 bg-gray-200 rounded-full animate-pulse" }),
|
|
3771
|
+
/* @__PURE__ */ jsxs23("div", { className: "space-y-2", children: [
|
|
3772
|
+
/* @__PURE__ */ jsx30("div", { className: "h-4 w-32 bg-gray-200 rounded animate-pulse" }),
|
|
3773
|
+
/* @__PURE__ */ jsx30("div", { className: "h-3 w-24 bg-gray-200 rounded animate-pulse" })
|
|
3928
3774
|
] })
|
|
3929
3775
|
] }),
|
|
3930
|
-
/* @__PURE__ */
|
|
3931
|
-
/* @__PURE__ */
|
|
3932
|
-
/* @__PURE__ */
|
|
3933
|
-
/* @__PURE__ */
|
|
3776
|
+
/* @__PURE__ */ jsxs23("div", { className: "space-y-4", children: [
|
|
3777
|
+
/* @__PURE__ */ jsx30("div", { className: "h-4 w-full bg-gray-200 rounded animate-pulse" }),
|
|
3778
|
+
/* @__PURE__ */ jsx30("div", { className: "h-4 w-3/4 bg-gray-200 rounded animate-pulse" }),
|
|
3779
|
+
/* @__PURE__ */ jsx30("div", { className: "h-4 w-1/2 bg-gray-200 rounded animate-pulse" })
|
|
3934
3780
|
] })
|
|
3935
3781
|
] });
|
|
3936
3782
|
}
|
|
3937
3783
|
|
|
3938
3784
|
// src/components/loading/msp-profile-form-skeleton.tsx
|
|
3939
3785
|
init_cn();
|
|
3940
|
-
import { jsx as
|
|
3786
|
+
import { jsx as jsx31, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
3941
3787
|
function MspProfileFormSkeleton({
|
|
3942
3788
|
className,
|
|
3943
3789
|
fields = 4
|
|
3944
3790
|
}) {
|
|
3945
|
-
return /* @__PURE__ */
|
|
3791
|
+
return /* @__PURE__ */ jsxs24(
|
|
3946
3792
|
"div",
|
|
3947
3793
|
{
|
|
3948
3794
|
className: cn(
|
|
@@ -3952,13 +3798,13 @@ function MspProfileFormSkeleton({
|
|
|
3952
3798
|
role: "status",
|
|
3953
3799
|
"aria-label": "Loading MSP profile form",
|
|
3954
3800
|
children: [
|
|
3955
|
-
/* @__PURE__ */
|
|
3956
|
-
/* @__PURE__ */
|
|
3957
|
-
/* @__PURE__ */
|
|
3801
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex flex-col space-y-2 h-full", children: [
|
|
3802
|
+
/* @__PURE__ */ jsx31(TextSkeleton.Body, { className: "w-28" }),
|
|
3803
|
+
/* @__PURE__ */ jsx31("div", { className: "flex-1 min-h-[180px] md:min-h-full", children: /* @__PURE__ */ jsx31(UnifiedSkeleton, { className: "w-full h-full rounded-lg", "aria-label": "Loading company logo" }) })
|
|
3958
3804
|
] }),
|
|
3959
|
-
/* @__PURE__ */
|
|
3960
|
-
/* @__PURE__ */
|
|
3961
|
-
/* @__PURE__ */
|
|
3805
|
+
/* @__PURE__ */ jsx31("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: Array.from({ length: fields }).map((_, idx) => /* @__PURE__ */ jsxs24("div", { className: "space-y-2 flex flex-col", children: [
|
|
3806
|
+
/* @__PURE__ */ jsx31(TextSkeleton.Body, { className: "w-40" }),
|
|
3807
|
+
/* @__PURE__ */ jsx31(InteractiveSkeleton.Input, {})
|
|
3962
3808
|
] }, idx)) })
|
|
3963
3809
|
]
|
|
3964
3810
|
}
|
|
@@ -3967,9 +3813,9 @@ function MspProfileFormSkeleton({
|
|
|
3967
3813
|
|
|
3968
3814
|
// src/components/loading/category-card-skeleton.tsx
|
|
3969
3815
|
init_cn();
|
|
3970
|
-
import { jsx as
|
|
3816
|
+
import { jsx as jsx32, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
3971
3817
|
function CategoryCardSkeleton({ className }) {
|
|
3972
|
-
return /* @__PURE__ */
|
|
3818
|
+
return /* @__PURE__ */ jsxs25(
|
|
3973
3819
|
"article",
|
|
3974
3820
|
{
|
|
3975
3821
|
className: cn(
|
|
@@ -3979,7 +3825,7 @@ function CategoryCardSkeleton({ className }) {
|
|
|
3979
3825
|
role: "status",
|
|
3980
3826
|
"aria-label": "Loading category card",
|
|
3981
3827
|
children: [
|
|
3982
|
-
/* @__PURE__ */
|
|
3828
|
+
/* @__PURE__ */ jsx32("div", { className: "flex gap-6 mb-8 justify-center items-center", children: Array.from({ length: 10 }).map((_, i) => /* @__PURE__ */ jsx32(
|
|
3983
3829
|
UnifiedSkeleton,
|
|
3984
3830
|
{
|
|
3985
3831
|
variant: "circular",
|
|
@@ -3988,12 +3834,12 @@ function CategoryCardSkeleton({ className }) {
|
|
|
3988
3834
|
},
|
|
3989
3835
|
i
|
|
3990
3836
|
)) }),
|
|
3991
|
-
/* @__PURE__ */
|
|
3992
|
-
/* @__PURE__ */
|
|
3993
|
-
/* @__PURE__ */
|
|
3994
|
-
/* @__PURE__ */
|
|
3837
|
+
/* @__PURE__ */ jsxs25("div", { className: "flex-1 flex flex-col space-y-3", children: [
|
|
3838
|
+
/* @__PURE__ */ jsx32(TextSkeleton.Heading, { className: "w-3/4" }),
|
|
3839
|
+
/* @__PURE__ */ jsx32(TextSkeleton.Body, { className: "w-1/2" }),
|
|
3840
|
+
/* @__PURE__ */ jsx32(TextSkeleton.Body, { className: "w-full" })
|
|
3995
3841
|
] }),
|
|
3996
|
-
/* @__PURE__ */
|
|
3842
|
+
/* @__PURE__ */ jsx32("div", { className: "mt-4 flex justify-end", children: /* @__PURE__ */ jsx32(UnifiedSkeleton, { className: "w-12 h-12 rounded-[6px]", "aria-label": "Loading button" }) })
|
|
3997
3843
|
]
|
|
3998
3844
|
}
|
|
3999
3845
|
);
|
|
@@ -4001,22 +3847,22 @@ function CategoryCardSkeleton({ className }) {
|
|
|
4001
3847
|
|
|
4002
3848
|
// src/components/loading/category-vendor-selector-skeleton.tsx
|
|
4003
3849
|
init_cn();
|
|
4004
|
-
import { jsx as
|
|
3850
|
+
import { jsx as jsx33, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
4005
3851
|
function CategoryVendorSelectorSkeleton({ subcategories = 3, className }) {
|
|
4006
|
-
return /* @__PURE__ */
|
|
3852
|
+
return /* @__PURE__ */ jsxs26(
|
|
4007
3853
|
"div",
|
|
4008
3854
|
{
|
|
4009
3855
|
className: cn("bg-ods-card border border-ods-border rounded-lg p-6", className),
|
|
4010
3856
|
role: "status",
|
|
4011
3857
|
"aria-label": "Loading category section",
|
|
4012
3858
|
children: [
|
|
4013
|
-
/* @__PURE__ */
|
|
4014
|
-
/* @__PURE__ */
|
|
4015
|
-
/* @__PURE__ */
|
|
3859
|
+
/* @__PURE__ */ jsxs26("div", { className: "mb-6 space-y-2 max-w-xl", children: [
|
|
3860
|
+
/* @__PURE__ */ jsx33(TextSkeleton.Heading, { className: "w-1/2" }),
|
|
3861
|
+
/* @__PURE__ */ jsx33(TextSkeleton.Body, { className: "w-3/4" })
|
|
4016
3862
|
] }),
|
|
4017
|
-
/* @__PURE__ */
|
|
4018
|
-
/* @__PURE__ */
|
|
4019
|
-
/* @__PURE__ */
|
|
3863
|
+
/* @__PURE__ */ jsx33("div", { className: "space-y-6", children: Array.from({ length: subcategories }).map((_, idx) => /* @__PURE__ */ jsxs26("div", { className: "space-y-2", children: [
|
|
3864
|
+
/* @__PURE__ */ jsx33(TextSkeleton.Subheading, { className: "w-1/3" }),
|
|
3865
|
+
/* @__PURE__ */ jsx33("div", { className: "grid grid-cols-2 md:grid-cols-3 gap-4", children: Array.from({ length: 2 }).map((__, j) => /* @__PURE__ */ jsx33(UnifiedSkeleton, { className: "h-20 rounded-lg" }, j)) })
|
|
4020
3866
|
] }, idx)) })
|
|
4021
3867
|
]
|
|
4022
3868
|
}
|
|
@@ -4025,90 +3871,90 @@ function CategoryVendorSelectorSkeleton({ subcategories = 3, className }) {
|
|
|
4025
3871
|
|
|
4026
3872
|
// src/components/loading/wizard-layout-skeleton.tsx
|
|
4027
3873
|
init_cn();
|
|
4028
|
-
import { jsx as
|
|
3874
|
+
import { jsx as jsx34, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
4029
3875
|
function WizardLayoutSkeleton({ steps = 6, className }) {
|
|
4030
|
-
return /* @__PURE__ */
|
|
4031
|
-
/* @__PURE__ */
|
|
4032
|
-
/* @__PURE__ */
|
|
4033
|
-
/* @__PURE__ */
|
|
4034
|
-
/* @__PURE__ */
|
|
3876
|
+
return /* @__PURE__ */ jsxs27("div", { className: cn("space-y-6", className), role: "status", "aria-label": "Loading wizard layout", children: [
|
|
3877
|
+
/* @__PURE__ */ jsx34("div", { className: "flex flex-wrap items-center gap-2", children: Array.from({ length: steps }).map((_, i) => /* @__PURE__ */ jsx34(UnifiedSkeleton, { className: "h-6 w-24 rounded" }, i)) }),
|
|
3878
|
+
/* @__PURE__ */ jsxs27("div", { className: "space-y-2 max-w-2xl", children: [
|
|
3879
|
+
/* @__PURE__ */ jsx34(TextSkeleton.Heading, { className: "w-2/3" }),
|
|
3880
|
+
/* @__PURE__ */ jsx34(TextSkeleton.Body, { className: "w-1/2" })
|
|
4035
3881
|
] }),
|
|
4036
|
-
/* @__PURE__ */
|
|
4037
|
-
/* @__PURE__ */
|
|
4038
|
-
/* @__PURE__ */
|
|
3882
|
+
/* @__PURE__ */ jsxs27("div", { className: "flex justify-between mt-10", children: [
|
|
3883
|
+
/* @__PURE__ */ jsx34(UnifiedSkeleton, { className: "h-10 w-24 rounded" }),
|
|
3884
|
+
/* @__PURE__ */ jsx34(UnifiedSkeleton, { className: "h-10 w-32 rounded" })
|
|
4039
3885
|
] })
|
|
4040
3886
|
] });
|
|
4041
3887
|
}
|
|
4042
3888
|
|
|
4043
3889
|
// src/components/loading/margin-report-skeleton.tsx
|
|
4044
|
-
import { jsx as
|
|
3890
|
+
import { jsx as jsx35, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
4045
3891
|
function MarginReportSkeleton({ animate = true, description, overlayContent }) {
|
|
4046
|
-
return /* @__PURE__ */
|
|
4047
|
-
/* @__PURE__ */
|
|
4048
|
-
/* @__PURE__ */
|
|
4049
|
-
/* @__PURE__ */
|
|
4050
|
-
/* @__PURE__ */
|
|
3892
|
+
return /* @__PURE__ */ jsxs28("main", { className: `bg-ods-bg ${animate ? "animate-pulse" : ""} relative min-h-screen`, children: [
|
|
3893
|
+
/* @__PURE__ */ jsxs28("div", { className: "max-w-[1920px] px-6 md:px-20 py-6 md:py-10 mx-auto space-y-10", children: [
|
|
3894
|
+
/* @__PURE__ */ jsxs28("div", { className: "space-y-3", children: [
|
|
3895
|
+
/* @__PURE__ */ jsx35("div", { className: "h-10 w-72 bg-[#2A2A2A] rounded" }),
|
|
3896
|
+
/* @__PURE__ */ jsx35("div", { className: "h-4 w-80 bg-[#2A2A2A] rounded" })
|
|
4051
3897
|
] }),
|
|
4052
|
-
/* @__PURE__ */
|
|
4053
|
-
/* @__PURE__ */
|
|
4054
|
-
/* @__PURE__ */
|
|
4055
|
-
/* @__PURE__ */
|
|
4056
|
-
/* @__PURE__ */
|
|
4057
|
-
/* @__PURE__ */
|
|
4058
|
-
/* @__PURE__ */
|
|
3898
|
+
/* @__PURE__ */ jsx35("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: Array.from({ length: 3 }).map((_, i) => /* @__PURE__ */ jsx35("div", { className: "h-32 bg-ods-card border border-ods-border rounded" }, i)) }),
|
|
3899
|
+
/* @__PURE__ */ jsxs28("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
3900
|
+
/* @__PURE__ */ jsxs28("div", { className: "bg-ods-card border border-ods-border rounded-lg p-6 flex items-center gap-4 animate-pulse", children: [
|
|
3901
|
+
/* @__PURE__ */ jsx35("div", { className: "w-14 h-14 rounded-lg bg-[#2A2A2A]" }),
|
|
3902
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex-1 space-y-2", children: [
|
|
3903
|
+
/* @__PURE__ */ jsx35("div", { className: "h-4 bg-[#2A2A2A] rounded w-3/4" }),
|
|
3904
|
+
/* @__PURE__ */ jsx35("div", { className: "h-3 bg-[#2A2A2A] rounded w-1/2" })
|
|
4059
3905
|
] })
|
|
4060
3906
|
] }),
|
|
4061
|
-
/* @__PURE__ */
|
|
4062
|
-
/* @__PURE__ */
|
|
4063
|
-
/* @__PURE__ */
|
|
4064
|
-
/* @__PURE__ */
|
|
4065
|
-
/* @__PURE__ */
|
|
4066
|
-
/* @__PURE__ */
|
|
4067
|
-
/* @__PURE__ */
|
|
3907
|
+
/* @__PURE__ */ jsxs28("div", { className: "bg-ods-card border border-ods-border rounded-lg p-6 flex flex-col gap-4 animate-pulse", children: [
|
|
3908
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex items-center justify-between gap-4", children: [
|
|
3909
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2", children: [
|
|
3910
|
+
/* @__PURE__ */ jsx35("div", { className: "w-10 h-10 rounded-lg bg-[#2A2A2A]" }),
|
|
3911
|
+
/* @__PURE__ */ jsxs28("div", { className: "space-y-1", children: [
|
|
3912
|
+
/* @__PURE__ */ jsx35("div", { className: "h-4 w-32 bg-[#2A2A2A] rounded" }),
|
|
3913
|
+
/* @__PURE__ */ jsx35("div", { className: "h-3 w-20 bg-[#2A2A2A] rounded" })
|
|
4068
3914
|
] })
|
|
4069
3915
|
] }),
|
|
4070
|
-
/* @__PURE__ */
|
|
3916
|
+
/* @__PURE__ */ jsx35("div", { className: "h-6 w-36 bg-[#2A2A2A] rounded" })
|
|
4071
3917
|
] }),
|
|
4072
|
-
/* @__PURE__ */
|
|
3918
|
+
/* @__PURE__ */ jsx35("div", { className: "h-4 w-40 bg-[#2A2A2A] rounded mt-4" })
|
|
4073
3919
|
] })
|
|
4074
3920
|
] }),
|
|
4075
|
-
/* @__PURE__ */
|
|
4076
|
-
/* @__PURE__ */
|
|
4077
|
-
/* @__PURE__ */
|
|
4078
|
-
/* @__PURE__ */
|
|
4079
|
-
/* @__PURE__ */
|
|
4080
|
-
/* @__PURE__ */
|
|
3921
|
+
/* @__PURE__ */ jsx35("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: ["Commercial Stack", "Open-Source Stack"].map((label, idx) => /* @__PURE__ */ jsxs28("div", { className: "bg-ods-card border border-ods-border rounded-lg overflow-hidden flex flex-col animate-pulse", children: [
|
|
3922
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
3923
|
+
/* @__PURE__ */ jsx35("div", { className: "h-6 w-40 bg-[#2A2A2A] rounded" }),
|
|
3924
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2", children: [
|
|
3925
|
+
/* @__PURE__ */ jsx35("div", { className: "h-5 w-20 bg-[#2A2A2A] rounded" }),
|
|
3926
|
+
/* @__PURE__ */ jsx35("div", { className: "h-4 w-10 bg-[#2A2A2A] rounded" })
|
|
4081
3927
|
] })
|
|
4082
3928
|
] }),
|
|
4083
|
-
/* @__PURE__ */
|
|
4084
|
-
/* @__PURE__ */
|
|
4085
|
-
/* @__PURE__ */
|
|
4086
|
-
/* @__PURE__ */
|
|
4087
|
-
/* @__PURE__ */
|
|
4088
|
-
/* @__PURE__ */
|
|
3929
|
+
/* @__PURE__ */ jsx35("div", { className: "flex-1 flex flex-col gap-3 p-3", children: Array.from({ length: 5 }).map((_, j) => /* @__PURE__ */ jsxs28("div", { className: "bg-ods-bg border border-ods-border rounded-lg px-4 py-3 flex items-center justify-between", children: [
|
|
3930
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3 min-w-0", children: [
|
|
3931
|
+
/* @__PURE__ */ jsx35("div", { className: "w-12 h-12 bg-[#2A2A2A] rounded-lg flex-shrink-0" }),
|
|
3932
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex flex-col min-w-0", children: [
|
|
3933
|
+
/* @__PURE__ */ jsx35("div", { className: "h-4 w-32 bg-[#2A2A2A] rounded" }),
|
|
3934
|
+
/* @__PURE__ */ jsx35("div", { className: "hidden md:block h-3 w-24 bg-[#2A2A2A] rounded mt-1" })
|
|
4089
3935
|
] })
|
|
4090
3936
|
] }),
|
|
4091
|
-
/* @__PURE__ */
|
|
4092
|
-
/* @__PURE__ */
|
|
4093
|
-
/* @__PURE__ */
|
|
3937
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-1 flex-shrink-0", children: [
|
|
3938
|
+
/* @__PURE__ */ jsx35("div", { className: "h-4 w-16 bg-[#2A2A2A] rounded" }),
|
|
3939
|
+
/* @__PURE__ */ jsx35("div", { className: "h-3 w-8 bg-[#2A2A2A] rounded" })
|
|
4094
3940
|
] })
|
|
4095
3941
|
] }, j)) })
|
|
4096
3942
|
] }, idx)) }),
|
|
4097
|
-
/* @__PURE__ */
|
|
4098
|
-
/* @__PURE__ */
|
|
4099
|
-
/* @__PURE__ */
|
|
4100
|
-
/* @__PURE__ */
|
|
4101
|
-
/* @__PURE__ */
|
|
4102
|
-
/* @__PURE__ */
|
|
4103
|
-
/* @__PURE__ */
|
|
3943
|
+
/* @__PURE__ */ jsx35("div", { className: "h-6 w-60 bg-[#2A2A2A] rounded" }),
|
|
3944
|
+
/* @__PURE__ */ jsx35("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6", children: Array.from({ length: 3 }).map((_, i) => /* @__PURE__ */ jsx35("div", { className: "h-48 bg-ods-card border border-ods-border rounded" }, i)) }),
|
|
3945
|
+
/* @__PURE__ */ jsxs28("div", { className: "border border-ods-border rounded-3xl p-8 space-y-6", children: [
|
|
3946
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex items-start gap-6", children: [
|
|
3947
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex-1 space-y-2 min-w-0", children: [
|
|
3948
|
+
/* @__PURE__ */ jsx35("div", { className: "h-8 w-72 bg-[#2A2A2A] rounded" }),
|
|
3949
|
+
/* @__PURE__ */ jsx35("div", { className: "h-4 w-3/4 bg-[#2A2A2A] rounded" })
|
|
4104
3950
|
] }),
|
|
4105
|
-
/* @__PURE__ */
|
|
3951
|
+
/* @__PURE__ */ jsx35("div", { className: "w-12 h-12 bg-[#2A2A2A] rounded-md shrink-0" })
|
|
4106
3952
|
] }),
|
|
4107
|
-
/* @__PURE__ */
|
|
3953
|
+
/* @__PURE__ */ jsx35("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6", children: Array.from({ length: 3 }).map((_, i) => /* @__PURE__ */ jsx35("div", { className: "h-32 bg-ods-card border border-ods-border rounded" }, i)) })
|
|
4108
3954
|
] })
|
|
4109
3955
|
] }),
|
|
4110
|
-
overlayContent && /* @__PURE__ */
|
|
4111
|
-
description && /* @__PURE__ */
|
|
3956
|
+
overlayContent && /* @__PURE__ */ jsx35("div", { className: "absolute inset-0 bg-ods-card/80 z-10 rounded-lg pointer-events-none", children: /* @__PURE__ */ jsxs28("div", { className: "fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-auto flex flex-col items-center gap-4 text-center px-4", children: [
|
|
3957
|
+
description && /* @__PURE__ */ jsx35("h3", { children: description }),
|
|
4112
3958
|
overlayContent
|
|
4113
3959
|
] }) })
|
|
4114
3960
|
] });
|
|
@@ -4116,18 +3962,18 @@ function MarginReportSkeleton({ animate = true, description, overlayContent }) {
|
|
|
4116
3962
|
|
|
4117
3963
|
// src/components/loading/users-grid-skeleton.tsx
|
|
4118
3964
|
init_cn();
|
|
4119
|
-
import { jsx as
|
|
3965
|
+
import { jsx as jsx36, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
4120
3966
|
function UsersGridSkeleton({ rows = 10, className }) {
|
|
4121
3967
|
const skeletonRows = Array.from({ length: rows });
|
|
4122
|
-
return /* @__PURE__ */
|
|
4123
|
-
/* @__PURE__ */
|
|
4124
|
-
/* @__PURE__ */
|
|
3968
|
+
return /* @__PURE__ */ jsx36("div", { className: cn("overflow-x-auto rounded-lg border border-ods-border bg-ods-card animate-pulse", className), children: /* @__PURE__ */ jsxs29("table", { className: "min-w-full divide-y divide-ods-border", children: [
|
|
3969
|
+
/* @__PURE__ */ jsx36("thead", { className: "bg-[#2A2A2A]", children: /* @__PURE__ */ jsx36("tr", { children: ["Name", "Email", "Role", "Created", "Last Sign-In"].map((h) => /* @__PURE__ */ jsx36("th", { className: "px-4 py-3 text-left text-[12px] font-medium text-ods-text-primary font-['DM_Sans']", children: h }, h)) }) }),
|
|
3970
|
+
/* @__PURE__ */ jsx36("tbody", { className: "divide-y divide-ods-border", children: skeletonRows.map((_, idx) => /* @__PURE__ */ jsx36("tr", { children: Array.from({ length: 5 }).map((__, cell) => /* @__PURE__ */ jsx36("td", { className: "px-4 py-3 whitespace-nowrap", children: /* @__PURE__ */ jsx36("div", { className: "h-4 bg-ods-border rounded w-full" }) }, cell)) }, idx)) })
|
|
4125
3971
|
] }) });
|
|
4126
3972
|
}
|
|
4127
3973
|
|
|
4128
3974
|
// src/components/loading/organization-icon-skeleton.tsx
|
|
4129
3975
|
init_cn();
|
|
4130
|
-
import { jsx as
|
|
3976
|
+
import { jsx as jsx37 } from "react/jsx-runtime";
|
|
4131
3977
|
var sizeClasses2 = {
|
|
4132
3978
|
xs: "w-6 h-6",
|
|
4133
3979
|
sm: "w-8 h-8",
|
|
@@ -4154,27 +4000,27 @@ function OrganizationIconSkeleton({
|
|
|
4154
4000
|
!showBackground && "overflow-hidden",
|
|
4155
4001
|
className
|
|
4156
4002
|
);
|
|
4157
|
-
return /* @__PURE__ */
|
|
4003
|
+
return /* @__PURE__ */ jsx37(
|
|
4158
4004
|
"div",
|
|
4159
4005
|
{
|
|
4160
4006
|
className: containerClasses,
|
|
4161
4007
|
role: "status",
|
|
4162
4008
|
"aria-label": "Loading organization icon",
|
|
4163
|
-
children: /* @__PURE__ */
|
|
4009
|
+
children: /* @__PURE__ */ jsx37("div", { className: "w-1/2 h-1/2 bg-ods-border rounded-sm animate-pulse" })
|
|
4164
4010
|
}
|
|
4165
4011
|
);
|
|
4166
4012
|
}
|
|
4167
4013
|
|
|
4168
4014
|
// src/components/loading/organization-card-skeleton.tsx
|
|
4169
4015
|
init_cn();
|
|
4170
|
-
import { jsx as
|
|
4016
|
+
import { jsx as jsx38, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
4171
4017
|
function OrganizationCardSkeleton({
|
|
4172
4018
|
className,
|
|
4173
4019
|
containerClassName,
|
|
4174
4020
|
showFooter = true,
|
|
4175
4021
|
showDescription = true
|
|
4176
4022
|
}) {
|
|
4177
|
-
return /* @__PURE__ */
|
|
4023
|
+
return /* @__PURE__ */ jsx38(
|
|
4178
4024
|
"div",
|
|
4179
4025
|
{
|
|
4180
4026
|
className: cn(
|
|
@@ -4184,9 +4030,9 @@ function OrganizationCardSkeleton({
|
|
|
4184
4030
|
),
|
|
4185
4031
|
role: "status",
|
|
4186
4032
|
"aria-label": "Loading organization card",
|
|
4187
|
-
children: /* @__PURE__ */
|
|
4188
|
-
/* @__PURE__ */
|
|
4189
|
-
/* @__PURE__ */
|
|
4033
|
+
children: /* @__PURE__ */ jsxs30("div", { className: "p-4 gap-3 flex flex-col", children: [
|
|
4034
|
+
/* @__PURE__ */ jsxs30("div", { className: "flex items-start gap-3 w-full", children: [
|
|
4035
|
+
/* @__PURE__ */ jsx38(
|
|
4190
4036
|
OrganizationIconSkeleton,
|
|
4191
4037
|
{
|
|
4192
4038
|
size: "xl",
|
|
@@ -4195,29 +4041,29 @@ function OrganizationCardSkeleton({
|
|
|
4195
4041
|
className: "w-[60px] h-[60px]"
|
|
4196
4042
|
}
|
|
4197
4043
|
),
|
|
4198
|
-
/* @__PURE__ */
|
|
4199
|
-
/* @__PURE__ */
|
|
4200
|
-
/* @__PURE__ */
|
|
4044
|
+
/* @__PURE__ */ jsxs30("div", { className: "flex-1 flex flex-col justify-center py-2 min-w-0 space-y-1", children: [
|
|
4045
|
+
/* @__PURE__ */ jsx38(TextSkeleton.Subheading, { className: "w-3/4" }),
|
|
4046
|
+
/* @__PURE__ */ jsx38(TextSkeleton.Caption, { className: "w-1/2" })
|
|
4201
4047
|
] })
|
|
4202
4048
|
] }),
|
|
4203
|
-
showDescription && /* @__PURE__ */
|
|
4204
|
-
/* @__PURE__ */
|
|
4205
|
-
/* @__PURE__ */
|
|
4049
|
+
showDescription && /* @__PURE__ */ jsx38("div", { className: "w-full h-12 overflow-hidden flex items-center", children: /* @__PURE__ */ jsxs30("div", { className: "space-y-1 w-full", children: [
|
|
4050
|
+
/* @__PURE__ */ jsx38(TextSkeleton.Body, { className: "w-full" }),
|
|
4051
|
+
/* @__PURE__ */ jsx38(TextSkeleton.Body, { className: "w-2/3" })
|
|
4206
4052
|
] }) }),
|
|
4207
|
-
showFooter && /* @__PURE__ */
|
|
4208
|
-
/* @__PURE__ */
|
|
4209
|
-
/* @__PURE__ */
|
|
4210
|
-
/* @__PURE__ */
|
|
4211
|
-
/* @__PURE__ */
|
|
4053
|
+
showFooter && /* @__PURE__ */ jsxs30("div", { className: "flex items-center justify-between gap-2 w-full min-w-0", children: [
|
|
4054
|
+
/* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-3 md:gap-4 min-w-0 flex-shrink", children: [
|
|
4055
|
+
/* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-1 flex-shrink-0", children: [
|
|
4056
|
+
/* @__PURE__ */ jsx38(MediaSkeleton.Icon, { size: "sm", className: "w-5 h-5" }),
|
|
4057
|
+
/* @__PURE__ */ jsx38(TextSkeleton.Caption, { className: "w-8" })
|
|
4212
4058
|
] }),
|
|
4213
|
-
/* @__PURE__ */
|
|
4214
|
-
/* @__PURE__ */
|
|
4215
|
-
/* @__PURE__ */
|
|
4059
|
+
/* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-1 flex-shrink-0", children: [
|
|
4060
|
+
/* @__PURE__ */ jsx38(MediaSkeleton.Icon, { size: "sm", className: "w-5 h-5" }),
|
|
4061
|
+
/* @__PURE__ */ jsx38(TextSkeleton.Caption, { className: "w-10" })
|
|
4216
4062
|
] })
|
|
4217
4063
|
] }),
|
|
4218
|
-
/* @__PURE__ */
|
|
4219
|
-
/* @__PURE__ */
|
|
4220
|
-
/* @__PURE__ */
|
|
4064
|
+
/* @__PURE__ */ jsx38("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-1.5 bg-ods-bg border border-ods-border rounded px-2.5 py-1.5", children: [
|
|
4065
|
+
/* @__PURE__ */ jsx38("div", { className: "w-4 h-4 bg-ods-border rounded-sm flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx38(MediaSkeleton.Icon, { size: "sm", className: "w-2.5 h-2.5" }) }),
|
|
4066
|
+
/* @__PURE__ */ jsx38(TextSkeleton.Caption, { className: "w-16" })
|
|
4221
4067
|
] }) })
|
|
4222
4068
|
] })
|
|
4223
4069
|
] })
|
|
@@ -4231,7 +4077,7 @@ function OrganizationCardSkeletonGrid({
|
|
|
4231
4077
|
showFooter = true,
|
|
4232
4078
|
showDescription = true
|
|
4233
4079
|
}) {
|
|
4234
|
-
return /* @__PURE__ */
|
|
4080
|
+
return /* @__PURE__ */ jsx38(
|
|
4235
4081
|
"div",
|
|
4236
4082
|
{
|
|
4237
4083
|
className: cn(
|
|
@@ -4240,7 +4086,7 @@ function OrganizationCardSkeletonGrid({
|
|
|
4240
4086
|
),
|
|
4241
4087
|
role: "status",
|
|
4242
4088
|
"aria-label": `Loading ${count} organization cards`,
|
|
4243
|
-
children: Array.from({ length: count }, (_, index) => /* @__PURE__ */
|
|
4089
|
+
children: Array.from({ length: count }, (_, index) => /* @__PURE__ */ jsx38(
|
|
4244
4090
|
OrganizationCardSkeleton,
|
|
4245
4091
|
{
|
|
4246
4092
|
containerClassName,
|
|
@@ -4255,9 +4101,9 @@ function OrganizationCardSkeletonGrid({
|
|
|
4255
4101
|
|
|
4256
4102
|
// src/components/loading/device-card-skeleton.tsx
|
|
4257
4103
|
init_cn();
|
|
4258
|
-
import { jsx as
|
|
4104
|
+
import { jsx as jsx39, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
4259
4105
|
function DeviceCardSkeleton({ className }) {
|
|
4260
|
-
return /* @__PURE__ */
|
|
4106
|
+
return /* @__PURE__ */ jsxs31(
|
|
4261
4107
|
"div",
|
|
4262
4108
|
{
|
|
4263
4109
|
className: cn(
|
|
@@ -4267,19 +4113,19 @@ function DeviceCardSkeleton({ className }) {
|
|
|
4267
4113
|
role: "status",
|
|
4268
4114
|
"aria-label": "Loading device card",
|
|
4269
4115
|
children: [
|
|
4270
|
-
/* @__PURE__ */
|
|
4271
|
-
/* @__PURE__ */
|
|
4272
|
-
/* @__PURE__ */
|
|
4273
|
-
/* @__PURE__ */
|
|
4116
|
+
/* @__PURE__ */ jsxs31("div", { className: "flex gap-4 items-center px-4 py-3", children: [
|
|
4117
|
+
/* @__PURE__ */ jsx39("div", { className: "w-8 h-8 bg-ods-bg border border-ods-border rounded-[6px] flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx39("div", { className: "w-4 h-4 bg-ods-border rounded animate-pulse" }) }),
|
|
4118
|
+
/* @__PURE__ */ jsx39("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsx39("div", { className: "h-6 w-3/4 bg-ods-border rounded animate-pulse" }) }),
|
|
4119
|
+
/* @__PURE__ */ jsx39("div", { className: "w-12 h-12 bg-ods-border rounded-[6px] flex-shrink-0 animate-pulse" })
|
|
4274
4120
|
] }),
|
|
4275
|
-
/* @__PURE__ */
|
|
4276
|
-
/* @__PURE__ */
|
|
4277
|
-
/* @__PURE__ */
|
|
4278
|
-
/* @__PURE__ */
|
|
4121
|
+
/* @__PURE__ */ jsxs31("div", { className: "flex gap-4 items-center px-4 py-2", children: [
|
|
4122
|
+
/* @__PURE__ */ jsx39("div", { className: "w-24 h-6 bg-ods-border rounded flex-shrink-0 animate-pulse" }),
|
|
4123
|
+
/* @__PURE__ */ jsx39(OrganizationIconSkeleton, { size: "sm" }),
|
|
4124
|
+
/* @__PURE__ */ jsx39("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsx39("div", { className: "h-5 w-1/2 bg-ods-border rounded animate-pulse" }) })
|
|
4279
4125
|
] }),
|
|
4280
|
-
/* @__PURE__ */
|
|
4281
|
-
/* @__PURE__ */
|
|
4282
|
-
/* @__PURE__ */
|
|
4126
|
+
/* @__PURE__ */ jsxs31("div", { className: "flex gap-4 items-center px-4 py-2", children: [
|
|
4127
|
+
/* @__PURE__ */ jsx39("div", { className: "w-20 h-6 bg-ods-border rounded-full flex-shrink-0 animate-pulse" }),
|
|
4128
|
+
/* @__PURE__ */ jsx39("div", { className: "flex-1", children: /* @__PURE__ */ jsx39("div", { className: "h-5 w-40 bg-ods-border rounded animate-pulse" }) })
|
|
4283
4129
|
] })
|
|
4284
4130
|
]
|
|
4285
4131
|
}
|
|
@@ -4289,7 +4135,7 @@ function DeviceCardSkeletonGrid({
|
|
|
4289
4135
|
count = 12,
|
|
4290
4136
|
className
|
|
4291
4137
|
}) {
|
|
4292
|
-
return /* @__PURE__ */
|
|
4138
|
+
return /* @__PURE__ */ jsx39(
|
|
4293
4139
|
"div",
|
|
4294
4140
|
{
|
|
4295
4141
|
className: cn(
|
|
@@ -4298,22 +4144,22 @@ function DeviceCardSkeletonGrid({
|
|
|
4298
4144
|
),
|
|
4299
4145
|
role: "status",
|
|
4300
4146
|
"aria-label": `Loading ${count} device cards`,
|
|
4301
|
-
children: Array.from({ length: count }, (_, index) => /* @__PURE__ */
|
|
4147
|
+
children: Array.from({ length: count }, (_, index) => /* @__PURE__ */ jsx39(DeviceCardSkeleton, {}, index))
|
|
4302
4148
|
}
|
|
4303
4149
|
);
|
|
4304
4150
|
}
|
|
4305
4151
|
|
|
4306
4152
|
// src/components/vendor-page-skeleton.tsx
|
|
4307
|
-
import { jsx as
|
|
4153
|
+
import { jsx as jsx40 } from "react/jsx-runtime";
|
|
4308
4154
|
function VendorPageSkeleton() {
|
|
4309
|
-
return /* @__PURE__ */
|
|
4155
|
+
return /* @__PURE__ */ jsx40(VendorDetailLayoutSkeleton, {});
|
|
4310
4156
|
}
|
|
4311
4157
|
|
|
4312
4158
|
// src/components/why-it-matters.tsx
|
|
4313
|
-
import { jsx as
|
|
4159
|
+
import { jsx as jsx41, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
4314
4160
|
|
|
4315
4161
|
// src/components/yes-no-display.tsx
|
|
4316
|
-
import { jsx as
|
|
4162
|
+
import { jsx as jsx42, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
4317
4163
|
function YesNoDisplay({
|
|
4318
4164
|
value,
|
|
4319
4165
|
yesText = "Yes",
|
|
@@ -4322,20 +4168,20 @@ function YesNoDisplay({
|
|
|
4322
4168
|
className = ""
|
|
4323
4169
|
}) {
|
|
4324
4170
|
if (customText) {
|
|
4325
|
-
return /* @__PURE__ */
|
|
4326
|
-
/* @__PURE__ */
|
|
4327
|
-
/* @__PURE__ */
|
|
4171
|
+
return /* @__PURE__ */ jsxs33("div", { className: `flex items-center gap-2 ${className}`, children: [
|
|
4172
|
+
/* @__PURE__ */ jsx42(CheckCircleIcon2, { className: "h-6 w-6" }),
|
|
4173
|
+
/* @__PURE__ */ jsx42("span", { className: "text-ods-text-primary text-[16px]", children: customText })
|
|
4328
4174
|
] });
|
|
4329
4175
|
}
|
|
4330
4176
|
if (value) {
|
|
4331
|
-
return /* @__PURE__ */
|
|
4332
|
-
/* @__PURE__ */
|
|
4333
|
-
/* @__PURE__ */
|
|
4177
|
+
return /* @__PURE__ */ jsxs33("div", { className: `flex items-center gap-2 ${className}`, children: [
|
|
4178
|
+
/* @__PURE__ */ jsx42(CheckCircleIcon2, { className: "h-6 w-6" }),
|
|
4179
|
+
/* @__PURE__ */ jsx42("span", { className: "text-ods-text-primary text-[16px]", children: yesText })
|
|
4334
4180
|
] });
|
|
4335
4181
|
}
|
|
4336
|
-
return /* @__PURE__ */
|
|
4337
|
-
/* @__PURE__ */
|
|
4338
|
-
/* @__PURE__ */
|
|
4182
|
+
return /* @__PURE__ */ jsxs33("div", { className: `flex items-center gap-2 ${className}`, children: [
|
|
4183
|
+
/* @__PURE__ */ jsx42(XCircleIcon, { className: "h-6 w-6" }),
|
|
4184
|
+
/* @__PURE__ */ jsx42("span", { className: "text-ods-text-secondary text-[16px]", children: noText })
|
|
4339
4185
|
] });
|
|
4340
4186
|
}
|
|
4341
4187
|
function evaluateFeatureValue(value, dataType) {
|
|
@@ -4370,7 +4216,7 @@ function evaluateFeatureValue(value, dataType) {
|
|
|
4370
4216
|
|
|
4371
4217
|
// src/components/made-with-love.tsx
|
|
4372
4218
|
import { useState as useState5, useEffect as useEffect4 } from "react";
|
|
4373
|
-
import { jsx as
|
|
4219
|
+
import { jsx as jsx43, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
4374
4220
|
function MadeWithLove({
|
|
4375
4221
|
className = "",
|
|
4376
4222
|
size = "md",
|
|
@@ -4444,14 +4290,14 @@ function MadeWithLove({
|
|
|
4444
4290
|
marginLeft: "4px",
|
|
4445
4291
|
textDecoration: "none"
|
|
4446
4292
|
};
|
|
4447
|
-
return /* @__PURE__ */
|
|
4293
|
+
return /* @__PURE__ */ jsxs34(
|
|
4448
4294
|
"div",
|
|
4449
4295
|
{
|
|
4450
4296
|
style: containerStyle,
|
|
4451
4297
|
className,
|
|
4452
4298
|
children: [
|
|
4453
4299
|
"Made with love by",
|
|
4454
|
-
/* @__PURE__ */
|
|
4300
|
+
/* @__PURE__ */ jsxs34(
|
|
4455
4301
|
"a",
|
|
4456
4302
|
{
|
|
4457
4303
|
href: flamingoUrl,
|
|
@@ -4461,14 +4307,14 @@ function MadeWithLove({
|
|
|
4461
4307
|
onMouseEnter: () => setIsHovered(true),
|
|
4462
4308
|
onMouseLeave: () => setIsHovered(false),
|
|
4463
4309
|
children: [
|
|
4464
|
-
/* @__PURE__ */
|
|
4310
|
+
/* @__PURE__ */ jsx43("div", { style: logoStyle, children: /* @__PURE__ */ jsx43(
|
|
4465
4311
|
FlamingoLogo2,
|
|
4466
4312
|
{
|
|
4467
4313
|
size: config.logoSize,
|
|
4468
4314
|
color: "#f357bb"
|
|
4469
4315
|
}
|
|
4470
4316
|
) }),
|
|
4471
|
-
/* @__PURE__ */
|
|
4317
|
+
/* @__PURE__ */ jsx43("span", { style: textStyle, children: "Flamingo" })
|
|
4472
4318
|
]
|
|
4473
4319
|
}
|
|
4474
4320
|
)
|
|
@@ -4480,7 +4326,7 @@ function MadeWithLove({
|
|
|
4480
4326
|
// src/components/date-time-picker.tsx
|
|
4481
4327
|
init_cn();
|
|
4482
4328
|
import DatePicker2 from "react-datepicker";
|
|
4483
|
-
import { jsx as
|
|
4329
|
+
import { jsx as jsx44, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
4484
4330
|
var inputClassName = cn(
|
|
4485
4331
|
"flex h-10 w-full rounded-md border px-3 py-2 text-sm ring-offset-background",
|
|
4486
4332
|
"file:border-0 file:bg-transparent file:text-sm file:font-medium",
|
|
@@ -4504,9 +4350,9 @@ function DateTimePicker({
|
|
|
4504
4350
|
timeIntervals = 15,
|
|
4505
4351
|
dateFormat = "MMMM d, yyyy h:mm aa"
|
|
4506
4352
|
}) {
|
|
4507
|
-
return /* @__PURE__ */
|
|
4508
|
-
label && /* @__PURE__ */
|
|
4509
|
-
/* @__PURE__ */
|
|
4353
|
+
return /* @__PURE__ */ jsxs35("div", { className: cn("space-y-2", className), children: [
|
|
4354
|
+
label && /* @__PURE__ */ jsx44(Label, { className: "font-['Azeret_Mono'] text-[12px] font-semibold leading-[1em] tracking-[-0.02em] text-ods-text-secondary uppercase", children: label }),
|
|
4355
|
+
/* @__PURE__ */ jsx44("div", { className: "w-full", children: /* @__PURE__ */ jsx44(
|
|
4510
4356
|
DatePicker2,
|
|
4511
4357
|
{
|
|
4512
4358
|
selected: value,
|
|
@@ -4521,7 +4367,7 @@ function DateTimePicker({
|
|
|
4521
4367
|
className: inputClassName
|
|
4522
4368
|
}
|
|
4523
4369
|
) }),
|
|
4524
|
-
/* @__PURE__ */
|
|
4370
|
+
/* @__PURE__ */ jsx44("style", { dangerouslySetInnerHTML: { __html: `
|
|
4525
4371
|
.react-datepicker-wrapper {
|
|
4526
4372
|
width: 100% !important;
|
|
4527
4373
|
display: block !important;
|
|
@@ -4624,1233 +4470,9 @@ function DateTimePicker({
|
|
|
4624
4470
|
] });
|
|
4625
4471
|
}
|
|
4626
4472
|
|
|
4627
|
-
// src/components/shared/product-release/product-releases-view.tsx
|
|
4628
|
-
init_cn();
|
|
4629
|
-
import { Fragment as Fragment6, jsx as jsx46, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
4630
|
-
var DEFAULT_ENDPOINT = "/api/releases";
|
|
4631
|
-
var DEFAULT_SEARCH_PARAM_KEY = DEV_SECTION_PARAM_KEYS.search;
|
|
4632
|
-
var DEFAULT_STATUS_PARAM_KEY = DEV_SECTION_PARAM_KEYS.releaseStatus;
|
|
4633
|
-
var DEFAULT_PAGE_PARAM_KEY = "page";
|
|
4634
|
-
function ReleaseRow({
|
|
4635
|
-
release,
|
|
4636
|
-
basePath,
|
|
4637
|
-
buildCardProps
|
|
4638
|
-
}) {
|
|
4639
|
-
const runtime = useChatRuntime();
|
|
4640
|
-
const router = useRouter();
|
|
4641
|
-
const cta = resolveContentHref(runtime?.composeContentUrl, {
|
|
4642
|
-
type: "product_release",
|
|
4643
|
-
slug: release.slug,
|
|
4644
|
-
basePath,
|
|
4645
|
-
platforms: release.product_release_platforms
|
|
4646
|
-
});
|
|
4647
|
-
const { target, rel } = useEntityCardLink({ href: cta.href, targetPlatform: cta.targetPlatform });
|
|
4648
|
-
const onClick = (e) => {
|
|
4649
|
-
if (e.defaultPrevented || isModifierClick(e) || target === "_blank") return;
|
|
4650
|
-
e.preventDefault();
|
|
4651
|
-
executeNavigationImperative({
|
|
4652
|
-
runtime,
|
|
4653
|
-
href: cta.href,
|
|
4654
|
-
targetPlatform: cta.targetPlatform,
|
|
4655
|
-
fallbackNavigate: router.push
|
|
4656
|
-
});
|
|
4657
|
-
};
|
|
4658
|
-
return /* @__PURE__ */ jsx46(
|
|
4659
|
-
ProductReleaseCard,
|
|
4660
|
-
{
|
|
4661
|
-
size: "lg",
|
|
4662
|
-
title: release.title,
|
|
4663
|
-
summary: release.summary,
|
|
4664
|
-
version: release.version,
|
|
4665
|
-
...buildCardProps(release),
|
|
4666
|
-
anchorProps: { href: cta.href, target, rel, onClick }
|
|
4667
|
-
}
|
|
4668
|
-
);
|
|
4669
|
-
}
|
|
4670
|
-
function ProductReleasesView({
|
|
4671
|
-
endpoint = DEFAULT_ENDPOINT,
|
|
4672
|
-
initialData,
|
|
4673
|
-
itemsPerPage = 5,
|
|
4674
|
-
basePath = "/releases",
|
|
4675
|
-
buildCardProps = buildProductReleaseCardProps,
|
|
4676
|
-
searchParamKey = DEFAULT_SEARCH_PARAM_KEY,
|
|
4677
|
-
statusParamKey = DEFAULT_STATUS_PARAM_KEY,
|
|
4678
|
-
pageParamKey = DEFAULT_PAGE_PARAM_KEY,
|
|
4679
|
-
className
|
|
4680
|
-
} = {}) {
|
|
4681
|
-
const searchParams = useSearchParams();
|
|
4682
|
-
const router = useRouter();
|
|
4683
|
-
const pathname = usePathname();
|
|
4684
|
-
const search = searchParams.get(searchParamKey) || "";
|
|
4685
|
-
const status = searchParams.get(statusParamKey) || "all";
|
|
4686
|
-
const currentPage = Math.max(1, parseInt(searchParams.get(pageParamKey) || "1", 10) || 1);
|
|
4687
|
-
const offset = (currentPage - 1) * itemsPerPage;
|
|
4688
|
-
const listParams = new URLSearchParams({ limit: String(itemsPerPage), offset: String(offset) });
|
|
4689
|
-
if (search) listParams.set(searchParamKey, search);
|
|
4690
|
-
if (status && status !== "all") listParams.set(statusParamKey, status);
|
|
4691
|
-
const { data, isLoading, error, reload } = useSelfFetch(
|
|
4692
|
-
`${endpoint}?${listParams.toString()}`,
|
|
4693
|
-
{ initialData }
|
|
4694
|
-
);
|
|
4695
|
-
const releases = data?.data ?? [];
|
|
4696
|
-
const totalCount = data?.count ?? 0;
|
|
4697
|
-
const totalPages = Math.ceil(totalCount / itemsPerPage);
|
|
4698
|
-
const hasActiveFilters = search !== "" || status !== "all";
|
|
4699
|
-
const showEmpty = !isLoading && !error && releases.length === 0;
|
|
4700
|
-
const goToPage = (page) => {
|
|
4701
|
-
const params = new URLSearchParams(searchParams.toString());
|
|
4702
|
-
params.set(pageParamKey, String(page));
|
|
4703
|
-
router.replace(`${pathname}?${params.toString()}`, { scroll: false });
|
|
4704
|
-
};
|
|
4705
|
-
const resetFilters = () => {
|
|
4706
|
-
const params = new URLSearchParams(searchParams.toString());
|
|
4707
|
-
params.delete(searchParamKey);
|
|
4708
|
-
params.delete(statusParamKey);
|
|
4709
|
-
params.delete(pageParamKey);
|
|
4710
|
-
router.replace(`${pathname}?${params.toString()}`, { scroll: false });
|
|
4711
|
-
};
|
|
4712
|
-
if (error) {
|
|
4713
|
-
return /* @__PURE__ */ jsx46("div", { className: cn("w-full", className), children: /* @__PURE__ */ jsx46(LoadError, { message: "Failed to load releases.", onRetry: reload }) });
|
|
4714
|
-
}
|
|
4715
|
-
return /* @__PURE__ */ jsx46("div", { className: cn("w-full flex flex-col gap-[40px]", className), children: /* @__PURE__ */ jsx46("div", { className: "min-h-[600px]", children: showEmpty ? /* @__PURE__ */ jsx46("div", { className: "h-[600px] flex items-center justify-center", children: hasActiveFilters ? /* @__PURE__ */ jsx46(
|
|
4716
|
-
EmptyState,
|
|
4717
|
-
{
|
|
4718
|
-
type: "search",
|
|
4719
|
-
title: "No releases found",
|
|
4720
|
-
description: "No releases match your current filters. Try adjusting your search or status filter.",
|
|
4721
|
-
showCTA: true,
|
|
4722
|
-
ctaText: "Reset Filters",
|
|
4723
|
-
onCtaClick: resetFilters
|
|
4724
|
-
}
|
|
4725
|
-
) : /* @__PURE__ */ jsx46(
|
|
4726
|
-
EmptyState,
|
|
4727
|
-
{
|
|
4728
|
-
type: "generic",
|
|
4729
|
-
title: "No releases available",
|
|
4730
|
-
description: "Check back soon for product updates!",
|
|
4731
|
-
showCTA: false
|
|
4732
|
-
}
|
|
4733
|
-
) }) : /* @__PURE__ */ jsxs37(Fragment6, { children: [
|
|
4734
|
-
/* @__PURE__ */ jsx46("div", { className: "flex flex-col gap-6", children: Array.from({ length: itemsPerPage }).map((_, i) => {
|
|
4735
|
-
const release = releases[i];
|
|
4736
|
-
const hasData = !!release;
|
|
4737
|
-
return /* @__PURE__ */ jsx46(
|
|
4738
|
-
"div",
|
|
4739
|
-
{
|
|
4740
|
-
style: { visibility: isLoading || hasData ? "visible" : "hidden" },
|
|
4741
|
-
children: isLoading ? /* @__PURE__ */ jsx46(ProductReleaseCardSkeleton, { size: "lg" }) : release ? /* @__PURE__ */ jsx46(ReleaseRow, { release, basePath, buildCardProps }) : /* @__PURE__ */ jsx46(ProductReleaseCardSkeleton, { size: "lg" })
|
|
4742
|
-
},
|
|
4743
|
-
release?.id ?? `slot-${i}`
|
|
4744
|
-
);
|
|
4745
|
-
}) }),
|
|
4746
|
-
/* @__PURE__ */ jsx46("div", { className: "mt-6 md:mt-8 flex justify-center", children: isLoading ? /* @__PURE__ */ jsx46("div", { className: "h-12 m-3 w-64" }) : releases.length > 0 && totalPages > 1 ? /* @__PURE__ */ jsx46(
|
|
4747
|
-
PersistentPaginationWrapper,
|
|
4748
|
-
{
|
|
4749
|
-
isLoading: false,
|
|
4750
|
-
currentPage,
|
|
4751
|
-
totalPages,
|
|
4752
|
-
onPageChange: goToPage,
|
|
4753
|
-
variant: "blog"
|
|
4754
|
-
}
|
|
4755
|
-
) : /* @__PURE__ */ jsx46("div", { className: "h-12 m-3 w-64", style: { visibility: "hidden" } }) })
|
|
4756
|
-
] }) }) });
|
|
4757
|
-
}
|
|
4758
|
-
|
|
4759
|
-
// src/components/shared/product-release/release-detail-page.tsx
|
|
4760
|
-
init_next_link();
|
|
4761
|
-
init_next_navigation();
|
|
4762
|
-
import { useState as useState7, useEffect as useEffect5 } from "react";
|
|
4763
|
-
|
|
4764
|
-
// src/components/shared/media-gallery-strip.tsx
|
|
4765
|
-
import { useState as useState6 } from "react";
|
|
4766
|
-
import { Fragment as Fragment7, jsx as jsx47, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
4767
|
-
function isGalleryImage(mediaType) {
|
|
4768
|
-
return mediaType !== "video" && mediaType !== "demo";
|
|
4769
|
-
}
|
|
4770
|
-
function MediaGalleryStrip({ items, maxDisplay, className }) {
|
|
4771
|
-
const [galleryOpen, setGalleryOpen] = useState6(false);
|
|
4772
|
-
const [galleryIndex, setGalleryIndex] = useState6(0);
|
|
4773
|
-
if (!items || items.length === 0) return null;
|
|
4774
|
-
const display = typeof maxDisplay === "number" ? items.slice(0, Math.max(0, maxDisplay)) : items;
|
|
4775
|
-
const galleryImages = display.filter((m) => isGalleryImage(m.media_type)).map((m) => m.media_url);
|
|
4776
|
-
const tileClass = "shrink-0 w-[240px] h-[200px] rounded-md overflow-hidden border border-ods-border bg-black transition-opacity";
|
|
4777
|
-
return /* @__PURE__ */ jsxs38(Fragment7, { children: [
|
|
4778
|
-
/* @__PURE__ */ jsx47("div", { className: `flex gap-6 overflow-x-auto w-full ${className ?? ""}`, children: display.map((mediaItem, index) => {
|
|
4779
|
-
if (isGalleryImage(mediaItem.media_type)) {
|
|
4780
|
-
return /* @__PURE__ */ jsx47(
|
|
4781
|
-
"button",
|
|
4782
|
-
{
|
|
4783
|
-
type: "button",
|
|
4784
|
-
className: `${tileClass} cursor-pointer hover:opacity-80`,
|
|
4785
|
-
"aria-label": `Open ${mediaItem.title || `media ${index + 1}`} in gallery`,
|
|
4786
|
-
onClick: () => {
|
|
4787
|
-
setGalleryIndex(display.slice(0, index).filter((m) => isGalleryImage(m.media_type)).length);
|
|
4788
|
-
setGalleryOpen(true);
|
|
4789
|
-
},
|
|
4790
|
-
children: /* @__PURE__ */ jsx47("img", { src: mediaItem.media_url, alt: mediaItem.title || `Media ${index + 1}`, className: "w-full h-full object-cover" })
|
|
4791
|
-
},
|
|
4792
|
-
mediaItem.id || index
|
|
4793
|
-
);
|
|
4794
|
-
}
|
|
4795
|
-
return /* @__PURE__ */ jsx47("div", { className: tileClass, children: /* @__PURE__ */ jsx47(Video, { url: mediaItem.media_url, layout: "native" }) }, mediaItem.id || index);
|
|
4796
|
-
}) }),
|
|
4797
|
-
galleryImages.length > 0 && /* @__PURE__ */ jsx47(
|
|
4798
|
-
ImageGalleryModal,
|
|
4799
|
-
{
|
|
4800
|
-
images: galleryImages,
|
|
4801
|
-
isOpen: galleryOpen,
|
|
4802
|
-
onClose: () => setGalleryOpen(false),
|
|
4803
|
-
initialIndex: galleryIndex
|
|
4804
|
-
}
|
|
4805
|
-
)
|
|
4806
|
-
] });
|
|
4807
|
-
}
|
|
4808
|
-
|
|
4809
|
-
// src/components/shared/product-release/release-detail-page.tsx
|
|
4810
|
-
import { AlertTriangle, ExternalLink, BookMarked, Sparkles as Sparkles2, TrendingUp, Wrench } from "lucide-react";
|
|
4811
|
-
import { Fragment as Fragment8, jsx as jsx48, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
4812
|
-
var DefaultMarkdownRenderer = RichMarkdownRenderer;
|
|
4813
|
-
function ReleaseDetailPage({
|
|
4814
|
-
authorHref,
|
|
4815
|
-
slug,
|
|
4816
|
-
initialData,
|
|
4817
|
-
useRelease,
|
|
4818
|
-
MarkdownRenderer = DefaultMarkdownRenderer,
|
|
4819
|
-
RoadmapSection,
|
|
4820
|
-
DeliverySection,
|
|
4821
|
-
VideoSection,
|
|
4822
|
-
VideoDisplaySection,
|
|
4823
|
-
roadmapApiEndpoint = "/api/roadmap",
|
|
4824
|
-
deliveryApiEndpoint = "/api/delivery",
|
|
4825
|
-
backButton
|
|
4826
|
-
}) {
|
|
4827
|
-
const router = useRouter();
|
|
4828
|
-
const { data: fetchedRelease, error, isLoading } = useRelease(initialData ? void 0 : slug);
|
|
4829
|
-
const release = initialData || fetchedRelease;
|
|
4830
|
-
const showBackButton = backButton !== false;
|
|
4831
|
-
const backLabel = (backButton ? backButton.label : void 0) ?? "Back to home";
|
|
4832
|
-
const backHref = (backButton ? backButton.href : void 0) ?? "/";
|
|
4833
|
-
const [roadmapTasks, setRoadmapTasks] = useState7([]);
|
|
4834
|
-
const [deliveryData, setDeliveryData] = useState7(null);
|
|
4835
|
-
const [roadmapLoading, setRoadmapLoading] = useState7(false);
|
|
4836
|
-
const [deliveryLoading, setDeliveryLoading] = useState7(false);
|
|
4837
|
-
useEffect5(() => {
|
|
4838
|
-
async function fetchLinkedTasks() {
|
|
4839
|
-
if (!release) return;
|
|
4840
|
-
try {
|
|
4841
|
-
const roadmapTasksData = release.clickup_roadmap_tasks;
|
|
4842
|
-
if (roadmapTasksData && roadmapTasksData.length > 0 && RoadmapSection) {
|
|
4843
|
-
setRoadmapLoading(true);
|
|
4844
|
-
const roadmapIds = roadmapTasksData.map((t) => t.clickup_task_id).join(",");
|
|
4845
|
-
const roadmapResponse = await contentFetch(`${roadmapApiEndpoint}?task_ids=${roadmapIds}`);
|
|
4846
|
-
const roadmapData = await roadmapResponse.json();
|
|
4847
|
-
setRoadmapTasks(roadmapData.items || []);
|
|
4848
|
-
setRoadmapLoading(false);
|
|
4849
|
-
}
|
|
4850
|
-
const deliveryTasksData = release.clickup_delivery_tasks;
|
|
4851
|
-
if (deliveryTasksData && deliveryTasksData.length > 0 && DeliverySection) {
|
|
4852
|
-
setDeliveryLoading(true);
|
|
4853
|
-
const deliveryIds = deliveryTasksData.map((t) => t.clickup_task_id).join(",");
|
|
4854
|
-
const deliveryResponse = await contentFetch(`${deliveryApiEndpoint}?task_ids=${deliveryIds}`);
|
|
4855
|
-
const deliveryResponseData = await deliveryResponse.json();
|
|
4856
|
-
setDeliveryData(deliveryResponseData);
|
|
4857
|
-
setDeliveryLoading(false);
|
|
4858
|
-
}
|
|
4859
|
-
} catch (err) {
|
|
4860
|
-
console.error("Error fetching linked tasks:", err);
|
|
4861
|
-
setRoadmapLoading(false);
|
|
4862
|
-
setDeliveryLoading(false);
|
|
4863
|
-
}
|
|
4864
|
-
}
|
|
4865
|
-
fetchLinkedTasks();
|
|
4866
|
-
}, [release, RoadmapSection, DeliverySection, roadmapApiEndpoint, deliveryApiEndpoint]);
|
|
4867
|
-
if (!initialData && isLoading) {
|
|
4868
|
-
return /* @__PURE__ */ jsx48(PageShell, { children: /* @__PURE__ */ jsx48("div", { className: "pt-[var(--spacing-system-l)]", children: /* @__PURE__ */ jsx48(DetailPageSkeleton, { bare: true, metadataColumns: 4, showImageGallery: true }) }) });
|
|
4869
|
-
}
|
|
4870
|
-
if (error || !release) {
|
|
4871
|
-
return /* @__PURE__ */ jsx48(PageShell, { children: /* @__PURE__ */ jsxs39("div", { className: "text-center py-16", children: [
|
|
4872
|
-
/* @__PURE__ */ jsx48("h1", { className: "text-4xl font-bold text-ods-text-primary mb-4", children: "Release Not Found" }),
|
|
4873
|
-
/* @__PURE__ */ jsx48("p", { className: "text-xl text-ods-text-secondary", children: "The release you're looking for doesn't exist." })
|
|
4874
|
-
] }) });
|
|
4875
|
-
}
|
|
4876
|
-
const hasBreakingChanges = Array.isArray(release.breaking_changes) && release.breaking_changes.length > 0;
|
|
4877
|
-
const releaseTitle = release.title;
|
|
4878
|
-
const releaseVersion = release.version;
|
|
4879
|
-
const releaseSummary = release.summary;
|
|
4880
|
-
const releaseContent = release.content;
|
|
4881
|
-
const releaseDate = release.release_date;
|
|
4882
|
-
const releaseType = release.release_type;
|
|
4883
|
-
const releaseStatus = release.release_status;
|
|
4884
|
-
const releaseMedia = release.release_media;
|
|
4885
|
-
const author = release.author;
|
|
4886
|
-
const githubReleases = release.github_releases;
|
|
4887
|
-
const knowledgeBaseLinks = release.knowledge_base_links;
|
|
4888
|
-
const migrationGuideUrl = release.migration_guide_url;
|
|
4889
|
-
const documentationUrl = release.documentation_url;
|
|
4890
|
-
const youtubeUrl = release.youtube_url;
|
|
4891
|
-
const mainVideoUrl = release.main_video_url;
|
|
4892
|
-
const videoBites = release.video_bites;
|
|
4893
|
-
const highlightVideoUrl = release.highlight_video_url;
|
|
4894
|
-
const highlightVideoThumbnail = release.highlight_video_thumbnail;
|
|
4895
|
-
const breakingChanges = release.breaking_changes;
|
|
4896
|
-
const featuresAdded = release.features_added;
|
|
4897
|
-
const bugFixed = release.bugs_fixed;
|
|
4898
|
-
const improvements = release.improvements;
|
|
4899
|
-
return /* @__PURE__ */ jsx48(PageShell, { children: /* @__PURE__ */ jsx48(
|
|
4900
|
-
PageLayout,
|
|
4901
|
-
{
|
|
4902
|
-
backButton: showBackButton ? { label: backLabel, onClick: () => router.push(backHref) } : void 0,
|
|
4903
|
-
children: /* @__PURE__ */ jsxs39("div", { className: "space-y-6 md:space-y-8", children: [
|
|
4904
|
-
/* @__PURE__ */ jsx48("div", { className: "flex flex-col md:flex-row md:items-end gap-4 w-full", children: /* @__PURE__ */ jsxs39("div", { className: "flex-1 flex flex-col gap-2", children: [
|
|
4905
|
-
/* @__PURE__ */ jsx48("h1", { className: "text-h1 tracking-[-1.12px] text-ods-text-primary", children: releaseTitle }),
|
|
4906
|
-
/* @__PURE__ */ jsxs39("p", { className: "text-h4 text-ods-text-secondary", children: [
|
|
4907
|
-
"Version: ",
|
|
4908
|
-
releaseVersion
|
|
4909
|
-
] })
|
|
4910
|
-
] }) }),
|
|
4911
|
-
/* @__PURE__ */ jsx48(EntityTagBadges, { tags: release.product_release_tags }),
|
|
4912
|
-
/* @__PURE__ */ jsxs39("div", { className: "grid grid-cols-1 md:grid-cols-4 border border-ods-border rounded-md overflow-hidden w-full", children: [
|
|
4913
|
-
/* @__PURE__ */ jsx48("div", { className: "bg-ods-card border-b md:border-b-0 md:border-r border-ods-border p-4 flex flex-col gap-3", children: /* @__PURE__ */ jsxs39("div", { className: "flex flex-col gap-0", children: [
|
|
4914
|
-
/* @__PURE__ */ jsx48("p", { className: "text-h4 text-ods-text-primary", children: releaseType.toLocaleUpperCase() }),
|
|
4915
|
-
/* @__PURE__ */ jsx48("p", { className: "font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary", children: "Release Type" })
|
|
4916
|
-
] }) }),
|
|
4917
|
-
/* @__PURE__ */ jsx48("div", { className: "bg-ods-card border-b md:border-b-0 md:border-r border-ods-border p-4 flex flex-col gap-3", children: /* @__PURE__ */ jsxs39("div", { className: "flex flex-col gap-0", children: [
|
|
4918
|
-
/* @__PURE__ */ jsx48("p", { className: "text-h4 text-ods-text-primary", children: releaseStatus.toLocaleUpperCase() }),
|
|
4919
|
-
/* @__PURE__ */ jsx48("p", { className: "font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary", children: "Release Status" })
|
|
4920
|
-
] }) }),
|
|
4921
|
-
/* @__PURE__ */ jsx48("div", { className: "bg-ods-card border-b md:border-b-0 md:border-r border-ods-border p-4 flex flex-col gap-3", children: /* @__PURE__ */ jsxs39("div", { className: "flex flex-col gap-0", children: [
|
|
4922
|
-
/* @__PURE__ */ jsx48("p", { className: "text-h4 text-ods-text-primary", children: formatReleaseDate(releaseDate) }),
|
|
4923
|
-
/* @__PURE__ */ jsx48("p", { className: "font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary", children: "Release Date" })
|
|
4924
|
-
] }) }),
|
|
4925
|
-
/* @__PURE__ */ jsx48(
|
|
4926
|
-
EntityMetadataAuthorCell,
|
|
4927
|
-
{
|
|
4928
|
-
author: author ?? { full_name: null, avatar_url: null },
|
|
4929
|
-
authorHref: author?.full_name ? authorHref : void 0
|
|
4930
|
-
}
|
|
4931
|
-
)
|
|
4932
|
-
] }),
|
|
4933
|
-
/* @__PURE__ */ jsx48(MediaGalleryStrip, { items: releaseMedia ?? [], maxDisplay: 5 }),
|
|
4934
|
-
releaseSummary && /* @__PURE__ */ jsx48("div", { className: "text-h4 text-ods-text-primary", children: /* @__PURE__ */ jsx48("p", { children: releaseSummary }) }),
|
|
4935
|
-
VideoDisplaySection ? /* @__PURE__ */ jsx48(
|
|
4936
|
-
VideoDisplaySection,
|
|
4937
|
-
{
|
|
4938
|
-
mainVideoUrl,
|
|
4939
|
-
youtubeUrl,
|
|
4940
|
-
highlightVideoUrl,
|
|
4941
|
-
highlightVideoThumbnail,
|
|
4942
|
-
title: releaseTitle,
|
|
4943
|
-
videoBites,
|
|
4944
|
-
bitesTitle: "Video Clips",
|
|
4945
|
-
filterPublishedBites: true,
|
|
4946
|
-
srtContent: release?.srt_content,
|
|
4947
|
-
captionsUrl: release?.captionsUrl
|
|
4948
|
-
}
|
|
4949
|
-
) : /* @__PURE__ */ jsxs39(Fragment8, { children: [
|
|
4950
|
-
youtubeUrl && /* @__PURE__ */ jsx48(
|
|
4951
|
-
Video,
|
|
4952
|
-
{
|
|
4953
|
-
kind: "youtube",
|
|
4954
|
-
url: youtubeUrl,
|
|
4955
|
-
title: `${releaseTitle} - Video`,
|
|
4956
|
-
layout: "native"
|
|
4957
|
-
}
|
|
4958
|
-
),
|
|
4959
|
-
!youtubeUrl && mainVideoUrl && /* @__PURE__ */ jsx48(
|
|
4960
|
-
Video,
|
|
4961
|
-
{
|
|
4962
|
-
url: mainVideoUrl,
|
|
4963
|
-
srtContent: release?.srt_content,
|
|
4964
|
-
captionsUrl: release?.captionsUrl,
|
|
4965
|
-
layout: "centered"
|
|
4966
|
-
}
|
|
4967
|
-
),
|
|
4968
|
-
highlightVideoUrl && /* @__PURE__ */ jsx48(
|
|
4969
|
-
Video,
|
|
4970
|
-
{
|
|
4971
|
-
url: highlightVideoUrl,
|
|
4972
|
-
poster: highlightVideoThumbnail,
|
|
4973
|
-
layout: "centered"
|
|
4974
|
-
}
|
|
4975
|
-
)
|
|
4976
|
-
] }),
|
|
4977
|
-
releaseContent && /* @__PURE__ */ jsx48("div", { className: "text-h4 text-ods-text-primary", children: /* @__PURE__ */ jsx48(MarkdownRenderer, { content: releaseContent }) }),
|
|
4978
|
-
hasBreakingChanges && /* @__PURE__ */ jsx48(Card, { className: "border-red-500 bg-red-500/10", children: /* @__PURE__ */ jsx48(CardContent, { className: "p-6", children: /* @__PURE__ */ jsxs39("div", { className: "flex items-center gap-3", children: [
|
|
4979
|
-
/* @__PURE__ */ jsx48(AlertTriangle, { className: "h-6 w-6 text-red-500" }),
|
|
4980
|
-
/* @__PURE__ */ jsxs39("div", { children: [
|
|
4981
|
-
/* @__PURE__ */ jsx48("h3", { className: "font-bold text-red-500 text-lg", children: "Breaking Changes" }),
|
|
4982
|
-
/* @__PURE__ */ jsx48("p", { className: "text-ods-text-secondary", children: "This release contains breaking changes. Review carefully before upgrading." })
|
|
4983
|
-
] })
|
|
4984
|
-
] }) }) }),
|
|
4985
|
-
/* @__PURE__ */ jsx48(
|
|
4986
|
-
ReleaseChangelogSection,
|
|
4987
|
-
{
|
|
4988
|
-
title: "Breaking Changes",
|
|
4989
|
-
entries: breakingChanges || [],
|
|
4990
|
-
isBreaking: true,
|
|
4991
|
-
hideTitle: true,
|
|
4992
|
-
icon: /* @__PURE__ */ jsx48(AlertTriangle, { className: "h-6 w-6" }),
|
|
4993
|
-
SimpleMarkdownRenderer: MarkdownRenderer
|
|
4994
|
-
}
|
|
4995
|
-
),
|
|
4996
|
-
/* @__PURE__ */ jsx48(
|
|
4997
|
-
ReleaseChangelogSection,
|
|
4998
|
-
{
|
|
4999
|
-
title: "Features Added",
|
|
5000
|
-
entries: featuresAdded || [],
|
|
5001
|
-
icon: /* @__PURE__ */ jsx48(Sparkles2, { className: "h-6 w-6" }),
|
|
5002
|
-
previewFirst: true,
|
|
5003
|
-
SimpleMarkdownRenderer: MarkdownRenderer
|
|
5004
|
-
}
|
|
5005
|
-
),
|
|
5006
|
-
/* @__PURE__ */ jsx48(
|
|
5007
|
-
ReleaseChangelogSection,
|
|
5008
|
-
{
|
|
5009
|
-
title: "Bugs Fixed",
|
|
5010
|
-
entries: bugFixed || [],
|
|
5011
|
-
icon: /* @__PURE__ */ jsx48(Wrench, { className: "h-6 w-6" }),
|
|
5012
|
-
previewFirst: true,
|
|
5013
|
-
SimpleMarkdownRenderer: MarkdownRenderer
|
|
5014
|
-
}
|
|
5015
|
-
),
|
|
5016
|
-
/* @__PURE__ */ jsx48(
|
|
5017
|
-
ReleaseChangelogSection,
|
|
5018
|
-
{
|
|
5019
|
-
title: "Improvements",
|
|
5020
|
-
entries: improvements || [],
|
|
5021
|
-
icon: /* @__PURE__ */ jsx48(TrendingUp, { className: "h-6 w-6" }),
|
|
5022
|
-
previewFirst: true,
|
|
5023
|
-
SimpleMarkdownRenderer: MarkdownRenderer
|
|
5024
|
-
}
|
|
5025
|
-
),
|
|
5026
|
-
!VideoDisplaySection && VideoSection && videoBites && videoBites.length > 0 && /* @__PURE__ */ jsx48(
|
|
5027
|
-
VideoSection,
|
|
5028
|
-
{
|
|
5029
|
-
bites: videoBites,
|
|
5030
|
-
title: "Video Clips",
|
|
5031
|
-
filterPublished: true
|
|
5032
|
-
}
|
|
5033
|
-
),
|
|
5034
|
-
RoadmapSection && (roadmapLoading || roadmapTasks.length > 0) && /* @__PURE__ */ jsxs39("div", { className: "space-y-4 w-full", children: [
|
|
5035
|
-
/* @__PURE__ */ jsx48("p", { className: "text-h5 tracking-[-0.28px] text-ods-text-secondary", children: "Related Roadmap Items" }),
|
|
5036
|
-
/* @__PURE__ */ jsx48(
|
|
5037
|
-
RoadmapSection,
|
|
5038
|
-
{
|
|
5039
|
-
items: roadmapTasks,
|
|
5040
|
-
isLoading: roadmapLoading,
|
|
5041
|
-
onItemUpdate: (updatedItem) => {
|
|
5042
|
-
setRoadmapTasks(
|
|
5043
|
-
(prevTasks) => prevTasks.map(
|
|
5044
|
-
(task) => task.id === updatedItem.id ? updatedItem : task
|
|
5045
|
-
)
|
|
5046
|
-
);
|
|
5047
|
-
}
|
|
5048
|
-
}
|
|
5049
|
-
)
|
|
5050
|
-
] }),
|
|
5051
|
-
DeliverySection && (deliveryLoading || deliveryData && (deliveryData.completed.length > 0 || deliveryData.inProgress.length > 0)) && /* @__PURE__ */ jsxs39("div", { className: "w-full space-y-4", children: [
|
|
5052
|
-
/* @__PURE__ */ jsx48("p", { className: "text-h5 tracking-[-0.28px] text-ods-text-secondary", children: "Related Enhancements and Bug-fixes" }),
|
|
5053
|
-
/* @__PURE__ */ jsx48(
|
|
5054
|
-
DeliverySection,
|
|
5055
|
-
{
|
|
5056
|
-
data: deliveryData,
|
|
5057
|
-
isLoading: deliveryLoading
|
|
5058
|
-
}
|
|
5059
|
-
)
|
|
5060
|
-
] }),
|
|
5061
|
-
(githubReleases?.length || knowledgeBaseLinks?.length || migrationGuideUrl || documentationUrl) && /* @__PURE__ */ jsxs39("div", { className: "space-y-1 w-full", children: [
|
|
5062
|
-
/* @__PURE__ */ jsx48("p", { className: "text-h5 tracking-[-0.28px] text-ods-text-secondary", children: "Related Links" }),
|
|
5063
|
-
/* @__PURE__ */ jsx48(Card, { className: "bg-ods-card border-ods-border p-6", children: /* @__PURE__ */ jsxs39("div", { className: "space-y-4", children: [
|
|
5064
|
-
githubReleases && githubReleases.length > 0 && /* @__PURE__ */ jsx48(Fragment8, { children: githubReleases.map((ghRelease) => /* @__PURE__ */ jsxs39("div", { className: "flex items-start gap-1", children: [
|
|
5065
|
-
/* @__PURE__ */ jsx48(GitHubIcon, { className: "shrink-0", width: 24, height: 24, color: "var(--color-text-secondary)" }),
|
|
5066
|
-
/* @__PURE__ */ jsx48("span", { className: "text-h4 text-ods-text-primary", children: "Github Release" }),
|
|
5067
|
-
/* @__PURE__ */ jsx48(
|
|
5068
|
-
"a",
|
|
5069
|
-
{
|
|
5070
|
-
href: ghRelease.github_release_url,
|
|
5071
|
-
target: "_blank",
|
|
5072
|
-
rel: "noopener noreferrer",
|
|
5073
|
-
className: "text-h4 text-[#ffc008] hover:underline",
|
|
5074
|
-
children: ghRelease.github_release_url.split("/").pop()
|
|
5075
|
-
}
|
|
5076
|
-
),
|
|
5077
|
-
/* @__PURE__ */ jsx48(ExternalLink, { className: "h-6 w-6 text-[#ffc008] shrink-0" })
|
|
5078
|
-
] }, ghRelease.id)) }),
|
|
5079
|
-
knowledgeBaseLinks && knowledgeBaseLinks.length > 0 && /* @__PURE__ */ jsx48(Fragment8, { children: knowledgeBaseLinks.map((linkObj) => {
|
|
5080
|
-
const path = typeof linkObj === "string" ? linkObj : linkObj.kb_article_path;
|
|
5081
|
-
const linkId = typeof linkObj === "string" ? path : linkObj.id || path;
|
|
5082
|
-
return /* @__PURE__ */ jsxs39("div", { className: "flex items-start gap-1", children: [
|
|
5083
|
-
/* @__PURE__ */ jsx48(BookMarked, { className: "h-6 w-6 text-ods-text-secondary shrink-0" }),
|
|
5084
|
-
/* @__PURE__ */ jsx48("span", { className: "text-h4 text-ods-text-primary", children: "Knowledge Base" }),
|
|
5085
|
-
/* @__PURE__ */ jsx48(
|
|
5086
|
-
next_link_default,
|
|
5087
|
-
{
|
|
5088
|
-
href: path.startsWith("http") ? path : `/knowledge-base${path.startsWith("/") ? "" : "/"}${path}`,
|
|
5089
|
-
className: "text-h4 text-[#ffc008] hover:underline",
|
|
5090
|
-
children: path.replace(/^\//, "").split("/").pop()?.replace(/-/g, " ") || "View Article"
|
|
5091
|
-
}
|
|
5092
|
-
),
|
|
5093
|
-
/* @__PURE__ */ jsx48(ExternalLink, { className: "h-6 w-6 text-[#ffc008] shrink-0" })
|
|
5094
|
-
] }, linkId);
|
|
5095
|
-
}) }),
|
|
5096
|
-
migrationGuideUrl && /* @__PURE__ */ jsxs39("div", { className: "flex items-start gap-1", children: [
|
|
5097
|
-
/* @__PURE__ */ jsx48(BookMarked, { className: "h-6 w-6 text-ods-text-secondary shrink-0" }),
|
|
5098
|
-
/* @__PURE__ */ jsx48(
|
|
5099
|
-
"a",
|
|
5100
|
-
{
|
|
5101
|
-
href: migrationGuideUrl,
|
|
5102
|
-
target: "_blank",
|
|
5103
|
-
rel: "noopener noreferrer",
|
|
5104
|
-
className: "text-h4 text-[#ffc008] hover:underline",
|
|
5105
|
-
children: "\u{1F4D6} Migration Guide"
|
|
5106
|
-
}
|
|
5107
|
-
),
|
|
5108
|
-
/* @__PURE__ */ jsx48(ExternalLink, { className: "h-6 w-6 text-[#ffc008] shrink-0" })
|
|
5109
|
-
] }),
|
|
5110
|
-
documentationUrl && /* @__PURE__ */ jsxs39("div", { className: "flex items-start gap-1", children: [
|
|
5111
|
-
/* @__PURE__ */ jsx48(BookMarked, { className: "h-6 w-6 text-ods-text-secondary shrink-0" }),
|
|
5112
|
-
/* @__PURE__ */ jsx48(
|
|
5113
|
-
"a",
|
|
5114
|
-
{
|
|
5115
|
-
href: documentationUrl,
|
|
5116
|
-
target: "_blank",
|
|
5117
|
-
rel: "noopener noreferrer",
|
|
5118
|
-
className: "text-h4 text-[#ffc008] hover:underline",
|
|
5119
|
-
children: "\u{1F4DA} Documentation"
|
|
5120
|
-
}
|
|
5121
|
-
),
|
|
5122
|
-
/* @__PURE__ */ jsx48(ExternalLink, { className: "h-6 w-6 text-[#ffc008] shrink-0" })
|
|
5123
|
-
] })
|
|
5124
|
-
] }) })
|
|
5125
|
-
] })
|
|
5126
|
-
] })
|
|
5127
|
-
}
|
|
5128
|
-
) });
|
|
5129
|
-
}
|
|
5130
|
-
|
|
5131
|
-
// src/components/shared/product-release/release-detail-skeleton.tsx
|
|
5132
|
-
import { jsx as jsx49 } from "react/jsx-runtime";
|
|
5133
|
-
function ReleaseDetailSkeleton() {
|
|
5134
|
-
return /* @__PURE__ */ jsx49(DetailPageSkeleton, { metadataColumns: 4, showImageGallery: true });
|
|
5135
|
-
}
|
|
5136
|
-
|
|
5137
|
-
// src/components/shared/roadmap/roadmap-grid.tsx
|
|
5138
|
-
import { useEffect as useEffect7, useRef as useRef4, useState as useState9 } from "react";
|
|
5139
|
-
|
|
5140
|
-
// src/components/shared/roadmap/use-roadmap-voting.ts
|
|
5141
|
-
import { useState as useState8, useEffect as useEffect6, useCallback as useCallback3 } from "react";
|
|
5142
|
-
var DEFAULT_VOTE_ENDPOINT = "/api/roadmap/vote";
|
|
5143
|
-
var DEFAULT_STORAGE_KEY = "roadmap_votes_v1";
|
|
5144
|
-
function useRoadmapVoting(options = {}) {
|
|
5145
|
-
const voteApiEndpoint = options.voteApiEndpoint ?? DEFAULT_VOTE_ENDPOINT;
|
|
5146
|
-
const storageKey = options.storageKey ?? DEFAULT_STORAGE_KEY;
|
|
5147
|
-
const [votes, setVotes] = useState8({});
|
|
5148
|
-
const [isLoading, setIsLoading] = useState8(true);
|
|
5149
|
-
useEffect6(() => {
|
|
5150
|
-
setIsLoading(true);
|
|
5151
|
-
setVotes({});
|
|
5152
|
-
try {
|
|
5153
|
-
const stored = localStorage.getItem(storageKey);
|
|
5154
|
-
if (stored) {
|
|
5155
|
-
setVotes(JSON.parse(stored));
|
|
5156
|
-
}
|
|
5157
|
-
} catch (error) {
|
|
5158
|
-
console.error("[Voting] Error loading votes from localStorage:", error);
|
|
5159
|
-
} finally {
|
|
5160
|
-
setIsLoading(false);
|
|
5161
|
-
}
|
|
5162
|
-
}, [storageKey]);
|
|
5163
|
-
useEffect6(() => {
|
|
5164
|
-
if (!isLoading) {
|
|
5165
|
-
try {
|
|
5166
|
-
localStorage.setItem(storageKey, JSON.stringify(votes));
|
|
5167
|
-
} catch (error) {
|
|
5168
|
-
console.error("[Voting] Error saving votes to localStorage:", error);
|
|
5169
|
-
}
|
|
5170
|
-
}
|
|
5171
|
-
}, [votes, isLoading, storageKey]);
|
|
5172
|
-
const getVote = useCallback3(
|
|
5173
|
-
(taskId) => {
|
|
5174
|
-
return votes[taskId] || null;
|
|
5175
|
-
},
|
|
5176
|
-
[votes]
|
|
5177
|
-
);
|
|
5178
|
-
const toggleVote = useCallback3(
|
|
5179
|
-
async (taskId, voteType) => {
|
|
5180
|
-
const currentVote = votes[taskId];
|
|
5181
|
-
let newVote = null;
|
|
5182
|
-
let action = "add";
|
|
5183
|
-
if (currentVote === voteType) {
|
|
5184
|
-
newVote = null;
|
|
5185
|
-
action = "remove";
|
|
5186
|
-
} else {
|
|
5187
|
-
if (currentVote) {
|
|
5188
|
-
await contentFetch(voteApiEndpoint, {
|
|
5189
|
-
method: "POST",
|
|
5190
|
-
headers: { "Content-Type": "application/json" },
|
|
5191
|
-
body: JSON.stringify({
|
|
5192
|
-
taskId,
|
|
5193
|
-
voteType: currentVote,
|
|
5194
|
-
action: "remove"
|
|
5195
|
-
})
|
|
5196
|
-
}).catch((err) => console.error("[Voting] Error removing opposite vote:", err));
|
|
5197
|
-
}
|
|
5198
|
-
newVote = voteType;
|
|
5199
|
-
action = "add";
|
|
5200
|
-
}
|
|
5201
|
-
setVotes((prev) => ({
|
|
5202
|
-
...prev,
|
|
5203
|
-
[taskId]: newVote
|
|
5204
|
-
}));
|
|
5205
|
-
try {
|
|
5206
|
-
const response = await contentFetch(voteApiEndpoint, {
|
|
5207
|
-
method: "POST",
|
|
5208
|
-
headers: { "Content-Type": "application/json" },
|
|
5209
|
-
body: JSON.stringify({ taskId, voteType, action })
|
|
5210
|
-
});
|
|
5211
|
-
if (!response.ok) {
|
|
5212
|
-
throw new Error("Vote API request failed");
|
|
5213
|
-
}
|
|
5214
|
-
return { success: true, newVote, action };
|
|
5215
|
-
} catch (error) {
|
|
5216
|
-
console.error("[Voting] API error:", error);
|
|
5217
|
-
setVotes((prev) => ({
|
|
5218
|
-
...prev,
|
|
5219
|
-
[taskId]: currentVote
|
|
5220
|
-
}));
|
|
5221
|
-
return { success: false, newVote: currentVote, action };
|
|
5222
|
-
}
|
|
5223
|
-
},
|
|
5224
|
-
[votes, voteApiEndpoint]
|
|
5225
|
-
);
|
|
5226
|
-
const clearVotes = useCallback3(() => {
|
|
5227
|
-
setVotes({});
|
|
5228
|
-
localStorage.removeItem(storageKey);
|
|
5229
|
-
}, [storageKey]);
|
|
5230
|
-
return {
|
|
5231
|
-
votes,
|
|
5232
|
-
isLoading,
|
|
5233
|
-
getVote,
|
|
5234
|
-
toggleVote,
|
|
5235
|
-
clearVotes
|
|
5236
|
-
};
|
|
5237
|
-
}
|
|
5238
|
-
|
|
5239
|
-
// src/components/shared/roadmap/roadmap-grid.tsx
|
|
5240
|
-
init_cn();
|
|
5241
|
-
import { jsx as jsx50, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
5242
|
-
var DEFAULT_BUILD_REFRESH_URL = (taskId) => `/api/roadmap/${taskId}`;
|
|
5243
|
-
var BACKLOG = "Backlog";
|
|
5244
|
-
function getStatusPriority(status) {
|
|
5245
|
-
const s = (status || "").toLowerCase();
|
|
5246
|
-
if (s.includes("complete") || s.includes("done")) return 1;
|
|
5247
|
-
if (s.includes("working") || s.includes("progress")) return 2;
|
|
5248
|
-
if (s.includes("review")) return 3;
|
|
5249
|
-
if (s.includes("to do") || s.includes("plan")) return 4;
|
|
5250
|
-
return 5;
|
|
5251
|
-
}
|
|
5252
|
-
function parseQuarterString(q) {
|
|
5253
|
-
const match = q.match(/Q(\d+)\s+(\d+)/);
|
|
5254
|
-
if (!match) return null;
|
|
5255
|
-
return { quarter: parseInt(match[1], 10), year: parseInt(match[2], 10) };
|
|
5256
|
-
}
|
|
5257
|
-
function compareQuarters(a, b) {
|
|
5258
|
-
if (a.year !== b.year) return a.year - b.year;
|
|
5259
|
-
return a.quarter - b.quarter;
|
|
5260
|
-
}
|
|
5261
|
-
function getCurrentQuarter() {
|
|
5262
|
-
const now = /* @__PURE__ */ new Date();
|
|
5263
|
-
return { quarter: Math.floor(now.getMonth() / 3) + 1, year: now.getFullYear() };
|
|
5264
|
-
}
|
|
5265
|
-
function computeDefaultExpandedQuarters(quarters, quartersToKeepClosed) {
|
|
5266
|
-
const currentQ = getCurrentQuarter();
|
|
5267
|
-
const out = [];
|
|
5268
|
-
for (const q of quarters) {
|
|
5269
|
-
if (q === BACKLOG) continue;
|
|
5270
|
-
const parsed = parseQuarterString(q);
|
|
5271
|
-
if (!parsed) continue;
|
|
5272
|
-
const diff = compareQuarters(parsed, currentQ);
|
|
5273
|
-
if (diff >= 0) {
|
|
5274
|
-
out.push(q);
|
|
5275
|
-
} else {
|
|
5276
|
-
const quartersAgo = currentQ.year * 4 + currentQ.quarter - (parsed.year * 4 + parsed.quarter);
|
|
5277
|
-
if (quartersAgo < quartersToKeepClosed) out.push(q);
|
|
5278
|
-
}
|
|
5279
|
-
}
|
|
5280
|
-
if (quarters.includes(BACKLOG)) out.push(BACKLOG);
|
|
5281
|
-
return out;
|
|
5282
|
-
}
|
|
5283
|
-
function RoadmapGridSingle({
|
|
5284
|
-
items,
|
|
5285
|
-
showLeftMargin,
|
|
5286
|
-
getVote,
|
|
5287
|
-
onVote,
|
|
5288
|
-
votingTasks
|
|
5289
|
-
}) {
|
|
5290
|
-
return /* @__PURE__ */ jsx50("div", { className: `grid grid-cols-1 md:grid-cols-2 gap-6 ${showLeftMargin ? "md:ml-[120px]" : ""}`, children: items.map((item) => (
|
|
5291
|
-
// DOM id + sticky-header scroll offset live ON RoadmapCard's own
|
|
5292
|
-
// outer element (no wrapper div). Anchor mirrors
|
|
5293
|
-
// `buildDevSectionUrl('roadmap', <id>)` → `#roadmap-<external_id>`;
|
|
5294
|
-
// `useScrollToHash` in `roadmap-view.tsx` finds the card by id
|
|
5295
|
-
// and scrolls.
|
|
5296
|
-
/* @__PURE__ */ jsx50(
|
|
5297
|
-
RoadmapCard,
|
|
5298
|
-
{
|
|
5299
|
-
item,
|
|
5300
|
-
id: devSectionAnchorId("roadmap", item.id),
|
|
5301
|
-
userVote: getVote(item.id),
|
|
5302
|
-
onVote: (voteType) => onVote(item.id, voteType),
|
|
5303
|
-
isVoting: votingTasks.has(item.id)
|
|
5304
|
-
},
|
|
5305
|
-
item.id
|
|
5306
|
-
)
|
|
5307
|
-
)) });
|
|
5308
|
-
}
|
|
5309
|
-
function RoadmapGrid({
|
|
5310
|
-
items,
|
|
5311
|
-
onItemUpdate,
|
|
5312
|
-
showLeftMargin = true,
|
|
5313
|
-
buildRefreshUrl = DEFAULT_BUILD_REFRESH_URL,
|
|
5314
|
-
votingOptions,
|
|
5315
|
-
groupByQuarter = false,
|
|
5316
|
-
hasActiveFilters = false,
|
|
5317
|
-
quartersToKeepClosed = 2
|
|
5318
|
-
}) {
|
|
5319
|
-
const { getVote, toggleVote } = useRoadmapVoting(votingOptions);
|
|
5320
|
-
const [votingTasks, setVotingTasks] = useState9(/* @__PURE__ */ new Set());
|
|
5321
|
-
const handleVote = async (taskId, voteType) => {
|
|
5322
|
-
if (votingTasks.has(taskId)) return;
|
|
5323
|
-
setVotingTasks((prev) => new Set(prev).add(taskId));
|
|
5324
|
-
try {
|
|
5325
|
-
const result = await toggleVote(taskId, voteType);
|
|
5326
|
-
if (result.success) {
|
|
5327
|
-
const response = await contentFetch(buildRefreshUrl(taskId));
|
|
5328
|
-
if (response.ok) {
|
|
5329
|
-
const data = await response.json();
|
|
5330
|
-
if (data.item && onItemUpdate) onItemUpdate(data.item);
|
|
5331
|
-
}
|
|
5332
|
-
}
|
|
5333
|
-
} finally {
|
|
5334
|
-
setVotingTasks((prev) => {
|
|
5335
|
-
const next = new Set(prev);
|
|
5336
|
-
next.delete(taskId);
|
|
5337
|
-
return next;
|
|
5338
|
-
});
|
|
5339
|
-
}
|
|
5340
|
-
};
|
|
5341
|
-
const itemsByQuarter = items.reduce((acc, item) => {
|
|
5342
|
-
const q = item.quarter || BACKLOG;
|
|
5343
|
-
(acc[q] || (acc[q] = [])).push(item);
|
|
5344
|
-
return acc;
|
|
5345
|
-
}, {});
|
|
5346
|
-
for (const q of Object.keys(itemsByQuarter)) {
|
|
5347
|
-
itemsByQuarter[q].sort((a, b) => getStatusPriority(a.status) - getStatusPriority(b.status));
|
|
5348
|
-
}
|
|
5349
|
-
const sortedQuarters = Object.keys(itemsByQuarter).sort((a, b) => {
|
|
5350
|
-
if (a === BACKLOG) return 1;
|
|
5351
|
-
if (b === BACKLOG) return -1;
|
|
5352
|
-
const aD = parseQuarterString(a) ?? { quarter: 0, year: 0 };
|
|
5353
|
-
const bD = parseQuarterString(b) ?? { quarter: 0, year: 0 };
|
|
5354
|
-
return compareQuarters(aD, bD);
|
|
5355
|
-
});
|
|
5356
|
-
const sortedQuartersKey = sortedQuarters.join(",");
|
|
5357
|
-
const [expandedQuarters, setExpandedQuarters] = useState9([]);
|
|
5358
|
-
const [isInitialized, setIsInitialized] = useState9(false);
|
|
5359
|
-
const hasSetInitialState = useRef4(false);
|
|
5360
|
-
const prevItemsLength = useRef4(0);
|
|
5361
|
-
useEffect7(() => {
|
|
5362
|
-
const itemsJustLoaded = prevItemsLength.current === 0 && items.length > 0;
|
|
5363
|
-
prevItemsLength.current = items.length;
|
|
5364
|
-
if (sortedQuarters.length > 0 && (!hasSetInitialState.current || itemsJustLoaded)) {
|
|
5365
|
-
hasSetInitialState.current = true;
|
|
5366
|
-
setExpandedQuarters(
|
|
5367
|
-
hasActiveFilters ? [...sortedQuarters] : computeDefaultExpandedQuarters(sortedQuarters, quartersToKeepClosed)
|
|
5368
|
-
);
|
|
5369
|
-
setIsInitialized(true);
|
|
5370
|
-
}
|
|
5371
|
-
}, [sortedQuarters.length, items.length]);
|
|
5372
|
-
useEffect7(() => {
|
|
5373
|
-
if (!isInitialized || sortedQuarters.length === 0) return;
|
|
5374
|
-
setExpandedQuarters(
|
|
5375
|
-
hasActiveFilters ? [...sortedQuarters] : computeDefaultExpandedQuarters(sortedQuarters, quartersToKeepClosed)
|
|
5376
|
-
);
|
|
5377
|
-
}, [hasActiveFilters, sortedQuartersKey, isInitialized, quartersToKeepClosed]);
|
|
5378
|
-
if (items.length === 0) {
|
|
5379
|
-
return /* @__PURE__ */ jsx50(
|
|
5380
|
-
EmptyState,
|
|
5381
|
-
{
|
|
5382
|
-
type: "generic",
|
|
5383
|
-
title: "No roadmap items",
|
|
5384
|
-
description: "Check back soon for upcoming features and improvements!"
|
|
5385
|
-
}
|
|
5386
|
-
);
|
|
5387
|
-
}
|
|
5388
|
-
if (!groupByQuarter) {
|
|
5389
|
-
return /* @__PURE__ */ jsx50(
|
|
5390
|
-
RoadmapGridSingle,
|
|
5391
|
-
{
|
|
5392
|
-
items,
|
|
5393
|
-
showLeftMargin,
|
|
5394
|
-
getVote,
|
|
5395
|
-
onVote: handleVote,
|
|
5396
|
-
votingTasks
|
|
5397
|
-
}
|
|
5398
|
-
);
|
|
5399
|
-
}
|
|
5400
|
-
return /* @__PURE__ */ jsx50(
|
|
5401
|
-
Accordion,
|
|
5402
|
-
{
|
|
5403
|
-
type: "multiple",
|
|
5404
|
-
value: expandedQuarters,
|
|
5405
|
-
onValueChange: setExpandedQuarters,
|
|
5406
|
-
className: "flex flex-col gap-10",
|
|
5407
|
-
children: sortedQuarters.map((quarter) => {
|
|
5408
|
-
const itemCount = itemsByQuarter[quarter]?.length || 0;
|
|
5409
|
-
const isExpanded = expandedQuarters.includes(quarter);
|
|
5410
|
-
return /* @__PURE__ */ jsxs40(
|
|
5411
|
-
AccordionItem,
|
|
5412
|
-
{
|
|
5413
|
-
value: quarter,
|
|
5414
|
-
id: `quarter-${quarter.replace(/\s+/g, "-").toLowerCase()}`,
|
|
5415
|
-
className: "border-0",
|
|
5416
|
-
children: [
|
|
5417
|
-
/* @__PURE__ */ jsx50(AccordionTrigger, { className: "w-full p-0 hover:no-underline [&>svg]:h-5 [&>svg]:w-5 [&>svg]:text-ods-text-secondary [&>svg]:ml-auto [&>svg]:shrink-0", children: /* @__PURE__ */ jsxs40("div", { className: "flex items-center gap-3", children: [
|
|
5418
|
-
/* @__PURE__ */ jsxs40(
|
|
5419
|
-
"h3",
|
|
5420
|
-
{
|
|
5421
|
-
className: cn(
|
|
5422
|
-
"font-['Azeret_Mono'] font-semibold text-[24px] md:text-[28px] lg:text-[32px] leading-[32px] md:leading-[36px] lg:leading-[40px] text-ods-text-primary tracking-[-0.48px] md:tracking-[-0.56px] lg:tracking-[-0.64px] transition-opacity",
|
|
5423
|
-
isExpanded ? "opacity-100" : "opacity-60"
|
|
5424
|
-
),
|
|
5425
|
-
children: [
|
|
5426
|
-
quarter,
|
|
5427
|
-
/* @__PURE__ */ jsx50("span", { className: "text-ods-accent", children: ":" })
|
|
5428
|
-
]
|
|
5429
|
-
}
|
|
5430
|
-
),
|
|
5431
|
-
/* @__PURE__ */ jsxs40(
|
|
5432
|
-
"span",
|
|
5433
|
-
{
|
|
5434
|
-
className: cn(
|
|
5435
|
-
"text-sm font-medium transition-opacity",
|
|
5436
|
-
isExpanded ? "text-ods-text-secondary opacity-100" : "text-ods-text-tertiary opacity-60"
|
|
5437
|
-
),
|
|
5438
|
-
children: [
|
|
5439
|
-
itemCount,
|
|
5440
|
-
" ",
|
|
5441
|
-
itemCount === 1 ? "item" : "items",
|
|
5442
|
-
isInitialized && !isExpanded && /* @__PURE__ */ jsx50("span", { className: "ml-2 text-ods-accent", children: "Click to expand" })
|
|
5443
|
-
]
|
|
5444
|
-
}
|
|
5445
|
-
)
|
|
5446
|
-
] }) }),
|
|
5447
|
-
/* @__PURE__ */ jsx50(AccordionContent, { className: "pt-4 pb-0 overflow-hidden data-[state=closed]:animate-none data-[state=open]:animate-none", children: /* @__PURE__ */ jsx50(
|
|
5448
|
-
RoadmapGridSingle,
|
|
5449
|
-
{
|
|
5450
|
-
items: itemsByQuarter[quarter],
|
|
5451
|
-
showLeftMargin,
|
|
5452
|
-
getVote,
|
|
5453
|
-
onVote: handleVote,
|
|
5454
|
-
votingTasks
|
|
5455
|
-
}
|
|
5456
|
-
) })
|
|
5457
|
-
]
|
|
5458
|
-
},
|
|
5459
|
-
quarter
|
|
5460
|
-
);
|
|
5461
|
-
})
|
|
5462
|
-
}
|
|
5463
|
-
);
|
|
5464
|
-
}
|
|
5465
|
-
|
|
5466
|
-
// src/components/shared/roadmap/roadmap-grid-skeleton.tsx
|
|
5467
|
-
import { jsx as jsx51, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
5468
|
-
function RoadmapCardSkeleton2() {
|
|
5469
|
-
return /* @__PURE__ */ jsxs41("div", { className: "bg-ods-card border border-ods-border rounded-[6px] p-[24px] flex flex-col gap-[16px] min-h-[340px] relative", children: [
|
|
5470
|
-
/* @__PURE__ */ jsx51("div", { className: "absolute top-[24px] right-[24px]", children: /* @__PURE__ */ jsx51("div", { className: "h-[20px] w-[80px] bg-ods-border rounded animate-pulse" }) }),
|
|
5471
|
-
/* @__PURE__ */ jsxs41("div", { className: "flex items-center gap-[16px] pr-[120px]", children: [
|
|
5472
|
-
/* @__PURE__ */ jsx51("div", { className: "w-[80px] h-[80px] bg-ods-border rounded-lg flex-shrink-0 animate-pulse" }),
|
|
5473
|
-
/* @__PURE__ */ jsxs41("div", { className: "flex-1 min-w-0 flex flex-col gap-1", children: [
|
|
5474
|
-
/* @__PURE__ */ jsx51("div", { className: "min-h-[48px] flex items-center", children: /* @__PURE__ */ jsx51("div", { className: "h-[24px] w-full bg-ods-border rounded animate-pulse" }) }),
|
|
5475
|
-
/* @__PURE__ */ jsx51("div", { className: "min-h-[20px] flex items-center", children: /* @__PURE__ */ jsx51("div", { className: "h-[14px] w-1/2 bg-ods-border rounded animate-pulse" }) })
|
|
5476
|
-
] })
|
|
5477
|
-
] }),
|
|
5478
|
-
/* @__PURE__ */ jsx51("div", { className: "min-h-[72px] flex items-center", children: /* @__PURE__ */ jsxs41("div", { className: "w-full space-y-2", children: [
|
|
5479
|
-
/* @__PURE__ */ jsx51("div", { className: "h-[24px] bg-ods-border rounded animate-pulse" }),
|
|
5480
|
-
/* @__PURE__ */ jsx51("div", { className: "h-[24px] bg-ods-border rounded animate-pulse" }),
|
|
5481
|
-
/* @__PURE__ */ jsx51("div", { className: "h-[24px] w-4/5 bg-ods-border rounded animate-pulse" })
|
|
5482
|
-
] }) }),
|
|
5483
|
-
/* @__PURE__ */ jsx51("div", { className: "flex-1" }),
|
|
5484
|
-
/* @__PURE__ */ jsxs41("div", { className: "flex items-center justify-between", children: [
|
|
5485
|
-
/* @__PURE__ */ jsx51("div", { className: "h-[48px] w-[120px] bg-ods-border rounded animate-pulse" }),
|
|
5486
|
-
/* @__PURE__ */ jsx51("div", { className: "h-[32px] w-[100px] bg-ods-border rounded animate-pulse" })
|
|
5487
|
-
] })
|
|
5488
|
-
] });
|
|
5489
|
-
}
|
|
5490
|
-
function RoadmapGridSkeleton({ count = 4, showLeftMargin = true }) {
|
|
5491
|
-
return /* @__PURE__ */ jsx51("div", { className: `grid grid-cols-1 md:grid-cols-2 gap-6 ${showLeftMargin ? "md:ml-[120px]" : ""}`, children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsx51(RoadmapCardSkeleton2, {}, i)) });
|
|
5492
|
-
}
|
|
5493
|
-
|
|
5494
|
-
// src/components/shared/roadmap/roadmap-view.tsx
|
|
5495
|
-
import { useMemo as useMemo2 } from "react";
|
|
5496
|
-
import { jsx as jsx52 } from "react/jsx-runtime";
|
|
5497
|
-
var DEFAULT_ENDPOINT2 = "/api/roadmap";
|
|
5498
|
-
var DEFAULT_SEARCH_PARAM_KEY2 = DEV_SECTION_PARAM_KEYS.search;
|
|
5499
|
-
var DEFAULT_STATUS_PARAM_KEY2 = DEV_SECTION_PARAM_KEYS.status;
|
|
5500
|
-
function RoadmapView({
|
|
5501
|
-
endpoint = DEFAULT_ENDPOINT2,
|
|
5502
|
-
initialItems,
|
|
5503
|
-
showLeftMargin,
|
|
5504
|
-
buildRefreshUrl,
|
|
5505
|
-
votingOptions,
|
|
5506
|
-
searchParamKey = DEFAULT_SEARCH_PARAM_KEY2,
|
|
5507
|
-
statusParamKey = DEFAULT_STATUS_PARAM_KEY2
|
|
5508
|
-
} = {}) {
|
|
5509
|
-
const searchParams = useSearchParams();
|
|
5510
|
-
const search = searchParams.get(searchParamKey) || "";
|
|
5511
|
-
const status = searchParams.get(statusParamKey) || "all";
|
|
5512
|
-
const listParams = new URLSearchParams();
|
|
5513
|
-
if (search) listParams.set(searchParamKey, search);
|
|
5514
|
-
if (status && status !== "all") listParams.set(statusParamKey, status);
|
|
5515
|
-
const qs = listParams.toString();
|
|
5516
|
-
const url = qs ? `${endpoint}?${qs}` : endpoint;
|
|
5517
|
-
const initialData = useMemo2(() => initialItems ? { items: initialItems } : void 0, [initialItems]);
|
|
5518
|
-
const { data, setData, isLoading, error, reload } = useSelfFetch(
|
|
5519
|
-
url,
|
|
5520
|
-
{ initialData }
|
|
5521
|
-
);
|
|
5522
|
-
const items = data?.items ?? [];
|
|
5523
|
-
useScrollToHash(data, { headerOffset: STICKY_HEADER_OFFSET_PX });
|
|
5524
|
-
if (error) {
|
|
5525
|
-
return /* @__PURE__ */ jsx52(LoadError, { message: "Failed to load roadmap.", onRetry: reload });
|
|
5526
|
-
}
|
|
5527
|
-
if (isLoading && !data) {
|
|
5528
|
-
return /* @__PURE__ */ jsx52(RoadmapGridSkeleton, { showLeftMargin });
|
|
5529
|
-
}
|
|
5530
|
-
return /* @__PURE__ */ jsx52(
|
|
5531
|
-
RoadmapGrid,
|
|
5532
|
-
{
|
|
5533
|
-
items,
|
|
5534
|
-
showLeftMargin,
|
|
5535
|
-
buildRefreshUrl,
|
|
5536
|
-
votingOptions,
|
|
5537
|
-
groupByQuarter: true,
|
|
5538
|
-
hasActiveFilters: search !== "" || status !== "all",
|
|
5539
|
-
onItemUpdate: (updated) => setData(
|
|
5540
|
-
(prev) => prev ? { ...prev, items: (prev.items ?? []).map((it) => it.id === updated.id ? updated : it) } : prev
|
|
5541
|
-
)
|
|
5542
|
-
}
|
|
5543
|
-
);
|
|
5544
|
-
}
|
|
5545
|
-
|
|
5546
|
-
// src/components/shared/delivery/delivery-lists.tsx
|
|
5547
|
-
import { useEffect as useEffect8, useState as useState10 } from "react";
|
|
5548
|
-
|
|
5549
|
-
// src/components/shared/delivery/delivery-table.tsx
|
|
5550
|
-
import { jsx as jsx53, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
5551
|
-
function SkeletonRow() {
|
|
5552
|
-
return /* @__PURE__ */ jsx53("div", { className: "border-b border-ods-border last:border-b-0 p-[12px] md:p-[16px]", children: /* @__PURE__ */ jsxs42("div", { className: "flex flex-col md:flex-row items-start justify-between gap-[12px] md:gap-[16px] w-full", children: [
|
|
5553
|
-
/* @__PURE__ */ jsxs42("div", { className: "flex-1 min-w-0 w-full md:w-auto flex flex-col gap-[12px] md:gap-[16px]", children: [
|
|
5554
|
-
/* @__PURE__ */ jsx53("div", { className: "min-h-[24px] flex items-center", children: /* @__PURE__ */ jsx53("div", { className: "h-[20px] bg-ods-border rounded animate-pulse w-full" }) }),
|
|
5555
|
-
/* @__PURE__ */ jsx53("div", { className: "min-h-[20px] flex items-center", children: /* @__PURE__ */ jsx53("div", { className: "h-[20px] bg-ods-border rounded animate-pulse w-1/2" }) }),
|
|
5556
|
-
/* @__PURE__ */ jsx53("div", { className: "min-h-[72px] flex items-center", children: /* @__PURE__ */ jsxs42("div", { className: "flex-1 space-y-1", children: [
|
|
5557
|
-
/* @__PURE__ */ jsx53("div", { className: "h-[20px] bg-ods-border rounded animate-pulse w-full" }),
|
|
5558
|
-
/* @__PURE__ */ jsx53("div", { className: "h-[20px] bg-ods-border rounded animate-pulse w-full" }),
|
|
5559
|
-
/* @__PURE__ */ jsx53("div", { className: "h-[20px] bg-ods-border rounded animate-pulse w-2/3" })
|
|
5560
|
-
] }) })
|
|
5561
|
-
] }),
|
|
5562
|
-
/* @__PURE__ */ jsxs42("div", { className: "flex-shrink-0 self-start flex flex-col gap-2", children: [
|
|
5563
|
-
/* @__PURE__ */ jsx53("div", { className: "h-[32px] w-[100px] bg-ods-border rounded animate-pulse" }),
|
|
5564
|
-
/* @__PURE__ */ jsx53("div", { className: "h-[32px] w-[120px] bg-ods-border rounded animate-pulse" })
|
|
5565
|
-
] })
|
|
5566
|
-
] }) });
|
|
5567
|
-
}
|
|
5568
|
-
function DeliveryTable({ items, isLoading = false }) {
|
|
5569
|
-
if (isLoading) {
|
|
5570
|
-
return /* @__PURE__ */ jsx53("div", { className: "bg-ods-card border border-ods-border rounded-[6px] overflow-hidden w-full", children: /* @__PURE__ */ jsx53("div", { className: "w-full", children: [1, 2, 3, 4, 5].map((i) => /* @__PURE__ */ jsx53(SkeletonRow, {}, i)) }) });
|
|
5571
|
-
}
|
|
5572
|
-
if (items.length === 0) {
|
|
5573
|
-
return /* @__PURE__ */ jsx53("div", { className: "bg-ods-card border border-ods-border rounded-[6px] p-[40px] text-center w-full", children: /* @__PURE__ */ jsx53("p", { className: "text-ods-text-secondary text-[14px] font-['DM_Sans'] font-medium", children: "No tasks available" }) });
|
|
5574
|
-
}
|
|
5575
|
-
return /* @__PURE__ */ jsx53("div", { className: "bg-ods-card border border-ods-border rounded-[6px] overflow-hidden w-full", children: /* @__PURE__ */ jsx53("div", { className: "w-full", children: items.map((item) => (
|
|
5576
|
-
// DOM id lives on DeliveryRow's own outer element (no wrapper
|
|
5577
|
-
// div). Anchor mirrors `buildDevSectionUrl('delivery', <id>)`
|
|
5578
|
-
// → `#delivery-<external_id>`; `useScrollToHash` in
|
|
5579
|
-
// `delivery-lists.tsx` finds the row by id and scrolls. The
|
|
5580
|
-
// outer wrapper here ONLY exists for the row separators.
|
|
5581
|
-
/* @__PURE__ */ jsx53(
|
|
5582
|
-
"div",
|
|
5583
|
-
{
|
|
5584
|
-
className: "border-b border-ods-border last:border-b-0",
|
|
5585
|
-
children: /* @__PURE__ */ jsx53(DeliveryRow, { item, id: devSectionAnchorId("delivery", item.id) })
|
|
5586
|
-
},
|
|
5587
|
-
item.id
|
|
5588
|
-
)
|
|
5589
|
-
)) }) });
|
|
5590
|
-
}
|
|
5591
|
-
|
|
5592
|
-
// src/components/shared/delivery/delivery-lists.tsx
|
|
5593
|
-
import { jsx as jsx54, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
5594
|
-
var DEFAULT_COMPLETED_ENDPOINT = "/api/delivery/completed";
|
|
5595
|
-
var DEFAULT_IN_PROGRESS_ENDPOINT = "/api/delivery/in-progress";
|
|
5596
|
-
var DEFAULT_SEARCH_PARAM_KEY3 = DEV_SECTION_PARAM_KEYS.search;
|
|
5597
|
-
var DEFAULT_TASK_TYPE_PARAM_KEY = DEV_SECTION_PARAM_KEYS.deliveryTaskType;
|
|
5598
|
-
function DeliveryLists({
|
|
5599
|
-
completedApiEndpoint = DEFAULT_COMPLETED_ENDPOINT,
|
|
5600
|
-
inProgressApiEndpoint = DEFAULT_IN_PROGRESS_ENDPOINT,
|
|
5601
|
-
searchParamKey = DEFAULT_SEARCH_PARAM_KEY3,
|
|
5602
|
-
taskTypeParamKey = DEFAULT_TASK_TYPE_PARAM_KEY
|
|
5603
|
-
} = {}) {
|
|
5604
|
-
const searchParams = useSearchParams();
|
|
5605
|
-
const router = useRouter();
|
|
5606
|
-
const pathname = usePathname();
|
|
5607
|
-
const [data, setData] = useState10(null);
|
|
5608
|
-
const [isLoading, setIsLoading] = useState10(true);
|
|
5609
|
-
const [error, setError] = useState10(null);
|
|
5610
|
-
const searchQuery = searchParams.get(searchParamKey) || "";
|
|
5611
|
-
const taskTypeFilter = searchParams.get(taskTypeParamKey) || "all";
|
|
5612
|
-
useEffect8(() => {
|
|
5613
|
-
async function fetchDeliveryData() {
|
|
5614
|
-
try {
|
|
5615
|
-
setIsLoading(true);
|
|
5616
|
-
setError(null);
|
|
5617
|
-
const params = new URLSearchParams();
|
|
5618
|
-
if (searchQuery) {
|
|
5619
|
-
params.set(searchParamKey, searchQuery);
|
|
5620
|
-
}
|
|
5621
|
-
if (taskTypeFilter && taskTypeFilter !== "all") {
|
|
5622
|
-
params.set(taskTypeParamKey, taskTypeFilter);
|
|
5623
|
-
}
|
|
5624
|
-
const queryString = params.toString();
|
|
5625
|
-
const queryParam = queryString ? `?${queryString}` : "";
|
|
5626
|
-
const [completedResponse, inProgressResponse] = await Promise.all([
|
|
5627
|
-
contentFetch(`${completedApiEndpoint}${queryParam}`),
|
|
5628
|
-
contentFetch(`${inProgressApiEndpoint}${queryParam}`)
|
|
5629
|
-
]);
|
|
5630
|
-
if (!completedResponse.ok || !inProgressResponse.ok) {
|
|
5631
|
-
throw new Error("Failed to fetch delivery items");
|
|
5632
|
-
}
|
|
5633
|
-
const [completedResult, inProgressResult] = await Promise.all([
|
|
5634
|
-
completedResponse.json(),
|
|
5635
|
-
inProgressResponse.json()
|
|
5636
|
-
]);
|
|
5637
|
-
setData({
|
|
5638
|
-
completed: completedResult.items || [],
|
|
5639
|
-
inProgress: inProgressResult.items || []
|
|
5640
|
-
});
|
|
5641
|
-
} catch (err) {
|
|
5642
|
-
console.error("Error fetching delivery items:", err);
|
|
5643
|
-
setError("Failed to load delivery items. Please try again later.");
|
|
5644
|
-
} finally {
|
|
5645
|
-
setIsLoading(false);
|
|
5646
|
-
}
|
|
5647
|
-
}
|
|
5648
|
-
fetchDeliveryData();
|
|
5649
|
-
}, [searchQuery, taskTypeFilter, completedApiEndpoint, inProgressApiEndpoint, searchParamKey, taskTypeParamKey]);
|
|
5650
|
-
const filteredCompleted = data?.completed || [];
|
|
5651
|
-
const filteredInProgress = data?.inProgress || [];
|
|
5652
|
-
useScrollToHash(data, { headerOffset: STICKY_HEADER_OFFSET_PX });
|
|
5653
|
-
const showCompleted = true;
|
|
5654
|
-
const showInProgress = true;
|
|
5655
|
-
const hasActiveFilters = searchQuery !== "" || taskTypeFilter !== "all";
|
|
5656
|
-
const hasResults = showCompleted && filteredCompleted.length > 0 || showInProgress && filteredInProgress.length > 0;
|
|
5657
|
-
if (error) {
|
|
5658
|
-
return /* @__PURE__ */ jsx54("div", { className: "w-full", children: /* @__PURE__ */ jsx54(LoadError, { message: error, onRetry: () => window.location.reload() }) });
|
|
5659
|
-
}
|
|
5660
|
-
return /* @__PURE__ */ jsxs43("div", { className: "w-full flex flex-col gap-[40px]", children: [
|
|
5661
|
-
!isLoading && !hasResults && (hasActiveFilters ? /* @__PURE__ */ jsx54(
|
|
5662
|
-
EmptyState,
|
|
5663
|
-
{
|
|
5664
|
-
type: "search",
|
|
5665
|
-
title: "No tasks found",
|
|
5666
|
-
description: "No tasks match your current filters. Try adjusting your search or status filter.",
|
|
5667
|
-
showCTA: true,
|
|
5668
|
-
ctaText: "Reset Filters",
|
|
5669
|
-
onCtaClick: () => {
|
|
5670
|
-
const params = new URLSearchParams(searchParams.toString());
|
|
5671
|
-
params.delete(searchParamKey);
|
|
5672
|
-
params.delete(taskTypeParamKey);
|
|
5673
|
-
router.replace(`${pathname}?${params.toString()}`, { scroll: false });
|
|
5674
|
-
}
|
|
5675
|
-
}
|
|
5676
|
-
) : /* @__PURE__ */ jsx54(
|
|
5677
|
-
EmptyState,
|
|
5678
|
-
{
|
|
5679
|
-
type: "generic",
|
|
5680
|
-
title: "No tasks available",
|
|
5681
|
-
description: "Check back soon for upcoming tasks!",
|
|
5682
|
-
showCTA: false
|
|
5683
|
-
}
|
|
5684
|
-
)),
|
|
5685
|
-
showCompleted && (hasResults || isLoading) && /* @__PURE__ */ jsxs43("div", { className: "w-full", children: [
|
|
5686
|
-
/* @__PURE__ */ jsxs43("h3", { className: "text-h2 text-ods-text-primary tracking-[-0.48px] md:tracking-[-0.56px] lg:tracking-[-0.64px] mb-4", children: [
|
|
5687
|
-
"Recently Completed",
|
|
5688
|
-
/* @__PURE__ */ jsx54("span", { className: "text-ods-accent", children: ":" })
|
|
5689
|
-
] }),
|
|
5690
|
-
/* @__PURE__ */ jsx54(
|
|
5691
|
-
DeliveryTable,
|
|
5692
|
-
{
|
|
5693
|
-
items: filteredCompleted,
|
|
5694
|
-
isLoading
|
|
5695
|
-
}
|
|
5696
|
-
)
|
|
5697
|
-
] }),
|
|
5698
|
-
showInProgress && (hasResults || isLoading) && /* @__PURE__ */ jsxs43("div", { className: "w-full", children: [
|
|
5699
|
-
/* @__PURE__ */ jsxs43("h3", { className: "text-h2 text-ods-text-primary tracking-[-0.48px] md:tracking-[-0.56px] lg:tracking-[-0.64px] mb-4", children: [
|
|
5700
|
-
"Active Tasks",
|
|
5701
|
-
/* @__PURE__ */ jsx54("span", { className: "text-ods-accent", children: ":" })
|
|
5702
|
-
] }),
|
|
5703
|
-
/* @__PURE__ */ jsx54(
|
|
5704
|
-
DeliveryTable,
|
|
5705
|
-
{
|
|
5706
|
-
items: filteredInProgress,
|
|
5707
|
-
isLoading
|
|
5708
|
-
}
|
|
5709
|
-
)
|
|
5710
|
-
] })
|
|
5711
|
-
] });
|
|
5712
|
-
}
|
|
5713
|
-
|
|
5714
|
-
// src/components/shared/legal-document/legal-document-page.tsx
|
|
5715
|
-
init_next_navigation();
|
|
5716
|
-
|
|
5717
|
-
// src/components/shared/legal-document/use-legal-docs.ts
|
|
5718
|
-
import { useState as useState11, useEffect as useEffect9, useCallback as useCallback4 } from "react";
|
|
5719
|
-
function useLegalDocs(docType, options = {}) {
|
|
5720
|
-
const { initialData = null, apiEndpoint } = options;
|
|
5721
|
-
const effectiveEndpoint = apiEndpoint ?? `/api/legal/${docType}`;
|
|
5722
|
-
const [data, setData] = useState11(initialData ?? null);
|
|
5723
|
-
const [isLoading, setIsLoading] = useState11(!initialData);
|
|
5724
|
-
const [error, setError] = useState11(null);
|
|
5725
|
-
const fetchDocument = useCallback4(async () => {
|
|
5726
|
-
try {
|
|
5727
|
-
setIsLoading(true);
|
|
5728
|
-
setError(null);
|
|
5729
|
-
const response = await contentFetch(effectiveEndpoint);
|
|
5730
|
-
if (!response.ok) {
|
|
5731
|
-
throw new Error(
|
|
5732
|
-
`Failed to fetch ${docType} document: ${response.status} ${response.statusText}`
|
|
5733
|
-
);
|
|
5734
|
-
}
|
|
5735
|
-
const result = await response.json();
|
|
5736
|
-
if (!result.content) {
|
|
5737
|
-
throw new Error(`${docType} document content is empty`);
|
|
5738
|
-
}
|
|
5739
|
-
setData(result);
|
|
5740
|
-
} catch (err) {
|
|
5741
|
-
const errorMessage = err instanceof Error ? err.message : "Unknown error occurred";
|
|
5742
|
-
console.error("Error fetching legal document:", docType, err);
|
|
5743
|
-
setError(errorMessage);
|
|
5744
|
-
} finally {
|
|
5745
|
-
setIsLoading(false);
|
|
5746
|
-
}
|
|
5747
|
-
}, [docType, effectiveEndpoint]);
|
|
5748
|
-
useEffect9(() => {
|
|
5749
|
-
setData(initialData ?? null);
|
|
5750
|
-
setError(null);
|
|
5751
|
-
setIsLoading(!initialData);
|
|
5752
|
-
}, [docType, initialData]);
|
|
5753
|
-
useEffect9(() => {
|
|
5754
|
-
if (initialData) return;
|
|
5755
|
-
fetchDocument();
|
|
5756
|
-
}, [fetchDocument, initialData]);
|
|
5757
|
-
const refetch = () => {
|
|
5758
|
-
fetchDocument();
|
|
5759
|
-
};
|
|
5760
|
-
return {
|
|
5761
|
-
data,
|
|
5762
|
-
isLoading,
|
|
5763
|
-
error,
|
|
5764
|
-
refetch
|
|
5765
|
-
};
|
|
5766
|
-
}
|
|
5767
|
-
|
|
5768
|
-
// src/components/shared/legal-document/legal-document-page.tsx
|
|
5769
|
-
import { jsx as jsx55, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
5770
|
-
function LegalDocumentPage({
|
|
5771
|
-
docType,
|
|
5772
|
-
title,
|
|
5773
|
-
fallbackDescription,
|
|
5774
|
-
contactEmail,
|
|
5775
|
-
errorContactPrompt,
|
|
5776
|
-
errorTitle,
|
|
5777
|
-
emptyStateMessage,
|
|
5778
|
-
initialData = null,
|
|
5779
|
-
initialLastUpdatedLabel = null,
|
|
5780
|
-
apiEndpoint,
|
|
5781
|
-
MarkdownRenderer = RichMarkdownRenderer,
|
|
5782
|
-
backButton
|
|
5783
|
-
}) {
|
|
5784
|
-
const router = useRouter();
|
|
5785
|
-
const { data, isLoading, error } = useLegalDocs(docType, { initialData, apiEndpoint });
|
|
5786
|
-
const backCfg = backButton === false ? void 0 : {
|
|
5787
|
-
label: backButton?.label ?? "Back to home",
|
|
5788
|
-
onClick: () => router.push(backButton?.href ?? "/")
|
|
5789
|
-
};
|
|
5790
|
-
const fallbackLastUpdatedLabel = data?.lastSynced != null ? formatLegalDate(data.lastSynced) : null;
|
|
5791
|
-
const effectiveLastUpdatedLabel = initialLastUpdatedLabel ?? fallbackLastUpdatedLabel;
|
|
5792
|
-
const customTitle = /* @__PURE__ */ jsxs44("div", { className: "flex flex-col gap-4", children: [
|
|
5793
|
-
/* @__PURE__ */ jsxs44(PageHeading, { children: [
|
|
5794
|
-
/* @__PURE__ */ jsx55("span", { children: title }),
|
|
5795
|
-
/* @__PURE__ */ jsx55("span", { className: "text-ods-accent", children: "." })
|
|
5796
|
-
] }),
|
|
5797
|
-
/* @__PURE__ */ jsxs44("p", { className: "font-['DM_Sans'] text-base md:text-lg text-ods-text-secondary max-w-2xl", children: [
|
|
5798
|
-
effectiveLastUpdatedLabel ? `Last Updated: ${effectiveLastUpdatedLabel}` : fallbackDescription,
|
|
5799
|
-
data?.sourceFile && /* @__PURE__ */ jsxs44("span", { className: "block text-sm mt-1 opacity-75", children: [
|
|
5800
|
-
"Source: ",
|
|
5801
|
-
data.sourceFile
|
|
5802
|
-
] })
|
|
5803
|
-
] })
|
|
5804
|
-
] });
|
|
5805
|
-
return /* @__PURE__ */ jsx55(PageShell, { children: /* @__PURE__ */ jsxs44(PageLayout, { backButton: backCfg, children: [
|
|
5806
|
-
/* @__PURE__ */ jsx55("div", { className: "flex flex-col gap-4", children: customTitle }),
|
|
5807
|
-
/* @__PURE__ */ jsx55("div", { className: "flex flex-col lg:flex-row gap-6 lg:gap-10 items-start flex-1", children: /* @__PURE__ */ jsx55("div", { className: "flex-1", children: /* @__PURE__ */ jsx55("div", { className: "w-full", children: /* @__PURE__ */ jsx55("article", { className: "space-y-2", children: isLoading ? (
|
|
5808
|
-
// Loading skeleton matching Knowledge Hub pattern
|
|
5809
|
-
/* @__PURE__ */ jsxs44("div", { className: "space-y-6", children: [
|
|
5810
|
-
/* @__PURE__ */ jsx55("div", { className: "h-10 bg-ods-skeleton rounded-lg w-3/4 animate-pulse" }),
|
|
5811
|
-
/* @__PURE__ */ jsxs44("div", { className: "space-y-4", children: [
|
|
5812
|
-
/* @__PURE__ */ jsx55("div", { className: "h-4 bg-ods-skeleton rounded w-full animate-pulse" }),
|
|
5813
|
-
/* @__PURE__ */ jsx55("div", { className: "h-4 bg-ods-skeleton rounded w-full animate-pulse" }),
|
|
5814
|
-
/* @__PURE__ */ jsx55("div", { className: "h-4 bg-ods-skeleton rounded w-5/6 animate-pulse" })
|
|
5815
|
-
] }),
|
|
5816
|
-
/* @__PURE__ */ jsx55("div", { className: "h-32 bg-ods-card border border-ods-border rounded-lg animate-pulse" }),
|
|
5817
|
-
/* @__PURE__ */ jsxs44("div", { className: "space-y-4", children: [
|
|
5818
|
-
/* @__PURE__ */ jsx55("div", { className: "h-4 bg-ods-skeleton rounded w-full animate-pulse" }),
|
|
5819
|
-
/* @__PURE__ */ jsx55("div", { className: "h-4 bg-ods-skeleton rounded w-4/5 animate-pulse" })
|
|
5820
|
-
] })
|
|
5821
|
-
] })
|
|
5822
|
-
) : error ? /* @__PURE__ */ jsxs44("div", { className: "text-center space-y-4", children: [
|
|
5823
|
-
/* @__PURE__ */ jsxs44("div", { className: "bg-red-900/20 border border-red-700 rounded-lg p-6", children: [
|
|
5824
|
-
/* @__PURE__ */ jsx55("p", { className: "text-red-400 mb-2", children: errorTitle }),
|
|
5825
|
-
/* @__PURE__ */ jsx55("p", { className: "text-red-300 text-sm", children: error })
|
|
5826
|
-
] }),
|
|
5827
|
-
/* @__PURE__ */ jsxs44("div", { className: "text-ods-text-secondary", children: [
|
|
5828
|
-
/* @__PURE__ */ jsx55("p", { children: errorContactPrompt }),
|
|
5829
|
-
/* @__PURE__ */ jsx55("a", { href: `mailto:${contactEmail}`, className: "text-ods-accent hover:underline", children: contactEmail })
|
|
5830
|
-
] })
|
|
5831
|
-
] }) : data ? /* @__PURE__ */ jsx55(
|
|
5832
|
-
MarkdownRenderer,
|
|
5833
|
-
{
|
|
5834
|
-
content: data.content,
|
|
5835
|
-
sectionIds: data.sections || [],
|
|
5836
|
-
demoteMarkdownH1ToH2: true
|
|
5837
|
-
}
|
|
5838
|
-
) : /* @__PURE__ */ jsxs44("div", { className: "text-center text-ods-text-secondary py-16", children: [
|
|
5839
|
-
/* @__PURE__ */ jsx55("p", { className: "text-xl", children: emptyStateMessage }),
|
|
5840
|
-
/* @__PURE__ */ jsxs44("p", { className: "mt-2", children: [
|
|
5841
|
-
"Please contact",
|
|
5842
|
-
" ",
|
|
5843
|
-
/* @__PURE__ */ jsx55("a", { href: `mailto:${contactEmail}`, className: "text-ods-accent hover:underline", children: contactEmail }),
|
|
5844
|
-
" ",
|
|
5845
|
-
"for more information."
|
|
5846
|
-
] })
|
|
5847
|
-
] }) }) }) }) })
|
|
5848
|
-
] }) });
|
|
5849
|
-
}
|
|
5850
|
-
|
|
5851
4473
|
// src/components/authors/author-detail-view.tsx
|
|
5852
4474
|
init_cn();
|
|
5853
|
-
import { jsx as
|
|
4475
|
+
import { jsx as jsx45, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
5854
4476
|
function AuthorDetailView({
|
|
5855
4477
|
author,
|
|
5856
4478
|
proxyImageUrl,
|
|
@@ -5865,9 +4487,9 @@ function AuthorDetailView({
|
|
|
5865
4487
|
}) ?? author.avatarUrl : null;
|
|
5866
4488
|
const subtitle = [author.jobTitle, author.company].filter(Boolean).join(" @ ");
|
|
5867
4489
|
const bioText = formatBioText(author.about);
|
|
5868
|
-
return /* @__PURE__ */
|
|
5869
|
-
/* @__PURE__ */
|
|
5870
|
-
/* @__PURE__ */
|
|
4490
|
+
return /* @__PURE__ */ jsxs36("div", { className: cn("flex flex-col gap-5 md:gap-6", className), children: [
|
|
4491
|
+
/* @__PURE__ */ jsxs36("div", { className: "flex gap-6 w-full items-start", children: [
|
|
4492
|
+
/* @__PURE__ */ jsx45("div", { className: "relative shrink-0 h-24 w-24", children: /* @__PURE__ */ jsx45("div", { className: "rounded-full overflow-hidden bg-ods-bg-secondary border border-ods-border w-full h-full relative", children: proxiedAvatar ? /* @__PURE__ */ jsx45(
|
|
5871
4493
|
next_image_default,
|
|
5872
4494
|
{
|
|
5873
4495
|
src: proxiedAvatar,
|
|
@@ -5876,12 +4498,12 @@ function AuthorDetailView({
|
|
|
5876
4498
|
className: "object-cover",
|
|
5877
4499
|
unoptimized: true
|
|
5878
4500
|
}
|
|
5879
|
-
) : /* @__PURE__ */
|
|
5880
|
-
/* @__PURE__ */
|
|
5881
|
-
/* @__PURE__ */
|
|
5882
|
-
subtitle && /* @__PURE__ */
|
|
4501
|
+
) : /* @__PURE__ */ jsx45("div", { className: "flex items-center justify-center h-full w-full text-3xl text-ods-text-secondary font-['Azeret_Mono']", children: author.fullName.charAt(0).toUpperCase() }) }) }),
|
|
4502
|
+
/* @__PURE__ */ jsxs36("div", { className: "min-w-0 flex flex-col justify-center gap-2", children: [
|
|
4503
|
+
/* @__PURE__ */ jsx45("p", { className: "text-h2 text-ods-text-primary leading-none truncate", children: author.fullName }),
|
|
4504
|
+
subtitle && /* @__PURE__ */ jsx45("p", { className: "font-body text-lg text-ods-text-secondary leading-none truncate", children: subtitle }),
|
|
5883
4505
|
author.socialLinks.length > 0 && // Ghost compact row (transparent 32px) — metadata, not CTAs.
|
|
5884
|
-
/* @__PURE__ */
|
|
4506
|
+
/* @__PURE__ */ jsx45(
|
|
5885
4507
|
SocialIconRow,
|
|
5886
4508
|
{
|
|
5887
4509
|
compact: true,
|
|
@@ -5894,8 +4516,8 @@ function AuthorDetailView({
|
|
|
5894
4516
|
)
|
|
5895
4517
|
] })
|
|
5896
4518
|
] }),
|
|
5897
|
-
bioText && /* @__PURE__ */
|
|
5898
|
-
author.knowsAbout.length > 0 && /* @__PURE__ */
|
|
4519
|
+
bioText && /* @__PURE__ */ jsx45("p", { className: "font-body text-base leading-relaxed text-ods-text-secondary", children: bioText }),
|
|
4520
|
+
author.knowsAbout.length > 0 && /* @__PURE__ */ jsx45("div", { className: "flex flex-wrap gap-2", children: author.knowsAbout.map((topic) => /* @__PURE__ */ jsx45(StatusBadge, { text: topic, variant: "button", colorScheme: "cyan", singleLine: true }, topic)) }),
|
|
5899
4521
|
children
|
|
5900
4522
|
] });
|
|
5901
4523
|
}
|