@salesmind-ai/design-system 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +2 -0
  2. package/dist/Anton-Regular-MLEXVTB2.woff2 +0 -0
  3. package/dist/admin/index.cjs +5 -61
  4. package/dist/admin/index.css +0 -3918
  5. package/dist/admin/index.css.map +1 -1
  6. package/dist/admin/index.d.cts +1 -422
  7. package/dist/admin/index.d.ts +1 -422
  8. package/dist/admin/index.js +1 -5
  9. package/dist/blog/index.cjs +13 -34
  10. package/dist/blog/index.css +0 -579
  11. package/dist/blog/index.css.map +1 -1
  12. package/dist/blog/index.d.cts +1 -54
  13. package/dist/blog/index.d.ts +1 -54
  14. package/dist/blog/index.js +5 -6
  15. package/dist/charts/index.cjs +0 -46
  16. package/dist/charts/index.d.cts +1 -452
  17. package/dist/charts/index.d.ts +1 -452
  18. package/dist/charts/index.js +1 -3
  19. package/dist/{chunk-HDVAMYSG.js → chunk-27Y5ESMM.js} +7 -2
  20. package/dist/chunk-27Y5ESMM.js.map +1 -0
  21. package/dist/{chunk-YTYDQBVY.cjs → chunk-2VVRZBUR.cjs} +4 -4
  22. package/dist/{chunk-GQELL2MF.cjs → chunk-3NS6X2R4.cjs} +20 -203
  23. package/dist/chunk-3NS6X2R4.cjs.map +1 -0
  24. package/dist/{chunk-XEX2AEZK.cjs → chunk-65DTHLVX.cjs} +66 -186
  25. package/dist/chunk-65DTHLVX.cjs.map +1 -0
  26. package/dist/{chunk-QALDZ7WQ.js → chunk-6BUS7RMS.js} +21 -198
  27. package/dist/chunk-6BUS7RMS.js.map +1 -0
  28. package/dist/{chunk-BJZ2DKS5.cjs → chunk-6QIQCUYC.cjs} +11 -10
  29. package/dist/chunk-6QIQCUYC.cjs.map +1 -0
  30. package/dist/{chunk-H2Y6BSTL.cjs → chunk-7EUR3AKV.cjs} +1 -1
  31. package/dist/chunk-7EUR3AKV.cjs.map +1 -0
  32. package/dist/{chunk-VFJZQQZU.js → chunk-AMNY5TS3.js} +11 -10
  33. package/dist/chunk-AMNY5TS3.js.map +1 -0
  34. package/dist/{chunk-YJ6C3EKW.js → chunk-CLXLQCNQ.js} +52 -168
  35. package/dist/chunk-CLXLQCNQ.js.map +1 -0
  36. package/dist/{chunk-H2KQ3WSH.cjs → chunk-CVLD5RQK.cjs} +12 -14
  37. package/dist/chunk-CVLD5RQK.cjs.map +1 -0
  38. package/dist/chunk-EPD4ZEPY.cjs +344 -0
  39. package/dist/chunk-EPD4ZEPY.cjs.map +1 -0
  40. package/dist/chunk-FXYOSA4E.cjs +118 -0
  41. package/dist/chunk-FXYOSA4E.cjs.map +1 -0
  42. package/dist/{chunk-ECXBTUH6.cjs → chunk-GPHQGLR5.cjs} +27 -204
  43. package/dist/chunk-GPHQGLR5.cjs.map +1 -0
  44. package/dist/{chunk-Y26OHHMX.js → chunk-HHQ6J7B6.js} +513 -888
  45. package/dist/chunk-HHQ6J7B6.js.map +1 -0
  46. package/dist/chunk-JPUJWI7F.cjs +73 -0
  47. package/dist/chunk-JPUJWI7F.cjs.map +1 -0
  48. package/dist/{chunk-6UNG76Y2.js → chunk-K526GN7P.js} +2 -2
  49. package/dist/{chunk-SICKWUWB.js → chunk-KJHPOB3J.js} +1 -1
  50. package/dist/chunk-KJHPOB3J.js.map +1 -0
  51. package/dist/chunk-KXVFFEGD.js +60 -0
  52. package/dist/chunk-KXVFFEGD.js.map +1 -0
  53. package/dist/chunk-LQB7QLD3.js +288 -0
  54. package/dist/chunk-LQB7QLD3.js.map +1 -0
  55. package/dist/chunk-LUD52ZJF.cjs +726 -0
  56. package/dist/chunk-LUD52ZJF.cjs.map +1 -0
  57. package/dist/{chunk-7UZ5DETZ.js → chunk-MBAG654R.js} +4 -216
  58. package/dist/chunk-MBAG654R.js.map +1 -0
  59. package/dist/chunk-OMP6FAZ6.cjs +183 -0
  60. package/dist/chunk-OMP6FAZ6.cjs.map +1 -0
  61. package/dist/{chunk-WYH4TKS5.js → chunk-PBYRTNQ5.js} +6 -8
  62. package/dist/chunk-PBYRTNQ5.js.map +1 -0
  63. package/dist/chunk-PYREXCZK.js +679 -0
  64. package/dist/chunk-PYREXCZK.js.map +1 -0
  65. package/dist/{chunk-6D22TFLA.cjs → chunk-R3ZECV5P.cjs} +9 -4
  66. package/dist/chunk-R3ZECV5P.cjs.map +1 -0
  67. package/dist/{chunk-P5BOFE5A.js → chunk-RSLA2FJN.js} +28 -183
  68. package/dist/chunk-RSLA2FJN.js.map +1 -0
  69. package/dist/chunk-S46SKHMD.js +173 -0
  70. package/dist/chunk-S46SKHMD.js.map +1 -0
  71. package/dist/chunk-SFXTB7JL.js +190 -0
  72. package/dist/chunk-SFXTB7JL.js.map +1 -0
  73. package/dist/chunk-SGYXYMKZ.cjs +214 -0
  74. package/dist/chunk-SGYXYMKZ.cjs.map +1 -0
  75. package/dist/chunk-UGKYP6F3.cjs +296 -0
  76. package/dist/chunk-UGKYP6F3.cjs.map +1 -0
  77. package/dist/chunk-WB6XDNU7.js +115 -0
  78. package/dist/chunk-WB6XDNU7.js.map +1 -0
  79. package/dist/{chunk-LTPTW2US.cjs → chunk-WE4QIIVN.cjs} +592 -974
  80. package/dist/chunk-WE4QIIVN.cjs.map +1 -0
  81. package/dist/core/index.cjs +144 -626
  82. package/dist/core/index.css +178 -3567
  83. package/dist/core/index.css.map +1 -1
  84. package/dist/core/index.d.cts +940 -902
  85. package/dist/core/index.d.ts +940 -902
  86. package/dist/core/index.js +6 -12
  87. package/dist/i18n/index.cjs +54 -49
  88. package/dist/i18n/index.d.cts +46 -11
  89. package/dist/i18n/index.d.ts +46 -11
  90. package/dist/i18n/index.js +2 -1
  91. package/dist/index-BJ8rBqrO.d.cts +1100 -0
  92. package/dist/index-BxMqCbqE.d.ts +1100 -0
  93. package/dist/index.cjs +507 -1001
  94. package/dist/index.cjs.map +1 -1
  95. package/dist/index.css +6057 -16713
  96. package/dist/index.css.map +1 -1
  97. package/dist/index.d.cts +306 -21
  98. package/dist/index.d.ts +306 -21
  99. package/dist/index.js +274 -39
  100. package/dist/index.js.map +1 -1
  101. package/dist/marketing/index.cjs +33 -76
  102. package/dist/marketing/index.css +1896 -3234
  103. package/dist/marketing/index.css.map +1 -1
  104. package/dist/marketing/index.d.cts +3 -1351
  105. package/dist/marketing/index.d.ts +3 -1351
  106. package/dist/marketing/index.js +5 -8
  107. package/dist/motion/index.cjs +3 -20
  108. package/dist/motion/index.css +0 -580
  109. package/dist/motion/index.css.map +1 -1
  110. package/dist/motion/index.d.cts +1 -37
  111. package/dist/motion/index.d.ts +1 -37
  112. package/dist/motion/index.js +1 -2
  113. package/dist/nav/index.cjs +10 -35
  114. package/dist/nav/index.css +28 -580
  115. package/dist/nav/index.css.map +1 -1
  116. package/dist/nav/index.d.cts +2 -60
  117. package/dist/nav/index.d.ts +2 -60
  118. package/dist/nav/index.js +1 -2
  119. package/dist/report/index.cjs +1166 -175
  120. package/dist/report/index.cjs.map +1 -1
  121. package/dist/report/index.d.cts +208 -5
  122. package/dist/report/index.d.ts +208 -5
  123. package/dist/report/index.js +1141 -3
  124. package/dist/report/index.js.map +1 -1
  125. package/dist/sections/index.cjs +8 -10
  126. package/dist/sections/index.cjs.map +1 -1
  127. package/dist/sections/index.css +0 -206
  128. package/dist/sections/index.css.map +1 -1
  129. package/dist/sections/index.js +2 -4
  130. package/dist/sections/index.js.map +1 -1
  131. package/dist/social-media/index.cjs +4 -0
  132. package/dist/social-media/index.cjs.map +1 -0
  133. package/dist/social-media/index.d.cts +2 -0
  134. package/dist/social-media/index.d.ts +2 -0
  135. package/dist/social-media/index.js +3 -0
  136. package/dist/social-media/index.js.map +1 -0
  137. package/dist/social-proof/index.cjs +4 -36
  138. package/dist/social-proof/index.css +3 -1106
  139. package/dist/social-proof/index.css.map +1 -1
  140. package/dist/social-proof/index.d.cts +26 -171
  141. package/dist/social-proof/index.d.ts +26 -171
  142. package/dist/social-proof/index.js +1 -5
  143. package/dist/styles/styles.css +657 -2990
  144. package/dist/theme/index.cjs +12 -16
  145. package/dist/theme/index.css +1 -245
  146. package/dist/theme/index.css.map +1 -1
  147. package/dist/theme/index.d.cts +4 -1
  148. package/dist/theme/index.d.ts +4 -1
  149. package/dist/theme/index.js +2 -2
  150. package/dist/web/client/index.cjs +10 -10
  151. package/dist/web/client/index.css +118 -0
  152. package/dist/web/client/index.css.map +1 -1
  153. package/dist/web/client/index.js +2 -2
  154. package/dist/web/index.cjs +10 -10
  155. package/dist/web/index.css +118 -0
  156. package/dist/web/index.css.map +1 -1
  157. package/dist/web/index.js +2 -2
  158. package/package.json +10 -4
  159. package/dist/AppearancePanel-UT57J69V.d.cts +0 -51
  160. package/dist/AppearancePanel-UT57J69V.d.ts +0 -51
  161. package/dist/ExportMenu-A2TLFiVv.d.cts +0 -311
  162. package/dist/ExportMenu-C8qck5AT.d.ts +0 -311
  163. package/dist/Select-BdZmK0Lt.d.cts +0 -66
  164. package/dist/Select-BdZmK0Lt.d.ts +0 -66
  165. package/dist/chart-types-BGVVO-zl.d.cts +0 -208
  166. package/dist/chart-types-BGVVO-zl.d.ts +0 -208
  167. package/dist/charts/index.css +0 -1167
  168. package/dist/charts/index.css.map +0 -1
  169. package/dist/chunk-3BAQDW3V.cjs +0 -1207
  170. package/dist/chunk-3BAQDW3V.cjs.map +0 -1
  171. package/dist/chunk-3NKRFUAR.js +0 -37
  172. package/dist/chunk-3NKRFUAR.js.map +0 -1
  173. package/dist/chunk-3TGSIILM.cjs +0 -201
  174. package/dist/chunk-3TGSIILM.cjs.map +0 -1
  175. package/dist/chunk-4GM5BGBN.cjs +0 -801
  176. package/dist/chunk-4GM5BGBN.cjs.map +0 -1
  177. package/dist/chunk-5LA3T22E.cjs +0 -562
  178. package/dist/chunk-5LA3T22E.cjs.map +0 -1
  179. package/dist/chunk-5SN66B2X.js +0 -2542
  180. package/dist/chunk-5SN66B2X.js.map +0 -1
  181. package/dist/chunk-6D22TFLA.cjs.map +0 -1
  182. package/dist/chunk-6H4DSTXR.js +0 -786
  183. package/dist/chunk-6H4DSTXR.js.map +0 -1
  184. package/dist/chunk-6HKQ5ILL.cjs +0 -1624
  185. package/dist/chunk-6HKQ5ILL.cjs.map +0 -1
  186. package/dist/chunk-7PX2AZ6Y.js +0 -39
  187. package/dist/chunk-7PX2AZ6Y.js.map +0 -1
  188. package/dist/chunk-7UZ5DETZ.js.map +0 -1
  189. package/dist/chunk-B6AVAX4F.js +0 -1415
  190. package/dist/chunk-B6AVAX4F.js.map +0 -1
  191. package/dist/chunk-BJZ2DKS5.cjs.map +0 -1
  192. package/dist/chunk-BUTQSDQH.js +0 -200
  193. package/dist/chunk-BUTQSDQH.js.map +0 -1
  194. package/dist/chunk-C2BCDNAV.js +0 -24
  195. package/dist/chunk-C2BCDNAV.js.map +0 -1
  196. package/dist/chunk-CJ2MKVAF.cjs +0 -46
  197. package/dist/chunk-CJ2MKVAF.cjs.map +0 -1
  198. package/dist/chunk-E7D6EKJ4.cjs +0 -44
  199. package/dist/chunk-E7D6EKJ4.cjs.map +0 -1
  200. package/dist/chunk-ECXBTUH6.cjs.map +0 -1
  201. package/dist/chunk-FAFAP4L5.js +0 -183
  202. package/dist/chunk-FAFAP4L5.js.map +0 -1
  203. package/dist/chunk-G2XGBO5V.cjs +0 -2565
  204. package/dist/chunk-G2XGBO5V.cjs.map +0 -1
  205. package/dist/chunk-GQELL2MF.cjs.map +0 -1
  206. package/dist/chunk-H2KQ3WSH.cjs.map +0 -1
  207. package/dist/chunk-H2Y6BSTL.cjs.map +0 -1
  208. package/dist/chunk-HCZW5AJN.cjs +0 -234
  209. package/dist/chunk-HCZW5AJN.cjs.map +0 -1
  210. package/dist/chunk-HDVAMYSG.js.map +0 -1
  211. package/dist/chunk-HN4PHABT.js +0 -126
  212. package/dist/chunk-HN4PHABT.js.map +0 -1
  213. package/dist/chunk-LTPTW2US.cjs.map +0 -1
  214. package/dist/chunk-MDB2WCRQ.cjs +0 -137
  215. package/dist/chunk-MDB2WCRQ.cjs.map +0 -1
  216. package/dist/chunk-MQRB634A.cjs +0 -34
  217. package/dist/chunk-MQRB634A.cjs.map +0 -1
  218. package/dist/chunk-NN3TUHIH.js +0 -28
  219. package/dist/chunk-NN3TUHIH.js.map +0 -1
  220. package/dist/chunk-OWS2KAXZ.js +0 -701
  221. package/dist/chunk-OWS2KAXZ.js.map +0 -1
  222. package/dist/chunk-P5BOFE5A.js.map +0 -1
  223. package/dist/chunk-PUPSK3DI.cjs +0 -216
  224. package/dist/chunk-PUPSK3DI.cjs.map +0 -1
  225. package/dist/chunk-Q2MFGYTE.cjs +0 -1449
  226. package/dist/chunk-Q2MFGYTE.cjs.map +0 -1
  227. package/dist/chunk-Q75DBVDY.cjs +0 -68
  228. package/dist/chunk-Q75DBVDY.cjs.map +0 -1
  229. package/dist/chunk-QALDZ7WQ.js.map +0 -1
  230. package/dist/chunk-QWE2RNCS.js +0 -1195
  231. package/dist/chunk-QWE2RNCS.js.map +0 -1
  232. package/dist/chunk-RQUFZAZ7.js +0 -1608
  233. package/dist/chunk-RQUFZAZ7.js.map +0 -1
  234. package/dist/chunk-SICKWUWB.js.map +0 -1
  235. package/dist/chunk-TCFC7XTB.js +0 -212
  236. package/dist/chunk-TCFC7XTB.js.map +0 -1
  237. package/dist/chunk-UTVXGAQP.cjs +0 -2437
  238. package/dist/chunk-UTVXGAQP.cjs.map +0 -1
  239. package/dist/chunk-UVEMY3FQ.cjs +0 -717
  240. package/dist/chunk-UVEMY3FQ.cjs.map +0 -1
  241. package/dist/chunk-VFJZQQZU.js.map +0 -1
  242. package/dist/chunk-WH7PYHZY.cjs +0 -35
  243. package/dist/chunk-WH7PYHZY.cjs.map +0 -1
  244. package/dist/chunk-WYH4TKS5.js.map +0 -1
  245. package/dist/chunk-XEX2AEZK.cjs.map +0 -1
  246. package/dist/chunk-XPTVHPCN.js +0 -2320
  247. package/dist/chunk-XPTVHPCN.js.map +0 -1
  248. package/dist/chunk-XWPDRMZG.js +0 -62
  249. package/dist/chunk-XWPDRMZG.js.map +0 -1
  250. package/dist/chunk-Y26OHHMX.js.map +0 -1
  251. package/dist/chunk-YJ6C3EKW.js.map +0 -1
  252. package/dist/motion-C651Ry6d.d.cts +0 -832
  253. package/dist/motion-C651Ry6d.d.ts +0 -832
  254. package/dist/report/index.css +0 -1239
  255. package/dist/report/index.css.map +0 -1
  256. /package/dist/{chunk-6UNG76Y2.js.map → chunk-2VVRZBUR.cjs.map} +0 -0
  257. /package/dist/{chunk-YTYDQBVY.cjs.map → chunk-K526GN7P.js.map} +0 -0
