@brillout/docpress 0.8.14 → 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 (48) hide show
  1. package/Layout.tsx +254 -177
  2. package/MenuModal.tsx +42 -48
  3. package/{Links.tsx → NavSecondaryContent.tsx} +5 -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 +2 -2
  9. package/dist/Layout.d.ts +10 -6
  10. package/dist/Layout.js +165 -120
  11. package/dist/MenuModal.js +34 -47
  12. package/dist/{Links.d.ts → NavSecondaryContent.d.ts} +3 -2
  13. package/dist/{Links.js → NavSecondaryContent.js} +5 -7
  14. package/dist/components/HorizontalLine.d.ts +1 -1
  15. package/dist/components/HorizontalLine.js +3 -2
  16. package/dist/config/resolveHeadingsData.d.ts +3 -4
  17. package/dist/config/resolveHeadingsData.js +5 -8
  18. package/dist/config/resolvePageContext.d.ts +2 -3
  19. package/dist/docsearch/SearchLink.js +1 -1
  20. package/dist/navigation/Collapsible.d.ts +10 -0
  21. package/dist/navigation/Collapsible.js +35 -0
  22. package/dist/navigation/Navigation.d.ts +0 -3
  23. package/dist/navigation/Navigation.js +106 -55
  24. package/dist/renderer/determineNavItemsColumnLayout.d.ts +3 -0
  25. package/dist/renderer/{determineColumnEntries.js → determineNavItemsColumnLayout.js} +34 -28
  26. package/dist/renderer/usePageContext.d.ts +2 -2
  27. package/dist/renderer/usePageContext.js +2 -4
  28. package/dist/utils/Style.d.ts +5 -0
  29. package/dist/utils/Style.js +6 -0
  30. package/dist/utils/cls.d.ts +3 -0
  31. package/dist/utils/cls.js +5 -0
  32. package/dist/utils/throttle.d.ts +1 -0
  33. package/dist/utils/throttle.js +14 -0
  34. package/docsearch/SearchLink.tsx +1 -1
  35. package/global.d.ts +1 -1
  36. package/navigation/Collapsible.css +11 -0
  37. package/navigation/Collapsible.tsx +64 -0
  38. package/navigation/Navigation.css +12 -6
  39. package/navigation/Navigation.tsx +191 -80
  40. package/package.json +1 -1
  41. package/renderer/{determineColumnEntries.ts → determineNavItemsColumnLayout.ts} +35 -29
  42. package/renderer/initOnNavigation.ts +37 -0
  43. package/renderer/onRenderClient.tsx +2 -0
  44. package/renderer/usePageContext.tsx +2 -5
  45. package/utils/Style.tsx +7 -0
  46. package/utils/cls.ts +8 -0
  47. package/utils/throttle.ts +10 -0
  48. package/dist/renderer/determineColumnEntries.d.ts +0 -3
package/dist/Layout.js CHANGED
@@ -14,15 +14,17 @@ 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';
27
+ import { NavSecondaryContent } from './NavSecondaryContent';
26
28
  import { closeMenuModal, openMenuModal, toggleMenuModal } from './MenuModal';
27
29
  import { MenuModal } from './MenuModal';
28
30
  import { autoScrollNav_SSR } from './autoScrollNav';
@@ -30,19 +32,20 @@ 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,30 +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',
71
- _b['--top-nav-height'] = "".concat(isLandingPage ? 70 : 60, "px"),
74
+ _b['--nav-head-height'] = "".concat(isLandingPage ? 70 : 60, "px"),
72
75
  _b) },
73
76
  React.createElement(MenuModal, { isTopNav: isLandingPage }),
74
77
  React.createElement("div", { className: isLandingPage ? '' : 'doc-page', style: __assign({
75
78
  // We don't add `container` to `body` nor `html` beacuse in Firefox it breaks the `position: fixed` of <MenuModal>
76
79
  // https://stackoverflow.com/questions/74601420/css-container-inline-size-and-fixed-child
77
- containerType: 'inline-size' }, whitespaceBuster1) }, content)));
80
+ container: 'container-viewport / inline-size' }, whitespaceBuster1) },
81
+ React.createElement(NavHead, null),
82
+ content)));
78
83
  }
