@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.
@@ -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/transform.ts
84
- 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());
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 VERTICAL_TAB_CLASSNAME = "yfm-vertical-tab";
94
- 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";
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/transform.ts
198
- var TAB_RE = /`?{% list tabs .*?%}`?/;
199
- var runsCounter = 0;
200
- function findTabs(tokens, idx, closeTokenIdx) {
201
- const tabs = [];
202
- let i = idx, nestedLevel = -1, pending = { name: "", tokens: [], listItem: new import_token.default("list_item_open", "", 0) };
203
- while (i < tokens.length) {
204
- const token = tokens[i];
205
- switch (token.type) {
206
- case "ordered_list_open":
207
- case "bullet_list_open":
208
- if (nestedLevel > -1) {
209
- pending.tokens.push(token);
210
- }
211
- nestedLevel++;
212
- break;
213
- case "list_item_open":
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 insertTabs(tabs, state, align, { start, end }, {
266
- containerClasses,
267
- tabsGroup,
268
- runId
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 [start2] = (_a = tabs[0].listItem.map) != null ? _a : [null];
280
- if (start2 == null) {
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 [_, end2] = (_b = tabs[tabs.length - 1].listItem.map) != null ? _b : [null, null];
284
- if (end2 == null) {
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 = [start2, end2];
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 (align === "radio") {
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 : align === "horizontal" && i === 0;
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 (align === "radio") {
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 (align === "radio") {
359
- tabOpen.attrSet(VERTICAL_TAB_FORCED_OPEN, "true");
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 (align === "radio") {
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
- if (align === "horizontal") {
385
- tabsTokens.push(tabsOpen);
386
- tabsTokens.push(tabListOpen);
387
- tabsTokens.push(...tabListTokens);
388
- tabsTokens.push(tabListClose);
389
- 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);
390
420
  }
391
421
  tabsTokens.push(tabsClose);
392
- state.tokens.splice(start, end - start + 1, ...tabsTokens);
393
- return tabsTokens.length;
394
- }
395
- function isTabSelected(tab) {
396
- const { name } = tab;
397
- 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;
398
605
  }
399
- 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) {
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" && props(tokens[i + 1].content);
629
+ return tokens[i].type === "paragraph_open" && tokens[i + 1].type === "inline" && tokens[i + 1].content.match(TAB_RE);
420
630
  }
421
- function props(target) {
422
- const matched = target.match(TAB_RE);
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: "horizontal",
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 match = matchOpenToken(tokens, i);
464
- const openTag = match && match.content;
465
- const isNotEscaped = openTag && !(openTag.startsWith("`") && openTag.endsWith("`"));
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 tabsGroup = match.group;
477
- 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);
478
765
  if (tabs2.length > 0) {
479
- insertTabs(
480
- tabs2,
481
- state,
482
- match.orientation,
483
- { start: i, end: closeTokenIdx + 2 },
484
- {
485
- containerClasses,
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, closeTokenIdx - i + 3);
776
+ state.tokens.splice(i, closeTokenIndex - i + 3);
494
777
  }
495
778
  }
496
779
  if (tabsAreInserted) {