@diplodoc/tabs-extension 3.4.0 → 3.5.0-beta1
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/build/common.d.ts +23 -10
- package/build/plugin/find.d.ts +12 -0
- package/build/plugin/generate.d.ts +4 -0
- package/build/plugin/index.js +480 -197
- package/build/plugin/index.js.map +4 -4
- package/build/plugin/transform.d.ts +1 -8
- package/build/plugin/types.d.ts +12 -0
- package/build/plugin/{utils.d.ts → utils/index.d.ts} +3 -3
- package/build/plugin/utils/strings.d.ts +3 -0
- package/build/plugin/utils/tabs.d.ts +7 -0
- package/build/plugin/variants/accordion.d.ts +2 -0
- package/build/plugin/variants/dropdown.d.ts +2 -0
- package/build/plugin/variants/index.d.ts +3 -0
- package/build/plugin/variants/radio.d.ts +2 -0
- package/build/plugin/variants/regular.d.ts +2 -0
- package/build/plugin/variants/types.d.ts +15 -0
- package/build/react/index.js.map +2 -2
- package/build/runtime/TabsController.d.ts +8 -3
- package/build/runtime/index.css +1 -1
- package/build/runtime/index.css.map +2 -2
- package/build/runtime/index.js +1 -1
- package/build/runtime/index.js.map +3 -3
- package/package.json +1 -1
- package/build/plugin/getTabId.d.ts +0 -6
- /package/build/plugin/{copyRuntimeFiles.d.ts → utils/files.d.ts} +0 -0
package/build/plugin/index.js
CHANGED
|
@@ -30,17 +30,17 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
30
30
|
));
|
|
31
31
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
32
32
|
|
|
33
|
-
// node_modules/github-slugger/regex.js
|
|
33
|
+
// ../../node_modules/github-slugger/regex.js
|
|
34
34
|
var require_regex = __commonJS({
|
|
35
|
-
"node_modules/github-slugger/regex.js"(exports2, module2) {
|
|
35
|
+
"../../node_modules/github-slugger/regex.js"(exports2, module2) {
|
|
36
36
|
"use strict";
|
|
37
37
|
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;
|
|
38
38
|
}
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
// node_modules/github-slugger/index.js
|
|
41
|
+
// ../../node_modules/github-slugger/index.js
|
|
42
42
|
var require_github_slugger = __commonJS({
|
|
43
|
-
"node_modules/github-slugger/index.js"(exports2, module2) {
|
|
43
|
+
"../../node_modules/github-slugger/index.js"(exports2, module2) {
|
|
44
44
|
"use strict";
|
|
45
45
|
var regex = require_regex();
|
|
46
46
|
module2.exports = BananaSlug;
|
|
@@ -80,80 +80,47 @@ __export(plugin_exports, {
|
|
|
80
80
|
});
|
|
81
81
|
module.exports = __toCommonJS(plugin_exports);
|
|
82
82
|
|
|
83
|
-
// src/plugin/
|
|
84
|
-
|
|
83
|
+
// src/plugin/utils/strings.ts
|
|
84
|
+
function generateID() {
|
|
85
|
+
const id = Math.random().toString(36).substr(2, 8);
|
|
86
|
+
return id.substring(id.length - 8);
|
|
87
|
+
}
|
|
88
|
+
function trim(target) {
|
|
89
|
+
return target.trim();
|
|
90
|
+
}
|
|
91
|
+
function unquote(target) {
|
|
92
|
+
return target.match(/^(["']).*\1$/) ? target.slice(1, -1) : target;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// src/plugin/utils/tabs.ts
|
|
96
|
+
var import_github_slugger = __toESM(require_github_slugger());
|
|
85
97
|
|
|
86
98
|
// src/common.ts
|
|
99
|
+
var TAB_RE = /`?{% list tabs .*?%}`?/;
|
|
87
100
|
var TABS_CLASSNAME = "yfm-tabs";
|
|
88
|
-
var TABS_VERTICAL_CLASSNAME = "yfm-tabs-vertical";
|
|
89
|
-
var TABS_LIST_CLASSNAME = "yfm-tab-list";
|
|
90
101
|
var TAB_CLASSNAME = "yfm-tab";
|
|
91
102
|
var TAB_PANEL_CLASSNAME = "yfm-tab-panel";
|
|
103
|
+
var TABS_LIST_CLASSNAME = "yfm-tab-list";
|
|
92
104
|
var ACTIVE_CLASSNAME = "active";
|
|
93
|
-
var
|
|
94
|
-
var
|
|
105
|
+
var TAB_GROUP_CLASSNAME = "yfm-tab-group";
|
|
106
|
+
var TAB_ACTIVE_KEY = "data-diplodoc-is-active";
|
|
95
107
|
var GROUP_DATA_KEY = "data-diplodoc-group";
|
|
96
108
|
var TAB_DATA_KEY = "data-diplodoc-key";
|
|
109
|
+
var TAB_DATA_VARIANT = "data-diplodoc-variant";
|
|
97
110
|
var TAB_DATA_ID = "data-diplodoc-id";
|
|
98
|
-
var TAB_DATA_VERTICAL_TAB = "data-diplodoc-vertical-tab";
|
|
99
|
-
var TAB_ACTIVE_KEY = "data-diplodoc-is-active";
|
|
100
111
|
var DEFAULT_TABS_GROUP_PREFIX = "defaultTabsGroup-";
|
|
101
112
|
var ACTIVE_TAB_TEXT = "{selected}";
|
|
113
|
+
var TAB_FORCED_OPEN = "data-diplodoc-forced";
|
|
114
|
+
var TABS_DROPDOWN_CLASSNAME = "yfm-tabs-dropdown";
|
|
115
|
+
var TABS_DROPDOWN_MENU_CLASSNAME = "yfm-tabs-dropdown-menu";
|
|
116
|
+
var TABS_DROPDOWN_SELECT = "yfm-tabs-dropdown-select";
|
|
117
|
+
var TABS_ACCORDION_CLASSNAME = "yfm-tabs-accordion";
|
|
118
|
+
var TABS_RADIO_CLASSNAME = "yfm-tabs-vertical";
|
|
119
|
+
var VERTICAL_TAB_CLASSNAME = "yfm-vertical-tab";
|
|
120
|
+
var TAB_DATA_VERTICAL_TAB = "data-diplodoc-vertical-tab";
|
|
102
121
|
var GLOBAL_SYMBOL = Symbol.for("diplodocTabs");
|
|
103
122
|
|
|
104
|
-
// src/plugin/utils.ts
|
|
105
|
-
function generateID() {
|
|
106
|
-
const id = Math.random().toString(36).substr(2, 8);
|
|
107
|
-
return id.substring(id.length - 8);
|
|
108
|
-
}
|
|
109
|
-
function trim(target) {
|
|
110
|
-
return target.trim();
|
|
111
|
-
}
|
|
112
|
-
function unquote(target) {
|
|
113
|
-
return target.match(/^(["']).*\1$/) ? target.slice(1, -1) : target;
|
|
114
|
-
}
|
|
115
|
-
function addHiddenProperty(box, field, value) {
|
|
116
|
-
if (!(field in box)) {
|
|
117
|
-
Object.defineProperty(box, field, {
|
|
118
|
-
enumerable: false,
|
|
119
|
-
value
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
return box;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// src/plugin/copyRuntimeFiles.ts
|
|
126
|
-
var PATH_TO_RUNTIME = "../runtime";
|
|
127
|
-
function copyRuntimeFiles({
|
|
128
|
-
runtimeJsPath,
|
|
129
|
-
runtimeCssPath,
|
|
130
|
-
output
|
|
131
|
-
}, cache) {
|
|
132
|
-
const { join, resolve } = dynrequire("node:path");
|
|
133
|
-
const runtimeFiles = {
|
|
134
|
-
"index.js": runtimeJsPath,
|
|
135
|
-
"index.css": runtimeCssPath
|
|
136
|
-
};
|
|
137
|
-
for (const [originFile, outputFile] of Object.entries(runtimeFiles)) {
|
|
138
|
-
const file = join(PATH_TO_RUNTIME, originFile);
|
|
139
|
-
if (!cache.has(file)) {
|
|
140
|
-
cache.add(file);
|
|
141
|
-
copyFile(resolve(__dirname, file), join(output, outputFile));
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
function copyFile(from, to) {
|
|
146
|
-
const { mkdirSync, copyFileSync } = dynrequire("node:fs");
|
|
147
|
-
const { dirname } = dynrequire("node:path");
|
|
148
|
-
mkdirSync(dirname(to), { recursive: true });
|
|
149
|
-
copyFileSync(from, to);
|
|
150
|
-
}
|
|
151
|
-
function dynrequire(module) {
|
|
152
|
-
return eval(`require('${module}')`);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// src/plugin/getTabId.ts
|
|
156
|
-
var import_github_slugger = __toESM(require_github_slugger());
|
|
123
|
+
// src/plugin/utils/tabs.ts
|
|
157
124
|
var CUSTOM_ID_REGEXP = /\[?{ ?#(\S+) ?}]?/;
|
|
158
125
|
var sluggersStorage = /* @__PURE__ */ new Map();
|
|
159
126
|
function parseName(name) {
|
|
@@ -183,6 +150,10 @@ function getTabId(tab, { runId }) {
|
|
|
183
150
|
}
|
|
184
151
|
return slugger.slug(getRawId(tab));
|
|
185
152
|
}
|
|
153
|
+
function isTabSelected(tab) {
|
|
154
|
+
const { name } = tab;
|
|
155
|
+
return name.includes(ACTIVE_TAB_TEXT);
|
|
156
|
+
}
|
|
186
157
|
function getTabKey(tab) {
|
|
187
158
|
return encodeURIComponent(getRawId(tab)).toLocaleLowerCase();
|
|
188
159
|
}
|
|
@@ -194,79 +165,49 @@ function getRawId(tab) {
|
|
|
194
165
|
return customAnchor || name;
|
|
195
166
|
}
|
|
196
167
|
|
|
197
|
-
// src/plugin/
|
|
198
|
-
var
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
if (nestedLevel) {
|
|
215
|
-
pending.tokens.push(token);
|
|
216
|
-
} else {
|
|
217
|
-
pending = { name: "", tokens: [], listItem: token };
|
|
218
|
-
}
|
|
219
|
-
break;
|
|
220
|
-
case "list_item_close":
|
|
221
|
-
if (nestedLevel) {
|
|
222
|
-
pending.tokens.push(token);
|
|
223
|
-
} else {
|
|
224
|
-
tabs.push(pending);
|
|
225
|
-
}
|
|
226
|
-
break;
|
|
227
|
-
case "ordered_list_close":
|
|
228
|
-
case "bullet_list_close":
|
|
229
|
-
if (!nestedLevel) {
|
|
230
|
-
return {
|
|
231
|
-
tabs,
|
|
232
|
-
index: i
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
|
-
nestedLevel--;
|
|
236
|
-
pending.tokens.push(token);
|
|
237
|
-
break;
|
|
238
|
-
case "paragraph_open":
|
|
239
|
-
if (i === closeTokenIdx && tokens[i + 1].content && tokens[i + 1].content.trim() === "{% endlist %}") {
|
|
240
|
-
if (pending && !nestedLevel) {
|
|
241
|
-
tabs.push(pending);
|
|
242
|
-
}
|
|
243
|
-
return {
|
|
244
|
-
tabs,
|
|
245
|
-
index: i + 2
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
if (!pending.name && tokens[i + 1].type === "inline") {
|
|
249
|
-
pending.name = tokens[i + 1].content;
|
|
250
|
-
i += 2;
|
|
251
|
-
} else {
|
|
252
|
-
pending.tokens.push(token);
|
|
253
|
-
}
|
|
254
|
-
break;
|
|
255
|
-
default:
|
|
256
|
-
pending.tokens.push(token);
|
|
168
|
+
// src/plugin/utils/files.ts
|
|
169
|
+
var PATH_TO_RUNTIME = "../runtime";
|
|
170
|
+
function copyRuntimeFiles({
|
|
171
|
+
runtimeJsPath,
|
|
172
|
+
runtimeCssPath,
|
|
173
|
+
output
|
|
174
|
+
}, cache) {
|
|
175
|
+
const { join, resolve } = dynrequire("node:path");
|
|
176
|
+
const runtimeFiles = {
|
|
177
|
+
"index.js": runtimeJsPath,
|
|
178
|
+
"index.css": runtimeCssPath
|
|
179
|
+
};
|
|
180
|
+
for (const [originFile, outputFile] of Object.entries(runtimeFiles)) {
|
|
181
|
+
const file = join(PATH_TO_RUNTIME, originFile);
|
|
182
|
+
if (!cache.has(file)) {
|
|
183
|
+
cache.add(file);
|
|
184
|
+
copyFile(resolve(__dirname, file), join(output, outputFile));
|
|
257
185
|
}
|
|
258
|
-
i++;
|
|
259
186
|
}
|
|
260
|
-
return {
|
|
261
|
-
tabs,
|
|
262
|
-
index: i
|
|
263
|
-
};
|
|
264
187
|
}
|
|
265
|
-
function
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
188
|
+
function copyFile(from, to) {
|
|
189
|
+
const { mkdirSync, copyFileSync } = dynrequire("node:fs");
|
|
190
|
+
const { dirname } = dynrequire("node:path");
|
|
191
|
+
mkdirSync(dirname(to), { recursive: true });
|
|
192
|
+
copyFileSync(from, to);
|
|
193
|
+
}
|
|
194
|
+
function dynrequire(module) {
|
|
195
|
+
return eval(`require('${module}')`);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// src/plugin/utils/index.ts
|
|
199
|
+
function addHiddenProperty(box, field, value) {
|
|
200
|
+
if (!(field in box)) {
|
|
201
|
+
Object.defineProperty(box, field, {
|
|
202
|
+
enumerable: false,
|
|
203
|
+
value
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
return box;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// src/plugin/variants/regular.ts
|
|
210
|
+
var regular = (tabs, state, { containerClasses, tabsGroup, runId, orientation }) => {
|
|
270
211
|
var _a, _b;
|
|
271
212
|
const tabsTokens = [];
|
|
272
213
|
const tabListTokens = [];
|
|
@@ -276,34 +217,31 @@ function insertTabs(tabs, state, align, { start, end }, {
|
|
|
276
217
|
const tabListOpen = new state.Token("tab-list_open", "div", 1);
|
|
277
218
|
const tabListClose = new state.Token("tab-list_close", "div", -1);
|
|
278
219
|
if (tabs.length) {
|
|
279
|
-
const [
|
|
280
|
-
if (
|
|
220
|
+
const [start] = (_a = tabs[0].listItem.map) != null ? _a : [null];
|
|
221
|
+
if (start == null) {
|
|
281
222
|
throw new Error("failed to parse line mapping");
|
|
282
223
|
}
|
|
283
|
-
const [_,
|
|
284
|
-
if (
|
|
224
|
+
const [_, end] = (_b = tabs[tabs.length - 1].listItem.map) != null ? _b : [null, null];
|
|
225
|
+
if (end == null) {
|
|
285
226
|
throw new Error("failed to parse line mapping");
|
|
286
227
|
}
|
|
287
|
-
tabListOpen.map = [
|
|
228
|
+
tabListOpen.map = [start, end];
|
|
288
229
|
}
|
|
289
230
|
tabsOpen.block = true;
|
|
290
231
|
tabsClose.block = true;
|
|
291
232
|
tabListOpen.block = true;
|
|
292
233
|
tabListClose.block = true;
|
|
293
|
-
const areTabsVerticalClass = align === "radio" && TABS_VERTICAL_CLASSNAME;
|
|
294
234
|
const activeTabsCount = tabs.filter(isTabSelected).length;
|
|
295
235
|
if (activeTabsCount > 1) {
|
|
296
236
|
throw new Error("Unable to render tabs with more than 1 active element");
|
|
297
237
|
}
|
|
298
238
|
const hasDefaultOpenTab = activeTabsCount !== 0;
|
|
299
|
-
tabsOpen.attrSet(
|
|
300
|
-
"class",
|
|
301
|
-
[TABS_CLASSNAME, containerClasses, areTabsVerticalClass].filter(Boolean).join(" ")
|
|
302
|
-
);
|
|
239
|
+
tabsOpen.attrSet("class", [TABS_CLASSNAME, containerClasses].filter(Boolean).join(" "));
|
|
303
240
|
tabsOpen.attrSet(GROUP_DATA_KEY, tabsGroup);
|
|
241
|
+
tabsOpen.attrSet(TAB_DATA_VARIANT, "regular");
|
|
304
242
|
tabListOpen.attrSet("class", TABS_LIST_CLASSNAME);
|
|
305
243
|
tabListOpen.attrSet("role", "tablist");
|
|
306
|
-
if (
|
|
244
|
+
if (orientation === "radio") {
|
|
307
245
|
tabsTokens.push(tabsOpen);
|
|
308
246
|
}
|
|
309
247
|
for (let i = 0; i < tabs.length; i++) {
|
|
@@ -322,7 +260,7 @@ function insertTabs(tabs, state, align, { start, end }, {
|
|
|
322
260
|
const tabId = getTabId(tab, { runId });
|
|
323
261
|
const tabKey = getTabKey(tab);
|
|
324
262
|
const didTabHasActiveAttr = isTabSelected(tab);
|
|
325
|
-
const isTabActive = hasDefaultOpenTab ? didTabHasActiveAttr :
|
|
263
|
+
const isTabActive = hasDefaultOpenTab ? didTabHasActiveAttr : i === 0;
|
|
326
264
|
tab.name = getName(tab);
|
|
327
265
|
const tabPanelId = generateID();
|
|
328
266
|
verticalTabInput.block = true;
|
|
@@ -350,13 +288,13 @@ function insertTabs(tabs, state, align, { start, end }, {
|
|
|
350
288
|
tabPanelOpen.attrSet("role", "tabpanel");
|
|
351
289
|
tabPanelOpen.attrSet("aria-labelledby", tabId);
|
|
352
290
|
tabPanelOpen.attrSet("data-title", tab.name);
|
|
353
|
-
if (
|
|
291
|
+
if (orientation === "radio") {
|
|
354
292
|
tabOpen.attrSet(TAB_DATA_VERTICAL_TAB, "true");
|
|
355
293
|
tabOpen.attrJoin("class", VERTICAL_TAB_CLASSNAME);
|
|
356
294
|
}
|
|
357
295
|
if (isTabActive) {
|
|
358
|
-
if (
|
|
359
|
-
tabOpen.attrSet(
|
|
296
|
+
if (orientation === "radio") {
|
|
297
|
+
tabOpen.attrSet(TAB_FORCED_OPEN, "true");
|
|
360
298
|
verticalTabInput.attrSet("checked", "true");
|
|
361
299
|
tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
|
|
362
300
|
} else {
|
|
@@ -366,7 +304,7 @@ function insertTabs(tabs, state, align, { start, end }, {
|
|
|
366
304
|
tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
|
|
367
305
|
}
|
|
368
306
|
}
|
|
369
|
-
if (
|
|
307
|
+
if (orientation === "radio") {
|
|
370
308
|
tabsTokens.push(
|
|
371
309
|
tabOpen,
|
|
372
310
|
verticalTabInput,
|
|
@@ -381,22 +319,294 @@ function insertTabs(tabs, state, align, { start, end }, {
|
|
|
381
319
|
tabPanelsTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);
|
|
382
320
|
}
|
|
383
321
|
}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
322
|
+
tabsTokens.push(tabsOpen);
|
|
323
|
+
tabsTokens.push(tabListOpen);
|
|
324
|
+
tabsTokens.push(...tabListTokens);
|
|
325
|
+
tabsTokens.push(tabListClose);
|
|
326
|
+
tabsTokens.push(...tabPanelsTokens);
|
|
327
|
+
tabsTokens.push(tabsClose);
|
|
328
|
+
return tabsTokens;
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
// src/plugin/variants/radio.ts
|
|
332
|
+
var radio = (tabs, state, { containerClasses, tabsGroup, runId }) => {
|
|
333
|
+
var _a, _b;
|
|
334
|
+
const tabsTokens = [];
|
|
335
|
+
const tabsOpen = new state.Token("tabs_open", "div", 1);
|
|
336
|
+
const tabsClose = new state.Token("tabs_close", "div", -1);
|
|
337
|
+
if (tabs.length) {
|
|
338
|
+
const [start] = (_a = tabs[0].listItem.map) != null ? _a : [null];
|
|
339
|
+
if (start == null) {
|
|
340
|
+
throw new Error("failed to parse line mapping");
|
|
341
|
+
}
|
|
342
|
+
const [_, end] = (_b = tabs[tabs.length - 1].listItem.map) != null ? _b : [null, null];
|
|
343
|
+
if (end == null) {
|
|
344
|
+
throw new Error("failed to parse line mapping");
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
tabsOpen.block = true;
|
|
348
|
+
tabsClose.block = true;
|
|
349
|
+
const activeTabsCount = tabs.filter(isTabSelected).length;
|
|
350
|
+
if (activeTabsCount > 1) {
|
|
351
|
+
throw new Error("Unable to render tabs with more than 1 active element");
|
|
352
|
+
}
|
|
353
|
+
tabsOpen.attrSet(
|
|
354
|
+
"class",
|
|
355
|
+
[TABS_CLASSNAME, containerClasses, TABS_RADIO_CLASSNAME].filter(Boolean).join(" ")
|
|
356
|
+
);
|
|
357
|
+
tabsOpen.attrSet(GROUP_DATA_KEY, tabsGroup);
|
|
358
|
+
tabsOpen.attrSet(TAB_DATA_VARIANT, "radio");
|
|
359
|
+
tabsTokens.push(tabsOpen);
|
|
360
|
+
for (let i = 0; i < tabs.length; i++) {
|
|
361
|
+
const tabOpen = new state.Token("tab_open", "div", 1);
|
|
362
|
+
const tabInline = new state.Token("inline", "", 0);
|
|
363
|
+
const tabText = new state.Token("text", "", 0);
|
|
364
|
+
const tabClose = new state.Token("tab_close", "div", -1);
|
|
365
|
+
const tabPanelOpen = new state.Token("tab-panel_open", "div", 1);
|
|
366
|
+
const tabPanelClose = new state.Token("tab-panel_close", "div", -1);
|
|
367
|
+
const verticalTabInput = new state.Token("tab-input", "input", 0);
|
|
368
|
+
const verticalTabLabelOpen = new state.Token("tab-label_open", "label", 1);
|
|
369
|
+
const verticalTabLabelClose = new state.Token("tab-label_close", "label", -1);
|
|
370
|
+
tabOpen.map = tabs[i].listItem.map;
|
|
371
|
+
tabOpen.markup = tabs[i].listItem.markup;
|
|
372
|
+
const tab = tabs[i];
|
|
373
|
+
const tabId = getTabId(tab, { runId });
|
|
374
|
+
const tabKey = getTabKey(tab);
|
|
375
|
+
const didTabHasActiveAttr = isTabSelected(tab);
|
|
376
|
+
tab.name = getName(tab);
|
|
377
|
+
const tabPanelId = generateID();
|
|
378
|
+
verticalTabInput.block = true;
|
|
379
|
+
verticalTabInput.attrJoin("class", "radio");
|
|
380
|
+
verticalTabInput.attrSet("type", "radio");
|
|
381
|
+
tabOpen.map = tabs[i].listItem.map;
|
|
382
|
+
tabOpen.markup = tabs[i].listItem.markup;
|
|
383
|
+
tabText.content = tabs[i].name;
|
|
384
|
+
tabInline.children = [tabText];
|
|
385
|
+
tabOpen.block = true;
|
|
386
|
+
tabClose.block = true;
|
|
387
|
+
tabPanelOpen.block = true;
|
|
388
|
+
tabPanelClose.block = true;
|
|
389
|
+
tabOpen.attrSet(TAB_DATA_ID, tabId);
|
|
390
|
+
tabOpen.attrSet(TAB_DATA_KEY, tabKey);
|
|
391
|
+
tabOpen.attrSet(
|
|
392
|
+
"class",
|
|
393
|
+
[TAB_CLASSNAME, TAB_GROUP_CLASSNAME, VERTICAL_TAB_CLASSNAME].join(" ")
|
|
394
|
+
);
|
|
395
|
+
tabOpen.attrSet("role", "tab");
|
|
396
|
+
tabOpen.attrSet("aria-controls", tabPanelId);
|
|
397
|
+
tabOpen.attrSet("aria-selected", "false");
|
|
398
|
+
tabOpen.attrSet("tabindex", i === 0 ? "0" : "-1");
|
|
399
|
+
tabOpen.attrSet(TAB_ACTIVE_KEY, "false");
|
|
400
|
+
tabPanelOpen.attrSet("id", tabPanelId);
|
|
401
|
+
tabPanelOpen.attrSet("class", TAB_PANEL_CLASSNAME);
|
|
402
|
+
tabPanelOpen.attrSet("role", "tabpanel");
|
|
403
|
+
tabPanelOpen.attrSet("aria-labelledby", tabId);
|
|
404
|
+
tabPanelOpen.attrSet("data-title", tab.name);
|
|
405
|
+
tabOpen.attrSet(TAB_DATA_VERTICAL_TAB, "true");
|
|
406
|
+
if (didTabHasActiveAttr) {
|
|
407
|
+
tabOpen.attrSet(TAB_FORCED_OPEN, "true");
|
|
408
|
+
verticalTabInput.attrSet("checked", "true");
|
|
409
|
+
tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
|
|
410
|
+
}
|
|
411
|
+
tabsTokens.push(
|
|
412
|
+
tabOpen,
|
|
413
|
+
verticalTabInput,
|
|
414
|
+
verticalTabLabelOpen,
|
|
415
|
+
tabInline,
|
|
416
|
+
verticalTabLabelClose,
|
|
417
|
+
tabClose
|
|
418
|
+
);
|
|
419
|
+
tabsTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);
|
|
390
420
|
}
|
|
391
421
|
tabsTokens.push(tabsClose);
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
422
|
+
return tabsTokens;
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
// src/plugin/variants/dropdown.ts
|
|
426
|
+
var dropdown = (tabs, state, { containerClasses, tabsGroup, runId }) => {
|
|
427
|
+
var _a, _b;
|
|
428
|
+
const dropdownTokens = [];
|
|
429
|
+
const dropdownOpen = new state.Token("dropdown_open", "div", 1);
|
|
430
|
+
const dropdownClose = new state.Token("dropdown_close", "div", -1);
|
|
431
|
+
const dropdownSelectOpen = new state.Token("dropdown-select_open", "div", 1);
|
|
432
|
+
const dropdownSelectInline = new state.Token("inline", "", 0);
|
|
433
|
+
const dropdownSelectText = new state.Token("text", "", 0);
|
|
434
|
+
const dropdownSelectClose = new state.Token("dropdown-select_open", "div", -1);
|
|
435
|
+
if (tabs.length) {
|
|
436
|
+
const [start] = (_a = tabs[0].listItem.map) != null ? _a : [null];
|
|
437
|
+
if (start == null) {
|
|
438
|
+
throw new Error("failed to parse line mapping");
|
|
439
|
+
}
|
|
440
|
+
const [_, end] = (_b = tabs[tabs.length - 1].listItem.map) != null ? _b : [null, null];
|
|
441
|
+
if (end == null) {
|
|
442
|
+
throw new Error("failed to parse line mapping");
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
dropdownOpen.block = true;
|
|
446
|
+
dropdownClose.block = true;
|
|
447
|
+
dropdownSelectOpen.block = true;
|
|
448
|
+
dropdownSelectClose.block = true;
|
|
449
|
+
const [activeTab, ...restActiveTabs] = tabs.filter(isTabSelected);
|
|
450
|
+
if (restActiveTabs.length) {
|
|
451
|
+
throw new Error("Unable to dropdown tabs with more than 1 active element");
|
|
452
|
+
}
|
|
453
|
+
dropdownOpen.attrSet(
|
|
454
|
+
"class",
|
|
455
|
+
[TABS_CLASSNAME, containerClasses, TABS_DROPDOWN_CLASSNAME].filter(Boolean).join(" ")
|
|
456
|
+
);
|
|
457
|
+
dropdownOpen.attrSet(GROUP_DATA_KEY, tabsGroup);
|
|
458
|
+
dropdownOpen.attrSet(TAB_DATA_VARIANT, "dropdown");
|
|
459
|
+
dropdownSelectOpen.attrSet("role", "tablist");
|
|
460
|
+
dropdownSelectOpen.attrSet("class", TABS_DROPDOWN_SELECT);
|
|
461
|
+
dropdownSelectText.content = activeTab ? activeTab.name : "-";
|
|
462
|
+
dropdownSelectInline.children = [dropdownSelectText];
|
|
463
|
+
dropdownTokens.push(
|
|
464
|
+
dropdownOpen,
|
|
465
|
+
dropdownSelectOpen,
|
|
466
|
+
dropdownSelectInline,
|
|
467
|
+
dropdownSelectClose
|
|
468
|
+
);
|
|
469
|
+
const dropdownMenuOpen = new state.Token("dropdown-menu_open", "ul", 1);
|
|
470
|
+
const dropdownMenuClose = new state.Token("dropdown-menu_close", "ul", -1);
|
|
471
|
+
dropdownMenuOpen.attrSet("class", TABS_DROPDOWN_MENU_CLASSNAME);
|
|
472
|
+
const menuTokens = tabs.flatMap((tab) => {
|
|
473
|
+
const menuListItemOpen = new state.Token("dropdown-menu-item_open", "li", 1);
|
|
474
|
+
const menuListItemClose = new state.Token("dropdown-menu-item_close", "li", -1);
|
|
475
|
+
const menuListItemText = new state.Token("text", "", 0);
|
|
476
|
+
const menuListItemInline = new state.Token("inline", "", 0);
|
|
477
|
+
const tabId = getTabId(tab, { runId });
|
|
478
|
+
const tabKey = getTabKey(tab);
|
|
479
|
+
const isActive = String(tab === activeTab);
|
|
480
|
+
menuListItemOpen.attrSet("class", TAB_CLASSNAME);
|
|
481
|
+
menuListItemOpen.attrSet(TAB_DATA_ID, tabId);
|
|
482
|
+
menuListItemOpen.attrSet(TAB_DATA_KEY, tabKey);
|
|
483
|
+
menuListItemOpen.attrSet(TAB_ACTIVE_KEY, isActive);
|
|
484
|
+
menuListItemOpen.attrSet("aria-selected", isActive);
|
|
485
|
+
menuListItemText.content = tab.name;
|
|
486
|
+
menuListItemInline.children = [menuListItemText];
|
|
487
|
+
return [menuListItemOpen, menuListItemInline, menuListItemClose];
|
|
488
|
+
});
|
|
489
|
+
dropdownTokens.push(dropdownMenuOpen, ...menuTokens, dropdownMenuClose);
|
|
490
|
+
for (let i = 0; i < tabs.length; i++) {
|
|
491
|
+
const tabPanelOpen = new state.Token("tab-panel_open", "div", 1);
|
|
492
|
+
const tabPanelClose = new state.Token("tab-panel_close", "div", -1);
|
|
493
|
+
const tab = tabs[i];
|
|
494
|
+
const tabId = getTabId(tab, { runId });
|
|
495
|
+
const didTabHasActiveAttr = isTabSelected(tab);
|
|
496
|
+
tab.name = getName(tab);
|
|
497
|
+
const tabPanelId = generateID();
|
|
498
|
+
tabPanelOpen.block = true;
|
|
499
|
+
tabPanelClose.block = true;
|
|
500
|
+
tabPanelOpen.attrSet("id", tabPanelId);
|
|
501
|
+
tabPanelOpen.attrSet("class", TAB_PANEL_CLASSNAME);
|
|
502
|
+
tabPanelOpen.attrSet("role", "tabpanel");
|
|
503
|
+
tabPanelOpen.attrSet("aria-labelledby", tabId);
|
|
504
|
+
tabPanelOpen.attrSet("data-title", tab.name);
|
|
505
|
+
if (didTabHasActiveAttr) {
|
|
506
|
+
tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
|
|
507
|
+
}
|
|
508
|
+
dropdownTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);
|
|
509
|
+
}
|
|
510
|
+
dropdownTokens.push(dropdownClose);
|
|
511
|
+
return dropdownTokens;
|
|
512
|
+
};
|
|
513
|
+
|
|
514
|
+
// src/plugin/variants/accordion.ts
|
|
515
|
+
var accordion = (tabs, state, { containerClasses, tabsGroup, runId }) => {
|
|
516
|
+
var _a, _b;
|
|
517
|
+
const tabsTokens = [];
|
|
518
|
+
const tabsOpen = new state.Token("tabs_open", "div", 1);
|
|
519
|
+
const tabsClose = new state.Token("tabs_close", "div", -1);
|
|
520
|
+
if (tabs.length) {
|
|
521
|
+
const [start] = (_a = tabs[0].listItem.map) != null ? _a : [null];
|
|
522
|
+
if (start == null) {
|
|
523
|
+
throw new Error("failed to parse line mapping");
|
|
524
|
+
}
|
|
525
|
+
const [_, end] = (_b = tabs[tabs.length - 1].listItem.map) != null ? _b : [null, null];
|
|
526
|
+
if (end == null) {
|
|
527
|
+
throw new Error("failed to parse line mapping");
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
tabsOpen.block = true;
|
|
531
|
+
tabsClose.block = true;
|
|
532
|
+
const activeTabsCount = tabs.filter(isTabSelected).length;
|
|
533
|
+
if (activeTabsCount > 1) {
|
|
534
|
+
throw new Error("Unable to render tabs with more than 1 active element");
|
|
535
|
+
}
|
|
536
|
+
tabsOpen.attrSet(
|
|
537
|
+
"class",
|
|
538
|
+
[TABS_CLASSNAME, containerClasses, TABS_ACCORDION_CLASSNAME].filter(Boolean).join(" ")
|
|
539
|
+
);
|
|
540
|
+
tabsOpen.attrSet(GROUP_DATA_KEY, tabsGroup);
|
|
541
|
+
tabsOpen.attrSet(TAB_DATA_VARIANT, "accordion" /* Accordion */);
|
|
542
|
+
tabsTokens.push(tabsOpen);
|
|
543
|
+
for (let i = 0; i < tabs.length; i++) {
|
|
544
|
+
const tabOpen = new state.Token("tab_open", "div", 1);
|
|
545
|
+
const tabInline = new state.Token("inline", "", 0);
|
|
546
|
+
const tabText = new state.Token("text", "", 0);
|
|
547
|
+
const tabClose = new state.Token("tab_close", "div", -1);
|
|
548
|
+
const tabPanelOpen = new state.Token("tab-panel_open", "div", 1);
|
|
549
|
+
const tabPanelClose = new state.Token("tab-panel_close", "div", -1);
|
|
550
|
+
tabOpen.map = tabs[i].listItem.map;
|
|
551
|
+
tabOpen.markup = tabs[i].listItem.markup;
|
|
552
|
+
const tab = tabs[i];
|
|
553
|
+
const tabId = getTabId(tab, { runId });
|
|
554
|
+
const tabKey = getTabKey(tab);
|
|
555
|
+
const didTabHasActiveAttr = isTabSelected(tab);
|
|
556
|
+
tab.name = getName(tab);
|
|
557
|
+
const tabPanelId = generateID();
|
|
558
|
+
tabOpen.map = tabs[i].listItem.map;
|
|
559
|
+
tabOpen.markup = tabs[i].listItem.markup;
|
|
560
|
+
tabText.content = tabs[i].name;
|
|
561
|
+
tabInline.children = [tabText];
|
|
562
|
+
tabOpen.block = true;
|
|
563
|
+
tabClose.block = true;
|
|
564
|
+
tabPanelOpen.block = true;
|
|
565
|
+
tabPanelClose.block = true;
|
|
566
|
+
tabOpen.attrSet(TAB_DATA_ID, tabId);
|
|
567
|
+
tabOpen.attrSet(TAB_DATA_KEY, tabKey);
|
|
568
|
+
tabOpen.attrSet("class", [TAB_CLASSNAME, TAB_GROUP_CLASSNAME].join(" "));
|
|
569
|
+
tabOpen.attrSet("role", "tab");
|
|
570
|
+
tabOpen.attrSet("aria-controls", tabPanelId);
|
|
571
|
+
tabOpen.attrSet("aria-selected", "false");
|
|
572
|
+
tabOpen.attrSet("tabindex", i === 0 ? "0" : "-1");
|
|
573
|
+
tabOpen.attrSet(TAB_ACTIVE_KEY, "false");
|
|
574
|
+
tabPanelOpen.attrSet("id", tabPanelId);
|
|
575
|
+
tabPanelOpen.attrSet("class", TAB_PANEL_CLASSNAME);
|
|
576
|
+
tabPanelOpen.attrSet("role", "tabpanel");
|
|
577
|
+
tabPanelOpen.attrSet("aria-labelledby", tabId);
|
|
578
|
+
tabPanelOpen.attrSet("data-title", tab.name);
|
|
579
|
+
if (didTabHasActiveAttr) {
|
|
580
|
+
tabPanelOpen.attrSet(TAB_FORCED_OPEN, "true");
|
|
581
|
+
tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
|
|
582
|
+
}
|
|
583
|
+
tabsTokens.push(tabOpen, tabInline, tabClose);
|
|
584
|
+
tabsTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);
|
|
585
|
+
}
|
|
586
|
+
tabsTokens.push(tabsClose);
|
|
587
|
+
return tabsTokens;
|
|
588
|
+
};
|
|
589
|
+
|
|
590
|
+
// src/plugin/variants/index.ts
|
|
591
|
+
var generateByType = {
|
|
592
|
+
regular,
|
|
593
|
+
radio,
|
|
594
|
+
dropdown,
|
|
595
|
+
accordion
|
|
596
|
+
};
|
|
597
|
+
var generateTokensByType = (type) => {
|
|
598
|
+
return generateByType[type];
|
|
599
|
+
};
|
|
600
|
+
|
|
601
|
+
// src/plugin/generate.ts
|
|
602
|
+
function generateTabsTokens(tabs, state, props2) {
|
|
603
|
+
const tokens = generateTokensByType(props2.orientation)(tabs, state, props2);
|
|
604
|
+
return tokens;
|
|
398
605
|
}
|
|
399
|
-
|
|
606
|
+
|
|
607
|
+
// src/plugin/find.ts
|
|
608
|
+
var import_token = __toESM(require("markdown-it/lib/token"));
|
|
609
|
+
function findCloseTokenIndex(tokens, idx) {
|
|
400
610
|
let level = 0;
|
|
401
611
|
let i = idx;
|
|
402
612
|
while (i < tokens.length) {
|
|
@@ -416,18 +626,14 @@ function matchCloseToken(tokens, i) {
|
|
|
416
626
|
return tokens[i].type === "paragraph_open" && tokens[i + 1].type === "inline" && tokens[i + 1].content.trim() === "{% endlist %}";
|
|
417
627
|
}
|
|
418
628
|
function matchOpenToken(tokens, i) {
|
|
419
|
-
return tokens[i].type === "paragraph_open" && tokens[i + 1].type === "inline" &&
|
|
629
|
+
return tokens[i].type === "paragraph_open" && tokens[i + 1].type === "inline" && tokens[i + 1].content.match(TAB_RE);
|
|
420
630
|
}
|
|
421
|
-
function props(
|
|
422
|
-
const
|
|
423
|
-
if (!matched) {
|
|
424
|
-
return void 0;
|
|
425
|
-
}
|
|
426
|
-
const clean = trim(matched[0].replace("list tabs", ""));
|
|
631
|
+
function props(content) {
|
|
632
|
+
const clean = trim(content.replace("list tabs", ""));
|
|
427
633
|
const props2 = clean.split(" ");
|
|
428
634
|
const result = {
|
|
429
635
|
content: clean,
|
|
430
|
-
orientation: "
|
|
636
|
+
orientation: "regular" /* Regular */,
|
|
431
637
|
group: `${DEFAULT_TABS_GROUP_PREFIX}${generateID()}`
|
|
432
638
|
};
|
|
433
639
|
for (const prop of props2) {
|
|
@@ -435,6 +641,8 @@ function props(target) {
|
|
|
435
641
|
switch (key) {
|
|
436
642
|
case "horizontal":
|
|
437
643
|
case "radio":
|
|
644
|
+
case "dropdown":
|
|
645
|
+
case "accordion":
|
|
438
646
|
result.orientation = key;
|
|
439
647
|
break;
|
|
440
648
|
case "group":
|
|
@@ -445,6 +653,92 @@ function props(target) {
|
|
|
445
653
|
}
|
|
446
654
|
return result;
|
|
447
655
|
}
|
|
656
|
+
function tryToFindTabs(tokens, index) {
|
|
657
|
+
const match = matchOpenToken(tokens, index);
|
|
658
|
+
const openTag = match && match[0];
|
|
659
|
+
const isNotEscaped = openTag && !(openTag.startsWith("`") && openTag.endsWith("`"));
|
|
660
|
+
if (!match || !isNotEscaped) {
|
|
661
|
+
return {
|
|
662
|
+
step: 1
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
const closeTokenIndex = findCloseTokenIndex(tokens, index + 3);
|
|
666
|
+
if (!closeTokenIndex) {
|
|
667
|
+
tokens[index].attrSet("YFM005", "true");
|
|
668
|
+
return {
|
|
669
|
+
step: 3
|
|
670
|
+
};
|
|
671
|
+
}
|
|
672
|
+
return {
|
|
673
|
+
content: openTag,
|
|
674
|
+
closeTokenIndex
|
|
675
|
+
};
|
|
676
|
+
}
|
|
677
|
+
function findTabs(tokens, idx, closeTokenIdx) {
|
|
678
|
+
const tabs = [];
|
|
679
|
+
let i = idx;
|
|
680
|
+
let nestedLevel = -1;
|
|
681
|
+
let pending = {
|
|
682
|
+
name: "",
|
|
683
|
+
tokens: [],
|
|
684
|
+
listItem: new import_token.default("list_item_open", "", 0)
|
|
685
|
+
};
|
|
686
|
+
while (i < tokens.length) {
|
|
687
|
+
const token = tokens[i];
|
|
688
|
+
switch (token.type) {
|
|
689
|
+
case "ordered_list_open":
|
|
690
|
+
case "bullet_list_open":
|
|
691
|
+
if (nestedLevel > -1) {
|
|
692
|
+
pending.tokens.push(token);
|
|
693
|
+
}
|
|
694
|
+
nestedLevel++;
|
|
695
|
+
break;
|
|
696
|
+
case "list_item_open":
|
|
697
|
+
if (nestedLevel) {
|
|
698
|
+
pending.tokens.push(token);
|
|
699
|
+
} else {
|
|
700
|
+
pending = { name: "", tokens: [], listItem: token };
|
|
701
|
+
}
|
|
702
|
+
break;
|
|
703
|
+
case "list_item_close":
|
|
704
|
+
if (nestedLevel) {
|
|
705
|
+
pending.tokens.push(token);
|
|
706
|
+
} else {
|
|
707
|
+
tabs.push(pending);
|
|
708
|
+
}
|
|
709
|
+
break;
|
|
710
|
+
case "ordered_list_close":
|
|
711
|
+
case "bullet_list_close":
|
|
712
|
+
if (!nestedLevel) {
|
|
713
|
+
return tabs;
|
|
714
|
+
}
|
|
715
|
+
nestedLevel--;
|
|
716
|
+
pending.tokens.push(token);
|
|
717
|
+
break;
|
|
718
|
+
case "paragraph_open":
|
|
719
|
+
if (i === closeTokenIdx && tokens[i + 1].content && tokens[i + 1].content.trim() === "{% endlist %}") {
|
|
720
|
+
if (pending && !nestedLevel) {
|
|
721
|
+
tabs.push(pending);
|
|
722
|
+
}
|
|
723
|
+
return tabs;
|
|
724
|
+
}
|
|
725
|
+
if (!pending.name && tokens[i + 1].type === "inline") {
|
|
726
|
+
pending.name = tokens[i + 1].content;
|
|
727
|
+
i += 2;
|
|
728
|
+
} else {
|
|
729
|
+
pending.tokens.push(token);
|
|
730
|
+
}
|
|
731
|
+
break;
|
|
732
|
+
default:
|
|
733
|
+
pending.tokens.push(token);
|
|
734
|
+
}
|
|
735
|
+
i++;
|
|
736
|
+
}
|
|
737
|
+
return tabs;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
// src/plugin/transform.ts
|
|
741
|
+
var runsCounter = 0;
|
|
448
742
|
function transform({
|
|
449
743
|
runtimeJsPath = "_assets/tabs-extension.js",
|
|
450
744
|
runtimeCssPath = "_assets/tabs-extension.css",
|
|
@@ -460,37 +754,26 @@ function transform({
|
|
|
460
754
|
let i = 0;
|
|
461
755
|
let tabsAreInserted = false;
|
|
462
756
|
while (i < tokens.length) {
|
|
463
|
-
const
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
if (!match || !isNotEscaped) {
|
|
467
|
-
i++;
|
|
468
|
-
continue;
|
|
469
|
-
}
|
|
470
|
-
const closeTokenIdx = findCloseTokenIdx(tokens, i + 3);
|
|
471
|
-
if (!closeTokenIdx) {
|
|
472
|
-
tokens[i].attrSet("YFM005", "true");
|
|
473
|
-
i += 3;
|
|
757
|
+
const result = tryToFindTabs(tokens, i);
|
|
758
|
+
if ("step" in result) {
|
|
759
|
+
i += result.step;
|
|
474
760
|
continue;
|
|
475
761
|
}
|
|
476
|
-
const
|
|
477
|
-
const {
|
|
762
|
+
const { content, closeTokenIndex } = result;
|
|
763
|
+
const { group, orientation } = props(content);
|
|
764
|
+
const tabs2 = findTabs(state.tokens, i + 3, closeTokenIndex);
|
|
478
765
|
if (tabs2.length > 0) {
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
tabsGroup,
|
|
487
|
-
runId
|
|
488
|
-
}
|
|
489
|
-
);
|
|
766
|
+
const tabsTokens = generateTabsTokens(tabs2, state, {
|
|
767
|
+
containerClasses,
|
|
768
|
+
tabsGroup: group,
|
|
769
|
+
orientation,
|
|
770
|
+
runId
|
|
771
|
+
});
|
|
772
|
+
state.tokens.splice(i, closeTokenIndex - i + 3, ...tabsTokens);
|
|
490
773
|
i++;
|
|
491
774
|
tabsAreInserted = true;
|
|
492
775
|
} else {
|
|
493
|
-
state.tokens.splice(i,
|
|
776
|
+
state.tokens.splice(i, closeTokenIndex - i + 3);
|
|
494
777
|
}
|
|
495
778
|
}
|
|
496
779
|
if (tabsAreInserted) {
|