@xyd-js/theme-poetry 0.1.0-xyd.16 → 0.1.0-xyd.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyd-js/theme-poetry",
3
- "version": "0.1.0-xyd.16",
3
+ "version": "0.1.0-xyd.3",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -12,46 +12,19 @@
12
12
  "import": "./dist/index.js"
13
13
  }
14
14
  },
15
- "files": [
16
- "dist",
17
- "public",
18
- "package.json"
19
- ],
20
15
  "dependencies": {
21
- "@linaria/atomic": "^6.2.0",
22
- "@linaria/core": "^6.2.0",
23
- "@xyd-js/xtokens": "0.1.0-xyd.1",
24
- "@xyd-js/atlas": "0.1.0-xyd.7"
16
+ "@xyd-js/xtokens": "0.1.0-xyd.0",
17
+ "@xyd-js/components": "0.1.0-xyd.0"
25
18
  },
26
19
  "peerDependencies": {
27
- "react": "^19.0.0",
28
- "react-dom": "^19.0.0",
29
- "react-router": "^7.1.1",
30
- "@xyd-js/components": "0.1.0-xyd.1",
31
- "@xyd-js/framework": "0.1.0-xyd.21"
20
+ "@xyd-js/framework": "0.1.0-xyd.4"
32
21
  },
33
22
  "devDependencies": {
34
- "@babel/preset-typescript": "^7.26.0",
35
- "@babel/preset-react": "^7.26.0",
36
- "@babel/preset-env": "^7.26.0",
37
- "@babel/preset-flow": "^7.25.9",
38
- "@rollup/plugin-alias": "^5.1.1",
39
- "@rollup/plugin-babel": "^6.0.4",
40
- "@rollup/plugin-commonjs": "^28.0.1",
41
- "@rollup/plugin-node-resolve": "^15.3.0",
42
- "@rollup/plugin-typescript": "^12.1.1",
43
- "@wyw-in-js/rollup": "^0.5.5",
44
- "@wyw-in-js/vite": "^0.5.5",
45
23
  "autoprefixer": "^10.4.20",
46
- "postcss": "^8.4.47",
24
+ "postcss": "^8.4.49",
47
25
  "postcss-import": "^16.1.0",
48
- "rollup": "^4.27.4",
49
- "rollup-plugin-css-only": "^4.5.2",
50
- "rollup-plugin-dts": "^6.1.1",
51
- "rollup-plugin-postcss": "^4.0.2",
52
- "rollup-plugin-terser": "^7.0.2",
53
- "tsup": "^8.3.0",
54
- "rimraf": "^3.0.2"
26
+ "postcss-url": "^10.1.3",
27
+ "rollup-plugin-postcss": "^4.0.2"
55
28
  },
