@rspress-theme-anatole/plugin-container-syntax 0.1.30 → 0.1.31
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/container.css +101 -22
- package/dist/index.js +149 -1
- package/package.json +1 -1
package/container.css
CHANGED
|
@@ -129,28 +129,6 @@
|
|
|
129
129
|
color: var(--rp-container-tip-text);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
.rspress-doc .rspress-directive.tabs {
|
|
136
|
-
border-color: var(--rp-container-tip-border);
|
|
137
|
-
background-color: var(--rp-container-tip-bg);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
.rspress-doc .rspress-directive.tabs .rspress-directive-title {
|
|
141
|
-
color: var(--rp-container-tip-text);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
.rspress-doc .rspress-directive.tabs code {
|
|
145
|
-
color: var(--rp-container-tip-text);
|
|
146
|
-
background-color: var(--rp-container-tip-code-bg);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
.rspress-doc .rspress-directive.tabs a {
|
|
150
|
-
color: var(--rp-container-tip-text);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
|
|
154
132
|
.rspress-doc .rspress-directive.info {
|
|
155
133
|
border-color: var(--rp-container-info-border);
|
|
156
134
|
background-color: var(--rp-container-info-bg);
|
|
@@ -225,4 +203,105 @@
|
|
|
225
203
|
|
|
226
204
|
.rspress-doc .rspress-directive.details a {
|
|
227
205
|
color: var(--rp-container-details-link);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
.rspress-doc .rspress-directive.tabs {
|
|
214
|
+
border-color: var(--rp-container-tip-border);
|
|
215
|
+
background-color: var(--rp-container-tip-bg);
|
|
216
|
+
padding: 0;
|
|
217
|
+
overflow: hidden;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.rspress-doc .rspress-directive.tabs .rspress-directive-title {
|
|
221
|
+
color: var(--rp-container-tip-text);
|
|
222
|
+
display: none;
|
|
223
|
+
/* Hide the default title for tabs */
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.rspress-doc .rspress-directive.tabs .rspress-directive-content {
|
|
227
|
+
padding: 0;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* Tabs navigation styling */
|
|
231
|
+
.rspress-doc .tabs-nav {
|
|
232
|
+
display: flex;
|
|
233
|
+
border-bottom: 1px solid var(--rp-container-tip-border);
|
|
234
|
+
background-color: rgba(7, 156, 112, 0.03);
|
|
235
|
+
padding: 0;
|
|
236
|
+
margin: 0;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.rspress-doc .tabs-nav-item {
|
|
240
|
+
padding: 8px 16px;
|
|
241
|
+
cursor: pointer;
|
|
242
|
+
margin: 0;
|
|
243
|
+
font-size: 14px;
|
|
244
|
+
font-weight: 500;
|
|
245
|
+
color: var(--rp-container-tip-text);
|
|
246
|
+
border-bottom: 2px solid transparent;
|
|
247
|
+
transition: all 0.2s ease;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.rspress-doc .tabs-nav-item.active {
|
|
251
|
+
border-bottom: 2px solid var(--rp-container-tip-text);
|
|
252
|
+
background-color: rgba(7, 156, 112, 0.08);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* Tab content styling */
|
|
256
|
+
.rspress-doc .tabs-content {
|
|
257
|
+
padding: 16px 24px;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.rspress-doc .tabs-panel {
|
|
261
|
+
display: none;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.rspress-doc .tabs-panel.active {
|
|
265
|
+
display: block;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.rspress-doc .tabs-nav-item:hover {
|
|
269
|
+
background-color: rgba(7, 156, 112, 0.06);
|
|
270
|
+
cursor: pointer;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
/* ...existing styles... */
|
|
276
|
+
|
|
277
|
+
.rspress-directive.tabs {
|
|
278
|
+
margin: 1rem 0;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.tabs-nav {
|
|
282
|
+
display: flex;
|
|
283
|
+
border-bottom: 1px solid #ddd;
|
|
284
|
+
margin-bottom: 1rem;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.tabs-nav-item {
|
|
288
|
+
padding: 0.5rem 1rem;
|
|
289
|
+
cursor: pointer;
|
|
290
|
+
border: 1px solid transparent;
|
|
291
|
+
border-bottom: none;
|
|
292
|
+
margin-bottom: -1px;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.tabs-nav-item.active {
|
|
296
|
+
background-color: #fff;
|
|
297
|
+
border-color: #ddd;
|
|
298
|
+
border-bottom-color: #fff;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.tabs-panel {
|
|
302
|
+
display: none;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.tabs-panel.active {
|
|
306
|
+
display: block;
|
|
228
307
|
}
|
package/dist/index.js
CHANGED
|
@@ -21,10 +21,125 @@ const parseTitle = (rawTitle = '', isMDX = false) => {
|
|
|
21
21
|
const matched = rawTitle?.match(isMDX ? TITLE_REGEX_IN_MDX : TITLE_REGEX_IN_MD);
|
|
22
22
|
return trimTailingQuote(matched?.[1] || rawTitle);
|
|
23
23
|
};
|
|
24
|
+
|
|
24
25
|
const createContainer = (type, title, children) => {
|
|
25
26
|
const isDetails = 'details' === type;
|
|
27
|
+
const isTabs = 'tabs' === type;
|
|
26
28
|
const rootHName = isDetails ? 'details' : 'div';
|
|
27
29
|
const titleHName = isDetails ? 'summary' : 'div';
|
|
30
|
+
|
|
31
|
+
// Handle tabs differently
|
|
32
|
+
if (isTabs) {
|
|
33
|
+
// Identify tab sections by finding paragraphs starting with ==
|
|
34
|
+
const tabSections = [];
|
|
35
|
+
let currentTabContent = null;
|
|
36
|
+
let currentTabTitle = '';
|
|
37
|
+
|
|
38
|
+
// Process children to find tab sections
|
|
39
|
+
for (let i = 0; i < children.length; i++) {
|
|
40
|
+
const child = children[i];
|
|
41
|
+
|
|
42
|
+
if (child.type === 'paragraph' &&
|
|
43
|
+
child.children &&
|
|
44
|
+
child.children[0] &&
|
|
45
|
+
child.children[0].type === 'text' &&
|
|
46
|
+
child.children[0].value.trim().startsWith('==')) {
|
|
47
|
+
|
|
48
|
+
// If we already have a tab section, push it
|
|
49
|
+
if (currentTabContent) {
|
|
50
|
+
tabSections.push({
|
|
51
|
+
title: currentTabTitle,
|
|
52
|
+
content: currentTabContent
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Start a new tab section
|
|
57
|
+
currentTabTitle = child.children[0].value.trim().substring(2).trim();
|
|
58
|
+
currentTabContent = [];
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Add content to the current tab section
|
|
63
|
+
if (currentTabContent !== null) {
|
|
64
|
+
currentTabContent.push(child);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Add the last tab section if it exists
|
|
69
|
+
if (currentTabContent && currentTabContent.length) {
|
|
70
|
+
tabSections.push({
|
|
71
|
+
title: currentTabTitle,
|
|
72
|
+
content: currentTabContent
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Create tab navigation
|
|
77
|
+
const tabNavItems = tabSections.map((section, index) => ({
|
|
78
|
+
type: 'paragraph',
|
|
79
|
+
data: {
|
|
80
|
+
hName: 'div',
|
|
81
|
+
hProperties: {
|
|
82
|
+
class: `tabs-nav-item${index === 0 ? ' active' : ''}`,
|
|
83
|
+
'data-tab-index': index
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
children: [
|
|
87
|
+
{
|
|
88
|
+
type: 'text',
|
|
89
|
+
value: section.title
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
}));
|
|
93
|
+
|
|
94
|
+
// Create tab content panels
|
|
95
|
+
const tabContentPanels = tabSections.map((section, index) => ({
|
|
96
|
+
type: 'paragraph',
|
|
97
|
+
data: {
|
|
98
|
+
hName: 'div',
|
|
99
|
+
hProperties: {
|
|
100
|
+
class: `tabs-panel${index === 0 ? ' active' : ''}`,
|
|
101
|
+
id: `tab-${index}`
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
children: section.content
|
|
105
|
+
}));
|
|
106
|
+
|
|
107
|
+
// Create the tabs container
|
|
108
|
+
return {
|
|
109
|
+
type: 'containerDirective',
|
|
110
|
+
data: {
|
|
111
|
+
hName: rootHName,
|
|
112
|
+
hProperties: {
|
|
113
|
+
class: `rspress-directive ${type}`
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
children: [
|
|
117
|
+
// Navigation tabs
|
|
118
|
+
{
|
|
119
|
+
type: 'paragraph',
|
|
120
|
+
data: {
|
|
121
|
+
hName: 'div',
|
|
122
|
+
hProperties: {
|
|
123
|
+
class: 'tabs-nav'
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
children: tabNavItems
|
|
127
|
+
},
|
|
128
|
+
// Tab content container
|
|
129
|
+
{
|
|
130
|
+
type: 'paragraph',
|
|
131
|
+
data: {
|
|
132
|
+
hName: 'div',
|
|
133
|
+
hProperties: {
|
|
134
|
+
class: 'tabs-content'
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
children: tabContentPanels
|
|
138
|
+
},
|
|
139
|
+
]
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
28
143
|
return {
|
|
29
144
|
type: 'containerDirective',
|
|
30
145
|
data: {
|
|
@@ -62,6 +177,31 @@ const createContainer = (type, title, children) => {
|
|
|
62
177
|
]
|
|
63
178
|
};
|
|
64
179
|
};
|
|
180
|
+
|
|
181
|
+
export function initializeTabs() {
|
|
182
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
183
|
+
const tabContainers = document.querySelectorAll('.rspress-directive.tabs');
|
|
184
|
+
|
|
185
|
+
tabContainers.forEach(container => {
|
|
186
|
+
const navItems = container.querySelectorAll('.tabs-nav-item');
|
|
187
|
+
const panels = container.querySelectorAll('.tabs-panel');
|
|
188
|
+
|
|
189
|
+
navItems.forEach((navItem, index) => {
|
|
190
|
+
navItem.addEventListener('click', () => {
|
|
191
|
+
// Remove active class from all nav items and panels
|
|
192
|
+
navItems.forEach(item => item.classList.remove('active'));
|
|
193
|
+
panels.forEach(panel => panel.classList.remove('active'));
|
|
194
|
+
|
|
195
|
+
// Add active class to clicked nav item and corresponding panel
|
|
196
|
+
navItem.classList.add('active');
|
|
197
|
+
panels[index].classList.add('active');
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
|
|
65
205
|
function transformer(tree) {
|
|
66
206
|
let i = 0;
|
|
67
207
|
try {
|
|
@@ -197,9 +337,15 @@ function transformer(tree) {
|
|
|
197
337
|
throw e;
|
|
198
338
|
}
|
|
199
339
|
}
|
|
340
|
+
|
|
200
341
|
const remarkPluginContainer = () => transformer;
|
|
201
342
|
const src_dirname = (0, __WEBPACK_EXTERNAL_MODULE__rspress_shared_baa012d0__.normalizePosixPath)(__WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__["default"].dirname((0, __WEBPACK_EXTERNAL_MODULE_node_url_e96de089__.fileURLToPath)(import.meta.url)));
|
|
202
343
|
function pluginContainerSyntax() {
|
|
344
|
+
// Initialize tabs when the plugin loads
|
|
345
|
+
if (typeof window !== 'undefined') {
|
|
346
|
+
initializeTabs();
|
|
347
|
+
}
|
|
348
|
+
|
|
203
349
|
return {
|
|
204
350
|
name: '@rspress-theme-anatole/plugin-container-syntax',
|
|
205
351
|
markdown: {
|
|
@@ -207,7 +353,9 @@ function pluginContainerSyntax() {
|
|
|
207
353
|
remarkPluginContainer
|
|
208
354
|
]
|
|
209
355
|
},
|
|
210
|
-
globalStyles: __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__["default"].posix.join(src_dirname, '../container.css')
|
|
356
|
+
globalStyles: __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__["default"].posix.join(src_dirname, '../container.css'),
|
|
357
|
+
|
|
211
358
|
};
|
|
212
359
|
}
|
|
360
|
+
|
|
213
361
|
export { pluginContainerSyntax };
|