@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.
@@ -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
- return "";
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/transform.ts
87
- var import_token = __toESM(require("markdown-it/lib/token"));
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 VERTICAL_TAB_CLASSNAME = "yfm-vertical-tab";
97
- var VERTICAL_TAB_FORCED_OPEN = "data-diplodoc-radio-forced";
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/transform.ts
201
- var TAB_RE = /`?{% list tabs .*?%}`?/;
202
- var runsCounter = 0;
203
- function findTabs(tokens, idx, closeTokenIdx) {
204
- const tabs = [];
205
- let i = idx, nestedLevel = -1, pending = { name: "", tokens: [], listItem: new import_token.default("list_item_open", "", 0) };
206
- while (i < tokens.length) {
207
- const token = tokens[i];
208
- switch (token.type) {
209
- case "ordered_list_open":
210
- case "bullet_list_open":
211
- if (nestedLevel > -1) {
212
- pending.tokens.push(token);
213
- }
214
- nestedLevel++;
215
- break;
216
- case "list_item_open":
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 insertTabs(tabs, state, align, { start, end }, {
269
- containerClasses,
270
- tabsGroup,
271
- runId
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 [start2] = (_a = tabs[0].listItem.map) != null ? _a : [null];
283
- if (start2 == null) {
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 [_, end2] = (_b = tabs[tabs.length - 1].listItem.map) != null ? _b : [null, null];
287
- if (end2 == null) {
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 = [start2, end2];
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 (align === "radio") {
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 verticalTabOpen = new state.Token("tab_open", "input", 0);
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 : align === "horizontal" && i === 0;
263
+ const isTabActive = hasDefaultOpenTab ? didTabHasActiveAttr : i === 0;
328
264
  tab.name = getName(tab);
329
265
  const tabPanelId = generateID();
330
- verticalTabOpen.block = true;
331
- verticalTabOpen.attrJoin("class", "radio");
332
- verticalTabOpen.attrSet("type", "radio");
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 (align === "radio") {
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 (align === "radio") {
361
- tabOpen.attrSet(VERTICAL_TAB_FORCED_OPEN, "true");
362
- verticalTabOpen.attrSet("checked", "true");
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 (align === "radio") {
372
- tabsTokens.push(tabOpen, verticalTabOpen, verticalTabLabelOpen, tabInline, tabClose);
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
- if (align === "horizontal") {
380
- tabsTokens.push(tabsOpen);
381
- tabsTokens.push(tabListOpen);
382
- tabsTokens.push(...tabListTokens);
383
- tabsTokens.push(tabListClose);
384
- tabsTokens.push(...tabPanelsTokens);
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
- state.tokens.splice(start, end - start + 1, ...tabsTokens);
388
- return tabsTokens.length;
389
- }
390
- function isTabSelected(tab) {
391
- const { name } = tab;
392
- return name.includes(ACTIVE_TAB_TEXT);
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
- function findCloseTokenIdx(tokens, idx) {
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" && props(tokens[i + 1].content);
629
+ return tokens[i].type === "paragraph_open" && tokens[i + 1].type === "inline" && tokens[i + 1].content.match(TAB_RE);
415
630
  }
416
- function props(target) {
417
- const matched = target.match(TAB_RE);
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: "horizontal",
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 match = matchOpenToken(tokens, i);
459
- const openTag = match && match.content;
460
- const isNotEscaped = openTag && !(openTag.startsWith("`") && openTag.endsWith("`"));
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 tabsGroup = match.group;
472
- const { tabs: tabs2 } = findTabs(state.tokens, i + 3, closeTokenIdx);
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
- insertTabs(
475
- tabs2,
476
- state,
477
- match.orientation,
478
- { start: i, end: closeTokenIdx + 2 },
479
- {
480
- containerClasses,
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, closeTokenIdx - i + 3);
776
+ state.tokens.splice(i, closeTokenIndex - i + 3);
489
777
  }
490
778
  }
491
779
  if (tabsAreInserted) {