79
84
  function LayoutDocsPage(_a) {
80
85
  var children = _a.children;
81
86
  var pageContext = usePageContext();
82
- var hideNavLeftAlways = pageContext.navItems.length <= 1;
87
+ var hideNavLeftAlways = pageContext.navItemsDetached && pageContext.navItemsDetached.length <= 1;
83
88
  return (React.createElement(React.Fragment, null,
84
89
  React.createElement("style", null, getStyle()),
85
- React.createElement(NavMobile, null),
86
90
  React.createElement("div", { style: __assign({ display: 'flex' }, whitespaceBuster2) },
87
91
  React.createElement(NavLeft, null),
88
92
  React.createElement("div", { className: "low-prio-grow", style: { width: 0, maxWidth: 50, background: 'var(--bg-color)' } }),
89
93
  React.createElement(PageContent, null, children))));
90
94
  function getStyle() {
91
- 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);
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);
92
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"])));
93
97
  if (!hideNavLeftAlways) {
94
- 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);
95
99
  }
96
100
  style += navLeftHide;
97
101
  return style;
@@ -99,15 +103,8 @@ function LayoutDocsPage(_a) {
99
103
  }
100
104
  function LayoutLandingPage(_a) {
101
105
  var children = _a.children;
102
- var mobile = 800;
103
106
  return (React.createElement(React.Fragment, null,
104
- React.createElement("style", null, getStyle()),
105
- React.createElement(NavTop, null),
106
- React.createElement(NavMobile, null),
107
107
  React.createElement(PageContent, null, children)));
108
- function getStyle() {
109
- 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);
110
- }
111
108
  }
112
109
  function PageContent(_a) {
113
110
  var _b;
@@ -133,98 +130,157 @@ function PageContent(_a) {
133
130
  children,
134
131
  !isLandingPage && React.createElement(EditPageNote, { pageContext: pageContext }))));
135
132
  }
136
- function NavMobile() {
137
- return (React.createElement("div", { id: "nav-mobile" },
138
- React.createElement(NavigationHeader, { iconSize: 40, paddingLeft: 12, style: { justifyContent: 'center' } })));
139
- }
140
- function NavTop() {
141
- var _a;
142
- var pageContext2 = usePageContext2();
143
- var paddingSize = 35;
144
- var padding = "0 ".concat(paddingSize, "px");
145
- var TopNavigation = pageContext2.config.TopNavigation || PassThrough;
146
- return (React.createElement("div", { id: "top-navigation", className: "link-hover-animation", style: (_a = {
147
- position: 'relative',
148
- display: 'flex',
149
- alignItems: 'center',
150
- justifyContent: 'center',
151
- textDecoration: 'none',
152
- marginBottom: 'var(--block-margin)',
153
- backgroundColor: 'var(--bg-color)'
154
- },
155
- _a['--padding-side'] = "".concat(paddingSize, "px"),
156
- _a.fontSize = '1.06em',
157
- _a.color = '#666',
158
- _a) },
159
- React.createElement("div", { style: { display: 'flex', alignItems: 'center', height: 70 } },
160
- React.createElement(TopNavigation, null),
161
- React.createElement(SearchLink, { style: { padding: padding } }),
162
- React.createElement(MenuLink, { style: { padding: padding } }),
163
- React.createElement(Links, { style: { display: 'inline-flex', padding: padding, marginLeft: -8 } }))));
164
- }
165
133
  function NavLeft() {
166
134
  var pageContext = usePageContext();
167
- var navItems = pageContext.navItems, navItemsAll = pageContext.navItemsAll, isDetachedPage = pageContext.isDetachedPage;
168
- var headerHeight = 60;
135
+ var navItemsAll = pageContext.navItemsAll, navItemsDetached = pageContext.navItemsDetached;
169
136
  return (React.createElement(React.Fragment, null,
170
137
  React.createElement("div", { id: "nav-left", className: "link-hover-animation", style: {
171
138
  flexGrow: 1,
172
139
  borderRight: 'var(--block-margin) solid white',
140
+ zIndex: 1,
173
141
  } },
174
142
  React.createElement("div", { style: {
175
143
  position: 'sticky',
176
144
  top: 0,
177
145
  } },
178
- React.createElement(NavigationHeader, { iconSize: 39, paddingLeft: 6 }),
146
+ React.createElement(NavHead, { isNavLeft: true }),
179
147
  React.createElement("div", { style: {
180
148
  backgroundColor: 'var(--bg-color)',
181
149
  display: 'flex',
182
150
  justifyContent: 'flex-end',
183
151
  } },
184
- 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) },
185
- // TODO/refactor: simplify?
186
- 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 })))))),
187
162
  React.createElement("script", { dangerouslySetInnerHTML: { __html: autoScrollNav_SSR } })));
