@brillout/docpress 0.8.13 → 0.8.15

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 (50) hide show
  1. package/Layout.tsx +279 -171
  2. package/MenuModal.tsx +55 -56
  3. package/{Links.tsx → NavSecondaryContent.tsx} +6 -8
  4. package/components/HorizontalLine.tsx +4 -3
  5. package/config/resolveHeadingsData.ts +7 -10
  6. package/css/code/block.css +5 -5
  7. package/css/code/inline.css +1 -1
  8. package/css/colorize-on-hover.css +20 -9
  9. package/dist/Layout.d.ts +10 -6
  10. package/dist/Layout.js +181 -102
  11. package/dist/MenuModal.d.ts +5 -1
  12. package/dist/MenuModal.js +44 -60
  13. package/dist/{Links.d.ts → NavSecondaryContent.d.ts} +3 -2
  14. package/dist/{Links.js → NavSecondaryContent.js} +5 -6
  15. package/dist/components/HorizontalLine.d.ts +1 -1
  16. package/dist/components/HorizontalLine.js +3 -2
  17. package/dist/config/resolveHeadingsData.d.ts +3 -4
  18. package/dist/config/resolveHeadingsData.js +5 -8
  19. package/dist/config/resolvePageContext.d.ts +2 -3
  20. package/dist/docsearch/SearchLink.js +2 -3
  21. package/dist/navigation/Collapsible.d.ts +10 -0
  22. package/dist/navigation/Collapsible.js +35 -0
  23. package/dist/navigation/Navigation.d.ts +0 -3
  24. package/dist/navigation/Navigation.js +106 -55
  25. package/dist/renderer/determineNavItemsColumnLayout.d.ts +3 -0
  26. package/dist/renderer/{determineColumnEntries.js → determineNavItemsColumnLayout.js} +34 -28
  27. package/dist/renderer/usePageContext.d.ts +2 -2
  28. package/dist/renderer/usePageContext.js +2 -4
  29. package/dist/utils/Style.d.ts +5 -0
  30. package/dist/utils/Style.js +6 -0
  31. package/dist/utils/cls.d.ts +3 -0
  32. package/dist/utils/cls.js +5 -0
  33. package/dist/utils/throttle.d.ts +1 -0
  34. package/dist/utils/throttle.js +14 -0
  35. package/docsearch/SearchLink.tsx +4 -13
  36. package/global.d.ts +1 -1
  37. package/initKeyBindings.ts +1 -6
  38. package/navigation/Collapsible.css +11 -0
  39. package/navigation/Collapsible.tsx +64 -0
  40. package/navigation/Navigation.css +12 -6
  41. package/navigation/Navigation.tsx +191 -80
  42. package/package.json +1 -1
  43. package/renderer/{determineColumnEntries.ts → determineNavItemsColumnLayout.ts} +35 -29
  44. package/renderer/initOnNavigation.ts +37 -0
  45. package/renderer/onRenderClient.tsx +2 -0
  46. package/renderer/usePageContext.tsx +2 -5
  47. package/utils/Style.tsx +7 -0
  48. package/utils/cls.ts +8 -0
  49. package/utils/throttle.ts +10 -0
  50. package/dist/renderer/determineColumnEntries.d.ts +0 -3
package/dist/Layout.js CHANGED
@@ -14,35 +14,38 @@ var __assign = (this && this.__assign) || function () {
14
14
  return __assign.apply(this, arguments);
15
15
  };
16
16
  export { Layout };
17
- export { containerQueryMobile };
18
- export { navWidthMin };
19
- export { navWidthMax };
17
+ export { containerQueryMobileLayout };
18
+ export { containerQueryMobileMenu };
19
+ export { navLeftWidthMin };
20
+ export { navLeftWidthMax };
21
+ export { unexpandNav };
20
22
  import React from 'react';
21
23
  import { NavigationContent } from './navigation/Navigation';
22
24
  import { EditPageNote } from './components/EditPageNote';
23
25
  import { parseTitle } from './parseTitle';
24
26
  import { usePageContext, usePageContext2 } from './renderer/usePageContext';
25
- import { Links } from './Links';
26
- import { toggleMenuModal } from './MenuModal';
27
+ import { NavSecondaryContent } from './NavSecondaryContent';
28
+ import { closeMenuModal, openMenuModal, toggleMenuModal } from './MenuModal';
27
29
  import { MenuModal } from './MenuModal';
28
30
  import { autoScrollNav_SSR } from './autoScrollNav';
29
31
  import { SearchLink } from './docsearch/SearchLink';
30
32
  import { navigate } from 'vike/client/router';
31
33
  import { css } from './utils/css';
32
34
  import { PassThrough } from './utils/PassTrough';
33
- var mainViewWidthMax = 800;
34
- var mainViewPadding = 20;
35
- var navWidthMax = 370;
36
- var navWidthMin = 300;
37
- var navWidth = {
38
- minWidth: navWidthMin,
39
- maxWidth: navWidthMax,
40
- width: '100%',
41
- };
35
+ import { Style } from './utils/Style';
36
+ import { cls } from './utils/cls';
42
37
  var blockMargin = 3;
38
+ var mainViewPadding = 20;
39
+ var mainViewWidthMax = 800;
40
+ var navLeftWidthMax = 370;
41
+ var navLeftWidthMin = 300;
42
+ // 840 = 800 + 20 * 2
43
43
  var mainViewMax = mainViewWidthMax + mainViewPadding * 2;
