@diplodoc/tabs-extension 3.10.3 → 3.10.4

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.
@@ -0,0 +1,1327 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __typeError = (msg) => {
9
+ throw TypeError(msg);
10
+ };
11
+ var __commonJS = (cb, mod) => function __require() {
12
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
13
+ };
14
+ var __export = (target, all) => {
15
+ for (var name in all)
16
+ __defProp(target, name, { get: all[name], enumerable: true });
17
+ };
18
+ var __copyProps = (to, from, except, desc) => {
19
+ if (from && typeof from === "object" || typeof from === "function") {
20
+ for (let key of __getOwnPropNames(from))
21
+ if (!__hasOwnProp.call(to, key) && key !== except)
22
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
+ }
24
+ return to;
25
+ };
26
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
27
+ // If the importer is in node compatibility mode or this is not an ESM
28
+ // file that has been converted to a CommonJS file using a Babel-
29
+ // compatible transform (i.e. "__esModule" has not been set), then set
30
+ // "default" to the CommonJS "module.exports" for node compatibility.
31
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
32
+ mod
33
+ ));
34
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
36
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
37
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
38
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
39
+
40
+ // node_modules/@diplodoc/utils/build/cjs/common/index.js
41
+ var require_common = __commonJS({
42
+ "node_modules/@diplodoc/utils/build/cjs/common/index.js"(exports2, module2) {
43
+ "use strict";
44
+ var __defProp2 = Object.defineProperty;
45
+ var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
46
+ var __getOwnPropNames2 = Object.getOwnPropertyNames;
47
+ var __hasOwnProp2 = Object.prototype.hasOwnProperty;
48
+ var __export2 = (target, all) => {
49
+ for (var name in all)
50
+ __defProp2(target, name, { get: all[name], enumerable: true });
51
+ };
52
+ var __copyProps2 = (to, from, except, desc) => {
53
+ if (from && typeof from === "object" || typeof from === "function") {
54
+ for (let key of __getOwnPropNames2(from))
55
+ if (!__hasOwnProp2.call(to, key) && key !== except)
56
+ __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable });
57
+ }
58
+ return to;
59
+ };
60
+ var __toCommonJS2 = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod);
61
+ var index_exports = {};
62
+ __export2(index_exports, {
63
+ AttrsParser: () => AttrsParser,
64
+ createIDGenerator: () => createIDGenerator,
65
+ createIDGeneratorByStrategy: () => createIDGeneratorByStrategy2,
66
+ createLoadQueue: () => createLoadQueue,
67
+ formatHref: () => formatHref,
68
+ getQueueStore: () => getQueueStore,
69
+ getScriptStore: () => getScriptStore,
70
+ isBrowser: () => isBrowser,
71
+ parseHref: () => parseHref,
72
+ parseMdAttrs: () => parseMdAttrs
73
+ });
74
+ module2.exports = __toCommonJS2(index_exports);
75
+ var _key, _pending, _isInsideQuotation, _didQuotationClosed, _currentKeyType, _selectors, _handlers, _a;
76
+ var AttrsParser = (_a = class {
77
+ constructor(value) {
78
+ __privateAdd(this, _key);
79
+ __privateAdd(this, _pending);
80
+ __privateAdd(this, _isInsideQuotation);
81
+ __privateAdd(this, _didQuotationClosed);
82
+ __privateAdd(this, _currentKeyType);
83
+ __privateAdd(this, _selectors);
84
+ __privateAdd(this, _handlers);
85
+ this.DELIMITER = "=";
86
+ this.SEPARATOR = " ";
87
+ this.QUOTATION = '"';
88
+ this.ALLOWED_CHARS = /[a-zA-Z0-9_\- {}.|/]/;
89
+ this.VALIDATION_CHARS = /[a-zA-Z0-9_\- {}.#="|/]/;
90
+ this.state = {};
91
+ __privateSet(this, _key, "");
92
+ __privateSet(this, _pending, "");
93
+ __privateSet(this, _isInsideQuotation, false);
94
+ __privateSet(this, _didQuotationClosed, false);
95
+ __privateSet(this, _selectors, {
96
+ id: /#/,
97
+ class: /\./,
98
+ attr: /[a-zA-Z-_]/
99
+ });
100
+ __privateSet(this, _handlers, Object.entries(__privateGet(this, _selectors)));
101
+ if (value) {
102
+ this.parse(value);
103
+ }
104
+ }
105
+ parse(target) {
106
+ const content = this.extract(target.trim());
107
+ if (!content) {
108
+ return {};
109
+ }
110
+ this.clear();
111
+ this.state = {};
112
+ for (const char of content) {
113
+ this.next(char);
114
+ }
115
+ this.next(this.SEPARATOR);
116
+ this.clear();
117
+ return this.state;
118
+ }
119
+ apply(target) {
120
+ const { attr: singleKeyAttrs = [], ...fullAttrs } = this.state;
121
+ for (const [property, values] of Object.entries(fullAttrs)) {
122
+ target.attrJoin(property, values.join(" "));
123
+ }
124
+ for (const attr of singleKeyAttrs) {
125
+ target.attrJoin(attr, "true");
126
+ }
127
+ }
128
+ extract(target) {
129
+ if (!target.startsWith("{")) {
130
+ return false;
131
+ }
132
+ let balance = 1;
133
+ for (let i = 1; i < target.length; i++) {
134
+ const char = target[i];
135
+ if (char === "}") {
136
+ balance--;
137
+ }
138
+ if (char === "{") {
139
+ balance++;
140
+ }
141
+ if (balance === 0) {
142
+ const contentInside = target.slice(1, i).trim();
143
+ return contentInside;
144
+ }
145
+ if (balance < 0) {
146
+ return false;
147
+ }
148
+ if (!this.VALIDATION_CHARS.test(char)) {
149
+ return false;
150
+ }
151
+ }
152
+ return false;
153
+ }
154
+ next(value) {
155
+ if (!__privateGet(this, _currentKeyType)) {
156
+ __privateSet(this, _currentKeyType, this.type(value));
157
+ if (__privateGet(this, _currentKeyType) === "attr") {
158
+ __privateSet(this, _pending, value);
159
+ }
160
+ return;
161
+ }
162
+ if (this.isSeparator(value)) {
163
+ if (!__privateGet(this, _pending)) {
164
+ if (!__privateGet(this, _isInsideQuotation)) {
165
+ this.append(__privateGet(this, _key), " ");
166
+ this.clear();
167
+ return;
168
+ }
169
+ }
170
+ if (!__privateGet(this, _key) && __privateGet(this, _pending)) {
171
+ this.append();
172
+ this.clear();
173
+ return;
174
+ }
175
+ if (__privateGet(this, _isInsideQuotation) && !__privateGet(this, _didQuotationClosed)) {
176
+ __privateSet(this, _pending, __privateGet(this, _pending) + value);
177
+ return;
178
+ }
179
+ if (__privateGet(this, _isInsideQuotation) && __privateGet(this, _didQuotationClosed)) {
180
+ this.append(__privateGet(this, _key), __privateGet(this, _pending));
181
+ }
182
+ if (!__privateGet(this, _isInsideQuotation) && !__privateGet(this, _didQuotationClosed)) {
183
+ this.append(__privateGet(this, _key), __privateGet(this, _pending));
184
+ }
185
+ this.clear();
186
+ return;
187
+ }
188
+ if (this.isAllowedChar(value)) {
189
+ __privateSet(this, _pending, __privateGet(this, _pending) + value);
190
+ return;
191
+ }
192
+ if (this.isQuotation(value)) {
193
+ if (__privateGet(this, _isInsideQuotation)) {
194
+ __privateSet(this, _didQuotationClosed, true);
195
+ } else {
196
+ __privateSet(this, _isInsideQuotation, true);
197
+ }
198
+ }
199
+ if (this.isDelimiter(value)) {
200
+ if (__privateGet(this, _key)) {
201
+ __privateSet(this, _pending, __privateGet(this, _pending) + value);
202
+ return;
203
+ }
204
+ __privateSet(this, _key, __privateGet(this, _pending));
205
+ __privateSet(this, _pending, "");
206
+ }
207
+ }
208
+ type(of) {
209
+ var _a2;
210
+ return (_a2 = __privateGet(this, _handlers).find(([_, regex]) => regex.test(of))) == null ? void 0 : _a2[0];
211
+ }
212
+ append(key = __privateGet(this, _currentKeyType), value = __privateGet(this, _pending)) {
213
+ if (!key) {
214
+ return;
215
+ }
216
+ if (!this.state[key]) {
217
+ this.state[key] = [];
218
+ }
219
+ this.state[key].push(value);
220
+ }
221
+ clear() {
222
+ __privateSet(this, _key, "");
223
+ __privateSet(this, _pending, "");
224
+ __privateSet(this, _isInsideQuotation, false);
225
+ __privateSet(this, _didQuotationClosed, false);
226
+ __privateSet(this, _currentKeyType, void 0);
227
+ }
228
+ isDelimiter(target) {
229
+ return target === this.DELIMITER;
230
+ }
231
+ isSeparator(target) {
232
+ return target === this.SEPARATOR;
233
+ }
234
+ isQuotation(target) {
235
+ return target === this.QUOTATION;
236
+ }
237
+ isAllowedChar(target) {
238
+ return this.ALLOWED_CHARS.test(target);
239
+ }
240
+ }, _key = new WeakMap(), _pending = new WeakMap(), _isInsideQuotation = new WeakMap(), _didQuotationClosed = new WeakMap(), _currentKeyType = new WeakMap(), _selectors = new WeakMap(), _handlers = new WeakMap(), _a);
241
+ function parseMdAttrs(md, src, pos, max) {
242
+ if (pos >= max) {
243
+ return null;
244
+ }
245
+ if (src.charCodeAt(pos) !== 123) {
246
+ return null;
247
+ }
248
+ const attrs = {};
249
+ ++pos;
250
+ pos = skipBlanks(src, pos, max);
251
+ for (; pos < max; pos = skipBlanks(src, pos, max)) {
252
+ if (src.charCodeAt(pos) === 125) {
253
+ ++pos;
254
+ return { pos, attrs };
255
+ }
256
+ const c = src.charCodeAt(pos);
257
+ if (c === 35) {
258
+ ++pos;
259
+ const rst = parseUnsurroundedName(src, pos, max);
260
+ if (rst === null) {
261
+ return null;
262
+ }
263
+ pos = rst.pos;
264
+ const key = "id", value = rst.name;
265
+ if (typeof attrs[key] === "undefined") {
266
+ attrs[key] = [value];
267
+ } else {
268
+ attrs[key].push(value);
269
+ }
270
+ } else if (c === 46) {
271
+ ++pos;
272
+ const rst = parseUnsurroundedName(src, pos, max);
273
+ if (rst === null) {
274
+ return null;
275
+ }
276
+ pos = rst.pos;
277
+ const key = "class", value = rst.name;
278
+ if (typeof attrs[key] === "undefined") {
279
+ attrs[key] = [value];
280
+ } else {
281
+ attrs[key].push(value);
282
+ }
283
+ } else {
284
+ let rst = parseAttrName(src, pos, max);
285
+ if (rst === null) {
286
+ return null;
287
+ }
288
+ const key = rst.name;
289
+ pos = rst.pos;
290
+ pos = skipBlanks(src, pos, max);
291
+ if (pos >= max) {
292
+ return null;
293
+ }
294
+ let value;
295
+ if (src.charCodeAt(pos) === 61) {
296
+ ++pos;
297
+ pos = skipBlanks(src, pos, max);
298
+ if (pos >= max) {
299
+ return null;
300
+ }
301
+ const c2 = src.charCodeAt(pos);
302
+ if (c2 === 34 || c2 === 39) {
303
+ const rst2 = md.helpers.parseLinkTitle(src, pos, max);
304
+ if (!rst2.ok) {
305
+ return null;
306
+ }
307
+ value = rst2.str;
308
+ pos = rst2.pos;
309
+ } else {
310
+ rst = parseUnsurroundedName(src, pos, max);
311
+ if (rst === null) {
312
+ return null;
313
+ }
314
+ value = rst.name;
315
+ pos = rst.pos;
316
+ }
317
+ } else {
318
+ if (isBlank(src.charCodeAt(pos - 1))) {
319
+ --pos;
320
+ }
321
+ value = "";
322
+ }
323
+ if (typeof value !== "undefined") {
324
+ if (typeof attrs[key] === "undefined") {
325
+ attrs[key] = [value];
326
+ } else {
327
+ attrs[key].push(value);
328
+ }
329
+ }
330
+ }
331
+ if (pos >= max) {
332
+ return null;
333
+ }
334
+ const charBetween = src.charCodeAt(pos);
335
+ if (!isBlank(charBetween) && charBetween !== 125) {
336
+ return null;
337
+ }
338
+ }
339
+ return null;
340
+ function isBlank(code) {
341
+ return md.utils.isSpace(code) || code === 10;
342
+ }
343
+ function skipBlanks(src2, pos2, max2) {
344
+ for (; pos2 < max2; pos2++) {
345
+ const code = src2.charCodeAt(pos2);
346
+ if (!isBlank(code)) {
347
+ break;
348
+ }
349
+ }
350
+ return pos2;
351
+ }
352
+ }
353
+ var ATTR_NAME_RE = /^[a-z][a-z0-9\-_]*/;
354
+ function parseAttrName(src, pos, max) {
355
+ const oldPos = pos;
356
+ const rst = src.slice(pos, max).match(ATTR_NAME_RE);
357
+ if (rst === null) {
358
+ return null;
359
+ }
360
+ pos += rst[0].length;
361
+ return { pos, name: src.slice(oldPos, pos) };
362
+ }
363
+ var UNSURROUNDED_STRING_RE = /^[a-z0-9\-_]+/i;
364
+ function parseUnsurroundedName(src, pos, max) {
365
+ const oldPos = pos;
366
+ const rst = src.slice(pos, max).match(UNSURROUNDED_STRING_RE);
367
+ if (rst === null) {
368
+ return null;
369
+ }
370
+ pos += rst[0].length;
371
+ return { pos, name: src.slice(oldPos, pos) };
372
+ }
373
+ var isBrowser = () => {
374
+ return typeof window !== "undefined" && typeof window.document !== "undefined";
375
+ };
376
+ var QUEUES_SYMBOL = /* @__PURE__ */ Symbol.for("extension-load-queues");
377
+ var SINGLE_QUEUE_SYMBOL = /* @__PURE__ */ Symbol.for("single-queue");
378
+ var getScriptStore = (storeKey) => {
379
+ if (isBrowser()) {
380
+ if (!window[storeKey]) {
381
+ window[storeKey] = [];
382
+ } else if (!Array.isArray(window[storeKey])) {
383
+ throw new Error(`Expected window[${String(storeKey)}] to be an array`);
384
+ }
385
+ return window[storeKey];
386
+ } else {
387
+ throw new Error("Cannot initialize QueueStore in a non-browser environment.");
388
+ }
389
+ };
390
+ var ensureQueuesSymbolInitialized = () => {
391
+ if (isBrowser()) {
392
+ if (typeof window[QUEUES_SYMBOL] !== "object" || window[QUEUES_SYMBOL] === null) {
393
+ window[QUEUES_SYMBOL] = {};
394
+ }
395
+ } else {
396
+ throw new Error("Cannot initialize QueueStore in a non-browser environment.");
397
+ }
398
+ };
399
+ var getQueueStore = (queueKey) => {
400
+ var _a2;
401
+ ensureQueuesSymbolInitialized();
402
+ return ((_a2 = window[QUEUES_SYMBOL]) == null ? void 0 : _a2[queueKey]) || false;
403
+ };
404
+ var createHandleQueueCreated = (queueKey) => {
405
+ ensureQueuesSymbolInitialized();
406
+ return (created) => {
407
+ window[QUEUES_SYMBOL][queueKey] = created;
408
+ };
409
+ };
410
+ var createLoadQueue = ({
411
+ store,
412
+ createController,
413
+ queueKey = SINGLE_QUEUE_SYMBOL,
414
+ isQueueCreated = getQueueStore(queueKey),
415
+ onQueueCreated = createHandleQueueCreated(queueKey)
416
+ }) => {
417
+ if (!store || isQueueCreated) {
418
+ return;
419
+ }
420
+ onQueueCreated(true);
421
+ const controller = createController();
422
+ const queue = store.splice(0, store.length);
423
+ store.push = function(...args) {
424
+ args.forEach((callback) => {
425
+ queue.push(callback);
426
+ unqueue();
427
+ });
428
+ return queue.length;
429
+ };
430
+ let processing = false;
431
+ function unqueue() {
432
+ if (!processing) {
433
+ next();
434
+ }
435
+ }
436
+ async function next() {
437
+ processing = true;
438
+ const callback = queue.shift();
439
+ if (callback) {
440
+ await callback(controller);
441
+ return next();
442
+ }
443
+ processing = false;
444
+ }
445
+ unqueue();
446
+ };
447
+ function createIDGenerator() {
448
+ const counters = /* @__PURE__ */ new Map();
449
+ return function generateID(prefix) {
450
+ if (!prefix) {
451
+ return Math.random().toString(36).substr(2, 8);
452
+ }
453
+ counters.set(prefix, (counters.get(prefix) || 0) + 1);
454
+ return `${prefix}-${counters.get(prefix)}`;
455
+ };
456
+ }
457
+ function createIDGeneratorByStrategy2(strategy = "random") {
458
+ switch (strategy) {
459
+ case "deterministic":
460
+ return createIDGenerator();
461
+ case "constant":
462
+ return () => "1";
463
+ case "random":
464
+ default:
465
+ return (prefix) => {
466
+ if (!prefix) {
467
+ return Math.random().toString(36).substr(2, 8);
468
+ }
469
+ return `${prefix}-${Math.random().toString(36).substr(2, 8)}`;
470
+ };
471
+ }
472
+ }
473
+ function parseHref(href) {
474
+ const [beforeHash, ...hashParts] = href.split("#");
475
+ const hash = hashParts.length ? "#" + hashParts.join("#") : null;
476
+ const queryIndex = beforeHash.indexOf("?");
477
+ const path = queryIndex === -1 ? beforeHash : beforeHash.slice(0, queryIndex);
478
+ const search = queryIndex === -1 ? null : beforeHash.slice(queryIndex);
479
+ return {
480
+ pathname: path === "" ? null : path,
481
+ search,
482
+ hash
483
+ };
484
+ }
485
+ function formatHref({ pathname, search, hash }) {
486
+ return (pathname || "") + (search || "") + (hash || "");
487
+ }
488
+ }
489
+ });
490
+
491
+ // node_modules/github-slugger/regex.js
492
+ var require_regex = __commonJS({
493
+ "node_modules/github-slugger/regex.js"(exports2, module2) {
494
+ "use strict";
495
+ module2.exports = /[\0-\x1F!-,\.\/:-@\[-\^`\{-\xA9\xAB-\xB4\xB6-\xB9\xBB-\xBF\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0378\u0379\u037E\u0380-\u0385\u0387\u038B\u038D\u03A2\u03F6\u0482\u0530\u0557\u0558\u055A-\u055F\u0589-\u0590\u05BE\u05C0\u05C3\u05C6\u05C8-\u05CF\u05EB-\u05EE\u05F3-\u060F\u061B-\u061F\u066A-\u066D\u06D4\u06DD\u06DE\u06E9\u06FD\u06FE\u0700-\u070F\u074B\u074C\u07B2-\u07BF\u07F6-\u07F9\u07FB\u07FC\u07FE\u07FF\u082E-\u083F\u085C-\u085F\u086B-\u089F\u08B5\u08C8-\u08D2\u08E2\u0964\u0965\u0970\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09F2-\u09FB\u09FD\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF0-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B54\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B70\u0B72-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BF0-\u0BFF\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C7F\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D0D\u0D11\u0D45\u0D49\u0D4F-\u0D53\u0D58-\u0D5E\u0D64\u0D65\u0D70-\u0D79\u0D80\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF4-\u0E00\u0E3B-\u0E3F\u0E4F\u0E5A-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F01-\u0F17\u0F1A-\u0F1F\u0F2A-\u0F34\u0F36\u0F38\u0F3A-\u0F3D\u0F48\u0F6D-\u0F70\u0F85\u0F98\u0FBD-\u0FC5\u0FC7-\u0FFF\u104A-\u104F\u109E\u109F\u10C6\u10C8-\u10CC\u10CE\u10CF\u10FB\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u1360-\u137F\u1390-\u139F\u13F6\u13F7\u13FE-\u1400\u166D\u166E\u1680\u169B-\u169F\u16EB-\u16ED\u16F9-\u16FF\u170D\u1715-\u171F\u1735-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17D4-\u17D6\u17D8-\u17DB\u17DE\u17DF\u17EA-\u180A\u180E\u180F\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u1945\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DA-\u19FF\u1A1C-\u1A1F\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1AA6\u1AA8-\u1AAF\u1AC1-\u1AFF\u1B4C-\u1B4F\u1B5A-\u1B6A\u1B74-\u1B7F\u1BF4-\u1BFF\u1C38-\u1C3F\u1C4A-\u1C4C\u1C7E\u1C7F\u1C89-\u1C8F\u1CBB\u1CBC\u1CC0-\u1CCF\u1CD3\u1CFB-\u1CFF\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FBD\u1FBF-\u1FC1\u1FC5\u1FCD-\u1FCF\u1FD4\u1FD5\u1FDC-\u1FDF\u1FED-\u1FF1\u1FF5\u1FFD-\u203E\u2041-\u2053\u2055-\u2070\u2072-\u207E\u2080-\u208F\u209D-\u20CF\u20F1-\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F-\u215F\u2189-\u24B5\u24EA-\u2BFF\u2C2F\u2C5F\u2CE5-\u2CEA\u2CF4-\u2CFF\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D70-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E00-\u2E2E\u2E30-\u3004\u3008-\u3020\u3030\u3036\u3037\u303D-\u3040\u3097\u3098\u309B\u309C\u30A0\u30FB\u3100-\u3104\u3130\u318F-\u319F\u31C0-\u31EF\u3200-\u33FF\u4DC0-\u4DFF\u9FFD-\u9FFF\uA48D-\uA4CF\uA4FE\uA4FF\uA60D-\uA60F\uA62C-\uA63F\uA673\uA67E\uA6F2-\uA716\uA720\uA721\uA789\uA78A\uA7C0\uA7C1\uA7CB-\uA7F4\uA828-\uA82B\uA82D-\uA83F\uA874-\uA87F\uA8C6-\uA8CF\uA8DA-\uA8DF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA954-\uA95F\uA97D-\uA97F\uA9C1-\uA9CE\uA9DA-\uA9DF\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A-\uAA5F\uAA77-\uAA79\uAAC3-\uAADA\uAADE\uAADF\uAAF0\uAAF1\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB5B\uAB6A-\uAB6F\uABEB\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uE000-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB29\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBB2-\uFBD2\uFD3E-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFC-\uFDFF\uFE10-\uFE1F\uFE30-\uFE32\uFE35-\uFE4C\uFE50-\uFE6F\uFE75\uFEFD-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF3E\uFF40\uFF5B-\uFF65\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFFF]|\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDD3F\uDD75-\uDDFC\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEE1-\uDEFF\uDF20-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDF9F\uDFC4-\uDFC7\uDFD0\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56-\uDC5F\uDC77-\uDC7F\uDC9F-\uDCDF\uDCF3\uDCF6-\uDCFF\uDD16-\uDD1F\uDD3A-\uDD7F\uDDB8-\uDDBD\uDDC0-\uDDFF\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE40-\uDE5F\uDE7D-\uDE7F\uDE9D-\uDEBF\uDEC8\uDEE7-\uDEFF\uDF36-\uDF3F\uDF56-\uDF5F\uDF73-\uDF7F\uDF92-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCFF\uDD28-\uDD2F\uDD3A-\uDE7F\uDEAA\uDEAD-\uDEAF\uDEB2-\uDEFF\uDF1D-\uDF26\uDF28-\uDF2F\uDF51-\uDFAF\uDFC5-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC47-\uDC65\uDC70-\uDC7E\uDCBB-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD40-\uDD43\uDD48-\uDD4F\uDD74\uDD75\uDD77-\uDD7F\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDFF\uDE12\uDE38-\uDE3D\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEA9-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC4B-\uDC4F\uDC5A-\uDC5D\uDC62-\uDC7F\uDCC6\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDC1-\uDDD7\uDDDE-\uDDFF\uDE41-\uDE43\uDE45-\uDE4F\uDE5A-\uDE7F\uDEB9-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF3A-\uDFFF]|\uD806[\uDC3B-\uDC9F\uDCEA-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD44-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE2\uDDE5-\uDDFF\uDE3F-\uDE46\uDE48-\uDE4F\uDE9A-\uDE9C\uDE9E-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC41-\uDC4F\uDC5A-\uDC71\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF7-\uDFAF\uDFB1-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD824-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83D\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDECF\uDEEE\uDEEF\uDEF5-\uDEFF\uDF37-\uDF3F\uDF44-\uDF4F\uDF5A-\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE80-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE2\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82C[\uDD1F-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A-\uDC9C\uDC9F-\uDFFF]|\uD834[\uDC00-\uDD64\uDD6A-\uDD6C\uDD73-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDE41\uDE45-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3\uDFCC\uDFCD]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD4F-\uDEBF\uDEFA-\uDFFF]|\uD83A[\uDCC5-\uDCCF\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDFFF]|\uD83C[\uDC00-\uDD2F\uDD4A-\uDD4F\uDD6A-\uDD6F\uDD8A-\uDFFF]|\uD83E[\uDC00-\uDFEF\uDFFA-\uDFFF]|\uD869[\uDEDE-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uD884[\uDF4B-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]/g;
496
+ }
497
+ });
498
+
499
+ // node_modules/github-slugger/index.js
500
+ var require_github_slugger = __commonJS({
501
+ "node_modules/github-slugger/index.js"(exports2, module2) {
502
+ "use strict";
503
+ var regex = require_regex();
504
+ module2.exports = BananaSlug;
505
+ var own = Object.hasOwnProperty;
506
+ function BananaSlug() {
507
+ const self = this;
508
+ if (!(self instanceof BananaSlug)) return new BananaSlug();
509
+ self.reset();
510
+ }
511
+ BananaSlug.prototype.slug = function(value, maintainCase) {
512
+ const self = this;
513
+ let slug = slugger(value, maintainCase === true);
514
+ const originalSlug = slug;
515
+ while (own.call(self.occurrences, slug)) {
516
+ self.occurrences[originalSlug]++;
517
+ slug = originalSlug + "-" + self.occurrences[originalSlug];
518
+ }
519
+ self.occurrences[slug] = 0;
520
+ return slug;
521
+ };
522
+ BananaSlug.prototype.reset = function() {
523
+ this.occurrences = /* @__PURE__ */ Object.create(null);
524
+ };
525
+ function slugger(string, maintainCase) {
526
+ if (typeof string !== "string") return "";
527
+ if (!maintainCase) string = string.toLowerCase();
528
+ return string.replace(regex, "").replace(/ /g, "-");
529
+ }
530
+ BananaSlug.slug = slugger;
531
+ }
532
+ });
533
+
534
+ // src/plugin/index-node.ts
535
+ var index_node_exports = {};
536
+ __export(index_node_exports, {
537
+ transform: () => transform2
538
+ });
539
+ module.exports = __toCommonJS(index_node_exports);
540
+
541
+ // src/plugin/transform.ts
542
+ var import_utils6 = __toESM(require_common());
543
+
544
+ // src/common.ts
545
+ var TAB_RE = /`?{% list tabs .*?%}`?/;
546
+ var TABS_CLASSNAME = "yfm-tabs";
547
+ var TAB_CLASSNAME = "yfm-tab";
548
+ var TAB_PANEL_CLASSNAME = "yfm-tab-panel";
549
+ var TABS_LIST_CLASSNAME = "yfm-tab-list";
550
+ var ACTIVE_CLASSNAME = "active";
551
+ var TAB_GROUP_CLASSNAME = "yfm-tab-group";
552
+ var TAB_ACTIVE_KEY = "data-diplodoc-is-active";
553
+ var GROUP_DATA_KEY = "data-diplodoc-group";
554
+ var TAB_DATA_KEY = "data-diplodoc-key";
555
+ var TAB_DATA_VARIANT = "data-diplodoc-variant";
556
+ var TAB_DATA_ID = "data-diplodoc-id";
557
+ var DEFAULT_TABS_GROUP_PREFIX = "defaultTabsGroup-";
558
+ var ACTIVE_TAB_TEXT = "{selected}";
559
+ var TAB_FORCED_OPEN = "data-diplodoc-forced";
560
+ var TABS_DROPDOWN_CLASSNAME = "yfm-tabs-dropdown";
561
+ var TABS_DROPDOWN_MENU_CLASSNAME = "yfm-tabs-dropdown-menu";
562
+ var TABS_DROPDOWN_SELECT = "yfm-tabs-dropdown-select";
563
+ var TABS_ACCORDION_CLASSNAME = "yfm-tabs-accordion";
564
+ var TABS_RADIO_CLASSNAME = "yfm-tabs-vertical";
565
+ var VERTICAL_TAB_CLASSNAME = "yfm-vertical-tab";
566
+ var TAB_DATA_VERTICAL_TAB = "data-diplodoc-vertical-tab";
567
+
568
+ // src/plugin/utils/strings.ts
569
+ function trim(target) {
570
+ return target.trim();
571
+ }
572
+ function unquote(target) {
573
+ return target.match(/^(["']).*\1$/) ? target.slice(1, -1) : target;
574
+ }
575
+
576
+ // src/plugin/utils/tabs.ts
577
+ var import_github_slugger = __toESM(require_github_slugger());
578
+ var CUSTOM_ID_REGEXP = /\[?{ ?#(\S+) ?}]?/;
579
+ var sluggersStorage = /* @__PURE__ */ new Map();
580
+ function parseName(name) {
581
+ const parts = name.match(CUSTOM_ID_REGEXP);
582
+ let customAnchor = null;
583
+ let pure = name;
584
+ if (parts) {
585
+ pure = name.replace(parts[0], "");
586
+ customAnchor = parts[1];
587
+ } else {
588
+ pure = name;
589
+ customAnchor = null;
590
+ }
591
+ if (pure.includes(ACTIVE_TAB_TEXT)) {
592
+ pure = pure.replace(ACTIVE_TAB_TEXT, "");
593
+ }
594
+ return {
595
+ name: pure.trim(),
596
+ customAnchor
597
+ };
598
+ }
599
+ function getTabId(tab, { runId }) {
600
+ let slugger = sluggersStorage.get(runId);
601
+ if (!slugger) {
602
+ slugger = new import_github_slugger.default();
603
+ sluggersStorage.set(runId, slugger);
604
+ }
605
+ return slugger.slug(getRawId(tab));
606
+ }
607
+ function isTabSelected(tab) {
608
+ const { name } = tab;
609
+ return name.includes(ACTIVE_TAB_TEXT);
610
+ }
611
+ function getTabKey(tab) {
612
+ return encodeURIComponent(getRawId(tab)).toLocaleLowerCase();
613
+ }
614
+ function getName(tab) {
615
+ return parseName(tab.name).name;
616
+ }
617
+ function getRawId(tab) {
618
+ const { customAnchor, name } = parseName(tab.name);
619
+ return customAnchor || name;
620
+ }
621
+ function getContentMap(tokens) {
622
+ let firstMap = null;
623
+ let lastMap = null;
624
+ tokens.forEach(({ map }) => {
625
+ if (map) {
626
+ firstMap = firstMap != null ? firstMap : map;
627
+ lastMap = map;
628
+ }
629
+ });
630
+ return firstMap && lastMap ? [firstMap[0], lastMap[1]] : null;
631
+ }
632
+
633
+ // src/plugin/utils/index.ts
634
+ function addHiddenProperty(box, field, value) {
635
+ if (!(field in box)) {
636
+ Object.defineProperty(box, field, {
637
+ enumerable: false,
638
+ value
639
+ });
640
+ }
641
+ return box;
642
+ }
643
+
644
+ // src/plugin/variants/regular.ts
645
+ var regular = (tabs, state, { containerClasses, tabsGroup, runId, variant: orientation, generateID }) => {
646
+ var _a, _b;
647
+ const tabsTokens = [];
648
+ const tabListTokens = [];
649
+ const tabPanelsTokens = [];
650
+ const tabsOpen = new state.Token("tabs_open", "div", 1);
651
+ const tabsClose = new state.Token("tabs_close", "div", -1);
652
+ const tabListOpen = new state.Token("tab-list_open", "div", 1);
653
+ const tabListClose = new state.Token("tab-list_close", "div", -1);
654
+ if (tabs.length) {
655
+ const [start] = (_a = tabs[0].listItem.map) != null ? _a : [null];
656
+ if (start == null) {
657
+ throw new Error("failed to parse line mapping");
658
+ }
659
+ const [_, end] = (_b = tabs[tabs.length - 1].listItem.map) != null ? _b : [null, null];
660
+ if (end == null) {
661
+ throw new Error("failed to parse line mapping");
662
+ }
663
+ tabListOpen.map = [start, end];
664
+ }
665
+ tabsOpen.block = true;
666
+ tabsClose.block = true;
667
+ tabListOpen.block = true;
668
+ tabListClose.block = true;
669
+ const activeTabsCount = tabs.filter(isTabSelected).length;
670
+ if (activeTabsCount > 1) {
671
+ throw new Error("Unable to render tabs with more than 1 active element");
672
+ }
673
+ const hasDefaultOpenTab = activeTabsCount !== 0;
674
+ tabsOpen.attrSet("class", [TABS_CLASSNAME, containerClasses].filter(Boolean).join(" "));
675
+ tabsOpen.attrSet(GROUP_DATA_KEY, tabsGroup);
676
+ tabsOpen.attrSet(TAB_DATA_VARIANT, "regular");
677
+ tabListOpen.attrSet("class", TABS_LIST_CLASSNAME);
678
+ tabListOpen.attrSet("role", "tablist");
679
+ if (orientation === "radio") {
680
+ tabsTokens.push(tabsOpen);
681
+ }
682
+ for (let i = 0; i < tabs.length; i++) {
683
+ const tabOpen = new state.Token("tab_open", "div", 1);
684
+ const tabInline = new state.Token("inline", "", 0);
685
+ const tabText = new state.Token("text", "", 0);
686
+ const tabClose = new state.Token("tab_close", "div", -1);
687
+ const tabPanelOpen = new state.Token("tab-panel_open", "div", 1);
688
+ const tabPanelClose = new state.Token("tab-panel_close", "div", -1);
689
+ const verticalTabInput = new state.Token("tab-input", "input", 0);
690
+ const verticalTabLabelOpen = new state.Token("tab-label_open", "label", 1);
691
+ const verticalTabLabelClose = new state.Token("tab-label_close", "label", -1);
692
+ tabOpen.map = tabs[i].listItem.map;
693
+ tabOpen.markup = tabs[i].listItem.markup;
694
+ const tab = tabs[i];
695
+ const tabId = getTabId(tab, { runId });
696
+ const tabKey = getTabKey(tab);
697
+ const didTabHasActiveAttr = isTabSelected(tab);
698
+ const isTabActive = hasDefaultOpenTab ? didTabHasActiveAttr : i === 0;
699
+ tab.name = getName(tab);
700
+ const tabPanelId = generateID("regular");
701
+ verticalTabInput.block = true;
702
+ verticalTabInput.attrJoin("class", "radio");
703
+ verticalTabInput.attrSet("type", "radio");
704
+ tabOpen.map = tabs[i].listItem.map;
705
+ tabOpen.markup = tabs[i].listItem.markup;
706
+ tabPanelOpen.map = getContentMap(tabs[i].tokens);
707
+ tabText.content = tabs[i].name;
708
+ tabInline.children = [tabText];
709
+ tabOpen.block = true;
710
+ tabClose.block = true;
711
+ tabPanelOpen.block = true;
712
+ tabPanelClose.block = true;
713
+ tabOpen.attrSet(TAB_DATA_ID, tabId);
714
+ tabOpen.attrSet(TAB_DATA_KEY, tabKey);
715
+ tabOpen.attrSet("class", TAB_CLASSNAME);
716
+ tabOpen.attrJoin("class", "yfm-tab-group");
717
+ tabOpen.attrSet("role", "tab");
718
+ tabOpen.attrSet("aria-controls", tabPanelId);
719
+ tabOpen.attrSet("aria-selected", "false");
720
+ tabOpen.attrSet("tabindex", i === 0 ? "0" : "-1");
721
+ tabOpen.attrSet(TAB_ACTIVE_KEY, "false");
722
+ tabPanelOpen.attrSet("id", tabPanelId);
723
+ tabPanelOpen.attrSet("class", TAB_PANEL_CLASSNAME);
724
+ tabPanelOpen.attrSet("role", "tabpanel");
725
+ tabPanelOpen.attrSet("aria-labelledby", tabId);
726
+ tabPanelOpen.attrSet("data-title", tab.name);
727
+ if (orientation === "radio") {
728
+ tabOpen.attrSet(TAB_DATA_VERTICAL_TAB, "true");
729
+ tabOpen.attrJoin("class", VERTICAL_TAB_CLASSNAME);
730
+ }
731
+ if (isTabActive) {
732
+ if (orientation === "radio") {
733
+ tabOpen.attrSet(TAB_FORCED_OPEN, "true");
734
+ verticalTabInput.attrSet("checked", "true");
735
+ tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
736
+ } else {
737
+ tabOpen.attrSet(TAB_ACTIVE_KEY, i === 0 ? "true" : "false");
738
+ tabOpen.attrJoin("class", ACTIVE_CLASSNAME);
739
+ tabOpen.attrSet("aria-selected", "true");
740
+ tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
741
+ }
742
+ }
743
+ if (orientation === "radio") {
744
+ tabsTokens.push(
745
+ tabOpen,
746
+ verticalTabInput,
747
+ verticalTabLabelOpen,
748
+ tabInline,
749
+ verticalTabLabelClose,
750
+ tabClose
751
+ );
752
+ tabsTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);
753
+ } else {
754
+ tabListTokens.push(tabOpen, tabInline, tabClose);
755
+ tabPanelsTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);
756
+ }
757
+ }
758
+ tabsTokens.push(tabsOpen);
759
+ tabsTokens.push(tabListOpen);
760
+ tabsTokens.push(...tabListTokens);
761
+ tabsTokens.push(tabListClose);
762
+ tabsTokens.push(...tabPanelsTokens);
763
+ tabsTokens.push(tabsClose);
764
+ return tabsTokens;
765
+ };
766
+
767
+ // src/plugin/variants/radio.ts
768
+ var radio = (tabs, state, { containerClasses, tabsGroup, runId, generateID }) => {
769
+ var _a, _b;
770
+ const tabsTokens = [];
771
+ const tabsOpen = new state.Token("tabs_open", "div", 1);
772
+ const tabsClose = new state.Token("tabs_close", "div", -1);
773
+ if (tabs.length) {
774
+ const [start] = (_a = tabs[0].listItem.map) != null ? _a : [null];
775
+ if (start == null) {
776
+ throw new Error("failed to parse line mapping");
777
+ }
778
+ const [_, end] = (_b = tabs[tabs.length - 1].listItem.map) != null ? _b : [null, null];
779
+ if (end == null) {
780
+ throw new Error("failed to parse line mapping");
781
+ }
782
+ }
783
+ tabsOpen.block = true;
784
+ tabsClose.block = true;
785
+ const activeTabsCount = tabs.filter(isTabSelected).length;
786
+ if (activeTabsCount > 1) {
787
+ throw new Error("Unable to render tabs with more than 1 active element");
788
+ }
789
+ tabsOpen.attrSet(
790
+ "class",
791
+ [TABS_CLASSNAME, containerClasses, TABS_RADIO_CLASSNAME].filter(Boolean).join(" ")
792
+ );
793
+ tabsOpen.attrSet(GROUP_DATA_KEY, tabsGroup);
794
+ tabsOpen.attrSet(TAB_DATA_VARIANT, "radio");
795
+ tabsTokens.push(tabsOpen);
796
+ for (let i = 0; i < tabs.length; i++) {
797
+ const tabOpen = new state.Token("tab_open", "div", 1);
798
+ const tabInline = new state.Token("inline", "", 0);
799
+ const tabText = new state.Token("text", "", 0);
800
+ const tabClose = new state.Token("tab_close", "div", -1);
801
+ const tabPanelOpen = new state.Token("tab-panel_open", "div", 1);
802
+ const tabPanelClose = new state.Token("tab-panel_close", "div", -1);
803
+ const verticalTabInput = new state.Token("tab-input", "input", 0);
804
+ const verticalTabLabelOpen = new state.Token("tab-label_open", "label", 1);
805
+ const verticalTabLabelClose = new state.Token("tab-label_close", "label", -1);
806
+ tabOpen.map = tabs[i].listItem.map;
807
+ tabOpen.markup = tabs[i].listItem.markup;
808
+ const tab = tabs[i];
809
+ const tabId = getTabId(tab, { runId });
810
+ const tabKey = getTabKey(tab);
811
+ const didTabHasActiveAttr = isTabSelected(tab);
812
+ tab.name = getName(tab);
813
+ const tabPanelId = generateID("radio");
814
+ verticalTabInput.block = true;
815
+ verticalTabInput.attrJoin("class", "radio");
816
+ verticalTabInput.attrSet("type", "radio");
817
+ tabOpen.map = tabs[i].listItem.map;
818
+ tabOpen.markup = tabs[i].listItem.markup;
819
+ tabPanelOpen.map = getContentMap(tabs[i].tokens);
820
+ tabText.content = tabs[i].name;
821
+ tabInline.children = [tabText];
822
+ tabOpen.block = true;
823
+ tabClose.block = true;
824
+ tabPanelOpen.block = true;
825
+ tabPanelClose.block = true;
826
+ tabOpen.attrSet(TAB_DATA_ID, tabId);
827
+ tabOpen.attrSet(TAB_DATA_KEY, tabKey);
828
+ tabOpen.attrSet(
829
+ "class",
830
+ [TAB_CLASSNAME, TAB_GROUP_CLASSNAME, VERTICAL_TAB_CLASSNAME].join(" ")
831
+ );
832
+ tabOpen.attrSet("role", "tab");
833
+ tabOpen.attrSet("aria-controls", tabPanelId);
834
+ tabOpen.attrSet("aria-selected", "false");
835
+ tabOpen.attrSet("tabindex", i === 0 ? "0" : "-1");
836
+ tabOpen.attrSet(TAB_ACTIVE_KEY, "false");
837
+ tabPanelOpen.attrSet("id", tabPanelId);
838
+ tabPanelOpen.attrSet("class", TAB_PANEL_CLASSNAME);
839
+ tabPanelOpen.attrSet("role", "tabpanel");
840
+ tabPanelOpen.attrSet("aria-labelledby", tabId);
841
+ tabPanelOpen.attrSet("data-title", tab.name);
842
+ tabOpen.attrSet(TAB_DATA_VERTICAL_TAB, "true");
843
+ if (didTabHasActiveAttr) {
844
+ tabOpen.attrSet(TAB_FORCED_OPEN, "true");
845
+ verticalTabInput.attrSet("checked", "true");
846
+ tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
847
+ }
848
+ tabsTokens.push(
849
+ tabOpen,
850
+ verticalTabInput,
851
+ verticalTabLabelOpen,
852
+ tabInline,
853
+ verticalTabLabelClose,
854
+ tabClose
855
+ );
856
+ tabsTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);
857
+ }
858
+ tabsTokens.push(tabsClose);
859
+ return tabsTokens;
860
+ };
861
+
862
+ // src/plugin/variants/dropdown.ts
863
+ var dropdown = (tabs, state, { containerClasses, tabsGroup, runId, generateID }) => {
864
+ var _a, _b;
865
+ const dropdownTokens = [];
866
+ const dropdownOpen = new state.Token("dropdown_open", "div", 1);
867
+ const dropdownClose = new state.Token("dropdown_close", "div", -1);
868
+ const dropdownSelectOpen = new state.Token("dropdown-select_open", "div", 1);
869
+ const dropdownSelectInline = new state.Token("inline", "", 0);
870
+ const dropdownSelectText = new state.Token("text", "", 0);
871
+ const dropdownSelectClose = new state.Token("dropdown-select_open", "div", -1);
872
+ if (tabs.length) {
873
+ const [start] = (_a = tabs[0].listItem.map) != null ? _a : [null];
874
+ if (start == null) {
875
+ throw new Error("failed to parse line mapping");
876
+ }
877
+ const [_, end] = (_b = tabs[tabs.length - 1].listItem.map) != null ? _b : [null, null];
878
+ if (end == null) {
879
+ throw new Error("failed to parse line mapping");
880
+ }
881
+ }
882
+ dropdownOpen.block = true;
883
+ dropdownClose.block = true;
884
+ dropdownSelectOpen.block = true;
885
+ dropdownSelectClose.block = true;
886
+ const [activeTab, ...restActiveTabs] = tabs.filter(isTabSelected);
887
+ if (restActiveTabs.length) {
888
+ throw new Error("Unable to dropdown tabs with more than 1 active element");
889
+ }
890
+ dropdownOpen.attrSet(
891
+ "class",
892
+ [TABS_CLASSNAME, containerClasses, TABS_DROPDOWN_CLASSNAME].filter(Boolean).join(" ")
893
+ );
894
+ dropdownOpen.attrSet(GROUP_DATA_KEY, tabsGroup);
895
+ dropdownOpen.attrSet(TAB_DATA_VARIANT, "dropdown");
896
+ dropdownSelectOpen.attrSet("role", "tablist");
897
+ dropdownSelectOpen.attrSet("class", TABS_DROPDOWN_SELECT);
898
+ if (activeTab) {
899
+ dropdownSelectOpen.attrJoin("class", "filled");
900
+ }
901
+ dropdownSelectText.content = activeTab ? activeTab.name : "-";
902
+ dropdownSelectInline.children = [dropdownSelectText];
903
+ dropdownTokens.push(
904
+ dropdownOpen,
905
+ dropdownSelectOpen,
906
+ dropdownSelectInline,
907
+ dropdownSelectClose
908
+ );
909
+ const dropdownMenuOpen = new state.Token("dropdown-menu_open", "ul", 1);
910
+ const dropdownMenuClose = new state.Token("dropdown-menu_close", "ul", -1);
911
+ dropdownMenuOpen.attrSet("class", TABS_DROPDOWN_MENU_CLASSNAME);
912
+ const tabIds = tabs.map((tab) => getTabId(tab, { runId }));
913
+ const menuTokens = tabs.flatMap((tab, i) => {
914
+ const menuListItemOpen = new state.Token("dropdown-menu-item_open", "li", 1);
915
+ const menuListItemClose = new state.Token("dropdown-menu-item_close", "li", -1);
916
+ const menuListItemText = new state.Token("text", "", 0);
917
+ const menuListItemInline = new state.Token("inline", "", 0);
918
+ const tabId = tabIds[i];
919
+ const tabKey = getTabKey(tab);
920
+ const isActive = tab === activeTab;
921
+ menuListItemOpen.attrSet(
922
+ "class",
923
+ [TAB_CLASSNAME, isActive && ACTIVE_CLASSNAME].filter(Boolean).join(" ")
924
+ );
925
+ menuListItemOpen.attrSet(TAB_DATA_ID, tabId);
926
+ menuListItemOpen.attrSet(TAB_DATA_KEY, tabKey);
927
+ menuListItemOpen.attrSet("aria-selected", String(isActive));
928
+ menuListItemText.content = tab.name;
929
+ menuListItemInline.children = [menuListItemText];
930
+ return [menuListItemOpen, menuListItemInline, menuListItemClose];
931
+ });
932
+ dropdownTokens.push(dropdownMenuOpen, ...menuTokens, dropdownMenuClose);
933
+ for (let i = 0; i < tabs.length; i++) {
934
+ const tabPanelOpen = new state.Token("tab-panel_open", "div", 1);
935
+ const tabPanelClose = new state.Token("tab-panel_close", "div", -1);
936
+ const tab = tabs[i];
937
+ const tabId = tabIds[i];
938
+ const didTabHasActiveAttr = isTabSelected(tab);
939
+ tab.name = getName(tab);
940
+ const tabPanelId = generateID("dropdown");
941
+ tabPanelOpen.map = getContentMap(tabs[i].tokens);
942
+ tabPanelOpen.block = true;
943
+ tabPanelClose.block = true;
944
+ tabPanelOpen.attrSet("id", tabPanelId);
945
+ tabPanelOpen.attrSet("class", TAB_PANEL_CLASSNAME);
946
+ tabPanelOpen.attrSet("role", "tabpanel");
947
+ tabPanelOpen.attrSet("aria-labelledby", tabId);
948
+ tabPanelOpen.attrSet("data-title", tab.name);
949
+ if (didTabHasActiveAttr) {
950
+ tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
951
+ }
952
+ dropdownTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);
953
+ }
954
+ dropdownTokens.push(dropdownClose);
955
+ return dropdownTokens;
956
+ };
957
+
958
+ // src/plugin/variants/accordion.ts
959
+ var accordion = (tabs, state, { containerClasses, tabsGroup, runId, generateID }) => {
960
+ var _a, _b;
961
+ const tabsTokens = [];
962
+ const tabsOpen = new state.Token("tabs_open", "div", 1);
963
+ const tabsClose = new state.Token("tabs_close", "div", -1);
964
+ if (tabs.length) {
965
+ const [start] = (_a = tabs[0].listItem.map) != null ? _a : [null];
966
+ if (start == null) {
967
+ throw new Error("failed to parse line mapping");
968
+ }
969
+ const [_, end] = (_b = tabs[tabs.length - 1].listItem.map) != null ? _b : [null, null];
970
+ if (end == null) {
971
+ throw new Error("failed to parse line mapping");
972
+ }
973
+ }
974
+ tabsOpen.block = true;
975
+ tabsClose.block = true;
976
+ const activeTabsCount = tabs.filter(isTabSelected).length;
977
+ if (activeTabsCount > 1) {
978
+ throw new Error("Unable to render tabs with more than 1 active element");
979
+ }
980
+ tabsOpen.attrSet(
981
+ "class",
982
+ [TABS_CLASSNAME, containerClasses, TABS_ACCORDION_CLASSNAME].filter(Boolean).join(" ")
983
+ );
984
+ tabsOpen.attrSet(GROUP_DATA_KEY, tabsGroup);
985
+ tabsOpen.attrSet(TAB_DATA_VARIANT, "accordion" /* Accordion */);
986
+ tabsTokens.push(tabsOpen);
987
+ for (let i = 0; i < tabs.length; i++) {
988
+ const tabOpen = new state.Token("tab_open", "div", 1);
989
+ const tabInline = new state.Token("inline", "", 0);
990
+ const tabText = new state.Token("text", "", 0);
991
+ const tabClose = new state.Token("tab_close", "div", -1);
992
+ const tabPanelOpen = new state.Token("tab-panel_open", "div", 1);
993
+ const tabPanelClose = new state.Token("tab-panel_close", "div", -1);
994
+ tabOpen.map = tabs[i].listItem.map;
995
+ tabOpen.markup = tabs[i].listItem.markup;
996
+ const tab = tabs[i];
997
+ const tabId = getTabId(tab, { runId });
998
+ const tabKey = getTabKey(tab);
999
+ const didTabHasActiveAttr = isTabSelected(tab);
1000
+ tab.name = getName(tab);
1001
+ const tabPanelId = generateID("accordion");
1002
+ tabOpen.map = tabs[i].listItem.map;
1003
+ tabOpen.markup = tabs[i].listItem.markup;
1004
+ tabPanelOpen.map = getContentMap(tabs[i].tokens);
1005
+ tabText.content = tabs[i].name;
1006
+ tabInline.children = [tabText];
1007
+ tabOpen.block = true;
1008
+ tabClose.block = true;
1009
+ tabPanelOpen.block = true;
1010
+ tabPanelClose.block = true;
1011
+ tabOpen.attrSet(TAB_DATA_ID, tabId);
1012
+ tabOpen.attrSet(TAB_DATA_KEY, tabKey);
1013
+ tabOpen.attrSet("class", [TAB_CLASSNAME, TAB_GROUP_CLASSNAME].join(" "));
1014
+ tabOpen.attrSet("role", "tab");
1015
+ tabOpen.attrSet("aria-controls", tabPanelId);
1016
+ tabOpen.attrSet("aria-selected", "false");
1017
+ tabOpen.attrSet("tabindex", i === 0 ? "0" : "-1");
1018
+ tabOpen.attrSet(TAB_ACTIVE_KEY, "false");
1019
+ tabPanelOpen.attrSet("id", tabPanelId);
1020
+ tabPanelOpen.attrSet("class", TAB_PANEL_CLASSNAME);
1021
+ tabPanelOpen.attrSet("role", "tabpanel");
1022
+ tabPanelOpen.attrSet("aria-labelledby", tabId);
1023
+ tabPanelOpen.attrSet("data-title", tab.name);
1024
+ if (didTabHasActiveAttr) {
1025
+ tabPanelOpen.attrSet(TAB_FORCED_OPEN, "true");
1026
+ tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
1027
+ tabOpen.attrJoin("class", ACTIVE_CLASSNAME);
1028
+ }
1029
+ tabsTokens.push(tabOpen, tabInline, tabClose);
1030
+ tabsTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);
1031
+ }
1032
+ tabsTokens.push(tabsClose);
1033
+ return tabsTokens;
1034
+ };
1035
+
1036
+ // src/plugin/variants/index.ts
1037
+ var generateByType = {
1038
+ regular,
1039
+ radio,
1040
+ dropdown,
1041
+ accordion
1042
+ };
1043
+ var generateTokensByType = (type) => {
1044
+ return generateByType[type];
1045
+ };
1046
+
1047
+ // src/plugin/generate.ts
1048
+ function generateTabsTokens(tabs, state, props2) {
1049
+ const tokens = generateTokensByType(props2.variant)(tabs, state, props2);
1050
+ return tokens;
1051
+ }
1052
+
1053
+ // src/plugin/find.ts
1054
+ var import_token = __toESM(require("markdown-it/lib/token"));
1055
+ function findCloseTokenIndex(tokens, idx) {
1056
+ let level = 0;
1057
+ let i = idx;
1058
+ while (i < tokens.length) {
1059
+ if (matchOpenToken(tokens, i)) {
1060
+ level++;
1061
+ } else if (matchCloseToken(tokens, i)) {
1062
+ if (level === 0) {
1063
+ return i;
1064
+ }
1065
+ level--;
1066
+ }
1067
+ i++;
1068
+ }
1069
+ return null;
1070
+ }
1071
+ function matchCloseToken(tokens, i) {
1072
+ return tokens[i].type === "paragraph_open" && tokens[i + 1].type === "inline" && tokens[i + 1].content.trim() === "{% endlist %}";
1073
+ }
1074
+ function matchOpenToken(tokens, i) {
1075
+ if (tokens[i].type !== "paragraph_open" || tokens[i + 1].type !== "inline") {
1076
+ return null;
1077
+ }
1078
+ return tokens[i + 1].content.match(TAB_RE);
1079
+ }
1080
+ function props(content, generateID) {
1081
+ const clean = trim(content.replace("list tabs", ""));
1082
+ const props2 = clean.split(" ");
1083
+ const result = {
1084
+ content: clean,
1085
+ variant: "regular" /* Regular */,
1086
+ // DEFAULT_TABS_GROUP_PREFIX ends with '-', so strip it before passing to generateID
1087
+ // which appends '-N' itself. Result: 'defaultTabsGroup-1', 'defaultTabsGroup-2', …
1088
+ // TabsController checks group.startsWith(DEFAULT_TABS_GROUP_PREFIX) which still matches.
1089
+ group: generateID(DEFAULT_TABS_GROUP_PREFIX.replace(/-$/, ""))
1090
+ };
1091
+ for (const prop of props2) {
1092
+ const [key, value] = prop.split("=").map(trim);
1093
+ switch (key) {
1094
+ case "horizontal":
1095
+ case "radio":
1096
+ case "dropdown":
1097
+ case "accordion":
1098
+ result.variant = key;
1099
+ break;
1100
+ case "group":
1101
+ result.group = unquote(value);
1102
+ break;
1103
+ default:
1104
+ }
1105
+ }
1106
+ return result;
1107
+ }
1108
+ function tryToFindTabs(tokens, index) {
1109
+ var _a;
1110
+ const match = matchOpenToken(tokens, index);
1111
+ const openTag = match && match[0];
1112
+ const isNotEscaped = openTag && !(openTag.startsWith("`") && openTag.endsWith("`"));
1113
+ if (!match || !isNotEscaped) {
1114
+ return {
1115
+ step: 1
1116
+ };
1117
+ }
1118
+ const closeTokenIndex = findCloseTokenIndex(tokens, index + 3);
1119
+ if (!closeTokenIndex) {
1120
+ tokens[index].attrSet("YFM005", "true");
1121
+ return {
1122
+ step: 3
1123
+ };
1124
+ }
1125
+ let extraTokensAfterClose = 0;
1126
+ const afterEndlistIdx = closeTokenIndex + 3;
1127
+ const openTokenLevel = tokens[index].level;
1128
+ const closeTokenLevel = tokens[closeTokenIndex].level;
1129
+ if (closeTokenLevel < openTokenLevel) {
1130
+ tokens[index].attrSet("YFM005", "true");
1131
+ return {
1132
+ step: 3
1133
+ };
1134
+ }
1135
+ if (closeTokenLevel > openTokenLevel) {
1136
+ const tokenAfter = tokens[afterEndlistIdx];
1137
+ if (tokenAfter && tokenAfter.nesting >= 0) {
1138
+ tokens[index].attrSet("YFM005", "true");
1139
+ return {
1140
+ step: 3
1141
+ };
1142
+ }
1143
+ if ((tokenAfter == null ? void 0 : tokenAfter.type) === "list_item_close" && ((_a = tokens[afterEndlistIdx + 1]) == null ? void 0 : _a.type) === "bullet_list_close") {
1144
+ extraTokensAfterClose = 2;
1145
+ }
1146
+ }
1147
+ return {
1148
+ content: openTag,
1149
+ closeTokenIndex,
1150
+ extraTokensAfterClose
1151
+ };
1152
+ }
1153
+ function findTabs(tokens, idx, closeTokenIdx) {
1154
+ const tabs = [];
1155
+ let i = idx;
1156
+ let nestedLevel = -1;
1157
+ let pending = {
1158
+ name: "",
1159
+ tokens: [],
1160
+ listItem: new import_token.default("list_item_open", "", 0)
1161
+ };
1162
+ while (i < tokens.length) {
1163
+ const token = tokens[i];
1164
+ switch (token.type) {
1165
+ case "ordered_list_open":
1166
+ case "bullet_list_open":
1167
+ if (nestedLevel > -1) {
1168
+ pending.tokens.push(token);
1169
+ }
1170
+ nestedLevel++;
1171
+ break;
1172
+ case "list_item_open":
1173
+ if (nestedLevel) {
1174
+ pending.tokens.push(token);
1175
+ } else {
1176
+ pending = { name: "", tokens: [], listItem: token };
1177
+ }
1178
+ break;
1179
+ case "list_item_close":
1180
+ if (nestedLevel) {
1181
+ pending.tokens.push(token);
1182
+ } else {
1183
+ tabs.push(pending);
1184
+ }
1185
+ break;
1186
+ case "ordered_list_close":
1187
+ case "bullet_list_close":
1188
+ if (!nestedLevel) {
1189
+ return tabs;
1190
+ }
1191
+ nestedLevel--;
1192
+ pending.tokens.push(token);
1193
+ break;
1194
+ case "paragraph_open":
1195
+ if (i === closeTokenIdx && tokens[i + 1].content && tokens[i + 1].content.trim() === "{% endlist %}") {
1196
+ if (pending && !nestedLevel) {
1197
+ tabs.push(pending);
1198
+ }
1199
+ return tabs;
1200
+ }
1201
+ if (!pending.name && tokens[i + 1].type === "inline") {
1202
+ pending.name = tokens[i + 1].content;
1203
+ i += 2;
1204
+ } else {
1205
+ pending.tokens.push(token);
1206
+ }
1207
+ break;
1208
+ default:
1209
+ pending.tokens.push(token);
1210
+ }
1211
+ i++;
1212
+ }
1213
+ return tabs;
1214
+ }
1215
+
1216
+ // src/plugin/transform.ts
1217
+ var defaultFeatures = {
1218
+ enabledVariants: {
1219
+ regular: true,
1220
+ radio: true
1221
+ }
1222
+ };
1223
+ var runsCounter = 0;
1224
+ function transform({
1225
+ runtimeJsPath = "_assets/tabs-extension.js",
1226
+ runtimeCssPath = "_assets/tabs-extension.css",
1227
+ containerClasses = "",
1228
+ bundle = true,
1229
+ features = defaultFeatures,
1230
+ onBundle: onBundle2
1231
+ } = {}) {
1232
+ return function tabs(md, options) {
1233
+ const { output = ".", generateID: externalGenerateID } = options || {};
1234
+ const generateID = externalGenerateID != null ? externalGenerateID : (0, import_utils6.createIDGeneratorByStrategy)("random");
1235
+ const plugin = (state) => {
1236
+ const { env, tokens } = state;
1237
+ const runId = String(++runsCounter);
1238
+ addHiddenProperty(env, "bundled", /* @__PURE__ */ new Set());
1239
+ let i = 0;
1240
+ let tabsAreInserted = false;
1241
+ while (i < tokens.length) {
1242
+ const result = tryToFindTabs(tokens, i);
1243
+ if ("step" in result) {
1244
+ i += result.step;
1245
+ continue;
1246
+ }
1247
+ const { content, closeTokenIndex, extraTokensAfterClose } = result;
1248
+ const parsedProps = props(content, generateID);
1249
+ if (!features.enabledVariants[parsedProps.variant]) {
1250
+ parsedProps.variant = "regular" /* Regular */;
1251
+ }
1252
+ const tabs2 = findTabs(state.tokens, i + 3, closeTokenIndex);
1253
+ if (tabs2.length > 0) {
1254
+ const tabsTokens = generateTabsTokens(tabs2, state, {
1255
+ containerClasses,
1256
+ tabsGroup: parsedProps.group,
1257
+ variant: parsedProps.variant,
1258
+ runId,
1259
+ generateID
1260
+ });
1261
+ state.tokens.splice(
1262
+ i,
1263
+ closeTokenIndex - i + 3 + extraTokensAfterClose,
1264
+ ...tabsTokens
1265
+ );
1266
+ i++;
1267
+ tabsAreInserted = true;
1268
+ } else {
1269
+ state.tokens.splice(i, closeTokenIndex - i + 3 + extraTokensAfterClose);
1270
+ }
1271
+ }
1272
+ if (tabsAreInserted) {
1273
+ env.meta = env.meta || {};
1274
+ env.meta.script = env.meta.script || [];
1275
+ env.meta.style = env.meta.style || [];
1276
+ env.meta.script.push(runtimeJsPath);
1277
+ env.meta.style.push(runtimeCssPath);
1278
+ if (bundle && onBundle2) {
1279
+ onBundle2({ runtimeJsPath, runtimeCssPath, output }, env.bundled);
1280
+ }
1281
+ }
1282
+ };
1283
+ try {
1284
+ md.core.ruler.before("curly_attributes", "tabs", plugin);
1285
+ } catch {
1286
+ md.core.ruler.push("tabs", plugin);
1287
+ }
1288
+ };
1289
+ }
1290
+
1291
+ // src/plugin/index-node.ts
1292
+ var onBundle = (args, cache) => {
1293
+ copyRuntimeFiles(args, cache);
1294
+ };
1295
+ function transform2(options = {}) {
1296
+ return transform({ onBundle, ...options });
1297
+ }
1298
+ var PATH_TO_RUNTIME = "../runtime";
1299
+ function copyRuntimeFiles({
1300
+ runtimeJsPath,
1301
+ runtimeCssPath,
1302
+ output
1303
+ }, cache) {
1304
+ const { join, resolve } = require("node:path");
1305
+ const runtimeFiles = {
1306
+ "index.js": runtimeJsPath,
1307
+ "index.css": runtimeCssPath
1308
+ };
1309
+ for (const [originFile, outputFile] of Object.entries(runtimeFiles)) {
1310
+ const file = join(PATH_TO_RUNTIME, originFile);
1311
+ if (!cache.has(file)) {
1312
+ cache.add(file);
1313
+ copyFile(resolve(__dirname, file), join(output, outputFile));
1314
+ }
1315
+ }
1316
+ }
1317
+ function copyFile(from, to) {
1318
+ const { mkdirSync, copyFileSync } = require("node:fs");
1319
+ const { dirname } = require("node:path");
1320
+ mkdirSync(dirname(to), { recursive: true });
1321
+ copyFileSync(from, to);
1322
+ }
1323
+ // Annotate the CommonJS export names for ESM import in node:
1324
+ 0 && (module.exports = {
1325
+ transform
1326
+ });
1327
+ //# sourceMappingURL=index-node.js.map