188
163
  }
189
- function NavigationHeader(_a) {
164
+ function NavHead(_a) {
190
165
  var _b;
191
- var iconSize = _a.iconSize, style = _a.style, paddingLeft = _a.paddingLeft;
166
+ var isNavLeft = _a.isNavLeft;
167
+ var pageContext = usePageContext();
168
+ var pageContext2 = usePageContext2();
169
+ var projectName = pageContext.meta.projectName;
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
+ }
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;
192
255
  var pageContext = usePageContext();
193
- //*
256
+ var iconSize = 39;
194
257
  var projectName = pageContext.meta.projectName;
195
- /*/
196
- const projectName = 'Vike'
197
- //*/
198
- var isProjectNameShort = projectName.length <= 4;
199
- var childrenStyle = (_b = {
200
- justifyContent: 'center',
201
- fontSize: isProjectNameShort ? '4.8cqw' : '4.5cqw'
202
- },
203
- _b['--icon-text-padding'] = '1.8cqw',
204
- _b);
205
- var marginLeft = -10;
206
- return (React.createElement("div", { style: __assign({ backgroundColor: 'var(--bg-color)', display: 'flex', justifyContent: 'flex-end', borderBottom: 'var(--block-margin) solid white' }, style) },
207
- React.createElement("div", { style: __assign({ display: 'flex', height: 'var(--top-nav-height)', containerType: 'inline-size', alignItems: 'center' }, navWidth) },
208
- 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: "/" },
209
- React.createElement("img", { src: pageContext.meta.faviconUrl, height: iconSize, width: iconSize, onContextMenu: function (ev) {
210
- if (!pageContext.config.pressKit)
211
- return; // no /press page
212
- if (window.location.pathname === '/press')
213
- return;
214
- ev.preventDefault();
215
- navigate('/press#logo');
216
- } }),
217
- React.createElement("span", { style: {
218
- marginLeft: "calc(var(--icon-text-padding) + 2px)",
219
- fontSize: isProjectNameShort ? '1.65em' : '1.3em',
220
- } }, projectName)),
221
- React.createElement(SearchLink, { style: __assign(__assign({}, childrenStyle), { flexGrow: 0.5 }) }),
222
- React.createElement(MenuLink, { style: __assign(__assign({}, childrenStyle), { flexGrow: 1 }) }))));
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;
223
280
  }
224
281
  var onMouseIgnore;
225
- function MenuLink(_a) {
226
- var style = _a.style;
227
- return (React.createElement("div", { style: __assign({ height: '100%', display: 'flex', alignItems: 'center', cursor: 'default' }, style), className: "colorize-on-hover menu-toggle", onClick: function (ev) {
282
+ function MenuLink(props) {
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) {
228
284
  ev.preventDefault();
229
285
  toggleMenuModal();
230
286
  }, onMouseOver: function () {
@@ -239,31 +295,20 @@ function MenuLink(_a) {
239
295
  onMouseIgnore = setTimeout(function () {
240
296
  onMouseIgnore = undefined;
241
297
  }, 1000);
242
- } },
243
- React.createElement(DocsIcon, null),
244
- "Docs"));
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))));
245
306
  }
246
307
  function DocsIcon() {
247
- return (React.createElement("span", { style: { marginRight: 'calc(var(--icon-text-padding) + 2px)', lineHeight: 0, width: '1.3em' }, className: "decolorize-6" }, "\uD83D\uDCDA"));
308
+ return (React.createElement("span", { style: { marginRight: 'calc(var(--icon-text-padding) + 2px)' }, className: "decolorize-6" }, "\uD83D\uDCDA"));
248
309
  }
