@apify/docs-theme 1.0.210 → 1.0.211

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": "@apify/docs-theme",
3
- "version": "1.0.210",
3
+ "version": "1.0.211",
4
4
  "description": "",
5
5
  "main": "./src/index.js",
6
6
  "files": [
@@ -0,0 +1,212 @@
1
+ import Link from '@docusaurus/Link';
2
+ import {
3
+ findFirstSidebarItemLink,
4
+ isActiveSidebarItem,
5
+ useDocSidebarItemsExpandedState,
6
+ } from '@docusaurus/plugin-content-docs/client';
7
+ import {
8
+ Collapsible,
9
+ ThemeClassNames,
10
+ useCollapsible,
11
+ usePrevious,
12
+ useThemeConfig,
13
+ } from '@docusaurus/theme-common';
14
+ import { isSamePath } from '@docusaurus/theme-common/internal';
15
+ import { translate } from '@docusaurus/Translate';
16
+ import useIsBrowser from '@docusaurus/useIsBrowser';
17
+ import DocSidebarItems from '@theme/DocSidebarItems';
18
+ import clsx from 'clsx';
19
+ import React, { useEffect, useMemo } from 'react';
20
+
21
+ // If we navigate to a category and it becomes active, it should automatically
22
+ // expand itself
23
+ function useAutoExpandActiveCategory({ isActive, collapsed, updateCollapsed }) {
24
+ const wasActive = usePrevious(isActive);
25
+ useEffect(() => {
26
+ const justBecameActive = isActive && !wasActive;
27
+ if (justBecameActive && collapsed) {
28
+ updateCollapsed(false);
29
+ }
30
+ }, [isActive, wasActive, collapsed, updateCollapsed]);
31
+ }
32
+
33
+ /**
34
+ * When a collapsible category has no link, we still link it to its first child
35
+ * during SSR as a temporary fallback. This allows to be able to navigate inside
36
+ * the category even when JS fails to load, is delayed or simply disabled
37
+ * React hydration becomes an optional progressive enhancement
38
+ * see https://github.com/facebookincubator/infima/issues/36#issuecomment-772543188
39
+ * see https://github.com/facebook/docusaurus/issues/3030
40
+ */
41
+ function useCategoryHrefWithSSRFallback(item) {
42
+ const isBrowser = useIsBrowser();
43
+ return useMemo(() => {
44
+ if (item.href && !item.linkUnlisted) {
45
+ return item.href;
46
+ }
47
+ // In these cases, it's not necessary to render a fallback
48
+ // We skip the "findFirstCategoryLink" computation
49
+ if (isBrowser || !item.collapsible) {
50
+ return undefined;
51
+ }
52
+ return findFirstSidebarItemLink(item);
53
+ }, [item, isBrowser]);
54
+ }
55
+
56
+ function CollapseButton({ collapsed, categoryLabel, onClick }) {
57
+ return (
58
+ <button
59
+ aria-label={
60
+ collapsed
61
+ ? translate(
62
+ {
63
+ id: 'theme.DocSidebarItem.expandCategoryAriaLabel',
64
+ message: 'Expand sidebar category \'{label}\'',
65
+ description: 'The ARIA label to expand the sidebar category',
66
+ },
67
+ { label: categoryLabel },
68
+ )
69
+ : translate(
70
+ {
71
+ id: 'theme.DocSidebarItem.collapseCategoryAriaLabel',
72
+ message: 'Collapse sidebar category \'{label}\'',
73
+ description: 'The ARIA label to collapse the sidebar category',
74
+ },
75
+ { label: categoryLabel },
76
+ )
77
+ }
78
+ aria-expanded={!collapsed}
79
+ type="button"
80
+ className="clean-btn menu__caret"
81
+ onClick={onClick}
82
+ />
83
+ );
84
+ }
85
+
86
+ export default function DocSidebarItemCategory({ item, onItemClick, activePath, level, index, ...props }) {
87
+ const { items, label, collapsible, className, href } = item;
88
+ const {
89
+ docs: {
90
+ sidebar: { autoCollapseCategories },
91
+ },
92
+ } = useThemeConfig();
93
+ const hrefWithSSRFallback = useCategoryHrefWithSSRFallback(item);
94
+ const isActive = isActiveSidebarItem(item, activePath);
95
+ const isCurrentPage = isSamePath(href, activePath);
96
+ const {
97
+ collapsed,
98
+ setCollapsed,
99
+ } = useCollapsible({
100
+ // Active categories are always initialized as expanded. The default
101
+ // (`item.collapsed`) is only used for non-active categories.
102
+ initialState: () => {
103
+ if (!collapsible) {
104
+ return false;
105
+ }
106
+ return isActive ? false : item.collapsed;
107
+ },
108
+ });
109
+ const {
110
+ expandedItem,
111
+ setExpandedItem,
112
+ } = useDocSidebarItemsExpandedState();
113
+ // Use this instead of `setCollapsed`, because it is also reactive
114
+ const updateCollapsed = (toCollapsed = !collapsed) => {
115
+ setExpandedItem(toCollapsed ? null : index);
116
+ setCollapsed(toCollapsed);
117
+ };
118
+ useAutoExpandActiveCategory({
119
+ isActive,
120
+ collapsed,
121
+ updateCollapsed,
122
+ });
123
+ useEffect(() => {
124
+ if (
125
+ collapsible
126
+ && expandedItem != null
127
+ && expandedItem !== index
128
+ && autoCollapseCategories
129
+ ) {
130
+ setCollapsed(true);
131
+ }
132
+ }, [collapsible, expandedItem, index, setCollapsed, autoCollapseCategories]);
133
+
134
+ if (item.customProps) {
135
+ for (const key of Object.keys(item.customProps)) {
136
+ props[`data-${key}`] = item.customProps[key];
137
+ }
138
+ }
139
+
140
+ // console.log('sidebar category', item);
141
+
142
+ return (
143
+ <li
144
+ className={clsx(
145
+ ThemeClassNames.docs.docSidebarItemCategory,
146
+ ThemeClassNames.docs.docSidebarItemCategoryLevel(level),
147
+ 'menu__list-item',
148
+ {
149
+ 'menu__list-item--collapsed': collapsed,
150
+ },
151
+ className,
152
+ )}>
153
+ <div
154
+ className={clsx('menu__list-item-collapsible', {
155
+ 'menu__list-item-collapsible--active': isCurrentPage,
156
+ })}>
157
+ <Link
158
+ className={clsx('menu__link', {
159
+ 'menu__link--sublist': collapsible,
160
+ 'menu__link--sublist-caret': !href && collapsible,
161
+ 'menu__link--active': isActive,
162
+ })}
163
+ onClick={
164
+ collapsible
165
+ ? (e) => {
166
+ onItemClick?.(item);
167
+ if (href) {
168
+ updateCollapsed(false);
169
+ } else {
170
+ e.preventDefault();
171
+ updateCollapsed();
172
+ }
173
+ }
174
+ : () => {
175
+ onItemClick?.(item);
176
+ }
177
+ }
178
+ aria-current={isCurrentPage ? 'page' : undefined}
179
+ role={collapsible && !href ? 'button' : undefined}
180
+ aria-expanded={collapsible && !href ? !collapsed : undefined}
181
+ href={collapsible ? hrefWithSSRFallback ?? '#' : hrefWithSSRFallback}
182
+ {...props}>
183
+ {label}
184
+ </Link>
185
+ {href && collapsible && (
186
+ <CollapseButton
187
+ collapsed={collapsed}
188
+ categoryLabel={label}
189
+ onClick={(e) => {
190
+ e.preventDefault();
191
+ updateCollapsed();
192
+ }}
193
+ />
194
+ )}
195
+ </div>
196
+
197
+ <Collapsible
198
+ lazy
199
+ as="ul"
200
+ className="menu__list"
201
+ collapsed={collapsed}>
202
+ <DocSidebarItems
203
+ items={items}
204
+ tabIndex={collapsed ? -1 : 0}
205
+ onItemClick={onItemClick}
206
+ activePath={activePath}
207
+ level={level + 1}
208
+ />
209
+ </Collapsible>
210
+ </li>
211
+ );
212
+ }