@xyd-js/components 0.1.0-build.168

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 (314) hide show
  1. package/.idea/git_toolbox_blame.xml +6 -0
  2. package/.idea/modules.xml +8 -0
  3. package/.idea/vcs.xml +6 -0
  4. package/.idea/xyd-components.iml +12 -0
  5. package/CHANGELOG.md +1369 -0
  6. package/LICENSE +21 -0
  7. package/README.md +3 -0
  8. package/TODO.md +1 -0
  9. package/coder.ts +1 -0
  10. package/content.ts +1 -0
  11. package/dist/Button-BLA2ghHZ.js +2 -0
  12. package/dist/Button-BLA2ghHZ.js.map +1 -0
  13. package/dist/Button-BTJ2hIal.js +2 -0
  14. package/dist/Button-BTJ2hIal.js.map +1 -0
  15. package/dist/Button-r4BCrEjy.js +2 -0
  16. package/dist/Button-r4BCrEjy.js.map +1 -0
  17. package/dist/CodeSample-BZ5tvyWY.js +2 -0
  18. package/dist/CodeSample-BZ5tvyWY.js.map +1 -0
  19. package/dist/CodeSample-BqXDbWdi.js +2 -0
  20. package/dist/CodeSample-BqXDbWdi.js.map +1 -0
  21. package/dist/CodeSample-Cqv86IdN.js +2 -0
  22. package/dist/CodeSample-Cqv86IdN.js.map +1 -0
  23. package/dist/Icon--77MqplU.js +2 -0
  24. package/dist/Icon--77MqplU.js.map +1 -0
  25. package/dist/Icon-DbNmvK_Q.js +2 -0
  26. package/dist/Icon-DbNmvK_Q.js.map +1 -0
  27. package/dist/Icon-uVIU1LW6.js +2 -0
  28. package/dist/Icon-uVIU1LW6.js.map +1 -0
  29. package/dist/PageFirstSlide-BDNmCTiJ.js +2 -0
  30. package/dist/PageFirstSlide-BDNmCTiJ.js.map +1 -0
  31. package/dist/PageFirstSlide-BpZ42bEU.js +2 -0
  32. package/dist/PageFirstSlide-BpZ42bEU.js.map +1 -0
  33. package/dist/PageFirstSlide-CqxiyK57.js +2 -0
  34. package/dist/PageFirstSlide-CqxiyK57.js.map +1 -0
  35. package/dist/TabsAnalytics-B_JYpawG.js +2 -0
  36. package/dist/TabsAnalytics-B_JYpawG.js.map +1 -0
  37. package/dist/TabsAnalytics-DAOfTZgv.js +2 -0
  38. package/dist/TabsAnalytics-DAOfTZgv.js.map +1 -0
  39. package/dist/TabsAnalytics-Dhyadlbu.js +2 -0
  40. package/dist/TabsAnalytics-Dhyadlbu.js.map +1 -0
  41. package/dist/Update-53fEhmjh.js +2 -0
  42. package/dist/Update-53fEhmjh.js.map +1 -0
  43. package/dist/Update-CFi6uapq.js +2 -0
  44. package/dist/Update-CFi6uapq.js.map +1 -0
  45. package/dist/Update-CiMIOgZi.js +2 -0
  46. package/dist/Update-CiMIOgZi.js.map +1 -0
  47. package/dist/VideoGuide-C0K9fFar.js +2 -0
  48. package/dist/VideoGuide-C0K9fFar.js.map +1 -0
  49. package/dist/VideoGuide-CJYkuLst.js +2 -0
  50. package/dist/VideoGuide-CJYkuLst.js.map +1 -0
  51. package/dist/VideoGuide-DBY-EyxG.js +2 -0
  52. package/dist/VideoGuide-DBY-EyxG.js.map +1 -0
  53. package/dist/_rollupPluginBabelHelpers-CvhQFv1t.js +4 -0
  54. package/dist/_rollupPluginBabelHelpers-CvhQFv1t.js.map +1 -0
  55. package/dist/_rollupPluginBabelHelpers-DSwDY1Dm.js +4 -0
  56. package/dist/_rollupPluginBabelHelpers-DSwDY1Dm.js.map +1 -0
  57. package/dist/_rollupPluginBabelHelpers-Dc-ocx4G.js +4 -0
  58. package/dist/_rollupPluginBabelHelpers-Dc-ocx4G.js.map +1 -0
  59. package/dist/coder/themes/classic.css +57 -0
  60. package/dist/coder/themes/classic.d.ts +96 -0
  61. package/dist/coder/themes/classic.js +2 -0
  62. package/dist/coder/themes/classic.js.map +1 -0
  63. package/dist/coder/themes/cosmo.css +64 -0
  64. package/dist/coder/themes/cosmo.d.ts +96 -0
  65. package/dist/coder/themes/cosmo.js +2 -0
  66. package/dist/coder/themes/cosmo.js.map +1 -0
  67. package/dist/coder.d.ts +94 -0
  68. package/dist/coder.js +2 -0
  69. package/dist/coder.js.map +1 -0
  70. package/dist/content.d.ts +411 -0
  71. package/dist/content.js +2 -0
  72. package/dist/content.js.map +1 -0
  73. package/dist/index.css +282 -0
  74. package/dist/index.d.ts +2 -0
  75. package/dist/index.js +2 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/layouts.d.ts +33 -0
  78. package/dist/layouts.js +2 -0
  79. package/dist/layouts.js.map +1 -0
  80. package/dist/pages.d.ts +176 -0
  81. package/dist/pages.js +2 -0
  82. package/dist/pages.js.map +1 -0
  83. package/dist/system.d.ts +45 -0
  84. package/dist/system.js +2 -0
  85. package/dist/system.js.map +1 -0
  86. package/dist/useUXClick-DK3cTAMR.js +2 -0
  87. package/dist/useUXClick-DK3cTAMR.js.map +1 -0
  88. package/dist/useUXClick-DO6qBcRy.js +2 -0
  89. package/dist/useUXClick-DO6qBcRy.js.map +1 -0
  90. package/dist/useUXClick-NwpsiuK9.js +2 -0
  91. package/dist/useUXClick-NwpsiuK9.js.map +1 -0
  92. package/dist/useUXEvents-CJtgGV4R.js +2 -0
  93. package/dist/useUXEvents-CJtgGV4R.js.map +1 -0
  94. package/dist/useUXEvents-Cxgl7xb-.js +2 -0
  95. package/dist/useUXEvents-Cxgl7xb-.js.map +1 -0
  96. package/dist/useUXEvents-XqAGxoEj.js +2 -0
  97. package/dist/useUXEvents-XqAGxoEj.js.map +1 -0
  98. package/dist/useUXScrollDepth-3rk3Z95r.js +2 -0
  99. package/dist/useUXScrollDepth-3rk3Z95r.js.map +1 -0
  100. package/dist/useUXScrollDepth-BwK-XOBg.js +2 -0
  101. package/dist/useUXScrollDepth-BwK-XOBg.js.map +1 -0
  102. package/dist/useUXScrollDepth-DKre7PBz.js +2 -0
  103. package/dist/useUXScrollDepth-DKre7PBz.js.map +1 -0
  104. package/dist/uxsdk.d.ts +53 -0
  105. package/dist/uxsdk.js +2 -0
  106. package/dist/uxsdk.js.map +1 -0
  107. package/dist/views.d.ts +18 -0
  108. package/dist/views.js +2 -0
  109. package/dist/views.js.map +1 -0
  110. package/dist/writer.d.ts +580 -0
  111. package/dist/writer.js +2 -0
  112. package/dist/writer.js.map +1 -0
  113. package/docs/.nojekyll +1 -0
  114. package/docs/assets/hierarchy.js +1 -0
  115. package/docs/assets/highlight.css +22 -0
  116. package/docs/assets/icons.js +18 -0
  117. package/docs/assets/icons.svg +1 -0
  118. package/docs/assets/main.js +60 -0
  119. package/docs/assets/navigation.js +1 -0
  120. package/docs/assets/search.js +1 -0
  121. package/docs/assets/style.css +1640 -0
  122. package/docs/functions/GuideCard.html +6 -0
  123. package/docs/hierarchy.html +1 -0
  124. package/docs/index.html +2 -0
  125. package/docs/interfaces/GuideCardProps.html +18 -0
  126. package/docs/modules.html +1 -0
  127. package/index.ts +0 -0
  128. package/layouts.ts +1 -0
  129. package/output.txt +13 -0
  130. package/package.json +81 -0
  131. package/pages.ts +1 -0
  132. package/postcss.config.cjs +5 -0
  133. package/rollup.config.js +195 -0
  134. package/src/coder/Code/Code.styles.tsx +151 -0
  135. package/src/coder/Code/Code.tsx +171 -0
  136. package/src/coder/Code/CodeLoader.tsx +10 -0
  137. package/src/coder/Code/annotations.tsx +51 -0
  138. package/src/coder/Code/highlight.ts +208 -0
  139. package/src/coder/Code/index.ts +16 -0
  140. package/src/coder/CodeCopy/CodeCopy.styles.tsx +21 -0
  141. package/src/coder/CodeCopy/CodeCopy.tsx +36 -0
  142. package/src/coder/CodeCopy/index.ts +7 -0
  143. package/src/coder/CodeSample/CodeSample.tsx +118 -0
  144. package/src/coder/CodeSample/CodeSampleAnalytics.tsx +112 -0
  145. package/src/coder/CodeSample/index.ts +11 -0
  146. package/src/coder/CodeSample/withLocalStored.tsx +50 -0
  147. package/src/coder/CodeTabs/CodeTabs.styles.tsx +126 -0
  148. package/src/coder/CodeTabs/CodeTabs.tsx +128 -0
  149. package/src/coder/CodeTabs/index.ts +6 -0
  150. package/src/coder/CodeTheme/CodeTheme.tsx +126 -0
  151. package/src/coder/CodeTheme/index.ts +7 -0
  152. package/src/coder/CoderProvider.tsx +26 -0
  153. package/src/coder/README.md +1 -0
  154. package/src/coder/hooks/highlight.ts +182 -0
  155. package/src/coder/index.ts +37 -0
  156. package/src/coder/themes/classic.css +57 -0
  157. package/src/coder/themes/classic.ts +270 -0
  158. package/src/coder/themes/cosmo.css +64 -0
  159. package/src/coder/themes/cosmo.ts +264 -0
  160. package/src/content/AppearanceDecorator.styles.tsx +11 -0
  161. package/src/content/ContentDecoator.styles.tsx +180 -0
  162. package/src/content/ContentDecorator.tsx +17 -0
  163. package/src/content/GridDecorator.styles.tsx +86 -0
  164. package/src/content/GridDecorator.tsx +23 -0
  165. package/src/content/ReactContent.tsx +671 -0
  166. package/src/content/TODO.md +1 -0
  167. package/src/content/index.ts +13 -0
  168. package/src/kit/Loader/Loader.styles.tsx +53 -0
  169. package/src/kit/Loader/Loader.tsx +22 -0
  170. package/src/kit/TODO.md +2 -0
  171. package/src/kit/index.ts +1 -0
  172. package/src/layouts/LayoutPrimary/LayoutPrimary.styles.tsx +325 -0
  173. package/src/layouts/LayoutPrimary/LayoutPrimary.tsx +252 -0
  174. package/src/layouts/LayoutPrimary/index.ts +3 -0
  175. package/src/layouts/index.ts +6 -0
  176. package/src/pages/PageBlogHome/PageBlogHome.styles.tsx +67 -0
  177. package/src/pages/PageBlogHome/PageBlogHome.tsx +64 -0
  178. package/src/pages/PageBlogHome/index.ts +3 -0
  179. package/src/pages/PageBlogHome/types.ts +35 -0
  180. package/src/pages/PageBlogPost/PageBlogPost.styles.tsx +4 -0
  181. package/src/pages/PageBlogPost/PageBlogPost.tsx +9 -0
  182. package/src/pages/PageBlogPost/index.ts +3 -0
  183. package/src/pages/PageFirstSlide/PageFirstSlide.styles.tsx +134 -0
  184. package/src/pages/PageFirstSlide/PageFirstSlide.tsx +56 -0
  185. package/src/pages/PageFirstSlide/index.ts +1 -0
  186. package/src/pages/PageFirstSlide/types.ts +67 -0
  187. package/src/pages/PageHome/PageHome.styles.tsx +51 -0
  188. package/src/pages/PageHome/PageHome.tsx +62 -0
  189. package/src/pages/PageHome/index.ts +3 -0
  190. package/src/pages/PageHome/types.ts +79 -0
  191. package/src/pages/index.ts +7 -0
  192. package/src/system/Baseline/Baseline.styles.tsx +128 -0
  193. package/src/system/Baseline/Baseline.tsx +40 -0
  194. package/src/system/Baseline/bun.svg +1 -0
  195. package/src/system/Baseline/check.svg +1 -0
  196. package/src/system/Baseline/index.ts +1 -0
  197. package/src/system/Baseline/logo.svg +1 -0
  198. package/src/system/Baseline/node.svg +7 -0
  199. package/src/system/Baseline/npm.svg +5 -0
  200. package/src/system/Baseline/pnpm.svg +1 -0
  201. package/src/system/Footer/Footer.styles.tsx +213 -0
  202. package/src/system/Footer/Footer.tsx +105 -0
  203. package/src/system/Footer/index.ts +1 -0
  204. package/src/system/SearchButton/SearchButton.styles.tsx +89 -0
  205. package/src/system/SearchButton/SearchButton.tsx +118 -0
  206. package/src/system/SearchButton/index.ts +1 -0
  207. package/src/system/index.ts +3 -0
  208. package/src/utils/useStyle.ts +19 -0
  209. package/src/uxsdk/const.ts +1 -0
  210. package/src/uxsdk/index.ts +21 -0
  211. package/src/uxsdk/useUXClick.ts +21 -0
  212. package/src/uxsdk/useUXEvents.ts +105 -0
  213. package/src/uxsdk/useUXScrollDepth.ts +49 -0
  214. package/src/uxsdk/useUXUnreachableElementTracker.ts +100 -0
  215. package/src/views/HomeView/HomeView.styles.tsx +37 -0
  216. package/src/views/HomeView/HomeView.tsx +34 -0
  217. package/src/views/HomeView/index.ts +3 -0
  218. package/src/writer/Anchor/Anchor.styles.tsx +26 -0
  219. package/src/writer/Anchor/Anchor.tsx +51 -0
  220. package/src/writer/Anchor/index.tsx +1 -0
  221. package/src/writer/Badge/Badge.styles.tsx +44 -0
  222. package/src/writer/Badge/Badge.tsx +47 -0
  223. package/src/writer/Badge/index.ts +7 -0
  224. package/src/writer/Banner/Banner.styles.tsx +111 -0
  225. package/src/writer/Banner/Banner.tsx +151 -0
  226. package/src/writer/Banner/index.ts +1 -0
  227. package/src/writer/Blockquote/Blockquote.styles.tsx +20 -0
  228. package/src/writer/Blockquote/Blockquote.tsx +38 -0
  229. package/src/writer/Blockquote/index.ts +7 -0
  230. package/src/writer/BlogCard/BlogCard.styles.tsx +4 -0
  231. package/src/writer/BlogCard/BlogCard.tsx +9 -0
  232. package/src/writer/BlogCard/index.ts +3 -0
  233. package/src/writer/Breadcrumbs/Breadcrumbs.styles.ts +24 -0
  234. package/src/writer/Breadcrumbs/Breadcrumbs.tsx +57 -0
  235. package/src/writer/Breadcrumbs/index.ts +7 -0
  236. package/src/writer/Button/Button.styles.tsx +149 -0
  237. package/src/writer/Button/Button.tsx +82 -0
  238. package/src/writer/Button/index.ts +2 -0
  239. package/src/writer/Callout/Callout.styles.tsx +102 -0
  240. package/src/writer/Callout/Callout.tsx +166 -0
  241. package/src/writer/Callout/index.tsx +3 -0
  242. package/src/writer/Card/Card.styles.tsx +110 -0
  243. package/src/writer/Card/Card.tsx +94 -0
  244. package/src/writer/Card/index.ts +1 -0
  245. package/src/writer/Code/Code.styles.tsx +16 -0
  246. package/src/writer/Code/Code.tsx +16 -0
  247. package/src/writer/Code/index.ts +3 -0
  248. package/src/writer/ColorSchemeButton/ColorSchemeButton.tsx +191 -0
  249. package/src/writer/ColorSchemeButton/index.ts +1 -0
  250. package/src/writer/Details/Details.styles.tsx +101 -0
  251. package/src/writer/Details/Details.tsx +168 -0
  252. package/src/writer/Details/DetailsProps.tsx +34 -0
  253. package/src/writer/Details/index.ts +6 -0
  254. package/src/writer/GuideCard/GuideCard.styles.tsx +129 -0
  255. package/src/writer/GuideCard/GuideCard.tsx +123 -0
  256. package/src/writer/GuideCard/index.ts +1 -0
  257. package/src/writer/Heading/Heading.styles.tsx +93 -0
  258. package/src/writer/Heading/Heading.tsx +123 -0
  259. package/src/writer/Heading/index.ts +7 -0
  260. package/src/writer/Hr/Hr.styles.tsx +7 -0
  261. package/src/writer/Hr/Hr.tsx +10 -0
  262. package/src/writer/Hr/index.ts +3 -0
  263. package/src/writer/Icon/Icon.styles.tsx +15 -0
  264. package/src/writer/Icon/Icon.tsx +99 -0
  265. package/src/writer/Icon/index.ts +1 -0
  266. package/src/writer/IconSocial/IconSocial.tsx +107 -0
  267. package/src/writer/IconSocial/index.ts +1 -0
  268. package/src/writer/Image/Image.styles.tsx +9 -0
  269. package/src/writer/Image/Image.tsx +35 -0
  270. package/src/writer/Image/index.ts +1 -0
  271. package/src/writer/List/List.styles.tsx +47 -0
  272. package/src/writer/List/List.tsx +29 -0
  273. package/src/writer/List/index.ts +4 -0
  274. package/src/writer/NavLinks/NavLinks.styles.ts +32 -0
  275. package/src/writer/NavLinks/NavLinks.tsx +95 -0
  276. package/src/writer/NavLinks/index.ts +7 -0
  277. package/src/writer/Pre/Pre.styles.tsx +13 -0
  278. package/src/writer/Pre/Pre.tsx +14 -0
  279. package/src/writer/Pre/index.ts +3 -0
  280. package/src/writer/README.md +1 -0
  281. package/src/writer/Steps/Steps.styles.tsx +91 -0
  282. package/src/writer/Steps/Steps.tsx +75 -0
  283. package/src/writer/Steps/index.ts +5 -0
  284. package/src/writer/Table/Table.styles.tsx +100 -0
  285. package/src/writer/Table/Table.tsx +158 -0
  286. package/src/writer/Table/index.ts +3 -0
  287. package/src/writer/Tabs/Tabs.tsx +67 -0
  288. package/src/writer/Tabs/TabsAnalytics.tsx +25 -0
  289. package/src/writer/Tabs/TabsPrimary.styles.tsx +187 -0
  290. package/src/writer/Tabs/TabsPrimary.tsx +215 -0
  291. package/src/writer/Tabs/TabsProps.tsx +13 -0
  292. package/src/writer/Tabs/TabsSecondary.styles.tsx +78 -0
  293. package/src/writer/Tabs/TabsSecondary.tsx +176 -0
  294. package/src/writer/Tabs/index.ts +2 -0
  295. package/src/writer/Tabs/useValueChange.ts +84 -0
  296. package/src/writer/Text/Text.styles.tsx +66 -0
  297. package/src/writer/Text/Text.tsx +79 -0
  298. package/src/writer/Text/index.ts +3 -0
  299. package/src/writer/TocCard/TocCard.module.css +44 -0
  300. package/src/writer/TocCard/TocCard.tsx +42 -0
  301. package/src/writer/TocCard/index.ts +3 -0
  302. package/src/writer/Update/Update.styles.tsx +33 -0
  303. package/src/writer/Update/Update.tsx +37 -0
  304. package/src/writer/Update/index.ts +1 -0
  305. package/src/writer/VideoGuide/VideoGuide.module.css +105 -0
  306. package/src/writer/VideoGuide/VideoGuide.tsx +75 -0
  307. package/src/writer/VideoGuide/index.ts +1 -0
  308. package/src/writer/index.ts +53 -0
  309. package/system.ts +1 -0
  310. package/tsconfig.json +46 -0
  311. package/types.d.ts +52 -0
  312. package/uxsdk.ts +1 -0
  313. package/views.ts +2 -0
  314. package/writer.ts +1 -0