@@ -1,21 +1,21 @@
1
1
  'use strict';
2
2
 
3
- var chunkECXBTUH6_cjs = require('./chunk-ECXBTUH6.cjs');
4
- var chunkVC5LMUVQ_cjs = require('./chunk-VC5LMUVQ.cjs');
5
3
  var chunkVM7WFMKI_cjs = require('./chunk-VM7WFMKI.cjs');
6
- var chunkBJZ2DKS5_cjs = require('./chunk-BJZ2DKS5.cjs');
4
+ var chunkSGYXYMKZ_cjs = require('./chunk-SGYXYMKZ.cjs');
5
+ var chunkVC5LMUVQ_cjs = require('./chunk-VC5LMUVQ.cjs');
6
+ var chunk6QIQCUYC_cjs = require('./chunk-6QIQCUYC.cjs');
7
7
  var chunkLJADZITX_cjs = require('./chunk-LJADZITX.cjs');
8
- var React9 = require('react');
9
- var clsx9 = require('clsx');
8
+ var React6 = require('react');
9
+ var clsx4 = require('clsx');
10
10
  var lucideReact = require('lucide-react');
11
11
  var jsxRuntime = require('react/jsx-runtime');
12
12
 
13
13
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
14
14
 
15
- var React9__default = /*#__PURE__*/_interopDefault(React9);
16
- var clsx9__default = /*#__PURE__*/_interopDefault(clsx9);
15
+ var React6__default = /*#__PURE__*/_interopDefault(React6);
16
+ var clsx4__default = /*#__PURE__*/_interopDefault(clsx4);
17
17
 