56
29
  "scripts": {
57
30
  "clean": "rimraf build",
@@ -0,0 +1,77 @@
1
+ import {createRequire} from "module";
2
+
3
+ import resolve from '@rollup/plugin-node-resolve';
4
+ import commonjs from '@rollup/plugin-commonjs';
5
+ import typescript from '@rollup/plugin-typescript';
6
+ import dts from 'rollup-plugin-dts';
7
+ import postcss from 'rollup-plugin-postcss';
8
+ import postcssImport from 'postcss-import';
9
+ import wyw from '@wyw-in-js/rollup';
10
+
11
+ const require = createRequire(import.meta.url);
12
+ const {dependencies} = require('./package.json', {assert: {type: 'json'}});
13
+
14
+ // unify theme build system
15
+ const external = [
16
+ ...Object.keys(dependencies),
17
+ 'react',
18
+ 'react-router',
19
+
20
+ // TODO: another `@xyd` packages?
21
+ '@xyd-js/framework/react'
22
+ ];
23
+
24
+ export default [
25
+ {
26
+ input: {
27
+ index: './src/index.ts'
28
+ },
29
+ output: [
30
+ {
31
+ dir: 'dist',
32
+ format: 'esm',
33
+ sourcemap: true,
34
+ entryFileNames: '[name].js'
35
+ }
36
+ ],
37
+ plugins: [
38
+ wyw({
39
+ include: ['**/*.{ts,tsx}'],
40
+ babelOptions: {
41
+ presets: [
42
+ '@babel/preset-typescript',
43
+ '@babel/preset-react'
44
+ ],
45
+ },
46
+ }),
47
+ resolve(),
48
+ commonjs(),
49
+ typescript({
50
+ tsconfig: './tsconfig.json',
51
+ }),
52
+ postcss({
53
+ extensions: ['.css'],
54
+ plugins: [postcssImport()],
55
+ extract: true, // Extract CSS into a separate file
56
+ minimize: true, // Minify the CSS
57
+ }),
58
+ ],
59
+ external
60
+ },
61
+ {
62
+ input: './src/index.ts',
63
+ output: {
64
+ file: 'dist/index.d.ts',
65
+ format: 'es',
66
+ },
67
+ plugins: [
68
+ dts({
69
+ respectExternal: true, // Ignore unresolved imports
70
+ }),
71
+ ],
72
+ external: [
73
+ ...external,
74
+ /\.css$/ // Mark CSS imports as external
75
+ ],
76
+ },
77
+ ];
@@ -0,0 +1,145 @@
1
+ import {css} from "@linaria/core";
2
+
3
+ const globalPageGutter = '8px';
4
+ export const globalHeaderHeight = '46px';
5
+ const globalHeaderWarningHeight = "0px";
6
+ const contentTopSpace = "12px";
7
+
8
+ const globalHeaderHeightWithSub = '90px';
9
+
10
+ const cubicMove = "cubic-bezier(.65, 0, .35, 1)";
11
+ const sidebarWidth = "450px";
12
+
13
+ // TODO: better solution - design tokens
14
+ export const globals = css`
15
+ :global() {
16
+ :root {
17
+ --xyd-navbar-height: ${globalHeaderHeight};
18
+ --xyd-sidebar-width: ${sidebarWidth};
19
+ }
20
+ }
21
+ `;
22
+
23
+ export const $layout = {
24
+ host: css`
25
+ width: 100%;
26
+ `,
27
+ header: css`
28
+ display: flex;
29
+ justify-content: space-between;
30
+ align-items: center;
31
+
32
+ position: fixed;
33
+ top: ${globalHeaderWarningHeight};
34
+ right: ${globalPageGutter};
35
+ left: ${globalPageGutter};
36
+
37
+ height: ${globalHeaderHeight};
38
+ `,
39
+ header$$sub: css`
40
+ flex-direction: column;
41
+ height: ${globalHeaderHeightWithSub};
42
+ transition: transform 200ms;
43
+ `,
44
+ header$$hideMain: css`
45
+ transform: translateY(calc(-${globalHeaderHeight} + 3px));
46
+ `,
47
+ main: css`
48
+ position: fixed;
49
+ top: calc(${globalHeaderHeight} + ${globalHeaderWarningHeight});
50
+ bottom: ${globalPageGutter};
51
+ left: ${globalPageGutter};
52
+ right: ${globalPageGutter};
53
+ }`,
54
+ main$$sub: css`
55
+ top: calc(${globalHeaderHeightWithSub} + ${globalHeaderWarningHeight});
56
+ transition: top 200ms;
57
+ `,
58
+ sidebar: css`
59
+ flex-direction: column;
60
+ position: absolute;
61
+ top: 0;
62
+ left: 0;
63
+ bottom: 0;
64
+ right: 0;
65
+ z-index: 101;
66
+ width: ${sidebarWidth};
67
+ border: 0;
68
+ padding: ${contentTopSpace} 0 0;
69
+ overflow: visible;
70
+ background: none;
71
+ border-radius: 0;
72
+ opacity: 1;
73
+ visibility: visible;
74
+ transition: opacity .3s ${cubicMove};
75
+ `,
76
+ }
77
+
78
+ export const $page = {
79
+ host: css`
80
+ position: absolute;
81
+ top: ${contentTopSpace};
82
+ right: 0;
83
+ bottom: 0;
84
+ z-index: 201;
85
+ background: #fff;
86
+
87
+ overflow: hidden;
88
+ transition: opacity .3s ${cubicMove};
89
+
90
+ left: ${sidebarWidth};
91
+ `,
92
+ scroll: css`
93
+ overflow: scroll;
94
+ height: 100%;
95
+
96
+ `,
97
+ container: css`
98
+ padding: 0;
99
+ width: 100%;
100
+ //position: relative; TODO: unset if during client render?
101
+ min-height: 100%;
102
+
103
+ max-width: 100%;
104
+ margin: 0 auto;
105
+ font-size: 15px;
106
+ line-height: 24px;
107
+ `,
108
+ articleContainer: css`
109
+ width: 980px;
110
+ padding: 40px 56px;
111
+ padding-left: 0;
112
+ padding-top: 20px;
113
+ margin: 0 auto;
114
+ margin-left: 100px;
115
+ max-width: 100%;
116
+ `,
117
+ articleContainer$$fullWidth: css`
118
+ width: 1200px;
119
+ `,
120
+ }
121
+
122
+ export const $article = {
123
+ host: css`
124
+ display: flex;
125
+ gap: 30px;
126
+ width: 100%;
127
+ align-items: flex-start;;
128
+ `,
129
+ content: css`
130
+ flex: 1 1 0;
131
+ overflow: hidden;
132
+ `,
133
+ nav: css`
134
+ position: sticky;
135
+ top: 30px;
136
+ width: 180px;
137
+ margin-top: 0;
138
+ margin-left: 50px;
139
+ padding-left: 16px;
140
+ flex: none;
141
+ `,
142
+ nav$$equal: css`
143
+ flex: 1;
144
+ `
145
+ }
@@ -0,0 +1,116 @@
1
+ import React, {useEffect, useState} from "react"
2
+
3
+ import {$layout, $page, $article, globalHeaderHeight} from "./Layout.styles"
4
+
5
+ export interface LayoutProps {
6
+ header: React.ReactNode;
7
+ aside: React.ReactNode;
8
+ content: React.ReactNode;
9
+ contentNav: React.ReactNode;
10
+ subheader?: boolean;
11
+ kind?: "fullwidth" | "equal"
12
+ }
13
+
14
+ // TODO: move scroller to xyd-foo
15
+ export function Layout(props: LayoutProps) {
16
+ const [hideMainHeader, setHideMainHeader] = useState(false)
17
+ const [scrollTop, setScrollTop] = useState(0)
18
+ const [controlScrollPos, setControlScrollPos] = useState(0)
19
+
20
+ useEffect(() => {
21
+ if (scrollTop === controlScrollPos) {
22
+ return
23
+ }
24
+
25
+ const checkpoint = parseInt(globalHeaderHeight, 10) / 2
26
+ const diff = scrollTop - controlScrollPos
27
+ const reversePosDiff = Math.abs(scrollTop - controlScrollPos)
28
+
29
+ if (diff > checkpoint) {
30
+ setHideMainHeader(true)
31
+ } else if (reversePosDiff > checkpoint) {
32
+ setHideMainHeader(false)
33
+ }
34
+ }, [
35
+ scrollTop,
36
+ controlScrollPos,
37
+ ]);
38
+
39
+ function onScroll(e: Event) {
40
+ if (!(e.target instanceof HTMLElement)) {
41
+ return
42
+ }
43
+
44
+ const scroll = e.target?.scrollTop
45
+ setScrollTop(scroll)
46
+ }
47
+
48
+ function onScrollFinish(e: Event) {
49
+ if (!(e.target instanceof HTMLElement)) {
50
+ return
51
+ }
52
+
53
+ setControlScrollPos(e.target?.scrollTop)
54
+ }
55
+
56
+ // TODO: by ref?
57
+ // TODO: MOVE SOMEWHERE ELSE BECAUSE IT DECREASE PERFORMANCE (RERENDER)
58
+ useEffect(() => {
59
+ // return // TODO: UNCOMMENT
60
+
61
+ if (!props.subheader) {
62
+ return
63
+ }
64
+
65
+ document.querySelector(`.${$page.scroll}`)?.addEventListener("scroll", onScroll)
66
+ document.querySelector(`.${$page.scroll}`)?.addEventListener("scrollend", onScrollFinish)
67
+
68
+ return () => {
69
+ document.querySelector(`.${$page.scroll}`)?.removeEventListener("scroll", onScroll)
70
+ document.querySelector(`.${$page.scroll}`)?.removeEventListener("scrollend", onScrollFinish)
71
+ }
72
+ }, []);
73
+
74
+ return <div className={$layout.host}>
75
+ <header className={`
76
+ ${$layout.header}
77
+ ${props.subheader && $layout.header$$sub}
78
+ ${hideMainHeader && $layout.header$$hideMain}
79
+ `}>
80
+ {props.header}
81
+ </header>
82
+ <main className={`
83
+ ${$layout.main}
84
+ ${!hideMainHeader && props.subheader && $layout.main$$sub}
85
+ `}>
86
+ <aside className={$layout.sidebar}>
87
+ {props.aside}
88
+ </aside>
89
+ <div className={$page.host}>
90
+ <div className={$page.scroll}>
91
+ <div className={$page.container}>
92
+ <div className={`
93
+ ${$page.articleContainer}
94
+ ${props.kind == "fullwidth" && $page.articleContainer$$fullWidth}
95
+ ${props.kind == "equal" && $page.articleContainer$$fullWidth}
96
+ `}>
97
+ <article className={$article.host}>
98
+ <section className={$article.content}>
99
+ {props.content}
100
+ </section>
101
+ {
102
+ props.contentNav && <nav className={`
103
+ ${$article.nav}
104
+ ${props.kind == "equal" && $article.nav$$equal}
105
+ `}>
106
+ {props.contentNav}
107
+ </nav>
108
+ }
109
+ </article>
110
+ </div>
111
+ </div>
112
+ </div>
113
+ </div>
114
+ </main>
115
+ </div>
116
+ }
@@ -0,0 +1,5 @@
1
+ export {
2
+ Layout
3
+ } from "./Layout";
4
+
5
+ export type {LayoutProps} from "./Layout";
package/src/index.css ADDED
@@ -0,0 +1,67 @@
1
+ @import "vars.css";
2
+
3
+ @font-face {
4
+ font-family: 'Mona Sans';
5
+ src: url('../public/fonts/MonaSans/Mona-Sans.woff2') format('woff2 supports variations'),
6
+ url('../public/fonts/MonaSans/Mona-Sans.woff2') format('woff2-variations');
7
+ font-weight: 200 900;
8
+ font-stretch: 75% 125%;
9
+ }
10
+
11
+ html {
12
+ font-family: 'Mona Sans', serif;
13
+ }
14
+
15
+ body {
16
+ margin: 0;
17
+ }
18
+
19
+ ol, ul, menu {
20
+ list-style: none;
21
+ margin: 0;
22
+ padding: 0;
23
+ }
24
+
25
+ button, input:where([type=button]), input:where([type=reset]), input:where([type=submit]) {
26
+ -webkit-appearance: button;
27
+ background-color: transparent;
28
+ background-image: none;
29
+ }
30
+
31
+ button, [role=button] {
32
+ cursor: pointer;
33
+ }
34
+
35
+ button, select {
36
+ text-transform: none;
37
+ }
38
+
39
+ button, input, optgroup, select, textarea {
40
+ font-family: inherit;
41
+ font-feature-settings: inherit;
42
+ font-variation-settings: inherit;
43
+ font-size: 100%;
44
+ font-weight: inherit;
45
+ line-height: inherit;
46
+ letter-spacing: inherit;
47
+ color: inherit;
48
+ margin: 0;
49
+ padding: 0;
50
+ }
51
+
52
+ a {
53
+ color: inherit;
54
+ text-decoration: inherit;
55
+ }
56
+
57
+ *, :before, :after {
58
+ box-sizing: border-box;
59
+ border-width: 0;
60
+ border-style: solid;
61
+ }
62
+
63
+ p {
64
+ padding: 0;
65
+ margin: 0;
66
+ }
67
+
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export {default} from "./theme"
@@ -0,0 +1,7 @@
1
+ .xyd_ui-comp-sidebar, .xyd_ui-comp-nav-logo {
2
+ padding-left: 200px;
3
+ }
4
+
5
+ .xyd_comp-comp-heading {
6
+ font-weight: 400;
7
+ }
package/src/theme.tsx ADDED
@@ -0,0 +1,78 @@
1
+ import React from "react"
2
+
3
+ import {helperContent} from "@xyd-js/components/content"
4
+ import type {
5
+ ITheme
6
+ } from "@xyd-js/framework"
7
+ import {
8
+ FwNav,
9
+ FwToc,
10
+ FwNavLinks,
11
+
12
+ FwSidebarGroups,
13
+ } from "@xyd-js/framework/react"
14
+
15
+ import {Layout} from "./components/Layouts";
16
+
17
+ import "@xyd-js/ui/index.css";
18
+ import "@xyd-js/components/index.css";
19
+ // TODO: what about atlas? it's loaded by plugin - probably we need better mechanism for loading css
20
+ import '@xyd-js/atlas/index.css';
21
+
22
+ import './index.css';
23
+ import './override.css';
24
+
25
+ const {Content} = helperContent()
26
+
27
+ export interface ThemeSettings {
28
+ hideToc?: boolean // TODO: better prop name?
29
+ sidebar?: {
30
+ onePathBehaviour?: boolean
31
+ clientSideRouting?: boolean
32
+ }
33
+ contentNav?: React.ReactNode
34
+ layout?: {
35
+ kind?: "fullwidth" | "equal"
36
+ }
37
+ }
38
+
39
+ export interface ThemeProps extends ITheme<ThemeSettings> {
40
+ }
41
+
42
+ export default function ThemePoetry(props: ThemeProps) {
43
+ return <Layout
44
+ header={<Navbar/>}
45
+ aside={<Sidebar themeSettings={props.themeSettings}/>}
46
+ content={<>
47
+ {/*TODO: optional breadcrumbs*/}
48
+ {/*{props.breadcrumbs ? <FwBreadcrumbs/> : undefined}*/}
49
+ <Content>
50
+ {props.children}
51
+ </Content>
52
+
53
+ <FwNavLinks/>
54
+ </>
55
+ }
56
+ contentNav={
57
+ props.themeSettings?.hideToc
58
+ ? null
59
+ : props.themeSettings?.contentNav ? props.themeSettings.contentNav : <FwToc/>
60
+ }
61
+ kind={props.themeSettings?.layout?.kind || undefined}
62
+ />
63
+ }
64
+
65
+ // TODO: finish search
66
+ function Navbar() {
67
+ return <>
68
+ <FwNav kind="middle"/>
69
+ </>
70
+ }
71
+
72
+ // TODO: onePathBehaviour does not work - fix that
73
+ function Sidebar({themeSettings}: { themeSettings?: ThemeSettings }) {
74
+ return <FwSidebarGroups
75
+ onePathBehaviour={themeSettings?.sidebar?.onePathBehaviour}
76
+ clientSideRouting={themeSettings?.sidebar?.clientSideRouting}
77
+ />
78
+ }
package/src/vars.css ADDED
@@ -0,0 +1,5 @@
1
+ :root {
2
+ --headingEffect-color-tertiary: rgba(23, 119, 184, 0.5);
3
+ --headingEffect-color-secondary: rgb(121, 85, 241);
4
+ --headingEffect-color-primary: rgb(255, 105, 180);
5
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "compilerOptions": {
3
+ "esModuleInterop": true,
4
+ "module": "esnext",
5
+ "moduleResolution": "bundler",
6
+ "target": "ES6",
7
+ "lib": [
8
+ "dom",
9
+ "dom.iterable",
10
+ "esnext"
11
+ ],
12
+ "allowJs": true,
13
+ "skipLibCheck": true,
14
+ "strict": false,
15
+ "noEmit": true,
16
+ "incremental": false,
17
+ "resolveJsonModule": true,
18
+ "isolatedModules": true,
19
+ "jsx": "react",
20
+ "plugins": [
21
+ {
22
+ "name": "next"
23
+ }
24
+ ],
25
+ "strictNullChecks": true
26
+ },
27
+ "include": [
28
+ "packages/css/src",
29
+ "next-env.d.ts",
30
+ "**/*.ts",
31
+ "**/*.tsx",
32
+ ".next/types/**/*.ts"
33
+ ],
34
+ "exclude": [
35
+ "node_modules"
36
+ ]
37
+ }
package/dist/index.css DELETED
@@ -1 +0,0 @@
1
- :root{--xyd-sidebar-width:450px}.h1rnwuz9{width:100%}.h132y9go{-webkit-box-pack:justify;-ms-flex-pack:space-between;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:46px;-webkit-justify-content:space-between;justify-content:space-between;left:8px;position:fixed;right:8px;top:0}.h1ulv53s{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:90px;-webkit-transition:-webkit-transform .2s;transition:transform .2s}.h1xdz7qg{-webkit-transform:translateY(-43px);-moz-transform:translateY(-43px);-ms-transform:translateY(-43px);transform:translateY(-43px)}.mk7pvq{bottom:8px;left:8px;position:fixed;right:8px;top:46px}.m8kgblw{top:90px;-webkit-transition:top .2s;transition:top .2s}.sh5saf3{background:none;border:0;border-radius:0;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;left:0;opacity:1;overflow:visible;padding:12px 0 0;top:0;visibility:visible;width:450px;z-index:101}.h14fb2m2,.sh5saf3{bottom:0;position:absolute;right:0;-webkit-transition:opacity .3s cubic-bezier(.65,0,.35,1);transition:opacity .3s cubic-bezier(.65,0,.35,1)}.h14fb2m2{background:#fff;left:450px;overflow:hidden;top:12px;z-index:201}.skdd2lx{height:100%;overflow:scroll}.c3f1387{font-size:15px;line-height:24px;margin:0 auto;max-width:100%;min-height:100%;padding:0;width:100%}.a85a4w5{margin:0 auto 0 100px;max-width:100%;padding:20px 56px 40px 0;width:980px}.asxdsuf{width:1200px}.hl7s9k1{-webkit-box-align:flex-start;-ms-flex-align:flex-start;-webkit-align-items:flex-start;align-items:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:30px;width:100%}.ctha5be{-webkit-flex:1 1 0;-ms-flex:1 1 0;flex:1 1 0;overflow:hidden}.nhz4uc{-webkit-flex:none;-ms-flex:none;flex:none;margin-left:50px;margin-top:0;padding-left:16px;position:-webkit-sticky;position:sticky;top:30px;width:180px}.n16jquc6{-webkit-flex:1;-ms-flex:1;flex:1}.h1vu90xp{background:transparent;display:flex;position:sticky;top:0;width:100%;z-index:20}.s1i2i14o{background-color:#fff;height:100%;pointer-events:none;position:absolute;width:100%;z-index:-1}.n1oemxra{align-items:center;display:flex;gap:8px;height:var(--xyd-navbar-height);justify-content:flex-end;padding-left:calc(max(env(safe-area-inset-left), 16px));padding-right:calc(max(env(safe-area-inset-right), 16px));width:100%}.ny6xn1c{align-items:center;display:grid;grid-template-columns:1fr 1fr 1fr}.hj2rxb1{gap:8px}.hcz0c13,.hj2rxb1{align-items:center;display:flex;justify-content:center}.hcz0c13{color:#4b5563;font-size:14px;padding:6px 16px;position:relative;white-space:nowrap}.hcz0c13:hover{color:#1f2937}.hcz0c13[data-state=active]{background:#f9f9f9;border-radius:8px;font-weight:700}.t1lsj05a{align-items:center;display:flex;inset:0;justify-content:center;position:absolute;text-align:center}.t138ur9z{font-weight:500;visibility:hidden}.hso30gp{align-items:center;display:flex;margin-right:auto}.hptag3l{background:#f9f9f9;border-radius:.5rem;display:flex;flex-direction:column;height:100%}.uead4fo{height:100%;overflow-x:hidden;overflow-y:auto;padding:1rem}.h1hrlfak{border-top:1px solid #ededed;box-shadow:0 -2px 10px hsla(0,0%,93%,.1);padding:1rem}.i1btwdcv{color:#6e6e80;padding:2px}.i1801o7t,.i1btwdcv{display:flex;width:100%}.i1801o7t{align-items:center;font-size:14px;gap:7px;padding:4px 8px}.i1801o7t:hover{background:#ececf1;border-radius:4px;color:#111827}.i1801o7t:hover svg{fill:#111827}.i1801o7t svg{fill:#6e6e80;font-size:18px;height:18px;width:18px}.hs1gieu{color:#6e6e80;font-size:14px}.l1s9ffav{display:flex;font-weight:500;padding:2px;width:100%}.l1041tva{background:#fff;border-radius:4px;color:#7051d4}.l1hsy03l{background:unset;color:#111827;font-weight:500}.lz6cy9y{display:flex;padding:4px 8px;width:100%}.lz6cy9y:hover{background:#ececf1;border-radius:4px;color:#111827}.hnhdi2c{margin-left:8px}.hj0z21i{color:#111827;font-size:12px;font-weight:600;letter-spacing:1px;line-height:16px;margin-bottom:6px;margin-top:16px;padding-left:10px}.c12fwmxc{overflow:hidden;transform:translateZ(0);transition:all .3s ease-in-out}.bfe0v98{opacity:0;transition:opacity .5s ease-in-out}.oza7km2{opacity:1}.h4ah3ok{align-items:center;background-color:#f6f6f7;border-radius:.5rem;display:flex;flex-direction:row;height:44px;margin-top:3px;padding:0 .25rem;width:100%}.p1ncaln9{color:#44474a;font-size:12px;font-weight:600;padding-left:.5rem;padding-right:1.5rem;position:relative;text-transform:uppercase}.p1ncaln9:after{background:#d2d5d8;border-radius:1px;content:" ";height:.75rem;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);width:2px}.u3wpqhn{flex-direction:row}.lc3ej8u,.u3wpqhn{display:flex;height:100%}.lc3ej8u{align-items:center;position:relative}.lc3ej8u[data-state=active]{font-weight:500}.lc3ej8u[data-state=active] a{color:#202223}.lc3ej8u[data-state=active] a:after{background-color:#7051d4;border-radius:1px;bottom:0;content:" ";height:2px;left:0;position:absolute;width:100%}.l1taqsnk{color:#4b5563;display:block;height:100%;line-height:2.75rem;padding:0 .5rem}.l1taqsnk:hover{color:#202223}.h19g75q2{padding-left:16px;position:relative}.ueg7kxf{list-style:none;margin:0;padding:0}.lagigsw{line-height:1.5;margin:0 0 10px;padding:0;position:relative}.lylqcp3{text-wrap:pretty;color:#6e6e80;display:inline-block;font-size:14px;line-height:1.4;transition:color .15s ease}.l16swvpi{color:#353740;font-weight:500}.ht0m6aa{background-color:#ececf1;bottom:0}.ht0m6aa,.sfp1vxs{left:0;position:absolute;top:0;width:2px}.sfp1vxs{background-color:#353740;height:var(--active-track-height);transform:translateY(var(--active-track-top));transition:height .4s cubic-bezier(.19,1,.22,1),transform .4s cubic-bezier(.19,1,.22,1)}.hfzpnxu{display:flex;flex-direction:column;min-height:100vh}.h1k4ds7x{-webkit-backdrop-filter:sepia(10%);backdrop-filter:sepia(10%);background:radial-gradient(circle,hsla(0,0%,9%,.3) 1px,transparent 0);background-size:30px 30px;flex:1;padding:60px}.h1x4dha7{background:repeating-linear-gradient(90deg,hsla(0,0%,9%,.1),hsla(0,0%,9%,.1) 1px,transparent 0,transparent 50px),repeating-linear-gradient(180deg,hsla(0,0%,9%,.1),hsla(0,0%,9%,.1) 1px,transparent 0,transparent 50px)}.broqp2l{display:flex;flex-direction:column;gap:80px;margin:0 auto;width:1200px}@media (max-width:1200px){.broqp2l{padding:0 20px;width:100%}}@media (max-width:768px){.broqp2l{padding:0 10px;width:100%}}.hfe0p8m{display:grid;gap:30px;grid-template-columns:repeat(2,500px);justify-content:center}@media (max-width:1200px){.hfe0p8m{grid-template-columns:repeat(2,1fr)}}@media (max-width:768px){.hfe0p8m{grid-template-columns:1fr}}.hn2r3b2{background-color:#f7f7f8;border:1px solid transparent;border-radius:20px;color:#3c3c43;display:inline-block;font-size:14px;font-weight:600;line-height:38px;padding:0 20px;text-align:center;transition:color .25s,border-color .25s,background-color .25s;white-space:nowrap}.hn2r3b2:hover{background:#e3e3e6}.hgvnekf{background-color:#7051d4;color:#fff}.hgvnekf:hover{background-color:#5f3bd3}.h1vf00q{background-color:#fff;border-top:1px solid #f0f0f0;padding:32px;position:relative}.c1ny3ybl{margin:0 auto;max-width:1200px;text-align:center}.t1ahtzu3{color:rgba(60,60,67,.78);font-size:14px;font-weight:500;line-height:24px}.h1vbgqbd{padding:20px}.c1qluffv{align-items:center;display:flex;gap:80px;justify-content:center}.h7zyorj{gap:40px}.h10nnuqu,.h7zyorj{align-items:center;display:flex;flex-direction:column;justify-content:center}.h10nnuqu{-webkit-text-fill-color:transparent;animation:wave-h10nnuqu 5s infinite;background:-webkit-linear-gradient(120deg,var(--headingEffect-color-tertiary) 20%,var(--headingEffect-color-tertiary) 30%,var(--headingEffect-color-secondary) 60%,var(--headingEffect-color-primary) 75%,var(--headingEffect-color-primary) 85%);-webkit-background-clip:text;background-clip:text;-webkit-background-position:50% 50%;background-position:50% 50%;background-size:200% 200%}@keyframes wave-h10nnuqu{0%{-webkit-background-position:50% 50%;background-position:50% 50%}50%{-webkit-background-position:0 50%;background-position:0 50%}to{-webkit-background-position:50% 50%;background-position:50% 50%}}.h1xgyvqe{align-items:center;display:flex;flex-direction:column;justify-content:center}.t1rx1fna{font-size:76px;font-weight:900;letter-spacing:3px;margin:0;text-align:center}.s9nduqh{color:#3c3c43;font-size:46px;font-weight:600;text-align:center}.hth6on8{display:flex;gap:10px;justify-content:center}.hth6on8,.hutvd2b{align-items:center}.hutvd2b{display:inline-flex;font-style:normal;font-weight:500;letter-spacing:normal;line-height:1rem;text-transform:none;white-space:nowrap}.hg9oorb{background-color:#f8d047;color:#000}.h6jev6x{background-color:#1fa6f2;color:#fff}.h1uvewli{border-radius:6px;font-size:12px;gap:3px;height:18px;padding:0 6px}.i1mcrm8o{position:relative}.hwgsk4h{align-items:center;color:#6b7280;display:flex;font-size:.875rem;gap:.25rem;line-height:1.25rem;margin-top:.375rem;overflow:hidden}.i1b95bxl{shrink:0;width:.875rem}.i1a3fa93{transition-duration:.3s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);white-space:nowrap}.i1dl7ywj{color:#000;font-weight:700}.hilz89t{background:linear-gradient(238deg,hsla(240,7%,97%,.5),#f7f7f8);border:.5px solid #ececf1;border-radius:8px;display:flex;overflow:hidden;padding:16px 20px 20px;position:relative;transition:box-shadow .2s ease-in-out,background-image .2s ease;z-index:0}.hilz89t:hover{background:linear-gradient(238deg,hsla(0,0%,100%,.5),#fafafa)}.h1rnhmpa{padding:21px 25px 25px}.lajci2p{height:100%;width:100%}.iezrce7{align-items:flex-start;border-radius:8px;cursor:pointer;display:flex;transition:opacity .15s}.iezrce7:hover [data-pointer=true]{opacity:1;transform:translate(0)}.i1vhi0b8{height:100%;width:100%}.i1m2lps9{align-items:center;background:linear-gradient(238deg,hsla(0,0%,100%,.5),#fafafa);border:1px solid #ececf1;border-radius:8px;box-sizing:border-box;color:#353740;display:flex;flex-shrink:0;font-size:24px;height:48px;justify-content:center;line-height:0px;transition:background .2s ease;width:48px}.r1new93p{display:flex;flex-direction:column;gap:4px;padding-left:16px}.t1u3d3ty{align-items:center;color:#202123;display:flex;font-weight:400;transition:color .15s}.t4udf3g{font-size:16px;line-height:20px}.t1icpluq{font-size:18px}.badgd67{color:#6e6e80;font-size:14px;font-weight:400;line-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:normal}.bcjznmh{font-size:16px}.p13ekkiz{display:flex;opacity:0;transform:translate(-4px);transition:opacity .15s ease-in-out,transform .15s ease-in-out}.h15733ml,.p13ekkiz{justify-content:center}.h15733ml{display:grid;gap:30px;grid-template-columns:1fr 1fr}.h1tn40xd{scroll-snap-margin-top:30px;color:#202123;cursor:pointer;display:inline-block;font-weight:300;line-height:40px;margin:0;padding:0 24px 0 0;position:relative;scroll-margin-top:30px}.h1tn40xd:hover svg{opacity:1}.hnf4kng{font-size:36px}.h1vdtsi8,.hnf4kng code{font-size:30px}.h1vdtsi8 code{font-size:24px}.hz5xehg{font-size:26px}.hptgzam,.hz5xehg code{font-size:22px}.h11bbv2f,.hptgzam code{font-size:18px}.h11bbv2f code{font-size:14px}.hcoksa6{font-size:16px}.hcoksa6 code{font-size:12px}.l17d6dy1{color:#7051d4;margin-top:-6px;opacity:0;position:absolute;right:0;top:50%;transition:opacity .15s ease}.h3kfd8c{counter-reset:ordered-listitem;display:flex;flex-direction:column;gap:6px;list-style:none;padding-left:0}.l1et872q{line-height:1.5;padding-left:32px;position:relative}.l1et872q:after{background:#ececf1;border-radius:12px;color:#353740;content:counter(ordered-listitem);counter-increment:ordered-listitem;font-size:12px;font-weight:500;height:24px;left:0;line-height:24px;position:absolute;text-align:center;top:0;width:24px}.hh8vcxa{max-width:100%;position:relative}.b2p5907{align-items:center;display:flex}.coeb6fw{margin-top:16px}.h196u2m6{background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05);padding:8px}.i1hlflsk{height:16px;width:16px}.hownbu8{flex-grow:1;overflow-x:auto}.cuwerl2{background-color:#f3f4f6;border-radius:8px;display:inline-flex;gap:4px;margin-left:4px;padding:4px}.hlivi01{border-radius:.375rem;color:#6b7280;font-size:.875rem;font-weight:500;line-height:1.25rem;padding:.5rem 1rem;transition-duration:.3s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);white-space:nowrap}.hlivi01:hover{color:#111827}._5m9mpz,.hlivi01[data-state=active]{background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05);color:#111827}.h1w59zdn{background:linear-gradient(45deg,#f7f7f8,#f7f7f8);border:.5px solid #ececf1;border-radius:6px;display:inline-block;font-size:14px;font-weight:500;line-height:1.6em;margin:0 3px;padding:0 .3em}.h1wifk81{border-color:#d1d5db;color:#374151;font-style:italic;margin:0}.h1ej4n95{border-color:hsla(0,0%,90%,.7)}.h1vb39qj{background-color:#f6f8fa;border:0;border-radius:6px;margin-top:0;overflow:auto;padding:16px}.h1bta36o{align-items:center;background-color:#fff;border-bottom:1px solid hsl(212,15%,84%);display:flex;height:42px;z-index:99}.uxs4bf1{color:hsl(212,15%,48%);display:flex;gap:10px;list-style:none;padding:0;white-space:nowrap}.ifn7ecb,.uxs4bf1{height:100%}.ifn7ecb[data-state=active] a{border-bottom-color:#7051d4}.i441kmn{border-bottom:3px solid transparent;display:inline-flex;height:100%;padding:10px;-webkit-text-decoration:none;text-decoration:none}.hwmojve{border-top:1px solid #ececf1}.hwmojve[open] summary svg[data-icon=true]{transform:rotate(90deg)}.h1an07j0{background-color:#f7f7f8;border:1px solid #ececf1;border-radius:8px}.sbneplt{align-items:center;cursor:pointer;display:flex;flex-direction:row;font-size:18px;font-variant-numeric:tabular-nums;font-weight:500;justify-content:flex-start;line-height:1.4;list-style:none;padding:16px 14px 16px 0;transition:color .3s}.sbneplt:hover{color:#565869}.s1d31n8s{cursor:pointer;justify-content:space-between;padding:20px 24px}.s1d31n8s,.s2p0kpw{align-items:center;display:flex}.s2p0kpw{margin-bottom:8px}.snk81qf{color:#6e6e80;font-size:12px;font-weight:700;letter-spacing:.08em;line-height:16px;margin-left:8px;text-transform:uppercase}.lyq3zec{flex:1 1 auto}.iq0a0s6{align-items:center;display:flex;flex:0 0 auto;font-size:16px;justify-content:center;padding-right:6px}.c1ligx2c{padding:0 24px 20px}.c89yndk code{background:#fff}.h1xhrk1{border-top-width:1px;justify-content:space-between;margin-bottom:2rem;margin-top:2rem;padding-top:2rem}.h1xhrk1,.l1elq7ab{align-items:center;display:flex}.l1elq7ab{font-size:1rem;font-weight:500;gap:.25rem;line-height:1.5rem;max-width:50%;padding-bottom:1rem;padding-top:1rem;transition-duration:.3s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.i1mmatje{display:inline;flex-shrink:0;height:1.25rem}.h14vj3ri{border-collapse:collapse;border-radius:3px;display:block;overflow-x:scroll}.t1l6tz9b{background:rgba(234,238,242,.5);border-color:#d1d5db;border-width:1px;font-weight:600;margin:0;padding:.5rem 1rem}.thzxr0l{border-color:#d1d5db;border-top-width:1px;margin:0;padding:0}.t1g1altt{border-color:#d1d5db;border-width:1px;margin:0;padding:.5rem 1rem}.hhnegou{align-items:center;border:1px solid #ececf1;border-radius:8px;display:inline-flex;min-width:275px;padding:8px 12px;position:relative;text-align:center;width:100%}._1ja9964{background-color:#f7f7f8;border-color:#ececf1}.h1lyih3m{align-self:flex-start;color:#6e6e80;display:inline-flex;flex:0 0 auto;font-size:20px;margin-right:14px;margin-top:2px}.h1gzjc3x{color:#353740;flex:1 1 auto;text-align:left}.boe1v8p{font-size:14px;line-height:20px}:root{--xyd-navbar-height:46px;--xyd-global-page-gutter:8px}.h8dr7e{width:100%}.h1ezaz84{align-items:center;display:flex;height:46px;justify-content:space-between;left:8px;position:fixed;right:8px;top:0}.h17wz13c{flex-direction:column;height:90px;transition:transform .2s}.h1bgh3rd{transform:translateY(-43px)}.mxu2emt{bottom:8px;left:8px;position:fixed;right:8px;top:46px}.mslox5x{top:90px;transition:top .2s}.s1i19hnd{background:none;border:0;border-radius:0;flex-direction:column;left:0;opacity:1;overflow:visible;padding:12px 0 0;top:0;visibility:visible;width:210px;z-index:101}.h13sn67b,.s1i19hnd{bottom:0;position:absolute;right:0;transition:opacity .3s cubic-bezier(.65,0,.35,1)}.h13sn67b{background:#fff;left:210px;overflow:hidden;top:12px;z-index:201}.s1k9r3in{height:100%;overflow:scroll}.c1t0msup{font-size:15px;line-height:24px;min-height:100%;padding:0;width:100%}.apqkghd,.c1t0msup{margin:0 auto;max-width:100%}.apqkghd{padding:20px 56px 40px;width:980px}.a10qws06{width:1200px}.h3zl32q{align-items:flex-start;display:flex;gap:30px;width:100%}.c1cmkhbs{flex:1 1 0;overflow:hidden}.n1rrfk2r{flex:none;margin-left:50px;margin-top:0;padding-left:16px;position:sticky;top:30px;width:180px}.htyux6{color:#7051d4}.h1dmvxug{border:1px solid #ececf1;border-radius:16px;min-width:0;overflow:hidden}.h1pb9ov9{background:linear-gradient(45deg,#f7f7f8,#f7f7f8)!important;border-bottom:0;border-top-left-radius:10px;border-top-right-radius:10px;display:flex;flex:1 1 0%;min-width:0}.laeqccf{display:flex;flex-grow:1;gap:8px;justify-content:end;padding:0 10px}.brmq4h0{all:unset;align-items:center;border-radius:6px;color:#353740;cursor:pointer;display:flex;font-size:14px;justify-content:center;padding:6px}.brmq4h0[data-state=active]{border-bottom:1px solid #7051d4;border-bottom-left-radius:0;border-bottom-right-radius:0;color:#7051d4}.brmq4h0:hover{background:#e3e3eb;transition:.1s ease-in}.dht44{align-items:center;color:#353740;display:flex;font-size:14px;gap:4px;margin-left:4px;margin-right:4px}.d3qz0ka{border-radius:4px;display:flex;flex:1 1 0%;gap:16px;padding-left:16px;padding-right:16px}.cjcdygz{align-items:center;display:flex;padding-left:8px;padding-right:8px}.hmi9h9e{color:#7051d4;font-size:18px;font-weight:300;margin-top:-18px}.hyawwu4{border-color:transparent;border-left-width:4px;display:flex;margin:4px 0}.l1i5ism5{flex:1 1 0%}._1fnx2sm{background-color:#eef2ff;border-color:#60a5fa}.h83ezas{margin:0 12px 0 4px;opacity:.5;-webkit-user-select:none;-moz-user-select:none;user-select:none}.hwih9s3{background:linear-gradient(45deg,#f7f7f8,#f7f7f8)!important;border-bottom-left-radius:10px;border-bottom-right-radius:10px;border-top:1px solid #ececf1;font-size:12px;line-height:20px;margin:0;max-height:400px;overflow-y:scroll;padding:8px 16px;white-space:pre-wrap;word-break:break-all}.h1sbwmbs{max-height:100%}.h1seqss5{display:flex;flex-direction:column;gap:24px}.h1hvsyfb{all:unset;align-items:center;border-radius:6px;cursor:pointer;display:flex;justify-content:center;padding:6px}.h1hvsyfb:hover{background:#e3e3eb;transition:.1s ease-in}.h9tkkeg{font-size:30px;font-weight:400}.c1q2rf33{background:linear-gradient(45deg,#f7f7f8,#f7f7f8);border:1px solid var(--atlas-comp-apiref-item-border-color);border-radius:8px;font-size:13px;padding:8px}.lhk53ap{color:var(--atlas-comp-apiref-item-navbar-color);margin-right:4px}.h1t46rpg{display:flex;flex-direction:column;gap:16px;padding-bottom:25px}.gq5m3p7{align-items:normal;display:grid;gap:100px;grid-template-columns:repeat(2,minmax(0,1fr))}.i1lmmgv6{display:flex;flex-direction:column;gap:25px;margin-bottom:25px}.hpmrvhc{font-size:15px;font-weight:600}.l8q9wny{-webkit-text-decoration:none;text-decoration:none}.h1b8wz9m{-webkit-box-flex-wrap:wrap;border:none;display:flex;flex-direction:column;flex-wrap:wrap;gap:16px;list-style:none}.h1ayic9k,.h1b8wz9m{margin:0;padding:0}.h1ayic9k:first-child{padding-top:0}.h1ayic9k:last-child{padding-bottom:0}.hkisad5{color:var(--atlas-comp-apiref-properties-description-color);font-size:14px;line-height:22px}.h159tzrk{-webkit-box-flex-wrap:wrap;align-items:center;display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-start;margin:8px 0;position:relative}.h159tzrk dd{margin-inline-start:0}.ht6ukcw{color:var(--atlas-comp-apiref-properties-prop__name-color);font-size:13px;font-weight:600}.h1hhb1ak,.ht6ukcw{display:inline-flex;padding:4px 0}.h1hhb1ak{border-radius:4px;color:var(--atlas-comp-apiref-properties-prop__type-color);font-size:10px}.l1ud1m37{color:var(--atlas-comp-apiref-properties-color--active);-webkit-text-decoration:underline;text-decoration:underline}.l1ud1m37:hover{-webkit-text-decoration:none;text-decoration:none}.h1fjyrqx{border-style:none;display:none;padding:8px}.h12sxrry{display:unset}.u1ofrsp8{-webkit-box-flex-wrap:wrap;border:none;border-left:1px solid var(--atlas-comp-apiref-properties-border-color);display:flex;flex-direction:column;flex-wrap:wrap;gap:16px;list-style:none;margin:0;padding:0}.lmjvvs5{padding:0 16px}.h9u79h5{align-items:center;background:none;border:none;color:inherit;cursor:pointer;display:flex;margin-top:16px;outline:inherit;padding:0}.h9u79h5,.h9u79h5 svg{font-size:13px}.h9u79h5:hover svg{color:var(--atlas-comp-apiref-properties-color--active);transition:all .1s ease-in}.l16o3qrr{cursor:pointer;margin-left:4px;-webkit-text-decoration:none;text-decoration:none}.l16o3qrr:hover{color:var(--atlas-comp-apiref-properties-color--active);transition:all .1s ease-in}.h47igvr{all:unset;align-items:center;border-radius:6px;cursor:pointer;display:flex;justify-content:center;padding:6px}.h47igvr:hover{background:var(--atlas-comp-code-copy-background--active);transition:.1s ease-in}.h1ur68ey{border:1px solid var(--atlas-comp-code-sample-border-color);border-radius:16px;flex:1 1 0;max-width:512px;min-width:0;overflow:hidden}.hp2fg9q{background:linear-gradient(45deg,#f7f7f8,#f7f7f8)!important;border-bottom:0;border-top-left-radius:10px;border-top-right-radius:10px;display:flex;flex:1 1 0%;min-width:0;padding:8px 0}.l1u5q09{display:flex;flex-grow:1;gap:8px;justify-content:end;padding:0 10px}.b1g5l43{all:unset;align-items:center;border-radius:6px;color:var(--atlas-comp-code-sample-color);cursor:pointer;display:flex;font-size:14px;justify-content:center;padding:6px}.b1g5l43[data-state=active]{border-bottom:1px solid var(--atlas-comp-code-sample-color--active);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--atlas-comp-code-sample-color--active)}.b1g5l43:hover{background:var(--atlas-comp-code-sample-background);transition:.1s ease-in}.d1x4vxzj{align-items:center;color:var(--atlas-comp-code-sample-color);display:flex;font-size:14px;gap:4px;margin-left:4px;margin-right:4px}.d1n1kybx{border-radius:4px;display:flex;flex:1 1 0%;gap:16px;padding-left:16px;padding-right:16px}.c1qxxuld{align-items:center;display:flex;padding-left:8px;padding-right:8px}.h1gfddng{background:linear-gradient(45deg,#f7f7f8,#f7f7f8)!important;border-bottom-left-radius:10px;border-bottom-right-radius:10px;border-top:1px solid var(--atlas-comp-code-sample-border-color);font-size:14px;line-height:20px;margin:0;max-height:400px;overflow-y:scroll;padding:8px 16px;white-space:pre-wrap;word-break:break-all}.h1h0n8u6{border-color:transparent;border-left-width:4px;display:flex;margin:4px 0}.l12klvp{flex:1 1 0%}._4uqa3m{background-color:var(--atlas-comp-code-sample-mark-background--active);border-color:var(--atlas-comp-code-sample-mark-border--active)}.h18n51vi{margin:0 4px;opacity:.5;-webkit-user-select:none;-moz-user-select:none;user-select:none}.h1de1isv{max-width:100%;position:relative}.c174knag{align-items:center;background-color:#f3f4f6;border-radius:8px;display:flex}.hdr58em{background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05);padding:8px}.izmf263{height:16px;width:16px}.h1olbpn1{flex-grow:1;overflow-x:auto}.c1dubejs{display:inline-flex;gap:4px;margin-left:4px;padding:4px}.he063xp{border-radius:.375rem;color:#6b7280;font-size:.875rem;font-weight:500;line-height:1.25rem;padding:.5rem 1rem;transition-duration:.3s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);white-space:nowrap}._lt697q,.he063xp:hover{color:#111827}._lt697q{background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.hskauww{display:flex;flex-direction:column;gap:32px;position:sticky;top:6rem}.hskauww:first-child{margin-top:0}.hskauww:last-child{margin-bottom:0}.h1nkbfqz{display:flex;flex-direction:column;gap:10px}.h5edgc7{width:100%}.h12vpet9{padding:16px 0}._18e99ku{padding:4px 0}:root{--headingEffect-color-tertiary:rgba(23,119,184,.5);--headingEffect-color-secondary:#7955f1;--headingEffect-color-primary:#ff69b4;--atlas-comp-apiref-properties-color--active:#7051d4;--atlas-comp-apiref-properties-border-color:#d2d5d8}@font-face{font-family:Mona Sans;font-stretch:75% 125%;font-weight:200 900;src:url(../public/fonts/MonaSans/Mona-Sans.woff2) format("woff2 supports variations"),url(../public/fonts/MonaSans/Mona-Sans.woff2) format("woff2-variations")}html{font-family:Mona Sans,serif}body{margin:0}menu,ol,ul{list-style:none;margin:0;padding:0}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}[role=button],button{cursor:pointer}button,select{text-transform:none}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}a{color:inherit;text-decoration:inherit}*,:after,:before{border-style:solid;border-width:0;box-sizing:border-box}p{margin:0;padding:0}.xyd_ui-comp-nav-logo,.xyd_ui-comp-sidebar{padding-left:200px}.xyd_comp-comp-heading{font-weight:400}
package/dist/index.d.ts DELETED
@@ -1,19 +0,0 @@
1
- import React from 'react';
2
- import { ITheme } from '@xyd-js/framework';
3
-
4
- interface ThemeSettings {
5
- hideToc?: boolean;
6
- sidebar?: {
7
- onePathBehaviour?: boolean;
8
- clientSideRouting?: boolean;
9
- };
10
- contentNav?: React.ReactNode;
11
- layout?: {
12
- kind?: "fullwidth" | "equal";
13
- };
14
- }
15
- interface ThemeProps extends ITheme<ThemeSettings> {
16
- }
17
- declare function ThemePoetry(props: ThemeProps): React.JSX.Element;
18
-
19
- export { ThemePoetry as default };
package/dist/index.js DELETED
@@ -1,130 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { helperContent } from '@xyd-js/components/content';
3
- import { FwNavLinks, FwToc, FwNav, FwSidebarGroups } from '@xyd-js/framework/react';
4
-
5
- const globalHeaderHeight = '46px';
6
- const $layout = {
7
- host: "h1rnwuz9",
8
- header: "h132y9go",
9
- header$$sub: "h1ulv53s",
10
- header$$hideMain: "h1xdz7qg",
11
- main: "mk7pvq",
12
- main$$sub: "m8kgblw",
13
- sidebar: "sh5saf3"
14
- };
15
- const $page = {
16
- host: "h14fb2m2",
17
- scroll: "skdd2lx",
18
- container: "c3f1387",
19
- articleContainer: "a85a4w5",
20
- articleContainer$$fullWidth: "asxdsuf"
21
- };
22
- const $article = {
23
- host: "hl7s9k1",
24
- content: "ctha5be",
25
- nav: "nhz4uc",
26
- nav$$equal: "n16jquc6"
27
- };
28
-
29
- // TODO: move scroller to xyd-foo
30
- function Layout(props) {
31
- const [hideMainHeader, setHideMainHeader] = useState(false);
32
- const [scrollTop, setScrollTop] = useState(0);
33
- const [controlScrollPos, setControlScrollPos] = useState(0);
34
- useEffect(() => {
35
- if (scrollTop === controlScrollPos) {
36
- return;
37
- }
38
- const checkpoint = parseInt(globalHeaderHeight, 10) / 2;
39
- const diff = scrollTop - controlScrollPos;
40
- const reversePosDiff = Math.abs(scrollTop - controlScrollPos);
41
- if (diff > checkpoint) {
42
- setHideMainHeader(true);
43
- }
44
- else if (reversePosDiff > checkpoint) {
45
- setHideMainHeader(false);
46
- }
47
- }, [
48
- scrollTop,
49
- controlScrollPos,
50
- ]);
51
- function onScroll(e) {
52
- var _a;
53
- if (!(e.target instanceof HTMLElement)) {
54
- return;
55
- }
56
- const scroll = (_a = e.target) === null || _a === undefined ? undefined : _a.scrollTop;
57
- setScrollTop(scroll);
58
- }
59
- function onScrollFinish(e) {
60
- var _a;
61
- if (!(e.target instanceof HTMLElement)) {
62
- return;
63
- }
64
- setControlScrollPos((_a = e.target) === null || _a === undefined ? undefined : _a.scrollTop);
65
- }
66
- // TODO: by ref?
67
- // TODO: MOVE SOMEWHERE ELSE BECAUSE IT DECREASE PERFORMANCE (RERENDER)
68
- useEffect(() => {
69
- // return // TODO: UNCOMMENT
70
- var _a, _b;
71
- if (!props.subheader) {
72
- return;
73
- }
74
- (_a = document.querySelector(`.${$page.scroll}`)) === null || _a === undefined ? undefined : _a.addEventListener("scroll", onScroll);
75
- (_b = document.querySelector(`.${$page.scroll}`)) === null || _b === undefined ? undefined : _b.addEventListener("scrollend", onScrollFinish);
76
- return () => {
77
- var _a, _b;
78
- (_a = document.querySelector(`.${$page.scroll}`)) === null || _a === undefined ? undefined : _a.removeEventListener("scroll", onScroll);
79
- (_b = document.querySelector(`.${$page.scroll}`)) === null || _b === undefined ? undefined : _b.removeEventListener("scrollend", onScrollFinish);
80
- };
81
- }, []);
82
- return React.createElement("div", { className: $layout.host },
83
- React.createElement("header", { className: `
84
- ${$layout.header}
85
- ${props.subheader && $layout.header$$sub}
86
- ${hideMainHeader && $layout.header$$hideMain}
87
- ` }, props.header),
88
- React.createElement("main", { className: `
89
- ${$layout.main}
90
- ${!hideMainHeader && props.subheader && $layout.main$$sub}
91
- ` },
92
- React.createElement("aside", { className: $layout.sidebar }, props.aside),
93
- React.createElement("div", { className: $page.host },
94
- React.createElement("div", { className: $page.scroll },
95
- React.createElement("div", { className: $page.container },
96
- React.createElement("div", { className: `
97
- ${$page.articleContainer}
98
- ${props.kind == "fullwidth" && $page.articleContainer$$fullWidth}
99
- ${props.kind == "equal" && $page.articleContainer$$fullWidth}
100
- ` },
101
- React.createElement("article", { className: $article.host },
102
- React.createElement("section", { className: $article.content }, props.content),
103
- props.contentNav && React.createElement("nav", { className: `
104
- ${$article.nav}
105
- ${props.kind == "equal" && $article.nav$$equal}
106
- ` }, props.contentNav))))))));
107
- }
108
-
109
- const { Content } = helperContent();
110
- function ThemePoetry(props) {
111
- var _a, _b, _c, _d;
112
- return React.createElement(Layout, { header: React.createElement(Navbar, null), aside: React.createElement(Sidebar, { themeSettings: props.themeSettings }), content: React.createElement(React.Fragment, null,
113
- React.createElement(Content, null, props.children),
114
- React.createElement(FwNavLinks, null)), contentNav: ((_a = props.themeSettings) === null || _a === undefined ? undefined : _a.hideToc)
115
- ? null
116
- : ((_b = props.themeSettings) === null || _b === undefined ? undefined : _b.contentNav) ? props.themeSettings.contentNav : React.createElement(FwToc, null), kind: ((_d = (_c = props.themeSettings) === null || _c === undefined ? undefined : _c.layout) === null || _d === undefined ? undefined : _d.kind) || undefined });
117
- }
118
- // TODO: finish search
119
- function Navbar() {
120
- return React.createElement(React.Fragment, null,
121
- React.createElement(FwNav, { kind: "middle" }));
122
- }
123
- // TODO: onePathBehaviour does not work - fix that
124
- function Sidebar({ themeSettings }) {
125
- var _a, _b;
126
- return React.createElement(FwSidebarGroups, { onePathBehaviour: (_a = themeSettings === null || themeSettings === undefined ? undefined : themeSettings.sidebar) === null || _a === undefined ? undefined : _a.onePathBehaviour, clientSideRouting: (_b = themeSettings === null || themeSettings === undefined ? undefined : themeSettings.sidebar) === null || _b === undefined ? undefined : _b.clientSideRouting });
127
- }
128
-
129
- export { ThemePoetry as default };
130
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/components/Layouts/Layout.styles.tsx","../src/components/Layouts/Layout.tsx","../src/theme.tsx"],"sourcesContent":["import {css} from \"@linaria/core\";\n\nconst globalPageGutter = '8px';\nexport const globalHeaderHeight = '46px';\nconst globalHeaderWarningHeight = \"0px\";\nconst contentTopSpace = \"12px\";\n\nconst globalHeaderHeightWithSub = '90px';\n\nconst cubicMove = \"cubic-bezier(.65, 0, .35, 1)\";\nconst sidebarWidth = \"450px\";\n\n// TODO: better solution - design tokens\nexport const globals = css`\n :global() {\n :root {\n --xyd-navbar-height: ${globalHeaderHeight};\n --xyd-sidebar-width: ${sidebarWidth};\n }\n }\n`;\n\nexport const $layout = {\n host: css`\n width: 100%;\n `,\n header: css`\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n position: fixed;\n top: ${globalHeaderWarningHeight};\n right: ${globalPageGutter};\n left: ${globalPageGutter};\n\n height: ${globalHeaderHeight};\n `,\n header$$sub: css`\n flex-direction: column;\n height: ${globalHeaderHeightWithSub};\n transition: transform 200ms;\n `,\n header$$hideMain: css`\n transform: translateY(calc(-${globalHeaderHeight} + 3px));\n `,\n main: css`\n position: fixed;\n top: calc(${globalHeaderHeight} + ${globalHeaderWarningHeight});\n bottom: ${globalPageGutter};\n left: ${globalPageGutter};\n right: ${globalPageGutter};\n }`,\n main$$sub: css`\n top: calc(${globalHeaderHeightWithSub} + ${globalHeaderWarningHeight});\n transition: top 200ms;\n `,\n sidebar: css`\n flex-direction: column;\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 101;\n width: ${sidebarWidth};\n border: 0;\n padding: ${contentTopSpace} 0 0;\n overflow: visible;\n background: none;\n border-radius: 0;\n opacity: 1;\n visibility: visible;\n transition: opacity .3s ${cubicMove};\n `,\n}\n\nexport const $page = {\n host: css`\n position: absolute;\n top: ${contentTopSpace};\n right: 0;\n bottom: 0;\n z-index: 201;\n background: #fff;\n\n overflow: hidden;\n transition: opacity .3s ${cubicMove};\n\n left: ${sidebarWidth};\n `,\n scroll: css`\n overflow: scroll;\n height: 100%;\n \n `,\n container: css`\n padding: 0;\n width: 100%;\n //position: relative; TODO: unset if during client render?\n min-height: 100%;\n\n max-width: 100%;\n margin: 0 auto;\n font-size: 15px;\n line-height: 24px;\n `,\n articleContainer: css`\n width: 980px;\n padding: 40px 56px;\n padding-left: 0;\n padding-top: 20px;\n margin: 0 auto;\n margin-left: 100px;\n max-width: 100%;\n `,\n articleContainer$$fullWidth: css`\n width: 1200px;\n `,\n}\n\nexport const $article = {\n host: css`\n display: flex;\n gap: 30px;\n width: 100%;\n align-items: flex-start;;\n `,\n content: css`\n flex: 1 1 0;\n overflow: hidden;\n `,\n nav: css`\n position: sticky;\n top: 30px;\n width: 180px;\n margin-top: 0;\n margin-left: 50px;\n padding-left: 16px;\n flex: none;\n `,\n nav$$equal: css`\n flex: 1;\n `\n}","import React, {useEffect, useState} from \"react\"\n\nimport {$layout, $page, $article, globalHeaderHeight} from \"./Layout.styles\"\n\nexport interface LayoutProps {\n header: React.ReactNode;\n aside: React.ReactNode;\n content: React.ReactNode;\n contentNav: React.ReactNode;\n subheader?: boolean;\n kind?: \"fullwidth\" | \"equal\"\n}\n\n// TODO: move scroller to xyd-foo\nexport function Layout(props: LayoutProps) {\n const [hideMainHeader, setHideMainHeader] = useState(false)\n const [scrollTop, setScrollTop] = useState(0)\n const [controlScrollPos, setControlScrollPos] = useState(0)\n\n useEffect(() => {\n if (scrollTop === controlScrollPos) {\n return\n }\n\n const checkpoint = parseInt(globalHeaderHeight, 10) / 2\n const diff = scrollTop - controlScrollPos\n const reversePosDiff = Math.abs(scrollTop - controlScrollPos)\n\n if (diff > checkpoint) {\n setHideMainHeader(true)\n } else if (reversePosDiff > checkpoint) {\n setHideMainHeader(false)\n }\n }, [\n scrollTop,\n controlScrollPos,\n ]);\n\n function onScroll(e: Event) {\n if (!(e.target instanceof HTMLElement)) {\n return\n }\n\n const scroll = e.target?.scrollTop\n setScrollTop(scroll)\n }\n\n function onScrollFinish(e: Event) {\n if (!(e.target instanceof HTMLElement)) {\n return\n }\n\n setControlScrollPos(e.target?.scrollTop)\n }\n\n // TODO: by ref?\n // TODO: MOVE SOMEWHERE ELSE BECAUSE IT DECREASE PERFORMANCE (RERENDER)\n useEffect(() => {\n // return // TODO: UNCOMMENT\n\n if (!props.subheader) {\n return\n }\n\n document.querySelector(`.${$page.scroll}`)?.addEventListener(\"scroll\", onScroll)\n document.querySelector(`.${$page.scroll}`)?.addEventListener(\"scrollend\", onScrollFinish)\n\n return () => {\n document.querySelector(`.${$page.scroll}`)?.removeEventListener(\"scroll\", onScroll)\n document.querySelector(`.${$page.scroll}`)?.removeEventListener(\"scrollend\", onScrollFinish)\n }\n }, []);\n\n return <div className={$layout.host}>\n <header className={`\n ${$layout.header}\n ${props.subheader && $layout.header$$sub}\n ${hideMainHeader && $layout.header$$hideMain}\n `}>\n {props.header}\n </header>\n <main className={`\n ${$layout.main}\n ${!hideMainHeader && props.subheader && $layout.main$$sub}\n `}>\n <aside className={$layout.sidebar}>\n {props.aside}\n </aside>\n <div className={$page.host}>\n <div className={$page.scroll}>\n <div className={$page.container}>\n <div className={`\n ${$page.articleContainer}\n ${props.kind == \"fullwidth\" && $page.articleContainer$$fullWidth}\n ${props.kind == \"equal\" && $page.articleContainer$$fullWidth}\n `}>\n <article className={$article.host}>\n <section className={$article.content}>\n {props.content}\n </section>\n {\n props.contentNav && <nav className={`\n ${$article.nav}\n ${props.kind == \"equal\" && $article.nav$$equal}\n `}>\n {props.contentNav}\n </nav>\n }\n </article>\n </div>\n </div>\n </div>\n </div>\n </main>\n </div>\n}","import React from \"react\"\n\nimport {helperContent} from \"@xyd-js/components/content\"\nimport type {\n ITheme\n} from \"@xyd-js/framework\"\nimport {\n FwNav,\n FwToc,\n FwNavLinks,\n\n FwSidebarGroups,\n} from \"@xyd-js/framework/react\"\n\nimport {Layout} from \"./components/Layouts\";\n\nimport \"@xyd-js/ui/index.css\";\nimport \"@xyd-js/components/index.css\";\nimport '@xyd-js/atlas/index.css';\n\nimport './index.css';\nimport './override.css';\n\nconst {Content} = helperContent()\n\nexport interface ThemeSettings {\n hideToc?: boolean // TODO: better prop name?\n sidebar?: {\n onePathBehaviour?: boolean\n clientSideRouting?: boolean\n }\n contentNav?: React.ReactNode\n layout?: {\n kind?: \"fullwidth\" | \"equal\"\n }\n}\n\nexport interface ThemeProps extends ITheme<ThemeSettings> {\n}\n\nexport default function ThemePoetry(props: ThemeProps) {\n return <Layout\n header={<Navbar/>}\n aside={<Sidebar themeSettings={props.themeSettings}/>}\n content={<>\n {/*TODO: optional breadcrumbs*/}\n {/*{props.breadcrumbs ? <FwBreadcrumbs/> : undefined}*/}\n <Content>\n {props.children}\n </Content>\n\n <FwNavLinks/>\n </>\n }\n contentNav={\n props.themeSettings?.hideToc\n ? null\n : props.themeSettings?.contentNav ? props.themeSettings.contentNav : <FwToc/>\n }\n kind={props.themeSettings?.layout?.kind || undefined}\n />\n}\n\n// TODO: finish search\nfunction Navbar() {\n return <>\n <FwNav kind=\"middle\"/>\n </>\n}\n\n// TODO: onePathBehaviour does not work - fix that\nfunction Sidebar({themeSettings}: { themeSettings?: ThemeSettings }) {\n return <FwSidebarGroups\n onePathBehaviour={themeSettings?.sidebar?.onePathBehaviour}\n clientSideRouting={themeSettings?.sidebar?.clientSideRouting}\n />\n}"],"names":["globalHeaderHeight","$layout","host","header","header$$sub","header$$hideMain","main","main$$sub","sidebar","$page","scroll","container","articleContainer","articleContainer$$fullWidth","$article","content","nav","nav$$equal"],"mappings":"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"}