249
- /* TODO/now: use for mobile
250
310
  function MenuIcon() {
251
- return (
252
- <svg
253
- style={{ marginRight: 'calc(var(--icon-text-padding) + 2px)', lineHeight: 0, width: '1.3em' }}
254
- className="decolorize-6"
255
- viewBox="0 0 448 512"
256
- >
257
- <path
258
- fill="currentColor"
259
- 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"
260
- ></path>
261
- </svg>
262
- )
263
- }
264
- */
265
- function Style(_a) {
266
- var children = _a.children;
267
- return React.createElement("style", { dangerouslySetInnerHTML: { __html: children } });
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" },
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" })));
268
313
  }
269
- 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;
package/dist/MenuModal.js CHANGED
@@ -10,20 +10,19 @@ import React from 'react';
10
10
  import { usePageContext } from './renderer/usePageContext';
11
11
  import { NavigationContent } from './navigation/Navigation';
12
12
  import { css } from './utils/css';
13
- import { containerQueryMobile } from './Layout';
14
- import { Links } from './Links';
15
- import { isBrowser } from './utils/isBrowser';
13
+ import { containerQueryMobileLayout, containerQueryMobileMenu } from './Layout';
14
+ import { NavSecondaryContent } from './NavSecondaryContent';
16
15
  import { getViewportWidth } from './utils/getViewportWidth';
17
- initCloseListeners();
16
+ import { Style } from './utils/Style';
18
17
  function MenuModal(_a) {
19
18
  var isTopNav = _a.isTopNav;
20
19
  return (React.createElement(React.Fragment, null,
21
- React.createElement("style", null, getStyle()),
20
+ React.createElement(Style, null, getStyle()),
22
21
  React.createElement("div", { id: "menu-modal", className: "link-hover-animation add-transition", style: {
23
22
  position: isTopNav ? 'absolute' : 'fixed',
24
23
  width: '100%',
25
- height: 'calc(100vh - var(--top-nav-height))',
26
- top: 'var(--top-nav-height)',
24
+ height: 'calc(100vh - var(--nav-head-height))',
25
+ top: 'var(--nav-head-height)',
27
26
  left: 0,
28
27
  zIndex: 9999,
29
28
  overflow: 'scroll',
@@ -34,37 +33,43 @@ function MenuModal(_a) {
34
33
  // Place <LinksBottom /> to the bottom
35
34
  display: 'flex',
36
35
  flexDirection: 'column',
37
- minHeight: 'calc(100vh - var(--top-nav-height))',
36
+ minHeight: 'calc(100vh - var(--nav-head-height))',
38
37
  justifyContent: 'space-between',
39
38
  // We don't set `container` to parent beacuse of a Chrome bug (showing a blank <MenuModal>)
40
- containerType: 'inline-size',
39
+ container: 'container-viewport / inline-size',
41
40
  } },
42
- React.createElement(Nav, null)))));
41
+ React.createElement(Nav, null),
42
+ React.createElement(NavSecondary, { className: "show-only-for-mobile" })),
43
+ React.createElement(CloseButton, { className: "show-only-for-mobile" }))));
43
44
  }
44
45
  function Nav() {
45
46
  var pageContext = usePageContext();
46
47
  var navItems = pageContext.navItemsAll;
47
48
  return React.createElement(NavigationContent, { columnLayout: true, navItems: navItems });
48
49
  }