18
- var ArticleCard = React9.forwardRef(
18
+ var ArticleCard = React6.forwardRef(
19
19
  ({
20
20
  href,
21
21
  title,
@@ -42,7 +42,7 @@ var ArticleCard = React9.forwardRef(
42
42
  ref,
43
43
  href,
44
44
  context: "article-card",
45
- className: clsx9__default.default(
45
+ className: clsx4__default.default(
46
46
  "ds-article-card",
47
47
  `ds-article-card--${variant}`,
48
48
  !imageUrl && "ds-article-card--no-image",
@@ -94,66 +94,60 @@ var ArticleCard = React9.forwardRef(
94
94
  }
95
95
  );
96
96
  ArticleCard.displayName = "ArticleCard";
97
- var ArticleLayout = React9.forwardRef(
97
+ var BrowserFrame = React6.forwardRef(
98
98
  ({
99
+ variant = "browser",
99
100
  children,
100
- title,
101
- author,
102
- date,
103
- heroImage,
104
- sidebar,
101
+ url,
102
+ showControls,
103
+ withGlow = false,
104
+ aspectRatio = "16/9",
105
105
  className,
106
106
  ...props
107
107
  }, ref) => {
108
- const { track } = chunkVC5LMUVQ_cjs.useAnalytics();
109
- React9__default.default.useEffect(() => {
110
- let maxScroll = 0;
111
- const handleScroll = () => {
112
- const docHeight = document.documentElement.scrollHeight - window.innerHeight;
113
- if (docHeight > 0) {
114
- const scrollPercent = Math.round(window.scrollY / docHeight * 100);
115
- if (scrollPercent > maxScroll) {
116
- maxScroll = scrollPercent;
117
- if (maxScroll === 25) track("article_scroll", { milestone: 25 });
118
- if (maxScroll === 50) track("article_scroll", { milestone: 50 });
119
- if (maxScroll === 75) track("article_scroll", { milestone: 75 });
120
- if (maxScroll === 100) track("article_scroll", { milestone: 100 });
121
- }
122
- }
123
- };
124
- window.addEventListener("scroll", handleScroll, { passive: true });
125
- return () => window.removeEventListener("scroll", handleScroll);
126
- }, [track]);
108
+ const hasControls = showControls ?? (variant === "browser" || variant === "app");
127
109
  return /* @__PURE__ */ jsxRuntime.jsxs(
128
- "article",
110
+ "div",
129
111
  {
130
112
  ref,
131
- className: clsx9__default.default("ds-article-layout", className),
113
+ className: clsx4__default.default(
114
+ "ds-browser-frame",
115
+ `ds-browser-frame--${variant}`,
116
+ withGlow && "ds-browser-frame--glow",
117
+ className
118
+ ),
132
119
  ...props,
133
120
  children: [
134
- /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "ds-article-layout__header", children: [
135
- /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "ds-article-layout__title", children: title }),
136
- (author || date) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-article-layout__meta", children: [
137
- author && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-article-layout__author", children: author }),
138
- author && date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-article-layout__dot", "aria-hidden": "true", children: "\u2022" }),
139
- date && /* @__PURE__ */ jsxRuntime.jsx("time", { className: "ds-article-layout__date", children: date })
121
+ variant !== "minimal" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-browser-frame__chrome", children: [
122
+ hasControls && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-browser-frame__controls", "aria-hidden": "true", children: [
123
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-browser-frame__dot ds-browser-frame__dot--red" }),
124
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-browser-frame__dot ds-browser-frame__dot--yellow" }),
125
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-browser-frame__dot ds-browser-frame__dot--green" })
126
+ ] }),
127
+ variant === "browser" && url && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-browser-frame__url-bar", children: [
128
+ /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", className: "ds-browser-frame__lock", children: [
129
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 5V4a3 3 0 116 0v1", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round" }),
130
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "2", y: "5", width: "8", height: "6", rx: "1.5", stroke: "currentColor", strokeWidth: "1.2" })
131
+ ] }),
132
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-browser-frame__url-text", children: url })
140
133
  ] })