44
- var containerQuerySpacing = mainViewMax + navWidthMax + blockMargin;
45
- var containerQueryMobile = mainViewMax + navWidthMin;
44
+ var containerQueryMobileMenu = 1000;
45
+ // 1143 = 840 + 300
46
+ var containerQueryMobileLayout = mainViewMax + navLeftWidthMin;
47
+ // 1213 = 840 + 370 + 3
48
+ var containerQueryExtraSpace = mainViewMax + navLeftWidthMax + blockMargin;
46
49
  // Avoid whitespace at the bottom of pages with almost no content
47
50
  var whitespaceBuster1 = {
48
51
  minHeight: '100vh',
@@ -68,29 +71,31 @@ function Layout(_a) {
68
71
  _b['--bg-color'] = '#f5f5f7',
69
72
  _b['--block-margin'] = "".concat(blockMargin, "px"),
70
73
  _b['--icon-text-padding'] = '8px',
74
+ _b['--nav-head-height'] = "".concat(isLandingPage ? 70 : 60, "px"),
71
75
  _b) },
72
- React.createElement(MenuModal, null),
76
+ React.createElement(MenuModal, { isTopNav: isLandingPage }),
73
77
  React.createElement("div", { className: isLandingPage ? '' : 'doc-page', style: __assign({
74
78
  // We don't add `container` to `body` nor `html` beacuse in Firefox it breaks the `position: fixed` of <MenuModal>
75
79
  // https://stackoverflow.com/questions/74601420/css-container-inline-size-and-fixed-child
76
- containerType: 'inline-size' }, whitespaceBuster1) }, content)));
80
+ container: 'container-viewport / inline-size' }, whitespaceBuster1) },
81
+ React.createElement(NavHead, null),
82
+ content)));
77
83
  }
