@diplodoc/tabs-extension 3.3.2 → 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 +498 -210
- 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 +5 -8
- 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,25 +30,24 @@ 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;
|
|
47
47
|
var own = Object.hasOwnProperty;
|
|
48
48
|
function BananaSlug() {
|
|
49
49
|
const self = this;
|
|
50
|
-
if (!(self instanceof BananaSlug))
|
|
51
|
-
return new BananaSlug();
|
|
50
|
+
if (!(self instanceof BananaSlug)) return new BananaSlug();
|
|
52
51
|
self.reset();
|
|
53
52
|
}
|
|
54
53
|
BananaSlug.prototype.slug = function(value, maintainCase) {
|
|
@@ -66,10 +65,8 @@ var require_github_slugger = __commonJS({
|
|
|
66
65
|
this.occurrences = /* @__PURE__ */ Object.create(null);
|
|
67
66
|
};
|
|
68
67
|
function slugger(string, maintainCase) {
|
|
69
|
-
if (typeof string !== "string")
|
|
70
|
-
|
|
71
|
-
if (!maintainCase)
|
|
72
|
-
string = string.toLowerCase();
|
|
68
|
+
if (typeof string !== "string") return "";
|
|
69
|
+
if (!maintainCase) string = string.toLowerCase();
|
|
73
70
|
return string.replace(regex, "").replace(/ /g, "-");
|
|
74
71
|
}
|
|
75
72
|
BananaSlug.slug = slugger;
|
|
@@ -83,80 +80,47 @@ __export(plugin_exports, {
|
|
|
83
80
|
});
|
|
84
81
|
module.exports = __toCommonJS(plugin_exports);
|
|
85
82
|
|
|
86
|
-
// src/plugin/
|
|
87
|
-
|
|
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());
|
|
88
97
|
|
|
89
98
|
// src/common.ts
|
|
99
|
+
var TAB_RE = /`?{% list tabs .*?%}`?/;
|
|
90
100
|
var TABS_CLASSNAME = "yfm-tabs";
|
|
91
|
-
var TABS_VERTICAL_CLASSNAME = "yfm-tabs-vertical";
|
|
92
|
-
var TABS_LIST_CLASSNAME = "yfm-tab-list";
|
|
93
101
|
var TAB_CLASSNAME = "yfm-tab";
|
|
94
102
|
var TAB_PANEL_CLASSNAME = "yfm-tab-panel";
|
|
103
|
+
var TABS_LIST_CLASSNAME = "yfm-tab-list";
|
|
95
104
|
var ACTIVE_CLASSNAME = "active";
|
|
96
|
-
var
|
|
97
|
-
var
|
|
105
|
+
var TAB_GROUP_CLASSNAME = "yfm-tab-group";
|
|
106
|
+
var TAB_ACTIVE_KEY = "data-diplodoc-is-active";
|
|
98
107
|
var GROUP_DATA_KEY = "data-diplodoc-group";
|
|
99
108
|
var TAB_DATA_KEY = "data-diplodoc-key";
|
|
109
|
+
var TAB_DATA_VARIANT = "data-diplodoc-variant";
|
|
100
110
|
var TAB_DATA_ID = "data-diplodoc-id";
|
|
101
|
-
var TAB_DATA_VERTICAL_TAB = "data-diplodoc-vertical-tab";
|
|
102
|
-
var TAB_ACTIVE_KEY = "data-diplodoc-is-active";
|
|
103
111
|
var DEFAULT_TABS_GROUP_PREFIX = "defaultTabsGroup-";
|
|
104
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";
|
|
105
121
|
var GLOBAL_SYMBOL = Symbol.for("diplodocTabs");
|
|
106
122
|
|
|
107
|
-
// src/plugin/utils.ts
|
|
108
|
-
function generateID() {
|
|
109
|
-
const id = Math.random().toString(36).substr(2, 8);
|
|
110
|
-
return id.substring(id.length - 8);
|
|
111
|
-
}
|
|
112
|
-
function trim(target) {
|
|
113
|
-
return target.trim();
|
|
114
|
-
}
|
|
115
|
-
function unquote(target) {
|
|
116
|
-
return target.match(/^(["']).*\1$/) ? target.slice(1, -1) : target;
|
|
117
|
-
}
|
|
118
|
-
function addHiddenProperty(box, field, value) {
|
|
119
|
-
if (!(field in box)) {
|
|
120
|
-
Object.defineProperty(box, field, {
|
|
121
|
-
enumerable: false,
|
|
122
|
-
value
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
return box;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// src/plugin/copyRuntimeFiles.ts
|
|
129
|
-
var PATH_TO_RUNTIME = "../runtime";
|
|
130
|
-
function copyRuntimeFiles({
|
|
131
|
-
runtimeJsPath,
|
|
132
|
-
runtimeCssPath,
|
|
133
|
-
output
|
|
134
|
-
}, cache) {
|
|
135
|
-
const { join, resolve } = dynrequire("node:path");
|
|
136
|
-
const runtimeFiles = {
|
|
137
|
-
"index.js": runtimeJsPath,
|
|
138
|
-
"index.css": runtimeCssPath
|
|
139
|
-
};
|
|
140
|
-
for (const [originFile, outputFile] of Object.entries(runtimeFiles)) {
|
|
141
|
-
const file = join(PATH_TO_RUNTIME, originFile);
|
|
142
|
-
if (!cache.has(file)) {
|
|
143
|
-
cache.add(file);
|
|
144
|
-
copyFile(resolve(__dirname, file), join(output, outputFile));
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
function copyFile(from, to) {
|
|
149
|
-
const { mkdirSync, copyFileSync } = dynrequire("node:fs");
|
|
150
|
-
const { dirname } = dynrequire("node:path");
|
|
151
|
-
mkdirSync(dirname(to), { recursive: true });
|
|
152
|
-
copyFileSync(from, to);
|
|
153
|
-
}
|
|
154
|
-
function dynrequire(module) {
|
|
155
|
-
return eval(`require('${module}')`);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// src/plugin/getTabId.ts
|
|
159
|
-
var import_github_slugger = __toESM(require_github_slugger());
|
|
123
|
+
// src/plugin/utils/tabs.ts
|
|
160
124
|
var CUSTOM_ID_REGEXP = /\[?{ ?#(\S+) ?}]?/;
|
|
161
125
|
var sluggersStorage = /* @__PURE__ */ new Map();
|
|
162
126
|
function parseName(name) {
|
|
@@ -186,6 +150,10 @@ function getTabId(tab, { runId }) {
|
|
|
186
150
|
}
|
|
187
151
|
return slugger.slug(getRawId(tab));
|
|
188
152
|
}
|
|
153
|
+
function isTabSelected(tab) {
|
|
154
|
+
const { name } = tab;
|
|
155
|
+
return name.includes(ACTIVE_TAB_TEXT);
|
|
156
|
+
}
|
|
189
157
|
function getTabKey(tab) {
|
|
190
158
|
return encodeURIComponent(getRawId(tab)).toLocaleLowerCase();
|
|
191
159
|
}
|
|
@@ -197,79 +165,49 @@ function getRawId(tab) {
|
|
|
197
165
|
return customAnchor || name;
|
|
198
166
|
}
|
|
199
167
|
|
|
200
|
-
// src/plugin/
|
|
201
|
-
var
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
if (nestedLevel) {
|
|
218
|
-
pending.tokens.push(token);
|
|
219
|
-
} else {
|
|
220
|
-
pending = { name: "", tokens: [], listItem: token };
|
|
221
|
-
}
|
|
222
|
-
break;
|
|
223
|
-
case "list_item_close":
|
|
224
|
-
if (nestedLevel) {
|
|
225
|
-
pending.tokens.push(token);
|
|
226
|
-
} else {
|
|
227
|
-
tabs.push(pending);
|
|
228
|
-
}
|
|
229
|
-
break;
|
|
230
|
-
case "ordered_list_close":
|
|
231
|
-
case "bullet_list_close":
|
|
232
|
-
if (!nestedLevel) {
|
|
233
|
-
return {
|
|
234
|
-
tabs,
|
|
235
|
-
index: i
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
nestedLevel--;
|
|
239
|
-
pending.tokens.push(token);
|
|
240
|
-
break;
|
|
241
|
-
case "paragraph_open":
|
|
242
|
-
if (i === closeTokenIdx && tokens[i + 1].content && tokens[i + 1].content.trim() === "{% endlist %}") {
|
|
243
|
-
if (pending && !nestedLevel) {
|
|
244
|
-
tabs.push(pending);
|
|
245
|
-
}
|
|
246
|
-
return {
|
|
247
|
-
tabs,
|
|
248
|
-
index: i + 2
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
if (!pending.name && tokens[i + 1].type === "inline") {
|
|
252
|
-
pending.name = tokens[i + 1].content;
|
|
253
|
-
i += 2;
|
|
254
|
-
} else {
|
|
255
|
-
pending.tokens.push(token);
|
|
256
|
-
}
|
|
257
|
-
break;
|
|
258
|
-
default:
|
|
259
|
-
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));
|
|
260
185
|
}
|
|
261
|
-
i++;
|
|
262
186
|
}
|
|
263
|
-
return {
|
|
264
|
-
tabs,
|
|
265
|
-
index: i
|
|
266
|
-
};
|
|
267
187
|
}
|
|
268
|
-
function
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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 }) => {
|
|
273
211
|
var _a, _b;
|
|
274
212
|
const tabsTokens = [];
|
|
275
213
|
const tabListTokens = [];
|
|
@@ -279,34 +217,31 @@ function insertTabs(tabs, state, align, { start, end }, {
|
|
|
279
217
|
const tabListOpen = new state.Token("tab-list_open", "div", 1);
|
|
280
218
|
const tabListClose = new state.Token("tab-list_close", "div", -1);
|
|
281
219
|
if (tabs.length) {
|
|
282
|
-
const [
|
|
283
|
-
if (
|
|
220
|
+
const [start] = (_a = tabs[0].listItem.map) != null ? _a : [null];
|
|
221
|
+
if (start == null) {
|
|
284
222
|
throw new Error("failed to parse line mapping");
|
|
285
223
|
}
|
|
286
|
-
const [_,
|
|
287
|
-
if (
|
|
224
|
+
const [_, end] = (_b = tabs[tabs.length - 1].listItem.map) != null ? _b : [null, null];
|
|
225
|
+
if (end == null) {
|
|
288
226
|
throw new Error("failed to parse line mapping");
|
|
289
227
|
}
|
|
290
|
-
tabListOpen.map = [
|
|
228
|
+
tabListOpen.map = [start, end];
|
|
291
229
|
}
|
|
292
230
|
tabsOpen.block = true;
|
|
293
231
|
tabsClose.block = true;
|
|
294
232
|
tabListOpen.block = true;
|
|
295
233
|
tabListClose.block = true;
|
|
296
|
-
const areTabsVerticalClass = align === "radio" && TABS_VERTICAL_CLASSNAME;
|
|
297
234
|
const activeTabsCount = tabs.filter(isTabSelected).length;
|
|
298
235
|
if (activeTabsCount > 1) {
|
|
299
236
|
throw new Error("Unable to render tabs with more than 1 active element");
|
|
300
237
|
}
|
|
301
238
|
const hasDefaultOpenTab = activeTabsCount !== 0;
|
|
302
|
-
tabsOpen.attrSet(
|
|
303
|
-
"class",
|
|
304
|
-
[TABS_CLASSNAME, containerClasses, areTabsVerticalClass].filter(Boolean).join(" ")
|
|
305
|
-
);
|
|
239
|
+
tabsOpen.attrSet("class", [TABS_CLASSNAME, containerClasses].filter(Boolean).join(" "));
|
|
306
240
|
tabsOpen.attrSet(GROUP_DATA_KEY, tabsGroup);
|
|
241
|
+
tabsOpen.attrSet(TAB_DATA_VARIANT, "regular");
|
|
307
242
|
tabListOpen.attrSet("class", TABS_LIST_CLASSNAME);
|
|
308
243
|
tabListOpen.attrSet("role", "tablist");
|
|
309
|
-
if (
|
|
244
|
+
if (orientation === "radio") {
|
|
310
245
|
tabsTokens.push(tabsOpen);
|
|
311
246
|
}
|
|
312
247
|
for (let i = 0; i < tabs.length; i++) {
|
|
@@ -316,20 +251,21 @@ function insertTabs(tabs, state, align, { start, end }, {
|
|
|
316
251
|
const tabClose = new state.Token("tab_close", "div", -1);
|
|
317
252
|
const tabPanelOpen = new state.Token("tab-panel_open", "div", 1);
|
|
318
253
|
const tabPanelClose = new state.Token("tab-panel_close", "div", -1);
|
|
319
|
-
const
|
|
320
|
-
const verticalTabLabelOpen = new state.Token("label_open", "label", 1);
|
|
254
|
+
const verticalTabInput = new state.Token("tab-input", "input", 0);
|
|
255
|
+
const verticalTabLabelOpen = new state.Token("tab-label_open", "label", 1);
|
|
256
|
+
const verticalTabLabelClose = new state.Token("tab-label_close", "label", -1);
|
|
321
257
|
tabOpen.map = tabs[i].listItem.map;
|
|
322
258
|
tabOpen.markup = tabs[i].listItem.markup;
|
|
323
259
|
const tab = tabs[i];
|
|
324
260
|
const tabId = getTabId(tab, { runId });
|
|
325
261
|
const tabKey = getTabKey(tab);
|
|
326
262
|
const didTabHasActiveAttr = isTabSelected(tab);
|
|
327
|
-
const isTabActive = hasDefaultOpenTab ? didTabHasActiveAttr :
|
|
263
|
+
const isTabActive = hasDefaultOpenTab ? didTabHasActiveAttr : i === 0;
|
|
328
264
|
tab.name = getName(tab);
|
|
329
265
|
const tabPanelId = generateID();
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
266
|
+
verticalTabInput.block = true;
|
|
267
|
+
verticalTabInput.attrJoin("class", "radio");
|
|
268
|
+
verticalTabInput.attrSet("type", "radio");
|
|
333
269
|
tabOpen.map = tabs[i].listItem.map;
|
|
334
270
|
tabOpen.markup = tabs[i].listItem.markup;
|
|
335
271
|
tabText.content = tabs[i].name;
|
|
@@ -352,14 +288,14 @@ function insertTabs(tabs, state, align, { start, end }, {
|
|
|
352
288
|
tabPanelOpen.attrSet("role", "tabpanel");
|
|
353
289
|
tabPanelOpen.attrSet("aria-labelledby", tabId);
|
|
354
290
|
tabPanelOpen.attrSet("data-title", tab.name);
|
|
355
|
-
if (
|
|
291
|
+
if (orientation === "radio") {
|
|
356
292
|
tabOpen.attrSet(TAB_DATA_VERTICAL_TAB, "true");
|
|
357
293
|
tabOpen.attrJoin("class", VERTICAL_TAB_CLASSNAME);
|
|
358
294
|
}
|
|
359
295
|
if (isTabActive) {
|
|
360
|
-
if (
|
|
361
|
-
tabOpen.attrSet(
|
|
362
|
-
|
|
296
|
+
if (orientation === "radio") {
|
|
297
|
+
tabOpen.attrSet(TAB_FORCED_OPEN, "true");
|
|
298
|
+
verticalTabInput.attrSet("checked", "true");
|
|
363
299
|
tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
|
|
364
300
|
} else {
|
|
365
301
|
tabOpen.attrSet(TAB_ACTIVE_KEY, i === 0 ? "true" : "false");
|
|
@@ -368,30 +304,309 @@ function insertTabs(tabs, state, align, { start, end }, {
|
|
|
368
304
|
tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
|
|
369
305
|
}
|
|
370
306
|
}
|
|
371
|
-
if (
|
|
372
|
-
tabsTokens.push(
|
|
307
|
+
if (orientation === "radio") {
|
|
308
|
+
tabsTokens.push(
|
|
309
|
+
tabOpen,
|
|
310
|
+
verticalTabInput,
|
|
311
|
+
verticalTabLabelOpen,
|
|
312
|
+
tabInline,
|
|
313
|
+
verticalTabLabelClose,
|
|
314
|
+
tabClose
|
|
315
|
+
);
|
|
373
316
|
tabsTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);
|
|
374
317
|
} else {
|
|
375
318
|
tabListTokens.push(tabOpen, tabInline, tabClose);
|
|
376
319
|
tabPanelsTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);
|
|
377
320
|
}
|
|
378
321
|
}
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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);
|
|
385
420
|
}
|
|
386
421
|
tabsTokens.push(tabsClose);
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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;
|
|
393
605
|
}
|
|
394
|
-
|
|
606
|
+
|
|
607
|
+
// src/plugin/find.ts
|
|
608
|
+
var import_token = __toESM(require("markdown-it/lib/token"));
|
|
609
|
+
function findCloseTokenIndex(tokens, idx) {
|
|
395
610
|
let level = 0;
|
|
396
611
|
let i = idx;
|
|
397
612
|
while (i < tokens.length) {
|
|
@@ -411,18 +626,14 @@ function matchCloseToken(tokens, i) {
|
|
|
411
626
|
return tokens[i].type === "paragraph_open" && tokens[i + 1].type === "inline" && tokens[i + 1].content.trim() === "{% endlist %}";
|
|
412
627
|
}
|
|
413
628
|
function matchOpenToken(tokens, i) {
|
|
414
|
-
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);
|
|
415
630
|
}
|
|
416
|
-
function props(
|
|
417
|
-
const
|
|
418
|
-
if (!matched) {
|
|
419
|
-
return void 0;
|
|
420
|
-
}
|
|
421
|
-
const clean = trim(matched[0].replace("list tabs", ""));
|
|
631
|
+
function props(content) {
|
|
632
|
+
const clean = trim(content.replace("list tabs", ""));
|
|
422
633
|
const props2 = clean.split(" ");
|
|
423
634
|
const result = {
|
|
424
635
|
content: clean,
|
|
425
|
-
orientation: "
|
|
636
|
+
orientation: "regular" /* Regular */,
|
|
426
637
|
group: `${DEFAULT_TABS_GROUP_PREFIX}${generateID()}`
|
|
427
638
|
};
|
|
428
639
|
for (const prop of props2) {
|
|
@@ -430,6 +641,8 @@ function props(target) {
|
|
|
430
641
|
switch (key) {
|
|
431
642
|
case "horizontal":
|
|
432
643
|
case "radio":
|
|
644
|
+
case "dropdown":
|
|
645
|
+
case "accordion":
|
|
433
646
|
result.orientation = key;
|
|
434
647
|
break;
|
|
435
648
|
case "group":
|
|
@@ -440,6 +653,92 @@ function props(target) {
|
|
|
440
653
|
}
|
|
441
654
|
return result;
|
|
442
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;
|
|
443
742
|
function transform({
|
|
444
743
|
runtimeJsPath = "_assets/tabs-extension.js",
|
|
445
744
|
runtimeCssPath = "_assets/tabs-extension.css",
|
|
@@ -455,37 +754,26 @@ function transform({
|
|
|
455
754
|
let i = 0;
|
|
456
755
|
let tabsAreInserted = false;
|
|
457
756
|
while (i < tokens.length) {
|
|
458
|
-
const
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
if (!match || !isNotEscaped) {
|
|
462
|
-
i++;
|
|
463
|
-
continue;
|
|
464
|
-
}
|
|
465
|
-
const closeTokenIdx = findCloseTokenIdx(tokens, i + 3);
|
|
466
|
-
if (!closeTokenIdx) {
|
|
467
|
-
tokens[i].attrSet("YFM005", "true");
|
|
468
|
-
i += 3;
|
|
757
|
+
const result = tryToFindTabs(tokens, i);
|
|
758
|
+
if ("step" in result) {
|
|
759
|
+
i += result.step;
|
|
469
760
|
continue;
|
|
470
761
|
}
|
|
471
|
-
const
|
|
472
|
-
const {
|
|
762
|
+
const { content, closeTokenIndex } = result;
|
|
763
|
+
const { group, orientation } = props(content);
|
|
764
|
+
const tabs2 = findTabs(state.tokens, i + 3, closeTokenIndex);
|
|
473
765
|
if (tabs2.length > 0) {
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
tabsGroup,
|
|
482
|
-
runId
|
|
483
|
-
}
|
|
484
|
-
);
|
|
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);
|
|
485
773
|
i++;
|
|
486
774
|
tabsAreInserted = true;
|
|
487
775
|
} else {
|
|
488
|
-
state.tokens.splice(i,
|
|
776
|
+
state.tokens.splice(i, closeTokenIndex - i + 3);
|
|
489
777
|
}
|
|
490
778
|
}
|
|
491
779
|
if (tabsAreInserted) {
|