141
134
  ] }),
142
- heroImage && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-article-layout__hero", children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: heroImage, alt: "", "aria-hidden": "true" }) }),
143
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: clsx9__default.default(
144
- "ds-article-layout__body",
145
- sidebar && "ds-article-layout__body--with-sidebar"
146
- ), children: [
147
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-article-layout__content ds-prose", children }),
148
- sidebar && /* @__PURE__ */ jsxRuntime.jsx("aside", { className: "ds-article-layout__sidebar", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-article-layout__sidebar-inner", children: sidebar }) })
149
- ] })
135
+ /* @__PURE__ */ jsxRuntime.jsx(
136
+ "div",
137
+ {
138
+ className: "ds-browser-frame__content",
139
+ style: aspectRatio !== "auto" ? { aspectRatio } : void 0,
140
+ children
141
+ }
142
+ ),
143
+ variant === "mobile" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-browser-frame__notch", "aria-hidden": "true" })
150
144
  ]
151
145
  }
152
146
  );
153
147
  }
154
148
  );
155
- ArticleLayout.displayName = "ArticleLayout";
156
- var AuthorBio = React9.forwardRef(
149
+ BrowserFrame.displayName = "BrowserFrame";
150
+ var AuthorBio = React6.forwardRef(
157
151
  ({
158
152
  name,
159
153
  role,
@@ -169,7 +163,7 @@ var AuthorBio = React9.forwardRef(
169
163
  "div",
170
164
  {
171
165
  ref,
172
- className: clsx9__default.default("ds-author-bio", `ds-author-bio--${variant}`, className),
166
+ className: clsx4__default.default("ds-author-bio", `ds-author-bio--${variant}`, className),
173
167
  ...props,
174
168
  children: [
175
169
  /* @__PURE__ */ jsxRuntime.jsxs(chunkVM7WFMKI_cjs.Avatar, { size: variant === "compact" ? "sm" : variant === "longform" ? "lg" : "md", className: "ds-author-bio__avatar", children: [
@@ -200,7 +194,7 @@ var AuthorBio = React9.forwardRef(
200
194
  }
201
195
  );
202
196
  AuthorBio.displayName = "AuthorBio";
203
- var TableOfContents = React9.forwardRef(
197
+ var TableOfContents = React6.forwardRef(
204
198
  ({
205
199
  items,
206
200
  activeId: controlledActiveId,
@@ -210,12 +204,12 @@ var TableOfContents = React9.forwardRef(
210
204
  className,
211
205
  ...props
212
206
  }, ref) => {
213
- const t = chunkECXBTUH6_cjs.useMessage();
207
+ const t = chunkSGYXYMKZ_cjs.useMessage();
214
208
  const defaultLabel = t({ id: "ds.toc.label", defaultMessage: "On this page" });
215
209
  const finalLabel = label || defaultLabel;
216
- const [observedActiveId, setObservedActiveId] = React9.useState("");
210
+ const [observedActiveId, setObservedActiveId] = React6.useState("");
217
211
  const activeId = controlledActiveId ?? observedActiveId;
218
- React9.useEffect(() => {
212
+ React6.useEffect(() => {
219
213
  if (controlledActiveId !== void 0) return;
220
214
  if (items.length === 0) return;
221
215
  const handleScroll = () => {
@@ -255,7 +249,7 @@ var TableOfContents = React9.forwardRef(
255
249
  "nav",
256
250
  {
257
251
  ref,
258
- className: clsx9__default.default("ds-toc", `ds-toc--${position}`, className),
252
+ className: clsx4__default.default("ds-toc", `ds-toc--${position}`, className),
259
253
  "aria-label": finalLabel,
260
254
  ...props,
261
255
  children: [
@@ -264,7 +258,7 @@ var TableOfContents = React9.forwardRef(
264
258
  "button",
265
259
  {
266
260
  type: "button",
267
- className: clsx9__default.default(
261
+ className: clsx4__default.default(
268
262
  "ds-toc__link",
269
263
  activeId === item.id && "ds-toc__link--active"
270
264
  ),
@@ -278,7 +272,7 @@ var TableOfContents = React9.forwardRef(
278
272
  }
279
273
  );
280
274
  TableOfContents.displayName = "TableOfContents";
281
- var RelatedContent = React9.forwardRef(
275
+ var RelatedContent = React6.forwardRef(
282
276
  ({
283
277
  eyebrow,
284
278
  title = "Related Articles",
@@ -290,14 +284,14 @@ var RelatedContent = React9.forwardRef(
290
284
  const visibleItems = maxVisible ? items.slice(0, maxVisible) : items;
291
285
  if (visibleItems.length === 0) return null;
292
286
  return /* @__PURE__ */ jsxRuntime.jsxs(
293
- chunkBJZ2DKS5_cjs.SectionShell,
287
+ chunk6QIQCUYC_cjs.SectionShell,
294
288
  {
295
289
  ref,
296
- className: clsx9__default.default("ds-related-content", className),
290
+ className: clsx4__default.default("ds-related-content", className),
297
291
  background: "muted",
298
292
  ...props,
299
293
  children: [
300
- /* @__PURE__ */ jsxRuntime.jsx(chunkBJZ2DKS5_cjs.SectionHeader, { eyebrow, title }),
294
+ /* @__PURE__ */ jsxRuntime.jsx(chunk6QIQCUYC_cjs.SectionHeader, { eyebrow, title }),
301
295
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-related-content__grid", children: visibleItems.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx(ArticleCard, { ...item }, i)) })
302
296
  ]
303
297
  }
@@ -305,44 +299,20 @@ var RelatedContent = React9.forwardRef(
305
299
  }
306
300
  );
307
301
  RelatedContent.displayName = "RelatedContent";
308
- var LongFormLayout = React9__default.default.forwardRef(
302
+ var LongFormLayout = React6__default.default.forwardRef(
309
303
  ({ children, sidebar, className, ...props }, ref) => {
310
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: clsx9__default.default("ds-longform-layout", className), ...props, children: [
304
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: clsx4__default.default("ds-longform-layout", className), ...props, children: [
311
305
  /* @__PURE__ */ jsxRuntime.jsx("article", { className: "ds-longform-layout__main", children }),
312
306
  sidebar && /* @__PURE__ */ jsxRuntime.jsx("aside", { className: "ds-longform-layout__sidebar", children: sidebar })
313
307
  ] });
314
308
  }
315
309
  );
316
310
  LongFormLayout.displayName = "LongFormLayout";
317
- var InsightCallout = React9__default.default.forwardRef(
318
- ({ children, icon, title, className, ...props }, ref) => {
319
- return /* @__PURE__ */ jsxRuntime.jsxs("aside", { ref, className: clsx9__default.default("ds-insight-callout", className), ...props, children: [
320
- icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-insight-callout__icon", children: icon }),
321
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-insight-callout__content", children: [
322
- title && /* @__PURE__ */ jsxRuntime.jsx("h5", { className: "ds-insight-callout__title", children: title }),
323
- children
324
- ] })
325
- ] });
326
- }
327
- );
328
- InsightCallout.displayName = "InsightCallout";
329
- var DataHighlight = React9__default.default.forwardRef(
330
- ({ stat, label, children, className, ...props }, ref) => {
331
- return /* @__PURE__ */ jsxRuntime.jsxs("figure", { ref, className: clsx9__default.default("ds-data-highlight", className), ...props, children: [
332
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-data-highlight__stat-group", children: [
333
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-data-highlight__stat", children: stat }),
334
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-data-highlight__label", children: label })
335
- ] }),
336
- children && /* @__PURE__ */ jsxRuntime.jsx("figcaption", { className: "ds-data-highlight__caption", children })
337
- ] });
338
- }
339
- );
340
- DataHighlight.displayName = "DataHighlight";
341
- var ReadingProgress = React9__default.default.forwardRef(
311
+ var ReadingProgress = React6__default.default.forwardRef(
342
312
  ({ targetRef, className, ...props }, ref) => {
343
- const [progress, setProgress] = React9.useState(0);
344
- const frameRef = React9.useRef(null);
345
- React9.useEffect(() => {
313
+ const [progress, setProgress] = React6.useState(0);
314
+ const frameRef = React6.useRef(null);
315
+ React6.useEffect(() => {
346
316
  const handleScroll = () => {
347
317
  if (frameRef.current) cancelAnimationFrame(frameRef.current);
348
318
  frameRef.current = requestAnimationFrame(() => {
@@ -386,7 +356,7 @@ var ReadingProgress = React9__default.default.forwardRef(
386
356
  "div",
387
357
  {
388
358
  ref,
389
- className: clsx9__default.default("ds-reading-progress", className),
359
+ className: clsx4__default.default("ds-reading-progress", className),
390
360
  ...props,
391
361
  children: /* @__PURE__ */ jsxRuntime.jsx(
392
362
  "div",
@@ -400,103 +370,13 @@ var ReadingProgress = React9__default.default.forwardRef(
400
370
  }
401
371
  );
402
372
  ReadingProgress.displayName = "ReadingProgress";
403
- var VersionedUpgradeAlert = React9__default.default.forwardRef(
404
- ({ seriesName, viewedYear, latestYear, latestUrl, deltaSummary, className, ...props }, ref) => {
405
- const [dismissed, setDismissed] = React9.useState(false);
406
- if (dismissed) return null;
407
- return /* @__PURE__ */ jsxRuntime.jsxs(
408
- "div",
409
- {
410
- ref,
411
- className: clsx9__default.default("ds-versioned-alert", className),
412
- role: "alert",
413
- ...props,
414
- children: [
415
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-versioned-alert__content", children: [
416
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-versioned-alert__icon", children: "\u26A0\uFE0F" }),
417
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-versioned-alert__text", children: [
418
- /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Outdated Edition:" }),
419
- " You are viewing the ",
420
- viewedYear,
421
- " edition of ",
422
- seriesName,
423
- ". The ",
424
- /* @__PURE__ */ jsxRuntime.jsxs("strong", { children: [
425
- latestYear,
426
- " edition"
427
- ] }),
428
- " is now available.",
429
- deltaSummary && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-versioned-alert__delta", children: [
430
- " ",
431
- deltaSummary
432
- ] })
433
- ] })
434
- ] }),
435
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-versioned-alert__actions", children: [
436
- /* @__PURE__ */ jsxRuntime.jsxs(chunkLJADZITX_cjs.OutboundLink, { href: latestUrl, context: "versioned-alert-view-latest", className: "ds-versioned-alert__button ds-button ds-button--primary ds-button--sm", openInNewTab: false, children: [
437
- "View ",
438
- latestYear,
439
- " Edition"
440
- ] }),
441
- /* @__PURE__ */ jsxRuntime.jsx(
442
- "button",
443
- {
444
- className: "ds-versioned-alert__close",
445
- onClick: () => setDismissed(true),
446
- "aria-label": "Dismiss alert",
447
- children: "\xD7"
448
- }
449
- )
450
- ] })
451
- ]
452
- }
453
- );
454
- }
455
- );
456
- VersionedUpgradeAlert.displayName = "VersionedUpgradeAlert";
457
- var VersionedSeriesNavigator = React9__default.default.forwardRef(
458
- ({ seriesName, hubUrl, editions, className, ...props }, ref) => {
459
- const sortedEditions = [...editions].sort((a, b) => a.year - b.year);
460
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: clsx9__default.default("ds-versioned-navigator", className), ...props, children: [
461
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-versioned-navigator__header", children: [
462
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-versioned-navigator__label", children: "Series" }),
463
- /* @__PURE__ */ jsxRuntime.jsxs(chunkLJADZITX_cjs.OutboundLink, { href: hubUrl, context: "versioned-navigator-hub", className: "ds-versioned-navigator__title", openInNewTab: false, children: [
464
- seriesName,
465
- " Hub"
466
- ] })
467
- ] }),
468
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-versioned-navigator__timeline", children: sortedEditions.map((edition, idx) => /* @__PURE__ */ jsxRuntime.jsxs(React9__default.default.Fragment, { children: [
469
- idx > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-versioned-navigator__connector" }),
470
- /* @__PURE__ */ jsxRuntime.jsx(
471
- chunkLJADZITX_cjs.OutboundLink,
472
- {
473
- href: edition.url,
474
- context: "versioned-navigator-edition",
475
- className: clsx9__default.default(
476
- "ds-versioned-navigator__node",
477
- edition.isCurrent && "ds-versioned-navigator__node--active"
478
- ),
479
- "aria-current": edition.isCurrent ? "page" : void 0,
480
- openInNewTab: false,
481
- children: edition.year
482
- }
483
- )
484
- ] }, edition.year)) })
485
- ] });
486
- }
487
- );
488
- VersionedSeriesNavigator.displayName = "VersionedSeriesNavigator";
489
373
 
490
374
  exports.ArticleCard = ArticleCard;
491
- exports.ArticleLayout = ArticleLayout;
492
375
  exports.AuthorBio = AuthorBio;
493
- exports.DataHighlight = DataHighlight;
494
- exports.InsightCallout = InsightCallout;
376
+ exports.BrowserFrame = BrowserFrame;
495
377
  exports.LongFormLayout = LongFormLayout;
496
378
  exports.ReadingProgress = ReadingProgress;
497
379
  exports.RelatedContent = RelatedContent;
498
380
  exports.TableOfContents = TableOfContents;
499
- exports.VersionedSeriesNavigator = VersionedSeriesNavigator;
500
- exports.VersionedUpgradeAlert = VersionedUpgradeAlert;
501
381
  //# sourceMappingURL=out.js.map
502
- //# sourceMappingURL=chunk-XEX2AEZK.cjs.map
382
+ //# sourceMappingURL=chunk-65DTHLVX.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ArticleCard/ArticleCard.tsx","../src/components/BrowserFrame/BrowserFrame.tsx","../src/components/AuthorBio/AuthorBio.tsx","../src/components/TableOfContents/TableOfContents.tsx","../src/components/RelatedContent/RelatedContent.tsx","../src/components/LongFormLayout/LongFormLayout.tsx","../src/components/ReadingProgress/ReadingProgress.tsx"],"names":["forwardRef","clsx","jsx","jsxs","React","useEffect","useState"],"mappings":"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","sourcesContent":["import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { useAnalytics } from '../../web/analytics/use-analytics';\nimport { ArrowRight, Clock, FileText } from 'lucide-react';\nimport { OutboundLink } from '../OutboundLink/OutboundLink';\nimport './ArticleCard.css';\n\nexport interface ArticleCardProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\n /** Target URL */\n href: string;\n /** Article title */\n title: string;\n /** Short excerpt or description */\n excerpt: string;\n /** Image URL for the thumbnail */\n imageUrl?: string;\n /** Image alt text */\n imageAlt?: string;\n /** Category or tag label */\n category?: string;\n /** Publication date */\n date?: string;\n /** Reading time in minutes */\n readingTime?: number;\n /** Author name */\n author?: string;\n /** Variant for different grid layouts */\n variant?: 'vertical' | 'horizontal' | 'featured';\n}\n\n/**\n * Standardized card for blog posts, resources, and case studies.\n * Acts as a block-level link.\n */\nexport const ArticleCard = forwardRef<HTMLAnchorElement, ArticleCardProps>(\n (\n {\n href,\n title,\n excerpt,\n imageUrl,\n imageAlt = '',\n category,\n date,\n readingTime,\n author,\n variant = 'vertical',\n className,\n onClick,\n ...props\n },\n ref\n ) => {\n const { track } = useAnalytics();\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n track('article_click', { url: href, title, category });\n if (onClick) onClick(e);\n };\n\n return (\n <OutboundLink\n ref={ref}\n href={href}\n context=\"article-card\"\n className={clsx(\n 'ds-article-card',\n `ds-article-card--${variant}`,\n !imageUrl && 'ds-article-card--no-image',\n className\n )}\n onClick={handleClick}\n {...props}\n >\n {imageUrl ? (\n <div className=\"ds-article-card__image-wrapper\">\n <img \n src={imageUrl} \n alt={imageAlt} \n className=\"ds-article-card__image\" \n loading=\"lazy\" \n />\n {category && (\n <span className=\"ds-article-card__category-badge\">{category}</span>\n )}\n </div>\n ) : (\n <div className=\"ds-article-card__placeholder\">\n <FileText className=\"ds-article-card__placeholder-icon\" aria-hidden=\"true\" />\n {category && (\n <span className=\"ds-article-card__category-badge\">{category}</span>\n )}\n </div>\n )}\n \n <div className=\"ds-article-card__content\">\n \n <h3 className=\"ds-article-card__title\">{title}</h3>\n <p className=\"ds-article-card__excerpt\">{excerpt}</p>\n \n <div className=\"ds-article-card__meta\">\n {(date || author) && (\n <div className=\"ds-article-card__meta-primary\">\n {author && <span className=\"ds-article-card__author\">{author}</span>}\n {author && date && <span className=\"ds-article-card__dot\" aria-hidden=\"true\">•</span>}\n {date && <time dateTime={date} className=\"ds-article-card__date\">{date}</time>}\n </div>\n )}\n \n {readingTime && (\n <div className=\"ds-article-card__meta-secondary\">\n <Clock size={14} aria-hidden=\"true\" />\n <span>{readingTime} min read</span>\n </div>\n )}\n </div>\n \n <div className=\"ds-article-card__footer\">\n <span className=\"ds-article-card__read-more\">\n Read article\n <ArrowRight size={16} className=\"ds-article-card__arrow\" />\n </span>\n </div>\n </div>\n </OutboundLink>\n );\n }\n);\n\nArticleCard.displayName = 'ArticleCard';\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport './BrowserFrame.css';\n\n/* ============================================================================\n BROWSER FRAME\n ============================================================================\n Realistic browser/device mockup frame for product screenshots and videos.\n Makes static screenshots feel like live product demos.\n\n Strategic objective: Trust (product visualization builds desire)\n ============================================================================ */\n\nexport interface BrowserFrameProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Frame type */\n variant?: 'browser' | 'app' | 'mobile' | 'minimal';\n /** Content to frame (image, video, or React element) */\n children: React.ReactNode;\n /** Optional URL bar text */\n url?: string;\n /** Show traffic light dots (default: true for browser/app) */\n showControls?: boolean;\n /** Optional glow effect behind frame */\n withGlow?: boolean;\n /** Aspect ratio */\n aspectRatio?: '16/9' | '4/3' | '3/2' | 'auto';\n}\n\n/**\n * Device mockup frame for product screenshots.\n *\n * @example\n * ```tsx\n * <BrowserFrame variant=\"browser\" url=\"app.sales-mind.ai\" withGlow>\n * <img src=\"/screenshot.png\" alt=\"SalesMind dashboard\" />\n * </BrowserFrame>\n * ```\n */\nexport const BrowserFrame = forwardRef<HTMLDivElement, BrowserFrameProps>(\n (\n {\n variant = 'browser',\n children,\n url,\n showControls,\n withGlow = false,\n aspectRatio = '16/9',\n className,\n ...props\n },\n ref,\n ) => {\n const hasControls = showControls ?? (variant === 'browser' || variant === 'app');\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-browser-frame',\n `ds-browser-frame--${variant}`,\n withGlow && 'ds-browser-frame--glow',\n className,\n )}\n {...props}\n >\n {/* Chrome header */}\n {variant !== 'minimal' && (\n <div className=\"ds-browser-frame__chrome\">\n {hasControls && (\n <div className=\"ds-browser-frame__controls\" aria-hidden=\"true\">\n <span className=\"ds-browser-frame__dot ds-browser-frame__dot--red\" />\n <span className=\"ds-browser-frame__dot ds-browser-frame__dot--yellow\" />\n <span className=\"ds-browser-frame__dot ds-browser-frame__dot--green\" />\n </div>\n )}\n {variant === 'browser' && url && (\n <div className=\"ds-browser-frame__url-bar\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\" className=\"ds-browser-frame__lock\">\n <path d=\"M3 5V4a3 3 0 116 0v1\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <rect x=\"2\" y=\"5\" width=\"8\" height=\"6\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n <span className=\"ds-browser-frame__url-text\">{url}</span>\n </div>\n )}\n </div>\n )}\n\n {/* Content area */}\n <div\n className=\"ds-browser-frame__content\"\n style={aspectRatio !== 'auto' ? { aspectRatio } : undefined}\n >\n {children}\n </div>\n\n {/* Mobile notch */}\n {variant === 'mobile' && (\n <div className=\"ds-browser-frame__notch\" aria-hidden=\"true\" />\n )}\n </div>\n );\n },\n);\n\nBrowserFrame.displayName = 'BrowserFrame';\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { Avatar, AvatarImage, AvatarFallback } from '../Avatar/Avatar';\nimport { OutboundLink } from '../OutboundLink/OutboundLink';\nimport './AuthorBio.css';\n\n/* ============================================================================\n AUTHOR BIO\n ============================================================================\n Author biography card for blog posts and articles.\n\n Strategic objective: Authority (expert credibility signal)\n ============================================================================ */\n\n/** Social/external link */\nexport interface AuthorLink {\n /** Link label (e.g., \"Twitter\", \"LinkedIn\") */\n label: string;\n /** Link URL */\n href: string;\n /** Optional icon */\n icon?: React.ReactNode;\n}\n\nexport interface AuthorBioProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Author name */\n name: string;\n /** Author role or title */\n role?: string;\n /** Avatar image URL */\n avatar?: string;\n /** Biography text */\n bio?: string;\n /** External links */\n links?: AuthorLink[];\n /** Layout variant */\n variant?: 'inline' | 'card' | 'compact' | 'longform';\n}\n\n/**\n * Author biography card.\n *\n * @example\n * ```tsx\n * <AuthorBio\n * name=\"Alex Chen\"\n * role=\"Head of Growth at SalesMind AI\"\n * avatar=\"/team/alex.jpg\"\n * bio=\"Alex has 10+ years of experience in B2B growth...\"\n * links={[{ label: 'LinkedIn', href: 'https://linkedin.com/in/alexchen' }]}\n * variant=\"card\"\n * />\n * ```\n */\nexport const AuthorBio = forwardRef<HTMLDivElement, AuthorBioProps>(\n (\n {\n name,\n role,\n avatar,\n bio,\n links,\n variant = 'card',\n className,\n ...props\n },\n ref,\n ) => {\n const initials = name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .slice(0, 2);\n\n return (\n <div\n ref={ref}\n className={clsx('ds-author-bio', `ds-author-bio--${variant}`, className)}\n {...props}\n >\n <Avatar size={variant === 'compact' ? 'sm' : variant === 'longform' ? 'lg' : 'md'} className=\"ds-author-bio__avatar\">\n {avatar && <AvatarImage src={avatar} alt={name} />}\n <AvatarFallback>{initials}</AvatarFallback>\n </Avatar>\n\n <div className=\"ds-author-bio__info\">\n <span className=\"ds-author-bio__name\">{name}</span>\n {role && <span className=\"ds-author-bio__role\">{role}</span>}\n {bio && variant !== 'compact' && (\n <p className=\"ds-author-bio__bio\">{bio}</p>\n )}\n {links && links.length > 0 && variant !== 'compact' && (\n <div className=\"ds-author-bio__links\">\n {links.map((link, i) => (\n <OutboundLink\n key={i}\n href={link.href}\n context=\"author-bio-link\"\n className=\"ds-author-bio__link\"\n >\n {link.icon && <span className=\"ds-author-bio__link-icon\">{link.icon}</span>}\n {link.label}\n </OutboundLink>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nAuthorBio.displayName = 'AuthorBio';\n","import React, { forwardRef, useState, useEffect } from 'react';\nimport clsx from 'clsx';\nimport { useMessage } from '../../i18n';\nimport './TableOfContents.css';\n\n/* ============================================================================\n TABLE OF CONTENTS\n ============================================================================\n Sticky article TOC with active heading detection via IntersectionObserver.\n\n Strategic objective: Distribution (increases article dwell time)\n ============================================================================ */\n\n/** A TOC item mapping to a heading */\nexport interface TOCItem {\n /** Heading element ID */\n id: string;\n /** Heading text */\n title: string;\n /** Heading level (2 = h2, 3 = h3, etc.) */\n level: number;\n}\n\nexport interface TableOfContentsProps extends React.HTMLAttributes<HTMLElement> {\n /** TOC items (typically extracted from article headings) */\n items: TOCItem[];\n /** Currently active heading ID (controlled) */\n activeId?: string;\n /** Position variant */\n position?: 'sidebar' | 'inline' | 'floating';\n /** Label text */\n label?: string;\n /** Callback when an item is clicked */\n onItemClick?: (id: string) => void;\n}\n\n/**\n * Sticky table of contents with active heading tracking.\n *\n * @example\n * ```tsx\n * <TableOfContents\n * items={[\n * { id: 'intro', title: 'Introduction', level: 2 },\n * { id: 'setup', title: 'Getting Started', level: 2 },\n * { id: 'config', title: 'Configuration', level: 3 },\n * ]}\n * position=\"sidebar\"\n * />\n * ```\n */\nexport const TableOfContents = forwardRef<HTMLElement, TableOfContentsProps>(\n (\n {\n items,\n activeId: controlledActiveId,\n position = 'sidebar',\n label,\n onItemClick,\n className,\n ...props\n },\n ref,\n ) => {\n const t = useMessage();\n const defaultLabel = t({ id: 'ds.toc.label', defaultMessage: 'On this page' });\n const finalLabel = label || defaultLabel;\n\n const [observedActiveId, setObservedActiveId] = useState<string>('');\n const activeId = controlledActiveId ?? observedActiveId;\n\n // Auto-detect active heading via Scroll Listener (more robust than IO for long sections)\n useEffect(() => {\n if (controlledActiveId !== undefined) return;\n if (items.length === 0) return;\n\n const handleScroll = () => {\n const headingElements = items\n .map((item) => ({\n id: item.id,\n el: document.getElementById(item.id),\n }))\n .filter((h): h is { id: string; el: HTMLElement } => !!h.el);\n\n if (headingElements.length === 0) return;\n\n // Offset for sticky header\n const topOffset = 120; \n\n // Find the first heading that is clearly below the top offset\n const firstBelowIndex = headingElements.findIndex((h) => {\n const rect = h.el.getBoundingClientRect();\n return rect.top > topOffset;\n });\n\n let newActiveId = '';\n if (firstBelowIndex === -1) {\n // All headings are above the offset -> last one is active\n newActiveId = headingElements[headingElements.length - 1].id;\n } else if (firstBelowIndex === 0) {\n // First heading is below offset -> none active (or first if we want to be generous)\n newActiveId = ''; // Or headingElements[0].id\n } else {\n // The heading immediately before the one that is below is the active one\n newActiveId = headingElements[firstBelowIndex - 1].id;\n }\n\n setObservedActiveId(newActiveId);\n };\n\n window.addEventListener('scroll', handleScroll, { passive: true });\n // Initial check\n handleScroll();\n\n return () => window.removeEventListener('scroll', handleScroll);\n }, [items, controlledActiveId]);\n\n const handleClick = (id: string) => {\n const el = document.getElementById(id);\n if (el) {\n el.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n if (onItemClick) onItemClick(id);\n };\n\n if (items.length === 0) return null;\n\n return (\n <nav\n ref={ref}\n className={clsx('ds-toc', `ds-toc--${position}`, className)}\n aria-label={finalLabel}\n {...props}\n >\n <span className=\"ds-toc__label\">{finalLabel}</span>\n <ul className=\"ds-toc__list\">\n {items.map((item) => (\n <li key={item.id} className=\"ds-toc__item\" style={{ paddingLeft: `${(item.level - 2) * 12}px` }}>\n <button\n type=\"button\"\n className={clsx(\n 'ds-toc__link',\n activeId === item.id && 'ds-toc__link--active',\n )}\n onClick={() => handleClick(item.id)}\n >\n {item.title}\n </button>\n </li>\n ))}\n </ul>\n </nav>\n );\n },\n);\n\nTableOfContents.displayName = 'TableOfContents';\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { SectionShell, type SectionShellProps } from '../SectionShell/SectionShell';\nimport { SectionHeader } from '../SectionShell/SectionShell';\nimport { ArticleCard, type ArticleCardProps } from '../ArticleCard/ArticleCard';\nimport './RelatedContent.css';\n\n/* ============================================================================\n RELATED CONTENT\n ============================================================================\n Related articles/resources section. Drives internal linking and increases\n session duration.\n\n Strategic objective: Distribution (internal linking + session depth)\n ============================================================================ */\n\nexport interface RelatedContentProps extends Omit<SectionShellProps, 'title'> {\n /** Section eyebrow */\n eyebrow?: React.ReactNode;\n /** Section title */\n title?: React.ReactNode;\n /** Related article items (uses ArticleCard props) */\n items: ArticleCardProps[];\n /** Max items to display */\n maxVisible?: number;\n}\n\n/**\n * Related articles section using ArticleCard grid.\n *\n * @example\n * ```tsx\n * <RelatedContent\n * title=\"Related Articles\"\n * items={[\n * { title: 'AI Outreach Guide', href: '/blog/ai-outreach', ... },\n * { title: 'Pipeline Automation', href: '/blog/pipeline', ... },\n * ]}\n * background=\"muted\"\n * />\n * ```\n */\nexport const RelatedContent = forwardRef<HTMLDivElement, RelatedContentProps>(\n (\n {\n eyebrow,\n title = 'Related Articles',\n items,\n maxVisible,\n className,\n ...props\n },\n ref,\n ) => {\n const visibleItems = maxVisible ? items.slice(0, maxVisible) : items;\n\n if (visibleItems.length === 0) return null;\n\n return (\n <SectionShell\n ref={ref}\n className={clsx('ds-related-content', className)}\n background=\"muted\"\n {...props}\n >\n <SectionHeader eyebrow={eyebrow} title={title} />\n\n <div className=\"ds-related-content__grid\">\n {visibleItems.map((item, i) => (\n <ArticleCard key={i} {...item} />\n ))}\n </div>\n </SectionShell>\n );\n },\n);\n\nRelatedContent.displayName = 'RelatedContent';\n","import React from 'react';\nimport clsx from 'clsx';\nimport './LongFormLayout.css';\n\nexport interface LongFormLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Pass the TOC element here to render as a sticky sidebar on desktop */\n sidebar?: React.ReactNode;\n}\n\n/**\n * A layout primitive designed specifically for long-form content (e.g., blog posts, documentation).\n * Enforces maximum reading widths and manages the relationship between the main content and an optional sticky sidebar.\n */\nexport const LongFormLayout = React.forwardRef<HTMLDivElement, LongFormLayoutProps>(\n ({ children, sidebar, className, ...props }, ref) => {\n return (\n <div ref={ref} className={clsx('ds-longform-layout', className)} {...props}>\n <article className=\"ds-longform-layout__main\">{children}</article>\n {sidebar && <aside className=\"ds-longform-layout__sidebar\">{sidebar}</aside>}\n </div>\n );\n }\n);\n\nLongFormLayout.displayName = 'LongFormLayout';\n","import React, { useEffect, useState, useRef } from 'react';\nimport clsx from 'clsx';\nimport './ReadingProgress.css';\n\nexport interface ReadingProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Reference to the container element whose scroll progress we're tracking */\n targetRef?: React.RefObject<HTMLElement | null>;\n}\n\nexport const ReadingProgress = React.forwardRef<HTMLDivElement, ReadingProgressProps>(\n ({ targetRef, className, ...props }, ref) => {\n const [progress, setProgress] = useState(0);\n const frameRef = useRef<number | null>(null);\n\n useEffect(() => {\n const handleScroll = () => {\n if (frameRef.current) cancelAnimationFrame(frameRef.current);\n\n frameRef.current = requestAnimationFrame(() => {\n let percentage = 0;\n\n if (targetRef && targetRef.current) {\n // Calculate progress relative to the specific container\n const el = targetRef.current;\n const rect = el.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n \n // If top is below viewport, 0%. If bottom is above viewport, 100%.\n if (rect.top > viewportHeight) {\n percentage = 0;\n } else if (rect.bottom < 0) {\n percentage = 100;\n } else {\n const scrollableDistance = rect.height - viewportHeight;\n if (scrollableDistance <= 0) {\n percentage = 100; // Fits entirely on screen\n } else {\n const scrolled = viewportHeight - rect.top;\n percentage = Math.max(0, Math.min(100, (scrolled / scrollableDistance) * 100));\n }\n }\n } else {\n // Fallback to full page scroll\n const scrollPosition = window.scrollY;\n const scrollHeight = document.body.scrollHeight - window.innerHeight;\n percentage = scrollHeight > 0 ? (scrollPosition / scrollHeight) * 100 : 0;\n percentage = Math.max(0, Math.min(100, percentage));\n }\n\n setProgress(percentage);\n });\n };\n\n window.addEventListener('scroll', handleScroll, { passive: true });\n window.addEventListener('resize', handleScroll, { passive: true });\n \n // Initial calculation\n handleScroll();\n\n return () => {\n if (frameRef.current) cancelAnimationFrame(frameRef.current);\n window.removeEventListener('scroll', handleScroll);\n window.removeEventListener('resize', handleScroll);\n };\n }, [targetRef]);\n\n return (\n <div \n ref={ref} \n className={clsx('ds-reading-progress', className)} \n {...props}\n >\n <div \n className=\"ds-reading-progress__bar\" \n style={{ transform: `scaleX(${progress / 100})` }} \n />\n </div>\n );\n }\n);\nReadingProgress.displayName = 'ReadingProgress';\n"]}