@postrun/react 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  "use client";
2
- import { createContext, memo, useMemo, useState, useEffect, Fragment as Fragment$1, useRef, createElement, useContext, useCallback } from 'react';
2
+ import { createContext, memo, useMemo, useState, useEffect, useRef, useLayoutEffect, Fragment as Fragment$1, useCallback, createElement, useContext, useId } from 'react';
3
3
  import { useInfiniteQuery, useQuery, useMutation, QueryClient } from '@tanstack/react-query';
4
- import { createPostrunClient, profilesList, profilesGet, profilesCreate, profilesUpdate, profilesDelete, connectionsConnect, connectionsListByProfile, connectionsGet, connectionsListAccounts, connectionsSelect, connectionsDelete, mediaGet, mediaList, mediaUpdate, mediaDelete, postsList, postsGet, postsCreate, buildCreatePost, isPostPlatform, failedVariants, isPublished, postsValidate, postsUpdate, postsDelete, tiktokCreatorInfo, mediaCreate, PostrunError } from '@postrun/js';
4
+ import { createPostrunClient, profilesList, profilesGet, profilesCreate, profilesUpdate, profilesDelete, connectionsConnect, connectionsListByProfile, connectionsGet, connectionsListAccounts, connectionsSelect, connectionsDelete, mediaGet, mediaList, mediaUpdate, mediaDelete, postsList, postsGet, postsCreate, buildCreatePost, isPostPlatform, failedVariants, isPublished, postsValidate, postsUpdate, postsDelete, tiktokCreatorInfo, audiencePrivacyOptions, audienceUnselected, tiktokPrivacyLabel, parsePrivacyLevel, TIKTOK_AUDIENCE_REQUIRED_HINT, captionMaxFor, commercialLabelNotice, commercialDisclosureIncomplete, setCommercialDisclosure, setBrandKind, TIKTOK_DISCLOSURE_REQUIRED_HINT, TIKTOK_BRANDED_CONTENT_POLICY_URL, TIKTOK_MUSIC_CONFIRMATION_URL, interactionRows, interactionValueKey, toggleInteraction, tiktokOptionsReady, TIKTOK_PROCESSING_NOTICE, brandedContentDeclared, mediaCreate, PostrunError } from '@postrun/js';
5
+ export { TIKTOK_CAPTION_MAX, captionMaxFor } from '@postrun/js';
5
6
  import Nango, { AuthError } from '@nangohq/frontend';
6
7
  import pWaitFor, { TimeoutError } from 'p-wait-for';
7
8
  import pLimit from 'p-limit';