49
- function LinksBottom() {
50
- return (React.createElement("div", { style: {
50
+ function NavSecondary(_a) {
51
+ var className = _a.className;
52
+ return (React.createElement("div", { className: className, style: {
51
53
  display: 'flex',
52
54
  justifyContent: 'center',
55
+ marginTop: 20,
53
56
  } },
54
- React.createElement(Links, { style: { height: 70 } })));
57
+ React.createElement(NavSecondaryContent, { style: { height: 70 } })));
55
58
  }
56
59
  function getStyle() {
57
- 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(min-width: ", "px) {\n #menu-modal .nav-item-level-3 {\n display: none;\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(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);
58
61
  }
59
- function CloseButton() {
60
- 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 },
61
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" },
62
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' } }),
63
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" }))));
64
68
  }
65
69
  function toggleMenuModal() {
66
70
  document.documentElement.classList.toggle('menu-modal-show');
67
- if (document.documentElement.classList.contains('menu-modal-show') && getViewportWidth() < containerQueryMobile) {
71
+ if (document.documentElement.classList.contains('menu-modal-show') &&
72
+ getViewportWidth() < containerQueryMobileLayout) {
68
73
  autoScroll();
69
74
  }
70
75
  }
@@ -75,46 +80,28 @@ function autoScroll() {
75
80
  var navLink = navLinks[0];
76
81
  if (!navLink)
77
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;
78
86
  navLink.scrollIntoView({
79
87
  behavior: 'instant',
80
88
  block: 'center',
81
89
  inline: 'start',
82
90
  });
83
91
  }
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;
100
+ }
84
101
  function openMenuModal() {
85
102
  document.documentElement.classList.add('menu-modal-show');
86
103
  }
87
104
  function closeMenuModal() {
88
105
  document.documentElement.classList.remove('menu-modal-show');
89
106
  }
90
- function initCloseListeners() {
91
- if (!isBrowser())
92
- return;
93
- document.addEventListener('click', onLinkClick);
94
- // It's redundant (and onLinkClick() is enough), but just to be sure.
95
- addEventListener('hashchange', closeMenuModal);
96
- }
97
- function onLinkClick(ev) {
98
- if (ev.altKey || ev.ctrlKey || ev.metaKey || ev.shiftKey)
99
- return;
100
- var linkTag = findLinkTag(ev.target);
101
- if (!linkTag)
102
- return;
103
- var href = linkTag.getAttribute('href');
104
- if (!href)
105
- return;
106
- if (!href.startsWith('/') && !href.startsWith('#'))
107
- return;
108
- closeMenuModal();
109
- }
110
- function findLinkTag(target) {
111
- while (target.tagName !== 'A') {
112
- var parentNode = target.parentNode;
113
- if (!parentNode) {
114
- return null;
115
- }
116
- target = parentNode;
117
- }
118
- return target;
119
- }
120
107
  var templateObject_1;
@@ -1,6 +1,7 @@
1
- export { Links };
1
+ export { NavSecondaryContent };
2
2
  import React from 'react';
3
3
  import '@docsearch/css';
4
- declare function Links({ style }: {
4
+ declare function NavSecondaryContent(props: {
5
5
  style?: React.CSSProperties;
6
+ className?: string;
6
7
  }): React.JSX.Element;
@@ -9,8 +9,7 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
- // TODO/refactor: rename
13
- export { Links };
12
+ export { NavSecondaryContent };
14
13
  import React from 'react';
15
14
  import iconGithub from './icons/github.svg';
16
15
  import iconTwitter from './icons/twitter.svg';
@@ -19,12 +18,11 @@ import iconChangelog from './icons/changelog.svg';
19
18
  import iconLanguages from './icons/languages.svg';
20
19
  import { usePageContext } from './renderer/usePageContext';
21
20
  import '@docsearch/css';
22
- function Links(_a) {
23
- var style = _a.style;
21
+ function NavSecondaryContent(props) {
24
22
  var pageContext = usePageContext();
25
- var _b = pageContext.config, projectInfo = _b.projectInfo, i18n = _b.i18n;
23
+ var _a = pageContext.config, projectInfo = _a.projectInfo, i18n = _a.i18n;
26
24
  var iconI18n = !i18n ? null : (React.createElement(LinkIcon, { className: "decolorize-4", icon: iconLanguages, href: '/languages', style: { height: 21, position: 'relative', top: 0, left: 0 } }));
27
- 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) }),
28
26
  iconI18n,
29
27
  projectInfo.discordInvite && (React.createElement(LinkIcon, { className: "decolorize-6", icon: iconDiscord, href: projectInfo.discordInvite })),
30
28
  React.createElement(LinkIcon, { className: "decolorize-4", icon: iconTwitter, href: projectInfo.twitterProfile }),
@@ -37,7 +35,7 @@ function ChangelogButton() {
37
35
  return (React.createElement("a", { href: "".concat(projectInfo.githubRepository, "/blob/main/CHANGELOG.md"), className: "colorize-on-hover", style: {
38
36
  display: 'flex',
39
37
  alignItems: 'center',
40
- padding: 10,
38
+ padding: '0 5px',
41
39
  height: '100%',
42
40
  } },
43
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;