78
84
  function LayoutDocsPage(_a) {
79
85
  var children = _a.children;
80
86
  var pageContext = usePageContext();
81
- var hideNavLeftAlways = pageContext.navItems.length <= 1;
87
+ var hideNavLeftAlways = pageContext.navItemsDetached && pageContext.navItemsDetached.length <= 1;
82
88
  return (React.createElement(React.Fragment, null,
83
89
  React.createElement("style", null, getStyle()),
84
- React.createElement(NavMobile, null),
85
90
  React.createElement("div", { style: __assign({ display: 'flex' }, whitespaceBuster2) },
86
91
  React.createElement(NavLeft, null),
87
92
  React.createElement("div", { className: "low-prio-grow", style: { width: 0, maxWidth: 50, background: 'var(--bg-color)' } }),
88
93
  React.createElement(PageContent, null, children))));
89
94
  function getStyle() {
90
- var style = css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n@container(min-width: ", "px) {\n .low-prio-grow {\n flex-grow: 1;\n }\n #navigation-container {\n width: ", "px !important;\n }\n}"], ["\n@container(min-width: ", "px) {\n .low-prio-grow {\n flex-grow: 1;\n }\n #navigation-container {\n width: ", "px !important;\n }\n}"])), containerQuerySpacing, navWidthMax);
91
- var navLeftHide = css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n#nav-left {\n display: none;\n}\n.page-wrapper {\n --main-view-padding: 10px !important;\n flex-grow: 1;\n align-items: center;\n}\n.page-content {\n margin: auto;\n}\n"], ["\n#nav-left {\n display: none;\n}\n.page-wrapper {\n --main-view-padding: 10px !important;\n flex-grow: 1;\n align-items: center;\n}\n.page-content {\n margin: auto;\n}\n"])));
95
+ var style = css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n@container container-viewport (min-width: ", "px) {\n .low-prio-grow {\n flex-grow: 1;\n }\n #navigation-container {\n width: ", "px !important;\n }\n}"], ["\n@container container-viewport (min-width: ", "px) {\n .low-prio-grow {\n flex-grow: 1;\n }\n #navigation-container {\n width: ", "px !important;\n }\n}"])), containerQueryExtraSpace, navLeftWidthMax);
96
+ var navLeftHide = css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n#nav-left {\n display: none;\n}\n.page-wrapper {\n --main-view-padding: 10px !important;\n flex-grow: 1;\n align-items: center;\n}\n.page-content {\n margin: auto;\n}\n#menu-modal {\n position: absolute !important;\n}\n"], ["\n#nav-left {\n display: none;\n}\n.page-wrapper {\n --main-view-padding: 10px !important;\n flex-grow: 1;\n align-items: center;\n}\n.page-content {\n margin: auto;\n}\n#menu-modal {\n position: absolute !important;\n}\n"])));
92
97
  if (!hideNavLeftAlways) {
93
- navLeftHide = css(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n@container(max-width: ", "px) {\n ", "\n}\n@container(min-width: ", "px) {\n #nav-mobile {\n display: none !important;\n }\n}\n"], ["\n@container(max-width: ", "px) {\n ", "\n}\n@container(min-width: ", "px) {\n #nav-mobile {\n display: none !important;\n }\n}\n"])), containerQueryMobile - 1, navLeftHide, containerQueryMobile);
98
+ navLeftHide = css(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n@container container-viewport (max-width: ", "px) {\n ", "\n}\n@container container-viewport (min-width: ", "px) {\n .nav-head-top {\n display: none !important;\n }\n}\n"], ["\n@container container-viewport (max-width: ", "px) {\n ", "\n}\n@container container-viewport (min-width: ", "px) {\n .nav-head-top {\n display: none !important;\n }\n}\n"])), containerQueryMobileLayout - 1, navLeftHide, containerQueryMobileLayout);
94
99
  }
95
100
  style += navLeftHide;
96
101
  return style;
@@ -98,15 +103,8 @@ function LayoutDocsPage(_a) {
98
103
  }
99
104
  function LayoutLandingPage(_a) {
100
105
  var children = _a.children;
101
- var mobile = 800;
102
106
  return (React.createElement(React.Fragment, null,
103
- React.createElement("style", null, getStyle()),
104
- React.createElement(NavTop, null),
105
- React.createElement(NavMobile, null),
106
107
  React.createElement(PageContent, null, children)));
107
- function getStyle() {
108
- return css(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n@container(min-width: ", "px) {\n #nav-mobile {\n display: none !important;\n }\n}\n@container(max-width: ", "px) {\n #top-navigation {\n display: none !important;\n }\n"], ["\n@container(min-width: ", "px) {\n #nav-mobile {\n display: none !important;\n }\n}\n@container(max-width: ", "px) {\n #top-navigation {\n display: none !important;\n }\n"])), mobile, mobile - 1);
109
- }
110
108
  }
111
109
  function PageContent(_a) {
112
110
  var _b;
@@ -132,104 +130,185 @@ function PageContent(_a) {
132
130
  children,
133
131
  !isLandingPage && React.createElement(EditPageNote, { pageContext: pageContext }))));
134
132
  }
135
- function NavMobile() {
136
- return (React.createElement("div", { id: "nav-mobile" },
137
- React.createElement(NavigationHeader, { headerHeight: 70, iconSize: 40, paddingLeft: 12, style: { justifyContent: 'center' } })));
138
- }
139
- function NavTop() {
140
- var _a;
141
- var pageContext2 = usePageContext2();
142
- var paddingSize = 35;
143
- var padding = "0 ".concat(paddingSize, "px");
144
- var TopNavigation = pageContext2.config.TopNavigation || PassThrough;
145
- return (React.createElement("div", { id: "top-navigation", className: "link-hover-animation", style: (_a = {
146
- position: 'relative',
147
- display: 'flex',
148
- alignItems: 'center',
149
- justifyContent: 'center',
150
- textDecoration: 'none',
151
- marginBottom: 'var(--block-margin)',
152
- backgroundColor: 'var(--bg-color)'
153
- },
154
- _a['--padding-side'] = "".concat(paddingSize, "px"),
155
- _a.fontSize = '1.06em',
156
- _a.color = '#666',
157
- _a) },
158
- React.createElement("div", { style: { display: 'flex', alignItems: 'center', height: 70 } },
159
- React.createElement(TopNavigation, null),
160
- React.createElement(SearchLink, { style: { padding: padding } }),
161
- React.createElement(MenuLink, { style: { padding: padding } }),
162
- React.createElement(Links, { style: { display: 'inline-flex', padding: padding, marginLeft: -8 } }))));
163
- }
164
133
  function NavLeft() {
165
134
  var pageContext = usePageContext();
166
- var navItems = pageContext.navItems, navItemsAll = pageContext.navItemsAll, isDetachedPage = pageContext.isDetachedPage;
167
- var headerHeight = 60;
135
+ var navItemsAll = pageContext.navItemsAll, navItemsDetached = pageContext.navItemsDetached;
168
136
  return (React.createElement(React.Fragment, null,
169
137
  React.createElement("div", { id: "nav-left", className: "link-hover-animation", style: {
170
138
  flexGrow: 1,
171
139
  borderRight: 'var(--block-margin) solid white',
140
+ zIndex: 1,
172
141
  } },
173
142
  React.createElement("div", { style: {
174
143
  position: 'sticky',
175
144
  top: 0,
176
145
  } },
177
- React.createElement(NavigationHeader, { headerHeight: headerHeight, iconSize: 39, paddingLeft: 6 }),
146
+ React.createElement(NavHead, { isNavLeft: true }),
178
147
  React.createElement("div", { style: {
179
148
  backgroundColor: 'var(--bg-color)',
180
149
  display: 'flex',
181
150
  justifyContent: 'flex-end',
182
151
  } },
183
- React.createElement("div", { id: "navigation-container", style: __assign({ top: 0, height: "calc(100vh - ".concat(headerHeight, "px - var(--block-margin))"), overflowY: 'auto', overscrollBehavior: 'contain', paddingBottom: 40 }, navWidth) },
184
- // TODO/refactor: simplify?
185
- isDetachedPage ? (React.createElement(NavigationContent, { navItems: navItems })) : (React.createElement(NavigationContent, { navItems: navItemsAll, showOnlyRelevant: true })))))),
152
+ React.createElement("div", { id: "navigation-container", style: {
153
+ top: 0,
154
+ height: "calc(100vh - var(--nav-head-height) - var(--block-margin))",
155
+ overflowY: 'auto',
156
+ overscrollBehavior: 'contain',
157
+ paddingBottom: 40,
158
+ minWidth: navLeftWidthMin,
159
+ maxWidth: navLeftWidthMax,
160
+ width: '100%',
161
+ } }, navItemsDetached ? (React.createElement(NavigationContent, { navItems: navItemsDetached })) : (React.createElement(NavigationContent, { navItems: navItemsAll, showOnlyRelevant: true })))))),
186
162
  React.createElement("script", { dangerouslySetInnerHTML: { __html: autoScrollNav_SSR } })));
187
163
  }
188
- function NavigationHeader(_a) {
164
+ function NavHead(_a) {
189
165
  var _b;
190
- var headerHeight = _a.headerHeight, iconSize = _a.iconSize, style = _a.style, paddingLeft = _a.paddingLeft;
166
+ var isNavLeft = _a.isNavLeft;
191
167
  var pageContext = usePageContext();
192
- //*
168
+ var pageContext2 = usePageContext2();
193
169
  var projectName = pageContext.meta.projectName;
194
- /*/
195
- const projectName = 'Vike'
196
- //*/
197
- var isProjectNameShort = projectName.length <= 4;
198
- var childrenStyle = (_b = {
199
- justifyContent: 'center',
200
- fontSize: isProjectNameShort ? '4.8cqw' : '4.5cqw'
201
- },
202
- _b['--icon-text-padding'] = '1.8cqw',
203
- _b);
204
- var marginLeft = -10;
205
- return (React.createElement("div", { style: __assign({ backgroundColor: 'var(--bg-color)', display: 'flex', justifyContent: 'flex-end', borderBottom: 'var(--block-margin) solid white' }, style) },
206
- React.createElement("div", { style: __assign({ display: 'flex', height: headerHeight, containerType: 'inline-size' }, navWidth) },
207
- React.createElement("a", { style: __assign(__assign({ display: 'flex', alignItems: 'center', color: 'inherit', textDecoration: 'none', height: '100%', paddingLeft: paddingLeft + marginLeft * -1, marginLeft: marginLeft }, childrenStyle), { justifyContent: 'flex-start', flexGrow: 0.5 }), href: "/" },
208
- React.createElement("img", { src: pageContext.meta.faviconUrl, height: iconSize, width: iconSize, onContextMenu: function (ev) {
209
- if (!pageContext.config.pressKit)
210
- return; // no /press page
211
- if (window.location.pathname === '/press')
212
- return;
213
- ev.preventDefault();
214
- navigate('/press#logo');
215
- } }),
216
- React.createElement("span", { style: {
217
- marginLeft: "calc(var(--icon-text-padding) + 2px)",
218
- fontSize: isProjectNameShort ? '1.65em' : '1.3em',
219
- } }, projectName)),
220
- React.createElement(SearchLink, { style: __assign(__assign({}, childrenStyle), { flexGrow: 0.5 }) }),
221
- React.createElement(MenuLink, { style: __assign(__assign({}, childrenStyle), { flexGrow: 1 }) }))));
170
+ var isLandingPage = pageContext.isLandingPage;
171
+ var linkStyle = {
172
+ height: '100%',
173
+ padding: '0 var(--padding-side)',
174
+ justifyContent: 'center',
175
+ };
176
+ var TopNavigation = pageContext2.config.TopNavigation || PassThrough;
177
+ var navSecondaryContent = (React.createElement("div", { className: isNavLeft ? 'show-on-nav-hover add-transition' : 'hide-on-shrink', style: __assign({ padding: 0, display: 'flex', height: '100%' }, (!isNavLeft
178
+ ? {}
179
+ : {
180
+ position: 'absolute',
181
+ left: '100%',
182
+ top: 0,
183
+ paddingLeft: 'var(--block-margin)',
184
+ '--padding-side': '20px',
185
+ width: mainViewMax, // guaranteed real estate
186
+ })) },
187
+ React.createElement(TopNavigation, null),
188
+ React.createElement(NavSecondaryContent, { style: {
189
+ display: 'inline-flex',
190
+ fontSize: '1.06em',
191
+ padding: '0 var(--padding-side)',
192
+ marginLeft: -8,
193
+ } })));
194
+ return (React.createElement("div", { className: cls(['nav-head-full-width', !isNavLeft && 'nav-head-top', 'link-hover-animation']), style: {
195
+ display: 'flex',
196
+ justifyContent: isNavLeft ? 'flex-end' : 'center',
197
+ backgroundColor: 'var(--bg-color)',
198
+ borderBottom: 'var(--block-margin) solid white',
199
+ position: 'relative',
200
+ } },
201
+ isNavLeft && React.createElement(NavHeaderLeftFullWidthBackground, null),
202
+ React.createElement("div", { style: {
203
+ container: 'container-nav-head / inline-size',
204
+ width: '100%',
205
+ minWidth: isNavLeft && navLeftWidthMin,
206
+ maxWidth: isNavLeft && navLeftWidthMax,
207
+ } },
208
+ React.createElement("div", { className: "nav-head-content", style: (_b = {
209
+ width: '100%',
210
+ height: 'var(--nav-head-height)',
211
+ fontSize: "min(16.96px, ".concat(isProjectNameShort(projectName) ? '4.8cqw' : '4.5cqw', ")"),
212
+ color: '#666'
213
+ },
214
+ _b['--icon-text-padding'] = 'min(8px, 1.8cqw)',
215
+ _b.display = 'flex',
216
+ _b.justifyContent = 'center',
217
+ _b) },
218
+ React.createElement(NavLogo, { className: "grow-half" }),
219
+ React.createElement(SearchLink, { className: "grow-half", style: linkStyle }),
220
+ React.createElement(MenuLink, { className: "grow-full", style: linkStyle }),
221
+ navSecondaryContent)),
222
+ getStyle()));
223
+ function getStyle() {
224
+ var style = css(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n@container container-nav-head (max-width: 550px) {\n .grow-full {\n flex-grow: 1;\n }\n .grow-half {\n flex-grow: 0.5;\n }\n .nav-head-content {\n --padding-side: 0px;\n }\n .nav-logo {\n padding-left: 15px;\n margin-left: -10px;\n }\n}\n@container container-nav-head (min-width: 501px) {\n .nav-head-content {\n --padding-side: 35px;\n }\n .nav-logo {\n padding: 0 var(--padding-side);\n }\n}\n@media(max-width: ", "px) {\n .hide-on-shrink {\n display: none !important;\n }\n}\n"], ["\n@container container-nav-head (max-width: 550px) {\n .grow-full {\n flex-grow: 1;\n }\n .grow-half {\n flex-grow: 0.5;\n }\n .nav-head-content {\n --padding-side: 0px;\n }\n .nav-logo {\n padding-left: 15px;\n margin-left: -10px;\n }\n}\n@container container-nav-head (min-width: 501px) {\n .nav-head-content {\n --padding-side: 35px;\n }\n .nav-logo {\n padding: 0 var(--padding-side);\n }\n}\n@media(max-width: ", "px) {\n .hide-on-shrink {\n display: none !important;\n }\n}\n"])), containerQueryMobileMenu);
225
+ if (isLandingPage)
226
+ style += css(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n@media(min-width: ", "px) {\n .nav-logo {\n display: none !important;\n }\n}\n"], ["\n@media(min-width: ", "px) {\n .nav-logo {\n display: none !important;\n }\n}\n"])), containerQueryMobileMenu + 1);
227
+ if (isNavLeft) {
228
+ style += css(templateObject_6 || (templateObject_6 = __makeTemplateObject(["\n\n.show-on-nav-hover {\n opacity: 0;\n transition-property: opacity;\n pointer-events: none;\n}\nhtml:not(.unexpand-nav) :has(.nav-head-full-width:hover) .show-on-nav-hover,\nhtml:not(.unexpand-nav) :has(.show-on-nav-hover:hover) .show-on-nav-hover,\nhtml:not(.unexpand-nav).menu-modal-show .show-on-nav-hover {\n opacity: 1;\n pointer-events: all;\n}\n"], ["\n\n.show-on-nav-hover {\n opacity: 0;\n transition-property: opacity;\n pointer-events: none;\n}\nhtml:not(.unexpand-nav) :has(.nav-head-full-width:hover) .show-on-nav-hover,\nhtml:not(.unexpand-nav) :has(.show-on-nav-hover:hover) .show-on-nav-hover,\nhtml:not(.unexpand-nav).menu-modal-show .show-on-nav-hover {\n opacity: 1;\n pointer-events: all;\n}\n"])));
229
+ }
230
+ return React.createElement(Style, null, style);
231
+ }
222
232
  }
233
+ function unexpandNav() {
234
+ document.documentElement.classList.add('unexpand-nav');
235
+ // Using setTimeout() because requestAnimationFrame() doesn't delay enough
236
+ setTimeout(function () {
237
+ document.documentElement.classList.remove('unexpand-nav');
238
+ }, 1000);
239
+ }
240
+ function NavHeaderLeftFullWidthBackground() {
241
+ return (React.createElement("div", { className: "show-on-nav-hover add-transition", style: {
242
+ height: '100%',
243
+ width: '100vw',
244
+ zIndex: -1,
245
+ background: 'var(--bg-color)',
246
+ position: 'absolute',
247
+ left: 0,
248
+ top: 0,
249
+ boxSizing: 'content-box',
250
+ borderBottom: 'var(--block-margin) solid white',
251
+ } }));
252
+ }
253
+ function NavLogo(_a) {
254
+ var className = _a.className;
255
+ var pageContext = usePageContext();
256
+ var iconSize = 39;
257
+ var projectName = pageContext.meta.projectName;
258
+ return (React.createElement("a", { className: cls(['nav-logo', className]), style: {
259
+ display: 'flex',
260
+ alignItems: 'center',
261
+ color: 'inherit',
262
+ height: '100%',
263
+ justifyContent: 'flex-start',
264
+ }, href: "/" },
265
+ React.createElement("img", { src: pageContext.meta.faviconUrl, height: iconSize, width: iconSize, onContextMenu: function (ev) {
266
+ if (!pageContext.config.pressKit)
267
+ return; // no /press page
268
+ if (window.location.pathname === '/press')
269
+ return;
270
+ ev.preventDefault();
271
+ navigate('/press#logo');
272
+ } }),
273
+ React.createElement("span", { style: {
274
+ marginLeft: "calc(var(--icon-text-padding) + 2px)",
275
+ fontSize: isProjectNameShort(projectName) ? '1.65em' : '1.3em',
276
+ } }, projectName)));
277
+ }
278
+ function isProjectNameShort(projectName) {
279
+ return projectName.length <= 4;
280
+ }
281
+ var onMouseIgnore;
223
282
  function MenuLink(props) {
224
- return (React.createElement("a", __assign({}, props, { style: __assign({ height: '100%', display: 'flex', alignItems: 'center', cursor: 'pointer' }, props.style), className: "colorize-on-hover", onClick: function (ev) {
283
+ return (React.createElement("div", __assign({}, props, { style: __assign({ height: '100%', display: 'flex', alignItems: 'center', cursor: 'default', userSelect: 'none' }, props.style), className: ['colorize-on-hover menu-toggle', props.className].filter(Boolean).join(' '), onClick: function (ev) {
225
284
  ev.preventDefault();
226
285
  toggleMenuModal();
227
- }, "aria-label": 'Ctrl\xa0+\xa0M' }),
228
- React.createElement(MenuIcon, null),
229
- "Menu"));
286
+ }, onMouseOver: function () {
287
+ if (onMouseIgnore)
288
+ return;
289
+ openMenuModal();
290
+ }, onMouseLeave: function () {
291
+ if (onMouseIgnore)
292
+ return;
293
+ closeMenuModal();
294
+ }, onTouchStart: function () {
295
+ onMouseIgnore = setTimeout(function () {
296
+ onMouseIgnore = undefined;
297
+ }, 1000);
298
+ } }),
299
+ React.createElement("span", { className: "text-docs" },
300
+ React.createElement(DocsIcon, null),
301
+ " Docs"),
302
+ React.createElement("span", { className: "text-menu" },
303
+ React.createElement(MenuIcon, null),
304
+ " Menu"),
305
+ React.createElement(Style, null, css(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n@media(max-width: ", "px) {\n .text-docs {\n display: none;\n }\n}\n@media(min-width: ", "px) {\n .text-menu {\n display: none;\n }\n}\n"], ["\n@media(max-width: ", "px) {\n .text-docs {\n display: none;\n }\n}\n@media(min-width: ", "px) {\n .text-menu {\n display: none;\n }\n}\n"])), containerQueryMobileMenu, containerQueryMobileMenu + 1))));
306
+ }
307
+ function DocsIcon() {
308
+ return (React.createElement("span", { style: { marginRight: 'calc(var(--icon-text-padding) + 2px)' }, className: "decolorize-6" }, "\uD83D\uDCDA"));
230
309
  }
231
310
  function MenuIcon() {
232
- return (React.createElement("svg", { style: { marginRight: 'calc(var(--icon-text-padding) + 2px)', lineHeight: 0, width: '1.3em' }, className: "decolorize-6", viewBox: "0 0 448 512" },
311
+ return (React.createElement("svg", { style: { marginRight: 'calc(var(--icon-text-padding) + 2px)', verticalAlign: 'top', width: '1.3em' }, className: "decolorize-6", viewBox: "0 0 448 512" },
233
312
  React.createElement("path", { fill: "currentColor", d: "M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z" })));
234
313
  }
235
- var templateObject_1, templateObject_2, templateObject_3, templateObject_4;
314
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7;
@@ -1,7 +1,11 @@
1
1
  export { MenuModal };
2
2
  export { toggleMenuModal };
3
+ export { openMenuModal };
3
4
  export { closeMenuModal };
4
5
  import React from 'react';
5
- declare function MenuModal(): React.JSX.Element;
6
+ declare function MenuModal({ isTopNav }: {
7
+ isTopNav: boolean;
8
+ }): React.JSX.Element;
6
9
  declare function toggleMenuModal(): void;
10
+ declare function openMenuModal(): void;
7
11
  declare function closeMenuModal(): void;
package/dist/MenuModal.js CHANGED
@@ -4,73 +4,72 @@ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cook
4
4
  };
5
5
  export { MenuModal };
6
6
  export { toggleMenuModal };
7
+ export { openMenuModal };
7
8
  export { closeMenuModal };
8
9
  import React from 'react';
9
10
  import { usePageContext } from './renderer/usePageContext';
10
11
  import { NavigationContent } from './navigation/Navigation';
11
12
  import { css } from './utils/css';
12
- import { containerQueryMobile } from './Layout';
13
- import { Links } from './Links';
14
- import { isBrowser } from './utils/isBrowser';
13
+ import { containerQueryMobileLayout, containerQueryMobileMenu } from './Layout';
14
+ import { NavSecondaryContent } from './NavSecondaryContent';
15
15
  import { getViewportWidth } from './utils/getViewportWidth';
16
- initCloseListeners();
17
- function MenuModal() {
16
+ import { Style } from './utils/Style';
17
+ function MenuModal(_a) {
18
+ var isTopNav = _a.isTopNav;
18
19
  return (React.createElement(React.Fragment, null,
19
- React.createElement("style", null, getStyle()),
20
- React.createElement("div", { id: "menu-modal", className: "link-hover-animation", style: {
21
- position: 'fixed',
20
+ React.createElement(Style, null, getStyle()),
21
+ React.createElement("div", { id: "menu-modal", className: "link-hover-animation add-transition", style: {
22
+ position: isTopNav ? 'absolute' : 'fixed',
22
23
  width: '100%',
23
- /* Do this once Firefox supports `dvh`: https://caniuse.com/?search=dvh
24
- * - Then also replace all `vh` values with `dvh` values.
25
- * - https://stackoverflow.com/questions/37112218/css3-100vh-not-constant-in-mobile-browser/72245072#72245072
26
- height: '100dh',
27
- /*/
28
- height: '100vh',
29
- maxHeight: '100dvh',
30
- //*/
31
- top: 0,
24
+ height: 'calc(100vh - var(--nav-head-height))',
25
+ top: 'var(--nav-head-height)',
32
26
  left: 0,
33
27
  zIndex: 9999,
34
28
  overflow: 'scroll',
35
- background: '#eaeaea',
36
- } },
29
+ background: '#ededef',
30
+ transitionProperty: 'opacity',
31
+ }, onMouseOver: openMenuModal, onMouseLeave: closeMenuModal },
37
32
  React.createElement("div", { style: {
38
33
  // Place <LinksBottom /> to the bottom
39
34
  display: 'flex',
40
35
  flexDirection: 'column',
41
- minHeight: '100dvh',
36
+ minHeight: 'calc(100vh - var(--nav-head-height))',
42
37
  justifyContent: 'space-between',
43
38
  // We don't set `container` to parent beacuse of a Chrome bug (showing a blank <MenuModal>)
44
- containerType: 'inline-size',
39
+ container: 'container-viewport / inline-size',
45
40
  } },
46
41
  React.createElement(Nav, null),
47
- React.createElement(LinksBottom, null)),
48
- React.createElement(CloseButton, null))));
42
+ React.createElement(NavSecondary, { className: "show-only-for-mobile" })),
43
+ React.createElement(CloseButton, { className: "show-only-for-mobile" }))));
49
44
  }
50
45
  function Nav() {
51
46
  var pageContext = usePageContext();
52
47
  var navItems = pageContext.navItemsAll;
53
48
  return React.createElement(NavigationContent, { columnLayout: true, navItems: navItems });
54
49
  }
55
- function LinksBottom() {
56
- return (React.createElement("div", { style: {
50
+ function NavSecondary(_a) {
51
+ var className = _a.className;
52
+ return (React.createElement("div", { className: className, style: {
57
53
  display: 'flex',
58
54
  justifyContent: 'center',
55
+ marginTop: 20,
59
56
  } },
60
- React.createElement(Links, { style: { height: 70 } })));
57
+ React.createElement(NavSecondaryContent, { style: { height: 70 } })));
61
58
  }
62
59
  function getStyle() {
63
- return css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\nhtml:not(.menu-modal-show) #menu-modal {\n display: none;\n}\n// disable scroll of main view\nhtml.menu-modal-show {\n overflow: hidden !important;\n}\n@container(min-width: ", "px) {\n #menu-modal .nav-item-level-3 {\n display: none;\n }\n}\n"], ["\nhtml:not(.menu-modal-show) #menu-modal {\n display: none;\n}\n// disable scroll of main view\nhtml.menu-modal-show {\n overflow: hidden !important;\n}\n@container(min-width: ", "px) {\n #menu-modal .nav-item-level-3 {\n display: none;\n }\n}\n"])), containerQueryMobile);
60
+ return css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\nhtml:not(.menu-modal-show) #menu-modal {\n opacity: 0;\n pointer-events: none;\n}\n// disable scroll of main view\nhtml.menu-modal-show {\n overflow: hidden !important;\n}\n@container container-viewport (min-width: ", "px) {\n #menu-modal .nav-item-level-3 {\n display: none;\n }\n}\n@media(max-width: ", "px) {\n #menu-modal {\n --nav-head-height: 0px !important;\n }\n}\n@media(min-width: ", "px) {\n .show-only-for-mobile {\n display: none !important;\n }\n}\n"], ["\nhtml:not(.menu-modal-show) #menu-modal {\n opacity: 0;\n pointer-events: none;\n}\n// disable scroll of main view\nhtml.menu-modal-show {\n overflow: hidden !important;\n}\n@container container-viewport (min-width: ", "px) {\n #menu-modal .nav-item-level-3 {\n display: none;\n }\n}\n@media(max-width: ", "px) {\n #menu-modal {\n --nav-head-height: 0px !important;\n }\n}\n@media(min-width: ", "px) {\n .show-only-for-mobile {\n display: none !important;\n }\n}\n"])), containerQueryMobileLayout, containerQueryMobileMenu, containerQueryMobileMenu + 1);
64
61
  }
65
- function CloseButton() {
66
- return (React.createElement("div", { onClick: toggleMenuModal, style: { position: 'fixed', top: 0, right: 0, zIndex: 10, padding: 11, cursor: 'pointer' }, "aria-label": 'Escape\nCtrl\xa0+\xa0M', "data-label-shift": true },
62
+ function CloseButton(_a) {
63
+ var className = _a.className;
64
+ return (React.createElement("div", { className: className, onClick: toggleMenuModal, style: { position: 'fixed', top: 0, right: 0, zIndex: 10, padding: 11, cursor: 'pointer' }, "aria-label": 'Escape\nCtrl\xa0+\xa0M', "data-label-shift": true },
67
65
  React.createElement("svg", { width: "48.855", height: "48.855", version: "1.1", viewBox: "0 0 22.901 22.901", xmlns: "http://www.w3.org/2000/svg" },
68
66
  React.createElement("circle", { cx: "11.45", cy: "11.45", r: "10.607", fill: "#ececec", stroke: "#666", strokeDashoffset: "251.44", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "1.6875", style: { paintOrder: 'normal' } }),
69
67
  React.createElement("path", { d: "m7.5904 6.2204 3.86 3.86 3.84-3.84a0.92 0.92 0 0 1 0.66-0.29 1 1 0 0 1 1 1 0.9 0.9 0 0 1-0.27 0.66l-3.89 3.84 3.89 3.89a0.9 0.9 0 0 1 0.27 0.61 1 1 0 0 1-1 1 0.92 0.92 0 0 1-0.69-0.27l-3.81-3.86-3.85 3.85a0.92 0.92 0 0 1-0.65 0.28 1 1 0 0 1-1-1 0.9 0.9 0 0 1 0.27-0.66l3.89-3.84-3.89-3.89a0.9 0.9 0 0 1-0.27-0.61 1 1 0 0 1 1-1c0.24 3e-3 0.47 0.1 0.64 0.27z", fill: "#666", stroke: "#666", strokeWidth: ".11719" }))));
70
68
  }
71
69
  function toggleMenuModal() {
72
70
  document.documentElement.classList.toggle('menu-modal-show');
73
- if (document.documentElement.classList.contains('menu-modal-show') && getViewportWidth() < containerQueryMobile) {
71
+ if (document.documentElement.classList.contains('menu-modal-show') &&
72
+ getViewportWidth() < containerQueryMobileLayout) {
74
73
  autoScroll();
75
74
  }
76
75
  }
@@ -81,43 +80,28 @@ function autoScroll() {
81
80
  var navLink = navLinks[0];
82
81
  if (!navLink)
83
82
  return;
83
+ // None of the following seemes to be working: https://stackoverflow.com/questions/19669786/check-if-element-is-visible-in-dom
84
+ if (findCollapsibleEl(navLink).classList.contains('collapsible-collapsed'))
85
+ return;
84
86
  navLink.scrollIntoView({
85
87
  behavior: 'instant',
86
88
  block: 'center',
87
89
  inline: 'start',
88
90
  });
89
91
  }
90
- function closeMenuModal() {
91
- document.documentElement.classList.remove('menu-modal-show');
92
+ function findCollapsibleEl(navLink) {
93
+ var parentEl = navLink;
94
+ while (parentEl) {
95
+ if (parentEl.classList.contains('collapsible'))
96
+ return parentEl;
97
+ parentEl = parentEl.parentElement;
98
+ }
99
+ return null;
92
100
  }
93
- function initCloseListeners() {
94
- if (!isBrowser())
95
- return;
96
- document.addEventListener('click', onLinkClick);
97
- // It's redundant (and onLinkClick() is enough), but just to be sure.
98
- addEventListener('hashchange', closeMenuModal);
101
+ function openMenuModal() {
102
+ document.documentElement.classList.add('menu-modal-show');
99
103
  }
100
- function onLinkClick(ev) {
101
- if (ev.altKey || ev.ctrlKey || ev.metaKey || ev.shiftKey)
102
- return;
103
- var linkTag = findLinkTag(ev.target);
104
- if (!linkTag)
105
- return;
106
- var href = linkTag.getAttribute('href');
107
- if (!href)
108
- return;
109
- if (!href.startsWith('/') && !href.startsWith('#'))
110
- return;
111
- closeMenuModal();
112
- }
113
- function findLinkTag(target) {
114
- while (target.tagName !== 'A') {
115
- var parentNode = target.parentNode;
116
- if (!parentNode) {
117
- return null;
118
- }
119
- target = parentNode;
120
- }
121
- return target;
104
+ function closeMenuModal() {
105
+ document.documentElement.classList.remove('menu-modal-show');
122
106
  }
123
107
  var templateObject_1;
@@ -1,6 +1,7 @@
1
+ export { NavSecondaryContent };
1
2
  import React from 'react';
2
3
  import '@docsearch/css';
3
- export { Links };
4
- declare function Links({ style }: {
4
+ declare function NavSecondaryContent(props: {
5
5
  style?: React.CSSProperties;
6
+ className?: string;
6
7
  }): React.JSX.Element;
@@ -9,6 +9,7 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
+ export { NavSecondaryContent };
12
13
  import React from 'react';
13
14
  import iconGithub from './icons/github.svg';
14
15
  import iconTwitter from './icons/twitter.svg';
@@ -17,13 +18,11 @@ import iconChangelog from './icons/changelog.svg';
17
18
  import iconLanguages from './icons/languages.svg';
18
19
  import { usePageContext } from './renderer/usePageContext';
19
20
  import '@docsearch/css';
20
- export { Links };
21
- function Links(_a) {
22
- var style = _a.style;
21
+ function NavSecondaryContent(props) {
23
22
  var pageContext = usePageContext();
24
- var _b = pageContext.config, projectInfo = _b.projectInfo, i18n = _b.i18n;
23
+ var _a = pageContext.config, projectInfo = _a.projectInfo, i18n = _a.i18n;
25
24
  var iconI18n = !i18n ? null : (React.createElement(LinkIcon, { className: "decolorize-4", icon: iconLanguages, href: '/languages', style: { height: 21, position: 'relative', top: 0, left: 0 } }));
26
- return (React.createElement("div", { style: __assign({ display: 'flex', alignItems: 'center', paddingTop: 0, justifyContent: 'left', height: '100%' }, style) },
25
+ return (React.createElement("div", __assign({}, props, { style: __assign({ display: 'flex', alignItems: 'center' }, props.style) }),
27
26
  iconI18n,
28
27
  projectInfo.discordInvite && (React.createElement(LinkIcon, { className: "decolorize-6", icon: iconDiscord, href: projectInfo.discordInvite })),
29
28
  React.createElement(LinkIcon, { className: "decolorize-4", icon: iconTwitter, href: projectInfo.twitterProfile }),
@@ -36,7 +35,7 @@ function ChangelogButton() {
36
35
  return (React.createElement("a", { href: "".concat(projectInfo.githubRepository, "/blob/main/CHANGELOG.md"), className: "colorize-on-hover", style: {
37
36
  display: 'flex',
38
37
  alignItems: 'center',
39
- padding: 10,
38
+ padding: '0 5px',
40
39
  height: '100%',
41
40
  } },
42
41
  React.createElement("div", { className: "button", style: {
@@ -1,5 +1,5 @@
1
- import React from 'react';
2
1
  export { HorizontalLine };
2
+ import React from 'react';
3
3
  declare function HorizontalLine({ primary }: {
4
4
  primary?: true;
5
5
  }): React.JSX.Element;
@@ -1,8 +1,9 @@
1
- import React from 'react';
2
1
  export { HorizontalLine };
2
+ import React from 'react';
3
+ import { cls } from '../utils/cls';
3
4
  function HorizontalLine(_a) {
4
5
  var primary = _a.primary;
5
- return (React.createElement("div", { className: 'header-separator-line ' + (primary ? 'primary' : ''), style: { textAlign: 'center' } },
6
+ return (React.createElement("div", { className: cls(primary && 'primary'), style: { textAlign: 'center' } },
6
7
  React.createElement("hr", { style: {
7
8
  display: 'inline-block',
8
9
  margin: 0,
@@ -1,11 +1,10 @@
1
1
  export { resolveHeadingsData };
2
- import type { NavItem, NavItemAll } from '../navigation/Navigation';
2
+ import type { NavItem } from '../navigation/Navigation';
3
3
  import type { LinkData } from '../components';
4
4
  import type { PageContextOriginal } from './resolvePageContext';
5
5
  declare function resolveHeadingsData(pageContext: PageContextOriginal): {
6
- isDetachedPage: boolean;
7
- navItems: NavItem[];
8
- navItemsAll: NavItemAll[];
6
+ navItemsAll: NavItem[];
7
+ navItemsDetached: NavItem[] | undefined;
9
8
  linksAll: LinkData[];
10
9
  isLandingPage: boolean;
11
10
  pageTitle: string | null;