@@ -0,0 +1,53 @@
1
+ import { css } from "@linaria/core";
2
+
3
+ export const LoaderHost = css`
4
+ @keyframes pulse {
5
+ 0%, 80%, 100% {
6
+ transform: scale(0.6);
7
+ opacity: 0.4;
8
+ }
9
+ 40% {
10
+ transform: scale(1);
11
+ opacity: 1;
12
+ }
13
+ }
14
+
15
+ @layer defaults {
16
+ display: inline-flex;
17
+ align-items: center;
18
+ justify-content: center;
19
+
20
+ &[data-size="small"] {
21
+ width: 6px;
22
+ height: 6px;
23
+ }
24
+ &[data-size="large"] {
25
+ width: 12px;
26
+ height: 12px;
27
+ }
28
+
29
+ [part="dots"] {
30
+ display: flex;
31
+ gap: 4px;
32
+ }
33
+
34
+ [part="dot"] {
35
+ width: 8px;
36
+ height: 8px;
37
+ background-color: currentColor;
38
+ border-radius: 50%;
39
+ animation: pulse 1.4s infinite ease-in-out;
40
+ opacity: 0.6;
41
+
42
+ &:nth-of-type(2) {
43
+ animation-delay: 0.2s;
44
+ }
45
+
46
+ &:nth-of-type(3) {
47
+ animation-delay: 0.4s;
48
+ }
49
+ }
50
+ }
51
+ `;
52
+
53
+
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ import * as cn from "./Loader.styles";
3
+
4
+ export interface LoaderProps {
5
+ size?: "small" | "medium" | "large";
6
+ className?: string;
7
+ }
8
+
9
+ export function Loader({size = "medium", className}: LoaderProps) {
10
+ return (
11
+ <xyd-loader
12
+ data-size={size}
13
+ className={` ${cn.LoaderHost} ${className || ""} `}
14
+ >
15
+ <div part="dots">
16
+ <div part="dot"/>
17
+ <div part="dot"/>
18
+ <div part="dot"/>
19
+ </div>
20
+ </xyd-loader>
21
+ );
22
+ }
@@ -0,0 +1,2 @@
1
+ rename to `@xyd-js/components/kit` / `@xyd-js/components/ui-kit` ?
2
+
@@ -0,0 +1 @@
1
+ export * from "./Loader/Loader";
@@ -0,0 +1,325 @@
1
+ import {css} from "@linaria/core";
2
+
3
+ // TODO: in the futre better media queries
4
+ const tabletBreakpoint = '1024px';
5
+ const mobileBreakpoint = '768px';
6
+
7
+ export const LayoutPrimaryHost = css`
8
+ @layer defaults {
9
+ width: 100%;
10
+ overflow-x: hidden;
11
+ background: var(--xyd-page-body-bgcolor);
12
+ display: contents;
13
+
14
+ > [part="header"] {
15
+ display: flex;
16
+ justify-content: space-between;
17
+ align-items: center;
18
+ position: sticky;
19
+ top: 0;
20
+ right: var(--xyd-page-gutter);
21
+ left: var(--xyd-page-gutter);
22
+ height: var(--xyd-nav-height);
23
+ background: var(--xyd-layout-header-bgcolor);
24
+ z-index: 3;
25
+ flex-direction: column;
26
+
27
+ @media (max-width: ${mobileBreakpoint}) {
28
+ padding: 0;
29
+ }
30
+ }
31
+
32
+ &[data-hide-subheader="true"] > [part="header"] {
33
+ transform: translateY(calc(-1 * var(--xyd-nav-height)));
34
+ }
35
+ &[data-hide-subheader="true"] > [part="header"] > [part="header-content"] {
36
+ visibility: hidden;
37
+ }
38
+
39
+ &[data-subheader="true"] > [part="header"] {
40
+ flex-direction: column;
41
+ height: var(--xyd-header-total-height);
42
+ transition: transform 200ms;
43
+ }
44
+
45
+ [part="header-content"] {
46
+ display: flex;
47
+ align-items: center;
48
+ width: 100%;
49
+ }
50
+
51
+ [part="header-subheader"] {
52
+ width: 100%;
53
+ }
54
+
55
+ [part="hamburger-button"] {
56
+ display: none;
57
+
58
+ @media (max-width: ${tabletBreakpoint}) {
59
+ display: flex;
60
+ align-items: center;
61
+ justify-content: center;
62
+ width: 40px;
63
+ height: 40px;
64
+ border: none;
65
+ background: none;
66
+ cursor: pointer;
67
+ padding: 0;
68
+ }
69
+ }
70
+
71
+ [part="hamburger-icon"] {
72
+ width: 24px;
73
+ height: 24px;
74
+ position: relative;
75
+ display: flex;
76
+ flex-direction: column;
77
+ justify-content: space-between;
78
+ }
79
+
80
+ [part="hamburger-line"] {
81
+ width: 100%;
82
+ height: 2px;
83
+ background: var(--xyd-page-body-color);
84
+ transition: transform 0.3s var(--xyd-cubic-bezier);
85
+
86
+ &[data-active="true"] {
87
+ &:first-child {
88
+ transform: translateY(11px) rotate(45deg);
89
+ }
90
+
91
+ &:nth-child(2) {
92
+ opacity: 0;
93
+ }
94
+
95
+ &:last-child {
96
+ transform: translateY(-11px) rotate(-45deg);
97
+ }
98
+ }
99
+ }
100
+
101
+ [part="main"] {
102
+ position: relative;
103
+ display: flex;
104
+ top: 0;
105
+ bottom: 0;
106
+ left: 0;
107
+ right: 0;
108
+ padding: var(--xyd-page-gutter);
109
+ overflow: visible;
110
+ min-height: calc(100vh - (var(--xyd-nav-height) + var(--xyd-banner-height)))
111
+ }
112
+
113
+ [part="sidebar"] {
114
+ flex: none;
115
+ width: var(--xyd-sidebar-width);
116
+ background: var(--xyd-layout-sidebar-bgcolor);
117
+ display: flex;
118
+ flex-direction: column;
119
+ position: relative;
120
+ height: 100%;
121
+
122
+ @media (max-width: ${tabletBreakpoint}) {
123
+ display: none;
124
+ }
125
+ }
126
+
127
+ [part="mobile-sidebar"] {
128
+ display: none;
129
+
130
+ @media (max-width: ${tabletBreakpoint}) {
131
+ display: flex;
132
+ position: fixed;
133
+ top: 0;
134
+ bottom: 0;
135
+ left: 0;
136
+ width: var(--xyd-sidebar-width--mobile);
137
+ background: var(--xyd-layout-sidebar-bgcolor);
138
+ flex-direction: column;
139
+ z-index: 50;
140
+ transform: translateX(-100%);
141
+ transition: transform .3s var(--xyd-cubic-bezier);
142
+ box-shadow: 4px 0 8px rgba(0, 0, 0, 0.1);
143
+ }
144
+
145
+ &[data-active="true"] {
146
+ @media (max-width: ${tabletBreakpoint}) {
147
+ transform: translateX(0);
148
+ }
149
+ }
150
+ }
151
+
152
+ [part="mobile-sidebar-aside"] {
153
+ flex: 1;
154
+ overflow-y: auto;
155
+ -webkit-overflow-scrolling: touch;
156
+ height: 100%;
157
+ }
158
+
159
+ [part="mobile-sidebar-close-button"] {
160
+ align-items: center;
161
+ background: none;
162
+ border: none;
163
+ cursor: pointer;
164
+ display: flex;
165
+ height: 32px;
166
+ justify-content: center;
167
+ padding: 0;
168
+ position: absolute;
169
+ right: -3px;
170
+ top: 0px;
171
+ width: 32px;
172
+ z-index: 10;
173
+ }
174
+
175
+ [part="mobile-sidebar-close-icon"] {
176
+ width: 20px;
177
+ height: 20px;
178
+ position: relative;
179
+
180
+ &::before,
181
+ &::after {
182
+ content: '';
183
+ position: absolute;
184
+ top: 50%;
185
+ left: 0;
186
+ width: 100%;
187
+ height: 2px;
188
+ background: var(--xyd-page-body-color--secondary);
189
+ transform-origin: center;
190
+ }
191
+
192
+ &::before {
193
+ transform: rotate(45deg);
194
+ }
195
+
196
+ &::after {
197
+ transform: rotate(-45deg);
198
+ }
199
+ }
200
+
201
+ [part="mobile-overlay"] {
202
+ display: none;
203
+
204
+ @media (max-width: ${tabletBreakpoint}) {
205
+ display: block;
206
+ position: fixed;
207
+ top: 0;
208
+ right: 0;
209
+ bottom: 0;
210
+ left: 0;
211
+ background: rgba(0, 0, 0, 0.6);
212
+ transition: opacity .3s;
213
+ opacity: 0;
214
+ pointer-events: none;
215
+ z-index: 40;
216
+ height: 100vh;
217
+ }
218
+
219
+ &[data-active="true"] {
220
+ opacity: 1;
221
+ pointer-events: auto;
222
+ }
223
+ }
224
+
225
+ [part="page"] {
226
+ position: relative;
227
+ overflow: visible;
228
+ flex: 1;
229
+ background: var(--xyd-page-body-bgcolor);
230
+ min-width: 0;
231
+ height: 100%;
232
+ }
233
+
234
+ [part="page-scroll"] {
235
+ overflow-y: visible;
236
+ height: 100%;
237
+ -webkit-overflow-scrolling: touch;
238
+ padding: 0 48px;
239
+
240
+ @media (max-width: ${tabletBreakpoint}) {
241
+ padding: 0 32px;
242
+ }
243
+
244
+ @media (max-width: ${mobileBreakpoint}) {
245
+ padding: 0 24px;
246
+ }
247
+ }
248
+ &[data-layout="wide"] [part="page-scroll"] {
249
+ padding-top: 15px;
250
+ }
251
+
252
+ [part="page-container"] {
253
+ max-width: var(--xyd-layout-width-medium);
254
+ margin: 0 auto;
255
+ padding: 0 var(--xyd-page-gutter);
256
+ height: 100%;
257
+ }
258
+
259
+ &[data-layout="wide"] [part="page-container"] {
260
+ max-width: var(--xyd-layout-width-large);
261
+ }
262
+
263
+ [part="page-article-container"] {
264
+ display: flex;
265
+ gap: 48px;
266
+ padding: 48px 0;
267
+ min-height: 100%;
268
+
269
+ @media (max-width: ${tabletBreakpoint}) {
270
+ gap: 32px;
271
+ }
272
+
273
+ @media (max-width: ${mobileBreakpoint}) {
274
+ flex-direction: column;
275
+ padding: 24px 0;
276
+ gap: 24px;
277
+ }
278
+
279
+ }
280
+
281
+ [part="page-article"] {
282
+ flex: 1;
283
+ min-width: 0;
284
+ }
285
+
286
+ [part="page-article-content"] {
287
+ width: 100%;
288
+ }
289
+
290
+ [part="page-article-nav"] {
291
+ --page-article-nav-top: calc(var(--xyd-header-total-height) / 2);
292
+ display: flex;
293
+ flex: none;
294
+ flex-direction: column;
295
+ gap: 16px;
296
+ width: var(--xyd-layout-nav-width-medium);
297
+ position: sticky;
298
+ height: fit-content;
299
+ max-height: 100vh;
300
+ overflow-y: auto;
301
+ padding-right: 24px;
302
+ padding: var(--xyd-content-space) 0;
303
+ margin-top: var(--page-article-nav-top);
304
+ top: calc(var(--xyd-header-total-height) + var(--page-article-nav-top));
305
+ /* top: var(--xyd-header-total-height); */
306
+
307
+
308
+ @media (max-width: ${tabletBreakpoint}) {
309
+ width: var(--xyd-layout-nav-width-small);
310
+ padding-right: 16px;
311
+ }
312
+
313
+ @media (max-width: ${mobileBreakpoint}) {
314
+ display: none;
315
+ }
316
+ }
317
+ }
318
+
319
+ @layer defaultfix {
320
+ > [part="header"]:has(xyd-banner) {
321
+ height: auto;
322
+ }
323
+ }
324
+ `;
325
+
@@ -0,0 +1,252 @@
1
+ import * as React from 'react'
2
+ import { useContext, useEffect, useRef, useState } from "react"
3
+
4
+ import { PageLayout } from '@xyd-js/core';
5
+
6
+ import * as cn from "./LayoutPrimary.styles"
7
+
8
+ export interface LayoutPrimaryProps {
9
+ children: React.ReactNode;
10
+
11
+ subheader?: boolean;
12
+ className?: string;
13
+ layout?: PageLayout
14
+ scrollKey?: string
15
+ id?: string
16
+ }
17
+
18
+ const LayoutPrimaryContext = React.createContext<{
19
+ scrollRef: React.RefObject<HTMLDivElement | Window | null>;
20
+ isMobileNavOpen: boolean;
21
+ setIsMobileNavOpen: (isOpen: boolean) => void;
22
+ }>({
23
+ scrollRef: React.createRef(),
24
+ isMobileNavOpen: false,
25
+ setIsMobileNavOpen: () => { },
26
+ })
27
+
28
+ // TODO: move scroller to xyd-foo
29
+ export function LayoutPrimary(props: LayoutPrimaryProps) {
30
+ const scrollRef = useRef<HTMLDivElement | Window>(null)
31
+ const [isMobileNavOpen, setIsMobileNavOpen] = useState(false)
32
+ const { hideMainHeader } = useSubHeader(props.subheader ? scrollRef : null, props.scrollKey)
33
+
34
+ useEffect(() => {
35
+ scrollRef.current = window
36
+ }, [])
37
+
38
+ return <LayoutPrimaryContext value={{
39
+ scrollRef,
40
+ isMobileNavOpen,
41
+ setIsMobileNavOpen
42
+ }}
43
+ >
44
+ <xyd-layout-primary
45
+ className={`${cn.LayoutPrimaryHost} ${props.className || ""}`}
46
+ data-subheader={String(!!props.subheader)}
47
+ data-hide-subheader={String(hideMainHeader)}
48
+ data-layout={props.layout}
49
+ id={props.id}
50
+ >
51
+ {props.children}
52
+ </xyd-layout-primary>
53
+ </LayoutPrimaryContext>
54
+ }
55
+
56
+ interface LayoutPrimaryHeaderProps {
57
+ header: React.ReactNode;
58
+
59
+ banner?: React.ReactNode;
60
+ subheader?: React.ReactNode;
61
+ }
62
+ LayoutPrimary.Header = function LayoutPrimaryHeader(props: LayoutPrimaryHeaderProps) {
63
+ const { isMobileNavOpen, setIsMobileNavOpen } = useContext(LayoutPrimaryContext)
64
+
65
+ return <>
66
+ <header part="header">
67
+ {props.banner}
68
+
69
+ <div part="header-content">
70
+ {props.header}
71
+ </div>
72
+
73
+ {props.subheader && <div part="header-subheader">
74
+ {props.subheader}
75
+ </div>}
76
+ </header>
77
+ </>
78
+ }
79
+
80
+ LayoutPrimary.Hamburger = function LayoutPrimaryHamburger() {
81
+ const { isMobileNavOpen, setIsMobileNavOpen } = useContext(LayoutPrimaryContext)
82
+ return <button
83
+ part="hamburger-button"
84
+ aria-label="Toggle navigation menu"
85
+ onClick={() => setIsMobileNavOpen(!isMobileNavOpen)}
86
+ >
87
+ <div part="hamburger-icon">
88
+ <$HamburgerLine active={isMobileNavOpen} />
89
+ <$HamburgerLine active={isMobileNavOpen} />
90
+ <$HamburgerLine active={isMobileNavOpen} />
91
+ </div>
92
+ </button>
93
+ }
94
+
95
+ interface LayoutPrimaryMobileAsideProps {
96
+ aside: React.ReactNode;
97
+ }
98
+ LayoutPrimary.MobileAside = function LayoutPrimaryAside(props: LayoutPrimaryMobileAsideProps) {
99
+ const { isMobileNavOpen, setIsMobileNavOpen } = useContext(LayoutPrimaryContext)
100
+ return <>
101
+ <div
102
+ part="mobile-overlay"
103
+ data-active={isMobileNavOpen}
104
+ onClick={() => setIsMobileNavOpen(false)}
105
+ />
106
+ <aside
107
+ part="mobile-sidebar"
108
+ data-active={isMobileNavOpen}
109
+ >
110
+ <div part="mobile-sidebar-aside">
111
+ {props.aside}
112
+ </div>
113
+ <div>
114
+ <button
115
+ part="mobile-sidebar-close-button"
116
+ aria-label="Close navigation menu"
117
+ onClick={() => setIsMobileNavOpen(false)}
118
+ >
119
+ <div part="mobile-sidebar-close-icon" />
120
+ </button>
121
+ </div>
122
+ </aside>
123
+ </>
124
+ }
125
+
126
+ interface LayoutPrimaryPageProps {
127
+ children: React.ReactNode;
128
+ contentNav?: React.ReactNode;
129
+ after?: React.ReactNode;
130
+ }
131
+ LayoutPrimary.Page = function LayoutPrimaryPage(props: LayoutPrimaryPageProps) {
132
+ return <>
133
+ <div part="page">
134
+ <div part="page-scroll">
135
+ <div part="page-container">
136
+ <div part="page-article-container">
137
+
138
+ <article part="page-article">
139
+ <section part="page-article-content">
140
+ {props.children}
141
+ </section>
142
+ </article>
143
+
144
+ {
145
+ props.contentNav && <nav part="page-article-nav">
146
+ {props.contentNav}
147
+ </nav>
148
+ }
149
+ </div>
150
+ </div>
151
+ </div>
152
+ {props.after}
153
+ </div>
154
+ </>
155
+ }
156
+
157
+ function $HamburgerLine({ active }: { active: boolean }) {
158
+ return <span
159
+ part="hamburger-line"
160
+ data-active={active}
161
+ />
162
+ }
163
+
164
+ const SCROLL_DOWN_TRIGGER_THRESHOLD = 200;
165
+ const SCROLL_UP_TRIGGER_THRESHOLD = 100;
166
+
167
+ // TODO: move to `xyd-foo` or somewhere else
168
+ // TODO better solution than `key`
169
+ function useSubHeader(ref: React.RefObject<HTMLDivElement | Window | null> | null, key?: any) {
170
+ const [hideMainHeader, setHideMainHeader] = useState(false)
171
+ const [lastScrollTop, setLastScrollTop] = useState(0)
172
+ const [scrollDirection, setScrollDirection] = useState<'up' | 'down' | null>(null)
173
+ const [scrollThreshold, setScrollThreshold] = useState(0)
174
+ const [scrollStartPosition, setScrollStartPosition] = useState(0)
175
+ const [isScrolling, setIsScrolling] = useState(false)
176
+
177
+ function reset() {
178
+ setHideMainHeader(false)
179
+ setLastScrollTop(0)
180
+ setScrollDirection(null)
181
+ setScrollThreshold(0)
182
+ setScrollStartPosition(0)
183
+ setIsScrolling(false)
184
+ }
185
+
186
+ useEffect(() => {
187
+ reset()
188
+ }, [key])
189
+
190
+ function onScroll(e: Event) {
191
+ if (!(e.target instanceof HTMLElement)) {
192
+ return
193
+ }
194
+
195
+ const currentScrollTop = e.target.scrollTop
196
+
197
+ // Always show header when near the top of the page
198
+ if (currentScrollTop < SCROLL_UP_TRIGGER_THRESHOLD) {
199
+ setHideMainHeader(false)
200
+ setScrollThreshold(0)
201
+ setLastScrollTop(currentScrollTop)
202
+ setIsScrolling(false)
203
+ return
204
+ }
205
+
206
+ // Determine scroll direction
207
+ const direction = currentScrollTop > lastScrollTop ? 'down' : 'up'
208
+
209
+ // If direction changed, reset scroll tracking
210
+ if (direction !== scrollDirection) {
211
+ setScrollDirection(direction)
212
+ setScrollStartPosition(currentScrollTop)
213
+ setIsScrolling(true)
214
+ }
215
+
216
+ // Calculate total scroll distance from start position
217
+ const totalScrollDistance = Math.abs(currentScrollTop - scrollStartPosition)
218
+
219
+ // Only trigger header changes if we've scrolled enough distance in the current direction
220
+ if (direction === 'down' && totalScrollDistance > SCROLL_DOWN_TRIGGER_THRESHOLD) {
221
+ // When scrolling down, hide header
222
+ setHideMainHeader(true)
223
+ setScrollThreshold(currentScrollTop)
224
+ // Reset scroll tracking after triggering
225
+ setScrollStartPosition(currentScrollTop)
226
+ } else if (direction === 'up' && totalScrollDistance > SCROLL_UP_TRIGGER_THRESHOLD) {
227
+ // When scrolling up, show header
228
+ setHideMainHeader(false)
229
+ setScrollThreshold(currentScrollTop)
230
+ // Reset scroll tracking after triggering
231
+ setScrollStartPosition(currentScrollTop)
232
+ }
233
+
234
+ setLastScrollTop(currentScrollTop)
235
+ }
236
+
237
+ useEffect(() => {
238
+ if (!ref?.current) {
239
+ return
240
+ }
241
+
242
+ ref.current.addEventListener("scroll", onScroll)
243
+
244
+ return () => {
245
+ ref.current?.removeEventListener("scroll", onScroll)
246
+ }
247
+ }, [ref, key, lastScrollTop, scrollDirection, scrollThreshold, scrollStartPosition]);
248
+
249
+ return {
250
+ hideMainHeader,
251
+ }
252
+ }
@@ -0,0 +1,3 @@
1
+ export {
2
+ LayoutPrimary
3
+ } from "./LayoutPrimary";
@@ -0,0 +1,6 @@
1
+ // TODO: move this pkg @xyd-js/layouts ?
2
+
3
+ export {
4
+ LayoutPrimary,
5
+ } from "./LayoutPrimary";
6
+