@@ -12,6 +13,8 @@ import { FiMessageCircle, FiRepeat, FiHeart, FiBarChart2, FiShare, FiGlobe, FiUs
12
13
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
13
14
  import twitterText from 'twitter-text';
14
15
  import { LuBadgeCheck } from 'react-icons/lu';
16
+ import useEmblaCarousel from 'embla-carousel-react';
17
+ import { IoMusicalNotes } from 'react-icons/io5';
15
18
 
16
19
  // src/context.tsx
17
20
  function createDefaultQueryClient() {
@@ -1041,7 +1044,7 @@ var ACTIONS = [
1041
1044
  { label: "Share", Icon: FiShare }
1042
1045
  ];
1043
1046
  function XPreviewActions() {
1044
- return /* @__PURE__ */ jsx("div", { style: ROW, children: ACTIONS.map(({ label, Icon }) => /* @__PURE__ */ jsx(Icon, { size: 18, "aria-label": label, role: "img" }, label)) });
1047
+ return /* @__PURE__ */ jsx("div", { style: ROW, children: ACTIONS.map(({ label, Icon: Icon2 }) => /* @__PURE__ */ jsx(Icon2, { size: 18, "aria-label": label, role: "img" }, label)) });
1045
1048
  }
1046
1049
  var {
1047
1050
  extractCashtagsWithIndices,
@@ -1351,8 +1354,8 @@ var ACTIONS2 = [
1351
1354
  { label: "Send", Icon: FiSend }
1352
1355
  ];
1353
1356
  function EngagementBar() {
1354
- return /* @__PURE__ */ jsx("div", { style: ROW2, children: ACTIONS2.map(({ label, Icon }) => /* @__PURE__ */ jsxs("span", { style: ITEM, children: [
1355
- /* @__PURE__ */ jsx(Icon, { size: 20, "aria-hidden": true }),
1357
+ return /* @__PURE__ */ jsx("div", { style: ROW2, children: ACTIONS2.map(({ label, Icon: Icon2 }) => /* @__PURE__ */ jsxs("span", { style: ITEM, children: [
1358
+ /* @__PURE__ */ jsx(Icon2, { size: 20, "aria-hidden": true }),
1356
1359
  label
1357
1360
  ] }, label)) });
1358
1361
  }
@@ -1658,7 +1661,7 @@ function LinkedInPostPreviewImpl({
1658
1661
  accent: varRef(LI_VAR.accent),
1659
1662
  muted: varRef(LI_VAR.muted)
1660
1663
  };
1661
- const cardStyle = {
1664
+ const cardStyle2 = {
1662
1665
  ...paletteVars(dark),
1663
1666
  background: varRef(LI_VAR.bg),
1664
1667
  color: varRef(LI_VAR.text),
@@ -1669,7 +1672,7 @@ function LinkedInPostPreviewImpl({
1669
1672
  fontFamily: FONT_STACK,
1670
1673
  ...style
1671
1674
  };
1672
- return /* @__PURE__ */ jsxs("div", { className, style: cardStyle, children: [
1675
+ return /* @__PURE__ */ jsxs("div", { className, style: cardStyle2, children: [
1673
1676
  /* @__PURE__ */ jsx(Header, { author, visibility, time }),
1674
1677
  variant.body ? /* @__PURE__ */ jsx("div", { style: { padding: "8px 16px 0" }, children: /* @__PURE__ */ jsx(
1675
1678
  PostBody,
@@ -1684,7 +1687,974 @@ function LinkedInPostPreviewImpl({
1684
1687
  ] });
1685
1688
  }
1686
1689
  var LinkedInPostPreview = memo(LinkedInPostPreviewImpl);
1690
+ var LINK_COLOR = "#8ab4ff";
1691
+ var TOKEN = /([#@][\p{L}\p{N}_.]+)/gu;
1692
+ var IS_TOKEN = /^[#@][\p{L}\p{N}_.]+$/u;
1693
+ function Caption({ body }) {
1694
+ const [expanded, setExpanded] = useState(false);
1695
+ const [overflowing, setOverflowing] = useState(false);
1696
+ const ref = useRef(null);
1697
+ useLayoutEffect(() => {
1698
+ const el = ref.current;
1699
+ if (!el || expanded) {
1700
+ return;
1701
+ }
1702
+ setOverflowing(el.scrollHeight > el.clientHeight + 1);
1703
+ }, [body, expanded]);
1704
+ const parts = body.split(TOKEN);
1705
+ return /* @__PURE__ */ jsxs("div", { style: wrapStyle, children: [
1706
+ /* @__PURE__ */ jsx("div", { ref, style: expanded ? expandedTextStyle : clampedTextStyle, children: parts.map(
1707
+ (part, i) => IS_TOKEN.test(part) ? /* @__PURE__ */ jsx("span", { style: { color: LINK_COLOR }, children: part }, i) : /* @__PURE__ */ jsx("span", { children: part }, i)
1708
+ ) }),
1709
+ overflowing || expanded ? /* @__PURE__ */ jsx(
1710
+ "button",
1711
+ {
1712
+ type: "button",
1713
+ "aria-expanded": expanded,
1714
+ "aria-label": expanded ? "Collapse caption" : "Expand caption",
1715
+ onClick: () => setExpanded((v) => !v),
1716
+ style: moreStyle,
1717
+ children: expanded ? "less" : "more"
1718
+ }
1719
+ ) : null
1720
+ ] });
1721
+ }
1722
+ var wrapStyle = {
1723
+ fontSize: 14,
1724
+ lineHeight: 1.35
1725
+ };
1726
+ var clampedTextStyle = {
1727
+ display: "-webkit-box",
1728
+ WebkitLineClamp: 2,
1729
+ WebkitBoxOrient: "vertical",
1730
+ overflow: "hidden",
1731
+ whiteSpace: "pre-wrap",
1732
+ wordBreak: "break-word"
1733
+ };
1734
+ var expandedTextStyle = {
1735
+ maxHeight: 180,
1736
+ overflowY: "auto",
1737
+ whiteSpace: "pre-wrap",
1738
+ wordBreak: "break-word",
1739
+ overscrollBehavior: "contain"
1740
+ };
1741
+ var moreStyle = {
1742
+ display: "inline-block",
1743
+ marginTop: 2,
1744
+ padding: 0,
1745
+ border: 0,
1746
+ background: "transparent",
1747
+ color: "rgba(255,255,255,0.82)",
1748
+ fontSize: 13,
1749
+ fontWeight: 600,
1750
+ cursor: "pointer",
1751
+ fontFamily: "inherit"
1752
+ };
1753
+ function Media2({
1754
+ media,
1755
+ pending = false
1756
+ }) {
1757
+ const [first] = media;
1758
+ if (!first) {
1759
+ return pending ? /* @__PURE__ */ jsx(ProcessingMedia, {}) : /* @__PURE__ */ jsx(EmptyMedia, {});
1760
+ }
1761
+ if (first.kind === "video") {
1762
+ return /* @__PURE__ */ jsx(
1763
+ "video",
1764
+ {
1765
+ src: first.src,
1766
+ poster: first.posterSrc,
1767
+ autoPlay: true,
1768
+ muted: true,
1769
+ loop: true,
1770
+ playsInline: true,
1771
+ style: coverStyle
1772
+ }
1773
+ );
1774
+ }
1775
+ return /* @__PURE__ */ jsx(PhotoCarousel, { media });
1776
+ }
1777
+ function PhotoCarousel({ media }) {
1778
+ const [emblaRef, emblaApi] = useEmblaCarousel({
1779
+ loop: false,
1780
+ align: "start",
1781
+ containScroll: "trimSnaps"
1782
+ });
1783
+ const [selected, setSelected] = useState(0);
1784
+ const sync = useCallback((api) => {
1785
+ setSelected(api.selectedScrollSnap());
1786
+ }, []);
1787
+ useEffect(() => {
1788
+ if (!emblaApi) {
1789
+ return;
1790
+ }
1791
+ sync(emblaApi);
1792
+ emblaApi.on("select", sync).on("reInit", sync);
1793
+ return () => {
1794
+ emblaApi.off("select", sync).off("reInit", sync);
1795
+ };
1796
+ }, [emblaApi, sync]);
1797
+ return /* @__PURE__ */ jsxs("div", { style: { position: "absolute", inset: 0 }, children: [
1798
+ /* @__PURE__ */ jsx("div", { ref: emblaRef, style: viewportStyle, children: /* @__PURE__ */ jsx("div", { style: containerStyle, children: media.map((m, i) => /* @__PURE__ */ jsx("div", { style: slideStyle, children: /* @__PURE__ */ jsx("img", { src: m.src, alt: m.alt ?? "", style: coverStyle }) }, `${m.src}-${i}`)) }) }),
1799
+ media.length > 1 ? /* @__PURE__ */ jsx("div", { style: dotsStyle, children: media.map((m, i) => /* @__PURE__ */ jsx(
1800
+ "span",
1801
+ {
1802
+ style: { ...dotStyle, opacity: i === selected ? 1 : 0.4 }
1803
+ },
1804
+ `dot-${m.src}-${i}`
1805
+ )) }) : null
1806
+ ] });
1807
+ }
1808
+ function EmptyMedia() {
1809
+ return /* @__PURE__ */ jsx("div", { style: emptyStyle, children: "No media yet" });
1810
+ }
1811
+ function ProcessingMedia() {
1812
+ return /* @__PURE__ */ jsxs("div", { style: emptyStyle, children: [
1813
+ /* @__PURE__ */ jsx("div", { style: shimmerStyle }),
1814
+ /* @__PURE__ */ jsx("span", { style: { position: "relative", zIndex: 1 }, children: "Processing media\u2026" })
1815
+ ] });
1816
+ }
1817
+ var coverStyle = {
1818
+ position: "absolute",
1819
+ inset: 0,
1820
+ width: "100%",
1821
+ height: "100%",
1822
+ objectFit: "cover"
1823
+ };
1824
+ var viewportStyle = {
1825
+ position: "absolute",
1826
+ inset: 0,
1827
+ overflow: "hidden"
1828
+ };
1829
+ var containerStyle = {
1830
+ display: "flex",
1831
+ height: "100%"
1832
+ };
1833
+ var slideStyle = {
1834
+ position: "relative",
1835
+ flex: "0 0 100%",
1836
+ minWidth: 0,
1837
+ height: "100%"
1838
+ };
1839
+ var dotsStyle = {
1840
+ position: "absolute",
1841
+ bottom: 124,
1842
+ left: "50%",
1843
+ transform: "translateX(-50%)",
1844
+ display: "flex",
1845
+ gap: 5,
1846
+ alignItems: "center"
1847
+ };
1848
+ var dotStyle = {
1849
+ width: 6,
1850
+ height: 6,
1851
+ borderRadius: "50%",
1852
+ background: "#fff",
1853
+ transition: "opacity 160ms ease"
1854
+ };
1855
+ var emptyStyle = {
1856
+ position: "absolute",
1857
+ inset: 0,
1858
+ display: "flex",
1859
+ alignItems: "center",
1860
+ justifyContent: "center",
1861
+ color: "rgba(255,255,255,0.55)",
1862
+ fontSize: 13,
1863
+ background: "linear-gradient(180deg,#1c1c20,#101013)",
1864
+ overflow: "hidden"
1865
+ };
1866
+ var shimmerStyle = {
1867
+ position: "absolute",
1868
+ inset: 0,
1869
+ background: "linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0) 100%)",
1870
+ backgroundSize: "200% 100%",
1871
+ animation: "pr-tt-shimmer 1.4s ease-in-out infinite"
1872
+ };
1873
+ var Icon = ({
1874
+ size = 24,
1875
+ viewBox,
1876
+ children,
1877
+ ...rest
1878
+ }) => /* @__PURE__ */ jsx(
1879
+ "svg",
1880
+ {
1881
+ width: size,
1882
+ height: size,
1883
+ viewBox,
1884
+ fill: "currentColor",
1885
+ xmlns: "http://www.w3.org/2000/svg",
1886
+ ...rest,
1887
+ children
1888
+ }
1889
+ );
1890
+ var HeartIcon = (p) => /* @__PURE__ */ jsx(Icon, { viewBox: "0 0 24 24", ...p, children: /* @__PURE__ */ jsx(
1891
+ "path",
1892
+ {
1893
+ fillRule: "evenodd",
1894
+ clipRule: "evenodd",
1895
+ d: "M7.5 2.25C10.5 2.25 12 4.25 12 4.25C12 4.25 13.5 2.25 16.5 2.25C20 2.25 22.5 4.99999 22.5 8.5C22.5 12.5 19.2311 16.0657 16.25 18.75C14.4095 20.4072 13 21.5 12 21.5C11 21.5 9.55051 20.3989 7.75 18.75C4.81949 16.0662 1.5 12.5 1.5 8.5C1.5 4.99999 4 2.25 7.5 2.25Z"
1896
+ }
1897
+ ) });
1898
+ var CommentIcon = (p) => /* @__PURE__ */ jsx(Icon, { viewBox: "0 0 48 48", ...p, children: /* @__PURE__ */ jsx(
1899
+ "path",
1900
+ {
1901
+ fillRule: "evenodd",
1902
+ clipRule: "evenodd",
1903
+ d: "M2 21.5c0-10.22 9.88-18 22-18s22 7.78 22 18c0 5.63-3.19 10.74-7.32 14.8a43.6 43.6 0 0 1-14.14 9.1A1.5 1.5 0 0 1 22.5 44v-5.04C11.13 38.4 2 31.34 2 21.5M14 25a3 3 0 1 0 0-6 3 3 0 0 0 0 6m10 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6m13-3a3 3 0 1 1-6 0 3 3 0 0 1 6 0"
1904
+ }
1905
+ ) });
1906
+ var BookmarkIcon = (p) => /* @__PURE__ */ jsx(Icon, { viewBox: "0 0 24 24", ...p, children: /* @__PURE__ */ jsx("path", { d: "M4 4.5a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v15.13a1 1 0 0 1-1.555.831l-6.167-4.12a.5.5 0 0 0-.556 0l-6.167 4.12A1 1 0 0 1 4 19.63z" }) });
1907
+ var ShareIcon = (p) => /* @__PURE__ */ jsx(Icon, { viewBox: "0 0 20 20", ...p, children: /* @__PURE__ */ jsx(
1908
+ "path",
1909
+ {
1910
+ fillRule: "evenodd",
1911
+ clipRule: "evenodd",
1912
+ d: "M10.938 3.175a.674.674 0 0 1 1.138-.488l6.526 6.215c.574.547.554 1.47-.043 1.991l-6.505 5.676a.674.674 0 0 1-1.116-.508V13.49s-6.985-1.258-9.225 2.854c-.209.384-1.023.518-.857-1.395.692-3.52 2.106-9.017 10.082-9.017z"
1913
+ }
1914
+ ) });
1915
+ var PlusIcon = (p) => /* @__PURE__ */ jsx(Icon, { viewBox: "0 0 48 48", ...p, children: /* @__PURE__ */ jsx("path", { d: "M26 7a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v15H7a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h15v15a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1V26h15a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1H26V7Z" }) });
1916
+ var DASH = "\u2011\u2011\u2011";
1917
+ function commercialLabel(settings) {
1918
+ if (settings?.brand_content_toggle) {
1919
+ return "Paid partnership";
1920
+ }
1921
+ if (settings?.brand_organic_toggle) {
1922
+ return "Promotional content";
1923
+ }
1924
+ return null;
1925
+ }
1926
+ function TikTokPostPreviewImpl({
1927
+ variant,
1928
+ creatorInfo,
1929
+ media,
1930
+ className,
1931
+ style
1932
+ }) {
1933
+ const resolvedMedia = useResolvedMedia(
1934
+ media,
1935
+ variant.media,
1936
+ altSignatureOf(variant.media)
1937
+ );
1938
+ const { creator } = creatorInfo;
1939
+ const handle = creator.username || creator.nickname;
1940
+ const label = commercialLabel(variant.settings);
1941
+ const isAigc = Boolean(variant.settings?.is_aigc);
1942
+ const pending = (media?.length ?? 0) > 0 && resolvedMedia.length === 0;
1943
+ return /* @__PURE__ */ jsxs("div", { className, style: { ...cardStyle, ...style }, children: [
1944
+ /* @__PURE__ */ jsx("style", { children: KEYFRAMES }),
1945
+ /* @__PURE__ */ jsx(Media2, { media: resolvedMedia, pending }),
1946
+ /* @__PURE__ */ jsx("div", { style: scrimStyle }),
1947
+ /* @__PURE__ */ jsxs("div", { style: infoStyle, children: [
1948
+ /* @__PURE__ */ jsx("div", { style: usernameStyle, children: handle }),
1949
+ variant.body ? /* @__PURE__ */ jsx(Caption, { body: variant.body }) : null,
1950
+ label || isAigc ? /* @__PURE__ */ jsxs("div", { style: labelsStyle, children: [
1951
+ label ? /* @__PURE__ */ jsx("span", { style: pillStyle, children: label }) : null,
1952
+ isAigc ? /* @__PURE__ */ jsx("span", { style: pillStyle, children: "Creator labeled as AI-generated" }) : null
1953
+ ] }) : null,
1954
+ /* @__PURE__ */ jsxs("div", { style: musicRowStyle, children: [
1955
+ /* @__PURE__ */ jsx(IoMusicalNotes, { size: 13 }),
1956
+ /* @__PURE__ */ jsxs("span", { children: [
1957
+ "Original sound - ",
1958
+ creator.nickname
1959
+ ] })
1960
+ ] })
1961
+ ] }),
1962
+ /* @__PURE__ */ jsxs("div", { style: railStyle, children: [
1963
+ /* @__PURE__ */ jsxs("div", { style: avatarWrapStyle, children: [
1964
+ /* @__PURE__ */ jsx(Avatar, { url: creator.avatar_url, name: creator.nickname }),
1965
+ /* @__PURE__ */ jsx("span", { style: followBadgeStyle, children: /* @__PURE__ */ jsx(PlusIcon, { size: 14 }) })
1966
+ ] }),
1967
+ /* @__PURE__ */ jsx(RailAction, { icon: /* @__PURE__ */ jsx(HeartIcon, { size: 30 }), count: DASH }),
1968
+ /* @__PURE__ */ jsx(RailAction, { icon: /* @__PURE__ */ jsx(CommentIcon, { size: 30 }), count: DASH }),
1969
+ /* @__PURE__ */ jsx(RailAction, { icon: /* @__PURE__ */ jsx(BookmarkIcon, { size: 28 }), count: DASH }),
1970
+ /* @__PURE__ */ jsx(RailAction, { icon: /* @__PURE__ */ jsx(ShareIcon, { size: 28 }), count: DASH }),
1971
+ /* @__PURE__ */ jsx(Disc, { url: creator.avatar_url })
1972
+ ] })
1973
+ ] });
1974
+ }
1975
+ function RailAction({ icon, count }) {
1976
+ return /* @__PURE__ */ jsxs("div", { style: railActionStyle, children: [
1977
+ /* @__PURE__ */ jsx("span", { style: railIconStyle, children: icon }),
1978
+ /* @__PURE__ */ jsx("span", { style: railCountStyle, children: count })
1979
+ ] });
1980
+ }
1981
+ function Avatar({ url, name }) {
1982
+ if (url) {
1983
+ return /* @__PURE__ */ jsx("img", { src: url, alt: name, style: avatarStyle });
1984
+ }
1985
+ return /* @__PURE__ */ jsx("div", { style: { ...avatarStyle, ...avatarFallbackStyle }, children: name.slice(0, 1).toUpperCase() });
1986
+ }
1987
+ function Disc({ url }) {
1988
+ return /* @__PURE__ */ jsx("div", { style: discStyle, children: url ? /* @__PURE__ */ jsx("img", { src: url, alt: "", style: discImgStyle }) : null });
1989
+ }
1990
+ var cardStyle = {
1991
+ position: "relative",
1992
+ width: "100%",
1993
+ maxWidth: 320,
1994
+ aspectRatio: "9 / 16",
1995
+ borderRadius: 16,
1996
+ overflow: "hidden",
1997
+ background: "#000",
1998
+ color: "#fff",
1999
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif'
2000
+ };
2001
+ var scrimStyle = {
2002
+ position: "absolute",
2003
+ inset: 0,
2004
+ background: "linear-gradient(180deg, rgba(0,0,0,0) 55%, rgba(0,0,0,0.55) 100%)",
2005
+ pointerEvents: "none"
2006
+ };
2007
+ var infoStyle = {
2008
+ position: "absolute",
2009
+ left: 14,
2010
+ right: 70,
2011
+ bottom: 14,
2012
+ display: "flex",
2013
+ flexDirection: "column",
2014
+ gap: 6,
2015
+ textShadow: "0 1px 3px rgba(0,0,0,0.5)"
2016
+ };
2017
+ var usernameStyle = {
2018
+ fontWeight: 600,
2019
+ fontSize: 16
2020
+ };
2021
+ var labelsStyle = {
2022
+ display: "flex",
2023
+ flexDirection: "column",
2024
+ alignItems: "flex-start",
2025
+ gap: 4,
2026
+ marginTop: 2
2027
+ };
2028
+ var pillStyle = {
2029
+ display: "inline-flex",
2030
+ alignItems: "center",
2031
+ background: "rgba(255,255,255,0.18)",
2032
+ color: "#fff",
2033
+ fontSize: 11,
2034
+ fontWeight: 500,
2035
+ padding: "2px 7px",
2036
+ borderRadius: 4
2037
+ };
2038
+ var musicRowStyle = {
2039
+ display: "flex",
2040
+ alignItems: "center",
2041
+ gap: 6,
2042
+ fontSize: 13,
2043
+ marginTop: 4
2044
+ };
2045
+ var railStyle = {
2046
+ position: "absolute",
2047
+ right: 8,
2048
+ bottom: 14,
2049
+ display: "flex",
2050
+ flexDirection: "column",
2051
+ alignItems: "center",
2052
+ gap: 16,
2053
+ color: "#fff"
2054
+ };
2055
+ var avatarWrapStyle = {
2056
+ position: "relative",
2057
+ marginBottom: 8
2058
+ };
2059
+ var avatarStyle = {
2060
+ width: 46,
2061
+ height: 46,
2062
+ borderRadius: "50%",
2063
+ objectFit: "cover",
2064
+ display: "block",
2065
+ border: "1px solid rgba(255,255,255,0.2)"
2066
+ };
2067
+ var avatarFallbackStyle = {
2068
+ display: "grid",
2069
+ placeItems: "center",
2070
+ background: "#3a3a40",
2071
+ color: "#fff",
2072
+ fontSize: 18,
2073
+ fontWeight: 700
2074
+ };
2075
+ var followBadgeStyle = {
2076
+ position: "absolute",
2077
+ bottom: -9,
2078
+ left: "50%",
2079
+ transform: "translateX(-50%)",
2080
+ width: 19,
2081
+ height: 19,
2082
+ borderRadius: "50%",
2083
+ background: "#fe2c55",
2084
+ color: "#fff",
2085
+ display: "grid",
2086
+ placeItems: "center"
2087
+ };
2088
+ var railActionStyle = {
2089
+ display: "flex",
2090
+ flexDirection: "column",
2091
+ alignItems: "center",
2092
+ gap: 3
2093
+ };
2094
+ var railIconStyle = {
2095
+ display: "grid",
2096
+ placeItems: "center",
2097
+ filter: "drop-shadow(0 1px 2px rgba(0,0,0,0.4))"
2098
+ };
2099
+ var railCountStyle = {
2100
+ fontSize: 12,
2101
+ fontWeight: 600,
2102
+ textShadow: "0 1px 2px rgba(0,0,0,0.4)"
2103
+ };
2104
+ var discStyle = {
2105
+ width: 44,
2106
+ height: 44,
2107
+ borderRadius: "50%",
2108
+ background: "radial-gradient(circle, #555 0 36%, #111 37% 100%)",
2109
+ display: "grid",
2110
+ placeItems: "center",
2111
+ marginTop: 2,
2112
+ animation: "pr-tt-spin 4s linear infinite"
2113
+ };
2114
+ var discImgStyle = {
2115
+ width: 22,
2116
+ height: 22,
2117
+ borderRadius: "50%",
2118
+ objectFit: "cover"
2119
+ };
2120
+ var KEYFRAMES = `@keyframes pr-tt-spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes pr-tt-shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}`;
2121
+ var TikTokPostPreview = memo(TikTokPostPreviewImpl);
2122
+ var TT_VAR = {
2123
+ text: "--pr-tt-text",
2124
+ muted: "--pr-tt-muted",
2125
+ border: "--pr-tt-border",
2126
+ accent: "--pr-tt-accent",
2127
+ switchOff: "--pr-tt-switch-off"
2128
+ };
2129
+ var LIGHT2 = {
2130
+ text: "rgba(0,0,0,0.9)",
2131
+ muted: "rgba(0,0,0,0.55)",
2132
+ border: "rgba(0,0,0,0.12)",
2133
+ accent: "#fe2c55",
2134
+ switchOff: "rgba(0,0,0,0.18)"
2135
+ };
2136
+ var DARK2 = {
2137
+ text: "rgba(255,255,255,0.92)",
2138
+ muted: "#8a8a92",
2139
+ border: "rgba(255,255,255,0.14)",
2140
+ accent: "#fe2c55",
2141
+ switchOff: "rgba(255,255,255,0.22)"
2142
+ };
2143
+ function varRef2(name) {
2144
+ return `var(${name})`;
2145
+ }
2146
+ function paletteVars2(dark) {
2147
+ const p = dark ? DARK2 : LIGHT2;
2148
+ return {
2149
+ [TT_VAR.text]: p.text,
2150
+ [TT_VAR.muted]: p.muted,
2151
+ [TT_VAR.border]: p.border,
2152
+ [TT_VAR.accent]: p.accent,
2153
+ [TT_VAR.switchOff]: p.switchOff
2154
+ };
2155
+ }
2156
+ function usePrefersDark2() {
2157
+ const [dark, setDark] = useState(false);
2158
+ useEffect(() => {
2159
+ if (typeof window === "undefined" || !window.matchMedia) {
2160
+ return;
2161
+ }
2162
+ const mq = window.matchMedia("(prefers-color-scheme: dark)");
2163
+ setDark(mq.matches);
2164
+ const onChange = (event) => setDark(event.matches);
2165
+ mq.addEventListener("change", onChange);
2166
+ return () => mq.removeEventListener("change", onChange);
2167
+ }, []);
2168
+ return dark;
2169
+ }
2170
+ function useIsDark2(theme) {
2171
+ const prefersDark = usePrefersDark2();
2172
+ if (theme === "auto") {
2173
+ return prefersDark;
2174
+ }
2175
+ return theme === "dark";
2176
+ }
2177
+ var MUTED = varRef2(TT_VAR.muted);
2178
+ var BORDER = varRef2(TT_VAR.border);
2179
+ var ACCENT = varRef2(TT_VAR.accent);
2180
+ var SWITCH_OFF = varRef2(TT_VAR.switchOff);
2181
+ var ON = "#34c759";
2182
+ function Row({
2183
+ label,
2184
+ sublabel,
2185
+ control,
2186
+ htmlFor
2187
+ }) {
2188
+ return /* @__PURE__ */ jsxs("div", { style: rowStyle, children: [
2189
+ /* @__PURE__ */ jsxs("label", { htmlFor, style: { display: "flex", flexDirection: "column", gap: 2 }, children: [
2190
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 14 }, children: label }),
2191
+ sublabel ? /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: MUTED }, children: sublabel }) : null
2192
+ ] }),
2193
+ control
2194
+ ] });
2195
+ }
2196
+ function Switch({
2197
+ checked,
2198
+ onChange,
2199
+ disabled,
2200
+ id,
2201
+ ariaLabel
2202
+ }) {
2203
+ return /* @__PURE__ */ jsx(
2204
+ "button",
2205
+ {
2206
+ type: "button",
2207
+ role: "switch",
2208
+ id,
2209
+ "aria-label": ariaLabel,
2210
+ "aria-checked": checked,
2211
+ disabled,
2212
+ onClick: () => onChange(!checked),
2213
+ style: {
2214
+ ...switchTrackStyle,
2215
+ background: checked ? ON : SWITCH_OFF,
2216
+ opacity: disabled ? 0.4 : 1,
2217
+ cursor: disabled ? "not-allowed" : "pointer"
2218
+ },
2219
+ children: /* @__PURE__ */ jsx(
2220
+ "span",
2221
+ {
2222
+ style: {
2223
+ ...switchKnobStyle,
2224
+ transform: checked ? "translateX(16px)" : "translateX(0)"
2225
+ }
2226
+ }
2227
+ )
2228
+ }
2229
+ );
2230
+ }
2231
+ function SectionLabel({ children }) {
2232
+ return /* @__PURE__ */ jsx("div", { style: sectionLabelStyle, children });
2233
+ }
2234
+ function Hint({ children }) {
2235
+ return /* @__PURE__ */ jsx("p", { style: hintStyle, children });
2236
+ }
2237
+ function Notice({ children }) {
2238
+ return /* @__PURE__ */ jsx("p", { style: noticeStyle, children });
2239
+ }
2240
+ function CheckRow({
2241
+ label,
2242
+ checked,
2243
+ onChange
2244
+ }) {
2245
+ const id = useId();
2246
+ return /* @__PURE__ */ jsxs("label", { htmlFor: id, style: checkRowStyle, children: [
2247
+ /* @__PURE__ */ jsx(
2248
+ "input",
2249
+ {
2250
+ id,
2251
+ type: "checkbox",
2252
+ checked,
2253
+ onChange: (e) => onChange(e.target.checked),
2254
+ style: { accentColor: ACCENT, width: 16, height: 16 }
2255
+ }
2256
+ ),
2257
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 14 }, children: label })
2258
+ ] });
2259
+ }
2260
+ var rowStyle = {
2261
+ display: "flex",
2262
+ alignItems: "center",
2263
+ justifyContent: "space-between",
2264
+ gap: 12,
2265
+ minHeight: 36
2266
+ };
2267
+ var switchTrackStyle = {
2268
+ position: "relative",
2269
+ width: 40,
2270
+ height: 24,
2271
+ borderRadius: 999,
2272
+ border: 0,
2273
+ padding: 2,
2274
+ flex: "0 0 auto",
2275
+ transition: "background 160ms ease"
2276
+ };
2277
+ var switchKnobStyle = {
2278
+ display: "block",
2279
+ width: 20,
2280
+ height: 20,
2281
+ borderRadius: "50%",
2282
+ background: "#fff",
2283
+ boxShadow: "0 1px 2px rgba(0,0,0,0.3)",
2284
+ transition: "transform 160ms ease"
2285
+ };
2286
+ var sectionLabelStyle = {
2287
+ fontSize: 13,
2288
+ fontWeight: 600
2289
+ };
2290
+ var hintStyle = {
2291
+ margin: 0,
2292
+ fontSize: 12,
2293
+ color: ACCENT,
2294
+ lineHeight: 1.4
2295
+ };
2296
+ var noticeStyle = {
2297
+ margin: 0,
2298
+ fontSize: 12,
2299
+ color: MUTED,
2300
+ lineHeight: 1.4
2301
+ };
2302
+ var checkRowStyle = {
2303
+ display: "flex",
2304
+ alignItems: "center",
2305
+ gap: 10,
2306
+ cursor: "pointer"
2307
+ };
2308
+ var TOKENS = { MUTED, BORDER, ACCENT};
2309
+ function AudienceSelect({
2310
+ creatorInfo,
2311
+ value,
2312
+ onChange
2313
+ }) {
2314
+ const id = useId();
2315
+ const options = audiencePrivacyOptions(creatorInfo.privacy_options, value);
2316
+ const unselected = audienceUnselected(value);
2317
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: 8 }, children: [
2318
+ /* @__PURE__ */ jsx(SectionLabel, { children: "Who can view this post" }),
2319
+ /* @__PURE__ */ jsxs(
2320
+ "select",
2321
+ {
2322
+ id,
2323
+ value: value.privacy_level ?? "",
2324
+ onChange: (e) => onChange({
2325
+ ...value,
2326
+ // Validate against the OFFERED (filtered) options, not the full set —
2327
+ // so a manipulated value (e.g. SELF_ONLY while branded) can't slip in.
2328
+ privacy_level: parsePrivacyLevel(e.target.value, options)
2329
+ }),
2330
+ style: selectStyle,
2331
+ children: [
2332
+ /* @__PURE__ */ jsx("option", { value: "", disabled: true, children: "Select who can view this post" }),
2333
+ options.map((level) => /* @__PURE__ */ jsx("option", { value: level, children: tiktokPrivacyLabel(level) }, level))
2334
+ ]
2335
+ }
2336
+ ),
2337
+ unselected ? /* @__PURE__ */ jsx(Hint, { children: TIKTOK_AUDIENCE_REQUIRED_HINT }) : null
2338
+ ] });
2339
+ }
2340
+ var selectStyle = {
2341
+ width: "100%",
2342
+ appearance: "none",
2343
+ background: "transparent",
2344
+ color: "inherit",
2345
+ border: `1px solid ${TOKENS.BORDER}`,
2346
+ borderRadius: 10,
2347
+ padding: "10px 12px",
2348
+ fontSize: 14,
2349
+ fontFamily: "inherit",
2350
+ outline: "none",
2351
+ cursor: "pointer"
2352
+ };
2353
+ function TikTokCaptionField({
2354
+ value,
2355
+ onChange,
2356
+ postType,
2357
+ placeholder = "Describe your post\u2026",
2358
+ className,
2359
+ style
2360
+ }) {
2361
+ const id = useId();
2362
+ const max = captionMaxFor(postType);
2363
+ const count = value.length;
2364
+ const over = count > max;
2365
+ return /* @__PURE__ */ jsxs("div", { className, style: { ...wrapStyle2, ...style }, children: [
2366
+ /* @__PURE__ */ jsxs("div", { style: labelRowStyle, children: [
2367
+ /* @__PURE__ */ jsx("label", { htmlFor: id, style: labelStyle, children: "Caption" }),
2368
+ /* @__PURE__ */ jsxs(
2369
+ "span",
2370
+ {
2371
+ style: {
2372
+ ...countStyle,
2373
+ color: over ? varRef2(TT_VAR.accent) : varRef2(TT_VAR.muted)
2374
+ },
2375
+ children: [
2376
+ count.toLocaleString(),
2377
+ " / ",
2378
+ max.toLocaleString()
2379
+ ]
2380
+ }
2381
+ )
2382
+ ] }),
2383
+ /* @__PURE__ */ jsx(
2384
+ "textarea",
2385
+ {
2386
+ id,
2387
+ value,
2388
+ onChange: (e) => onChange(e.target.value),
2389
+ placeholder,
2390
+ rows: 4,
2391
+ style: {
2392
+ ...textareaStyle,
2393
+ borderColor: over ? varRef2(TT_VAR.accent) : varRef2(TT_VAR.border)
2394
+ }
2395
+ }
2396
+ )
2397
+ ] });
2398
+ }
2399
+ var wrapStyle2 = {
2400
+ display: "flex",
2401
+ flexDirection: "column",
2402
+ gap: 6,
2403
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif'
2404
+ };
2405
+ var labelRowStyle = {
2406
+ display: "flex",
2407
+ alignItems: "baseline",
2408
+ justifyContent: "space-between"
2409
+ };
2410
+ var labelStyle = {
2411
+ fontSize: 13,
2412
+ fontWeight: 600,
2413
+ color: "inherit"
2414
+ };
2415
+ var countStyle = {
2416
+ fontSize: 12,
2417
+ fontVariantNumeric: "tabular-nums"
2418
+ };
2419
+ var textareaStyle = {
2420
+ width: "100%",
2421
+ resize: "vertical",
2422
+ background: "transparent",
2423
+ color: "inherit",
2424
+ border: "1px solid rgba(255,255,255,0.14)",
2425
+ borderRadius: 10,
2426
+ padding: "10px 12px",
2427
+ fontSize: 14,
2428
+ lineHeight: 1.4,
2429
+ fontFamily: "inherit",
2430
+ outline: "none",
2431
+ boxSizing: "border-box"
2432
+ };
2433
+ function CommercialDisclosure({
2434
+ value,
2435
+ onChange
2436
+ }) {
2437
+ const labelNotice = commercialLabelNotice(value);
2438
+ const incomplete = commercialDisclosureIncomplete(value);
2439
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: 8 }, children: [
2440
+ /* @__PURE__ */ jsx(SectionLabel, { children: "Disclose post content" }),
2441
+ /* @__PURE__ */ jsx(
2442
+ Row,
2443
+ {
2444
+ label: "Disclose commercial content",
2445
+ sublabel: "Turn on if this post promotes a brand, product, or service.",
2446
+ control: /* @__PURE__ */ jsx(
2447
+ Switch,
2448
+ {
2449
+ checked: value.commercial_disclosure,
2450
+ ariaLabel: "Disclose commercial content",
2451
+ onChange: (next) => onChange(setCommercialDisclosure(value, next))
2452
+ }
2453
+ )
2454
+ }
2455
+ ),
2456
+ value.commercial_disclosure ? /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: 8, paddingLeft: 2 }, children: [
2457
+ /* @__PURE__ */ jsx(
2458
+ CheckRow,
2459
+ {
2460
+ label: "Your brand",
2461
+ checked: value.your_brand,
2462
+ onChange: (next) => onChange(setBrandKind(value, "your_brand", next))
2463
+ }
2464
+ ),
2465
+ /* @__PURE__ */ jsx(
2466
+ CheckRow,
2467
+ {
2468
+ label: "Branded content",
2469
+ checked: value.branded_content,
2470
+ onChange: (next) => onChange(setBrandKind(value, "branded_content", next))
2471
+ }
2472
+ ),
2473
+ incomplete ? /* @__PURE__ */ jsx(Hint, { children: TIKTOK_DISCLOSURE_REQUIRED_HINT }) : null,
2474
+ labelNotice ? /* @__PURE__ */ jsx(Notice, { children: labelNotice }) : null
2475
+ ] }) : null
2476
+ ] });
2477
+ }
2478
+ function Declaration({ brandedContent }) {
2479
+ return /* @__PURE__ */ jsxs("p", { style: declarationStyle, children: [
2480
+ "By posting, you agree to TikTok's",
2481
+ " ",
2482
+ brandedContent ? /* @__PURE__ */ jsxs(Fragment, { children: [
2483
+ /* @__PURE__ */ jsx(DeclarationLink, { href: TIKTOK_BRANDED_CONTENT_POLICY_URL, children: "Branded Content Policy" }),
2484
+ " ",
2485
+ "and",
2486
+ " "
2487
+ ] }) : null,
2488
+ /* @__PURE__ */ jsx(DeclarationLink, { href: TIKTOK_MUSIC_CONFIRMATION_URL, children: "Music Usage Confirmation" }),
2489
+ "."
2490
+ ] });
2491
+ }
2492
+ function DeclarationLink({ href, children }) {
2493
+ return /* @__PURE__ */ jsx("a", { href, target: "_blank", rel: "noreferrer", style: linkStyle2, children });
2494
+ }
2495
+ var declarationStyle = {
2496
+ margin: 0,
2497
+ fontSize: 12,
2498
+ color: TOKENS.MUTED,
2499
+ lineHeight: 1.45
2500
+ };
2501
+ var linkStyle2 = {
2502
+ color: "inherit",
2503
+ textDecoration: "underline"
2504
+ };
2505
+ function InteractionToggles({
2506
+ creatorInfo,
2507
+ value,
2508
+ onChange,
2509
+ isVideo
2510
+ }) {
2511
+ const rows = interactionRows(creatorInfo, isVideo);
2512
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: 8 }, children: [
2513
+ /* @__PURE__ */ jsx(SectionLabel, { children: "Allow users to" }),
2514
+ rows.map((row) => {
2515
+ const on = Boolean(value[interactionValueKey(row.key)]);
2516
+ return /* @__PURE__ */ jsx(
2517
+ Row,
2518
+ {
2519
+ label: row.label,
2520
+ sublabel: row.disabled ? "Turned off by this creator" : void 0,
2521
+ control: /* @__PURE__ */ jsx(
2522
+ Switch,
2523
+ {
2524
+ checked: !row.disabled && on,
2525
+ disabled: row.disabled,
2526
+ ariaLabel: `Allow ${row.label}`,
2527
+ onChange: (next) => onChange(toggleInteraction(value, row.key, next))
2528
+ }
2529
+ )
2530
+ },
2531
+ row.key
2532
+ );
2533
+ })
2534
+ ] });
2535
+ }
2536
+ function mediaCountValid(postType, count) {
2537
+ if (postType === "carousel") {
2538
+ return count >= 2 && count <= 35;
2539
+ }
2540
+ return count === 1;
2541
+ }
2542
+ function TikTokPublishPanel({
2543
+ variant,
2544
+ creatorInfo,
2545
+ caption,
2546
+ onCaptionChange,
2547
+ options,
2548
+ onOptionsChange,
2549
+ onPost,
2550
+ posting = false,
2551
+ theme = "auto",
2552
+ className,
2553
+ style
2554
+ }) {
2555
+ const dark = useIsDark2(theme);
2556
+ const isVideo = variant.post_type === "video";
2557
+ const captionOver = caption.length > captionMaxFor(variant.post_type);
2558
+ const mediaOk = mediaCountValid(variant.post_type, variant.media?.length ?? 0);
2559
+ const ready = !captionOver && mediaOk && tiktokOptionsReady(options);
2560
+ return /* @__PURE__ */ jsxs(
2561
+ "div",
2562
+ {
2563
+ className,
2564
+ style: {
2565
+ ...paletteVars2(dark),
2566
+ ...panelStyle,
2567
+ color: varRef2(TT_VAR.text),
2568
+ ...style
2569
+ },
2570
+ children: [
2571
+ /* @__PURE__ */ jsx(
2572
+ TikTokCaptionField,
2573
+ {
2574
+ value: caption,
2575
+ onChange: onCaptionChange,
2576
+ postType: variant.post_type
2577
+ }
2578
+ ),
2579
+ /* @__PURE__ */ jsx(Divider, {}),
2580
+ /* @__PURE__ */ jsx(AudienceSelect, { creatorInfo, value: options, onChange: onOptionsChange }),
2581
+ /* @__PURE__ */ jsx(Divider, {}),
2582
+ /* @__PURE__ */ jsx(
2583
+ InteractionToggles,
2584
+ {
2585
+ creatorInfo,
2586
+ value: options,
2587
+ onChange: onOptionsChange,
2588
+ isVideo
2589
+ }
2590
+ ),
2591
+ /* @__PURE__ */ jsx(Divider, {}),
2592
+ /* @__PURE__ */ jsx(CommercialDisclosure, { value: options, onChange: onOptionsChange }),
2593
+ isVideo ? /* @__PURE__ */ jsxs(Fragment, { children: [
2594
+ /* @__PURE__ */ jsx(Divider, {}),
2595
+ /* @__PURE__ */ jsx(
2596
+ Row,
2597
+ {
2598
+ label: "AI-generated content",
2599
+ sublabel: "Disclose if this video was created or substantially edited with AI.",
2600
+ control: /* @__PURE__ */ jsx(
2601
+ Switch,
2602
+ {
2603
+ checked: options.aigc,
2604
+ ariaLabel: "AI-generated content",
2605
+ onChange: (next) => onOptionsChange({ ...options, aigc: next })
2606
+ }
2607
+ )
2608
+ }
2609
+ )
2610
+ ] }) : null,
2611
+ /* @__PURE__ */ jsx(Divider, {}),
2612
+ /* @__PURE__ */ jsx(Notice, { children: TIKTOK_PROCESSING_NOTICE }),
2613
+ /* @__PURE__ */ jsx(Declaration, { brandedContent: brandedContentDeclared(options) }),
2614
+ /* @__PURE__ */ jsx(
2615
+ "button",
2616
+ {
2617
+ type: "button",
2618
+ disabled: !ready || posting,
2619
+ onClick: onPost,
2620
+ style: {
2621
+ ...postButtonStyle,
2622
+ opacity: !ready || posting ? 0.5 : 1,
2623
+ cursor: !ready || posting ? "not-allowed" : "pointer"
2624
+ },
2625
+ children: posting ? "Posting\u2026" : "Post"
2626
+ }
2627
+ )
2628
+ ]
2629
+ }
2630
+ );
2631
+ }
2632
+ function Divider() {
2633
+ return /* @__PURE__ */ jsx("div", { style: dividerStyle });
2634
+ }
2635
+ var panelStyle = {
2636
+ display: "flex",
2637
+ flexDirection: "column",
2638
+ gap: 16,
2639
+ width: "100%",
2640
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif'
2641
+ };
2642
+ var dividerStyle = {
2643
+ height: 1,
2644
+ background: TOKENS.BORDER
2645
+ };
2646
+ var postButtonStyle = {
2647
+ width: "100%",
2648
+ border: 0,
2649
+ borderRadius: 10,
2650
+ background: TOKENS.ACCENT,
2651
+ color: "#fff",
2652
+ fontSize: 15,
2653
+ fontWeight: 600,
2654
+ padding: "12px 16px",
2655
+ transition: "opacity 160ms ease"
2656
+ };
1687
2657
 
1688
- export { Connect, LinkedInPostPreview, PostrunProvider, UploadError, XPostPreview, connectionKeys, mediaKeys, postKeys, profileKeys, tiktokKeys, useCalendar, useConnect, useConnection, useConnections, useCreatePost, useCreateProfile, useDeleteMedia, useDeletePost, useDeleteProfile, useDisconnect, useDiscoverableAccounts, useInfiniteList, useMedia, useMediaInfinite, useMediaList, useMediaUpload, usePost, usePostrun, usePosts, usePostsInfinite, useProfile, useProfiles, useProfilesInfinite, useSelectAccount, useTikTokCreatorInfo, useUpdateMedia, useUpdatePost, useUpdateProfile, useValidatePost };
2658
+ export { AudienceSelect, CommercialDisclosure, Connect, Declaration, InteractionToggles, LinkedInPostPreview, PostrunProvider, TikTokCaptionField, TikTokPostPreview, TikTokPublishPanel, UploadError, XPostPreview, connectionKeys, mediaKeys, postKeys, profileKeys, tiktokKeys, useCalendar, useConnect, useConnection, useConnections, useCreatePost, useCreateProfile, useDeleteMedia, useDeletePost, useDeleteProfile, useDisconnect, useDiscoverableAccounts, useInfiniteList, useMedia, useMediaInfinite, useMediaList, useMediaUpload, usePost, usePostrun, usePosts, usePostsInfinite, useProfile, useProfiles, useProfilesInfinite, useSelectAccount, useTikTokCreatorInfo, useUpdateMedia, useUpdatePost, useUpdateProfile, useValidatePost };
1689
2659
  //# sourceMappingURL=index.js.map
1690
2660
  //# sourceMappingURL=index.js.map