@diplodoc/tabs-extension 3.8.0 → 3.10.0
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/README.md +12 -3
- package/build/common.d.ts +15 -0
- package/build/plugin/find.d.ts +26 -2
- package/build/plugin/generate.d.ts +12 -3
- package/build/plugin/index.d.ts +1 -0
- package/build/plugin/index.js +485 -23
- package/build/plugin/index.js.map +4 -4
- package/build/plugin/transform.d.ts +10 -1
- package/build/plugin/types.d.ts +2 -0
- package/build/plugin/utils/index.d.ts +10 -1
- package/build/plugin/utils/strings.d.ts +0 -1
- package/build/plugin/utils/tabs.d.ts +32 -1
- package/build/plugin/variants/index.d.ts +10 -2
- package/build/plugin/variants/regular.d.ts +1 -1
- package/build/plugin/variants/types.d.ts +6 -1
- package/build/react/TabsRuntime.d.ts +11 -1
- package/build/react/index.js +4 -4
- package/build/react/index.js.map +2 -2
- package/build/react/useDiplodocTabs.d.ts +13 -8
- package/build/runtime/TabsController.d.ts +61 -7
- package/build/runtime/index.css +1 -1
- package/build/runtime/index.css.map +3 -3
- package/build/runtime/index.js +1 -1
- package/build/runtime/index.js.map +3 -3
- package/build/runtime/utils.d.ts +22 -0
- package/package.json +14 -8
package/build/react/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/react/index.ts", "../../src/react/useDiplodocTabs.ts", "../../src/common.ts", "../../src/react/TabsRuntime.ts"],
|
|
4
|
-
"sourcesContent": ["export type {Tab, UseDiplodocTabsCallback} from './useDiplodocTabs';\nexport {useDiplodocTabs} from './useDiplodocTabs';\nexport {TabsRuntime} from './TabsRuntime';\n", "
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;
|
|
4
|
+
"sourcesContent": ["export type {Tab, UseDiplodocTabsCallback} from './useDiplodocTabs';\nexport {useDiplodocTabs} from './useDiplodocTabs';\nexport {TabsRuntime} from './TabsRuntime';\n", "/**\n * React hook to access the global TabsController (window[GLOBAL_SYMBOL]).\n * Optionally subscribe to tab switch events via callback. Returns controller methods in stable refs.\n */\nimport type {SelectedTabEvent, Tab} from '../common';\nimport type {\n ISelectTabByIdOptions,\n TabsControllerOptions,\n TabsHistory,\n} from '../runtime/TabsController';\n\nimport {useCallback, useEffect} from 'react';\n\nimport {GLOBAL_SYMBOL} from '../common';\n\nexport type {Tab};\n\n/** Called when user (or code) switches to another tab; receives tab descriptor and optional element id. */\nexport type UseDiplodocTabsCallback = (tab: Tab, currentTabId?: string) => void;\n\n/**\n * Access tabs API and optionally listen to tab switch events.\n * @param callback - If provided, called on each tab switch (tab, currentTabId).\n * @returns Object with selectTabById, selectTab, configure, restoreTabs, onPageChanged, and persistence helpers.\n */\nexport function useDiplodocTabs(callback: UseDiplodocTabsCallback | undefined = undefined) {\n if (callback !== undefined) {\n const selectTabHandle = useCallback(\n ({tab, currentTabId}: SelectedTabEvent) => {\n callback(tab, currentTabId);\n },\n [callback],\n );\n\n useEffect(() => window[GLOBAL_SYMBOL].onSelectTab(selectTabHandle), [selectTabHandle]);\n }\n\n return {\n selectTabById: useCallback(\n (tabId: string, options?: ISelectTabByIdOptions) =>\n window[GLOBAL_SYMBOL].selectTabById(tabId, options),\n [],\n ),\n selectTab: useCallback((tab: Tab) => window[GLOBAL_SYMBOL].selectTab(tab), []),\n configure: useCallback(\n (options: Partial<TabsControllerOptions>) => window[GLOBAL_SYMBOL].configure(options),\n [],\n ),\n restoreTabs: useCallback(\n (tabsHistory: TabsHistory) => window[GLOBAL_SYMBOL].restoreTabs(tabsHistory),\n [],\n ),\n onPageChanged: useCallback(() => window[GLOBAL_SYMBOL].onPageChanged(), []),\n getTabsFromLocalStorage: useCallback(\n () => window[GLOBAL_SYMBOL].getTabsFromLocalStorage(),\n [],\n ),\n getTabsFromSearchQuery: useCallback(\n () => window[GLOBAL_SYMBOL].getTabsFromSearchQuery(),\n [],\n ),\n getCurrentPageTabHistory: useCallback(\n (tabsHistory: TabsHistory) =>\n window[GLOBAL_SYMBOL].getCurrentPageTabHistory(tabsHistory),\n [],\n ),\n updateLocalStorageWithTabs: useCallback(\n (tabsHistory: TabsHistory) =>\n window[GLOBAL_SYMBOL].updateLocalStorageWithTabs(tabsHistory),\n [],\n ),\n updateQueryParamWithTabs: useCallback(\n (tabsHistory: TabsHistory) =>\n window[GLOBAL_SYMBOL].updateQueryParamWithTabs(tabsHistory),\n [],\n ),\n };\n}\n", "/**\n * Shared constants, types and globals for the tabs extension.\n * Used by both the MarkdownIt plugin (compile-time) and the runtime controller (DOM).\n */\nimport {type TabsController} from './runtime/TabsController';\n\n/** Regex to match the opening `{% list tabs ... %}` tag (optionally backtick-escaped). */\nexport const TAB_RE = /`?{% list tabs .*?%}`?/;\n\n/** CSS class names for tab structure. */\nexport const TABS_CLASSNAME = 'yfm-tabs';\nexport const TAB_CLASSNAME = 'yfm-tab';\nexport const TAB_PANEL_CLASSNAME = 'yfm-tab-panel';\nexport const TABS_LIST_CLASSNAME = 'yfm-tab-list';\nexport const ACTIVE_CLASSNAME = 'active';\nexport const TAB_GROUP_CLASSNAME = 'yfm-tab-group';\n\n/** Data attributes used by the runtime to identify groups, keys, variants and active state. */\nexport const TAB_ACTIVE_KEY = 'data-diplodoc-is-active';\nexport const GROUP_DATA_KEY = 'data-diplodoc-group';\nexport const TAB_DATA_KEY = 'data-diplodoc-key';\nexport const TAB_DATA_VARIANT = 'data-diplodoc-variant';\nexport const TAB_DATA_ID = 'data-diplodoc-id';\nexport const DEFAULT_TABS_GROUP_PREFIX = 'defaultTabsGroup-';\nexport const ACTIVE_TAB_TEXT = '{selected}';\nexport const TAB_FORCED_OPEN = 'data-diplodoc-forced';\n\n/** Dropdown variant: container, menu and select element class names. */\nexport const TABS_DROPDOWN_CLASSNAME = 'yfm-tabs-dropdown';\nexport const TABS_DROPDOWN_MENU_CLASSNAME = 'yfm-tabs-dropdown-menu';\nexport const TABS_DROPDOWN_SELECT = 'yfm-tabs-dropdown-select';\n\n/** Accordion variant. */\nexport const TABS_ACCORDION_CLASSNAME = 'yfm-tabs-accordion';\nexport const TABS_ACCORDION_CLIENT_HEIGHT = 'data-yfm-tabs-accordion-client-heights';\n\n/** Radio (vertical) variant. */\nexport const TABS_RADIO_CLASSNAME = 'yfm-tabs-vertical';\nexport const VERTICAL_TAB_CLASSNAME = 'yfm-vertical-tab';\nexport const TAB_DATA_VERTICAL_TAB = 'data-diplodoc-vertical-tab';\nexport const TAB_RADIO_KEY = 'data-diplodoc-input';\n\n/** Available tab block variants (regular horizontal, radio, dropdown, accordion). */\nexport enum TabsVariants {\n Regular = 'regular',\n Radio = 'radio',\n Dropdown = 'dropdown',\n Accordion = 'accordion',\n}\n\n/** Which variants are enabled in the plugin (others fall back to Regular). */\nexport type EnabledVariants = Partial<Record<TabsVariants, boolean>>;\n\n/** Identifies a tab: group id, tab key (from content), and variant. */\nexport interface Tab {\n group?: string;\n key: string;\n variant: TabsVariants;\n}\n\n/** Payload passed to onSelectTab handlers when a tab is switched. */\nexport interface SelectedTabEvent {\n tab: Tab;\n currentTabId?: string;\n}\n\n/** Symbol under which the global TabsController instance is stored on `window`. */\nexport const GLOBAL_SYMBOL: unique symbol = Symbol.for('diplodocTabs');\n\ndeclare global {\n interface Window {\n [GLOBAL_SYMBOL]: TabsController;\n }\n}\n", "/**\n * React component that configures the global TabsController and restores tab state from\n * localStorage + URL on mount (and when router changes). Renders nothing (return null).\n */\nimport type {TabsControllerOptions} from '../runtime/TabsController';\n\nimport {useEffect} from 'react';\n\nimport {useDiplodocTabs} from './useDiplodocTabs';\n\n/**\n * Mount once (e.g. in layout) to apply options and restore tabs from storage/URL.\n * Pass router so that restore runs again on route change.\n * @param props - Controller options and optional router\n * @returns null (component renders nothing)\n */\nexport function TabsRuntime(props: Partial<TabsControllerOptions> & {router?: object} = {}) {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const tabs = useDiplodocTabs();\n\n useEffect(() => {\n tabs.configure({...props});\n }, [props, tabs]);\n\n useEffect(() => {\n tabs.onPageChanged();\n tabs.restoreTabs({\n ...tabs.getTabsFromLocalStorage(),\n ...tabs.getTabsFromSearchQuery(),\n });\n }, [props.router]);\n\n return null;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACWA,mBAAqC;;;ACwD9B,IAAM,gBAA+B,uBAAO,IAAI,cAAc;;;AD1C9D,SAAS,gBAAgB,WAAgD,QAAW;AACvF,MAAI,aAAa,QAAW;AACxB,UAAM,sBAAkB;AAAA,MACpB,CAAC,EAAC,KAAK,aAAY,MAAwB;AACvC,iBAAS,KAAK,YAAY;AAAA,MAC9B;AAAA,MACA,CAAC,QAAQ;AAAA,IACb;AAEA,gCAAU,MAAM,OAAO,aAAa,EAAE,YAAY,eAAe,GAAG,CAAC,eAAe,CAAC;AAAA,EACzF;AAEA,SAAO;AAAA,IACH,mBAAe;AAAA,MACX,CAAC,OAAe,YACZ,OAAO,aAAa,EAAE,cAAc,OAAO,OAAO;AAAA,MACtD,CAAC;AAAA,IACL;AAAA,IACA,eAAW,0BAAY,CAAC,QAAa,OAAO,aAAa,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;AAAA,IAC7E,eAAW;AAAA,MACP,CAAC,YAA4C,OAAO,aAAa,EAAE,UAAU,OAAO;AAAA,MACpF,CAAC;AAAA,IACL;AAAA,IACA,iBAAa;AAAA,MACT,CAAC,gBAA6B,OAAO,aAAa,EAAE,YAAY,WAAW;AAAA,MAC3E,CAAC;AAAA,IACL;AAAA,IACA,mBAAe,0BAAY,MAAM,OAAO,aAAa,EAAE,cAAc,GAAG,CAAC,CAAC;AAAA,IAC1E,6BAAyB;AAAA,MACrB,MAAM,OAAO,aAAa,EAAE,wBAAwB;AAAA,MACpD,CAAC;AAAA,IACL;AAAA,IACA,4BAAwB;AAAA,MACpB,MAAM,OAAO,aAAa,EAAE,uBAAuB;AAAA,MACnD,CAAC;AAAA,IACL;AAAA,IACA,8BAA0B;AAAA,MACtB,CAAC,gBACG,OAAO,aAAa,EAAE,yBAAyB,WAAW;AAAA,MAC9D,CAAC;AAAA,IACL;AAAA,IACA,gCAA4B;AAAA,MACxB,CAAC,gBACG,OAAO,aAAa,EAAE,2BAA2B,WAAW;AAAA,MAChE,CAAC;AAAA,IACL;AAAA,IACA,8BAA0B;AAAA,MACtB,CAAC,gBACG,OAAO,aAAa,EAAE,yBAAyB,WAAW;AAAA,MAC9D,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;;;AEvEA,IAAAA,gBAAwB;AAUjB,SAAS,YAAY,QAA4D,CAAC,GAAG;AACxF,MAAI,OAAO,WAAW,aAAa;AAC/B,WAAO;AAAA,EACX;AAEA,QAAM,OAAO,gBAAgB;AAE7B,+BAAU,MAAM;AACZ,SAAK,UAAU,mBAAI,MAAM;AAAA,EAC7B,GAAG,CAAC,OAAO,IAAI,CAAC;AAEhB,+BAAU,MAAM;AACZ,SAAK,cAAc;AACnB,SAAK,YAAY,kCACV,KAAK,wBAAwB,IAC7B,KAAK,uBAAuB,EAClC;AAAA,EACL,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,SAAO;AACX;",
|
|
6
6
|
"names": ["import_react"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* React hook to access the global TabsController (window[GLOBAL_SYMBOL]).
|
|
3
|
+
* Optionally subscribe to tab switch events via callback. Returns controller methods in stable refs.
|
|
4
|
+
*/
|
|
5
|
+
import type { Tab } from '../common';
|
|
6
|
+
import type { ISelectTabByIdOptions, TabsControllerOptions, TabsHistory } from '../runtime/TabsController';
|
|
3
7
|
export type { Tab };
|
|
8
|
+
/** Called when user (or code) switches to another tab; receives tab descriptor and optional element id. */
|
|
4
9
|
export type UseDiplodocTabsCallback = (tab: Tab, currentTabId?: string) => void;
|
|
10
|
+
/**
|
|
11
|
+
* Access tabs API and optionally listen to tab switch events.
|
|
12
|
+
* @param callback - If provided, called on each tab switch (tab, currentTabId).
|
|
13
|
+
* @returns Object with selectTabById, selectTab, configure, restoreTabs, onPageChanged, and persistence helpers.
|
|
14
|
+
*/
|
|
5
15
|
export declare function useDiplodocTabs(callback?: UseDiplodocTabsCallback | undefined): {
|
|
6
16
|
selectTabById: (tabId: string, options?: ISelectTabByIdOptions) => void;
|
|
7
17
|
selectTab: (tab: Tab) => void;
|
|
@@ -10,12 +20,7 @@ export declare function useDiplodocTabs(callback?: UseDiplodocTabsCallback | und
|
|
|
10
20
|
onPageChanged: () => void;
|
|
11
21
|
getTabsFromLocalStorage: () => TabsHistory;
|
|
12
22
|
getTabsFromSearchQuery: () => TabsHistory;
|
|
13
|
-
getCurrentPageTabHistory: (tabsHistory: TabsHistory) =>
|
|
14
|
-
[k: string]: {
|
|
15
|
-
key: string;
|
|
16
|
-
variant: import("../common").TabsVariants;
|
|
17
|
-
};
|
|
18
|
-
};
|
|
23
|
+
getCurrentPageTabHistory: (tabsHistory: TabsHistory) => TabsHistory;
|
|
19
24
|
updateLocalStorageWithTabs: (tabsHistory: TabsHistory) => void;
|
|
20
25
|
updateQueryParamWithTabs: (tabsHistory: TabsHistory) => void;
|
|
21
26
|
};
|
|
@@ -1,16 +1,24 @@
|
|
|
1
|
-
import { SelectedTabEvent, Tab
|
|
1
|
+
import type { SelectedTabEvent, Tab } from '../common';
|
|
2
|
+
import { TabsVariants } from '../common';
|
|
3
|
+
/** Options for selectTabById (e.g. scroll the selected tab into view). */
|
|
2
4
|
export interface ISelectTabByIdOptions {
|
|
3
5
|
scrollToElement: boolean;
|
|
4
6
|
}
|
|
5
7
|
type Handler = (data: SelectedTabEvent) => void;
|
|
8
|
+
/** Persisted tab state: group id -> { key, variant }. Used for localStorage and URL. */
|
|
6
9
|
export type TabsHistory = Record<string, {
|
|
7
10
|
key: string;
|
|
8
11
|
variant: TabsVariants;
|
|
9
12
|
}>;
|
|
13
|
+
/** Controller options: whether to persist selection to localStorage and/or URL query. */
|
|
10
14
|
export type TabsControllerOptions = {
|
|
11
15
|
saveTabsToLocalStorage: boolean;
|
|
12
16
|
saveTabsToQueryStateMode: 'all' | 'page' | 'none';
|
|
13
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* DOM controller for tab blocks: click/keyboard handling, active state, persistence (localStorage
|
|
20
|
+
* and URL), and events. One instance per document; registered on window[GLOBAL_SYMBOL].
|
|
21
|
+
*/
|
|
14
22
|
export declare class TabsController {
|
|
15
23
|
private _document;
|
|
16
24
|
private _onSelectTabHandlers;
|
|
@@ -18,23 +26,69 @@ export declare class TabsController {
|
|
|
18
26
|
private _currentPageTabGroups;
|
|
19
27
|
private _isRestoringTabs;
|
|
20
28
|
constructor(document: Document, options?: Partial<TabsControllerOptions>);
|
|
29
|
+
/**
|
|
30
|
+
* Update controller options (e.g. enable persistence after init).
|
|
31
|
+
* @param options - Partial options to merge
|
|
32
|
+
* @returns void
|
|
33
|
+
*/
|
|
21
34
|
configure(options: Partial<TabsControllerOptions>): void;
|
|
35
|
+
/**
|
|
36
|
+
* Subscribe to tab switch events.
|
|
37
|
+
* @param handler - Callback on tab switch
|
|
38
|
+
* @returns Unsubscribe function
|
|
39
|
+
*/
|
|
22
40
|
onSelectTab(handler: Handler): () => void;
|
|
41
|
+
/**
|
|
42
|
+
* Select tab by data-diplodoc-id and optionally scroll it into view.
|
|
43
|
+
* @param id - data-diplodoc-id value
|
|
44
|
+
* @param options - e.g. scrollToElement
|
|
45
|
+
* @returns void
|
|
46
|
+
*/
|
|
23
47
|
selectTabById(id: string, options?: ISelectTabByIdOptions): void;
|
|
48
|
+
/**
|
|
49
|
+
* Programmatically select a tab by { group, key, variant }.
|
|
50
|
+
* @param tab - Tab descriptor
|
|
51
|
+
* @returns void
|
|
52
|
+
*/
|
|
24
53
|
selectTab(tab: Tab): void;
|
|
54
|
+
/**
|
|
55
|
+
* Apply saved state: select each tab in tabsHistory (e.g. after navigation).
|
|
56
|
+
* @param tabsHistory - Group -> { key, variant } map
|
|
57
|
+
* @returns void
|
|
58
|
+
*/
|
|
25
59
|
restoreTabs(tabsHistory: TabsHistory): void;
|
|
60
|
+
/**
|
|
61
|
+
* Read persisted tab state from localStorage (key: tabsHistory).
|
|
62
|
+
* @returns Parsed TabsHistory
|
|
63
|
+
*/
|
|
26
64
|
getTabsFromLocalStorage(): TabsHistory;
|
|
65
|
+
/**
|
|
66
|
+
* Parse tab state from URL search params (tabs=group_key or group_key_variant).
|
|
67
|
+
* @returns Parsed TabsHistory
|
|
68
|
+
*/
|
|
27
69
|
getTabsFromSearchQuery(): TabsHistory;
|
|
28
70
|
updateLocalStorageWithTabs(tabsHistory: TabsHistory): void;
|
|
29
71
|
updateQueryParamWithTabs(tabsHistory: TabsHistory): void;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
72
|
+
/**
|
|
73
|
+
* Filter tabsHistory to only groups present on the current page.
|
|
74
|
+
* @param tabsHistory - Full history
|
|
75
|
+
* @returns Filtered TabsHistory
|
|
76
|
+
*/
|
|
77
|
+
getCurrentPageTabHistory(tabsHistory: TabsHistory): TabsHistory;
|
|
78
|
+
/**
|
|
79
|
+
* Call after route/page change so persistence uses only groups on the current page.
|
|
80
|
+
* @returns void
|
|
81
|
+
*/
|
|
36
82
|
onPageChanged(): void;
|
|
83
|
+
/**
|
|
84
|
+
* List of tab group ids found in the document.
|
|
85
|
+
* @returns Array of group ids
|
|
86
|
+
*/
|
|
37
87
|
getCurrentPageTabGroups(): string[];
|
|
88
|
+
/**
|
|
89
|
+
* Clear saved tab state from localStorage and URL.
|
|
90
|
+
* @returns void
|
|
91
|
+
*/
|
|
38
92
|
clearTabsPreferred(): void;
|
|
39
93
|
private _selectTab;
|
|
40
94
|
private updateHTML;
|
package/build/runtime/index.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
@charset "UTF-8";.yfm-tabs{margin-bottom:15px}.yfm-tab-list{display:flex;flex-wrap:wrap;margin-bottom:15px;border-bottom:1px solid rgba(0,0,0,.07)}.yfm-tab{margin-bottom:-1px;margin-right:20px;border-bottom:2px solid transparent;padding:6px 0 7px;font-weight:700;outline:none;cursor:pointer;user-select:none;white-space:break-spaces}.yfm-tab:last-child{margin-right:0}.yfm-tab:hover,.yfm-tab:active{color:#004080}.yfm-tab.active{border-bottom-color:#027bf3}.yfm-tab:focus{outline:2px solid #4d90fe;border-radius:2px}.yfm-tab:focus:not(:focus-visible){outline:0}.yfm-tab-panel{position:absolute;visibility:hidden;overflow:hidden;height:0}.yfm-tab-panel:first-child{margin-top:0
|
|
1
|
+
@charset "UTF-8";.yfm-tabs{margin-bottom:15px}.yfm-tab-list{display:flex;flex-wrap:wrap;margin-bottom:15px;border-bottom:1px solid rgba(0,0,0,.07)}.yfm-tab{margin-bottom:-1px;margin-right:20px;border-bottom:2px solid transparent;padding:6px 0 7px;font-weight:700;outline:none;cursor:pointer;user-select:none;white-space:break-spaces}.yfm-tab:last-child{margin-right:0}.yfm-tab:hover,.yfm-tab:active{color:#004080}.yfm-tab.active{border-bottom-color:#027bf3}.yfm-tab:focus{outline:2px solid #4d90fe;border-radius:2px}.yfm-tab:focus:not(:focus-visible){outline:0}.yfm-tab-panel{position:absolute;visibility:hidden;overflow:hidden;height:0}.yfm-tab-panel:first-child{margin-top:0}.yfm-tab-panel:last-child{margin-bottom:0}.yfm-tab-panel.active{position:relative;visibility:visible;overflow:visible;height:auto}.yfm-tabs-dropdown{position:relative;width:90%;margin-bottom:0;--yfm-tabs-dropdown-color: #f2f2f2;--yfm-tabs-dropdown-text-color: #a8a8a8;--yfm-tabs-dropdown-color-border: #ccc}.yfm-tabs-dropdown .yfm-tabs-dropdown-select{padding:10px 30px 10px 10px;background:var(--g-color-base-background);border:1px solid var(--yfm-tabs-dropdown-color-border);color:var(--yfm-tabs-dropdown-text-color);border-radius:5px;position:relative;user-select:none;margin-bottom:10px;max-width:500px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;z-index:100}.yfm-tabs-dropdown .yfm-tabs-dropdown-select.filled{color:inherit}.yfm-tabs-dropdown .yfm-tabs-dropdown-select:after{content:"";position:absolute;display:block;right:10px;top:25%;transform:rotate(90deg);transition:transform .2s;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIGQ9Im0zIDYgNSA1IDUtNSIvPjwvc3ZnPg==);width:20px;height:20px}.yfm-tabs-dropdown .yfm-tabs-dropdown-select.active+.yfm-tabs-dropdown-menu{transform:scaleY(1)}.yfm-tabs-dropdown .yfm-tabs-dropdown-select.active:after{transform:rotate(0)}.yfm-tabs-dropdown>.yfm-tabs-dropdown-menu{width:100%;max-width:500px;max-height:500px;overflow-y:scroll;padding:10px 0;position:absolute;z-index:100;display:flex;flex-direction:column;border:1px solid var(--yfm-tabs-dropdown-color-border);border-radius:5px;background-color:var(--g-color-base-background);transform:scaleY(0);list-style:none;transition:transform 125ms;transform-origin:top center}.yfm-tabs-dropdown>.yfm-tabs-dropdown-menu>li{user-select:none;cursor:pointer;background-color:var(--g-color-base-background)}.yfm-tabs-dropdown>.yfm-tabs-dropdown-menu>li:hover{background-color:var(--g-color-base-simple-hover);color:inherit}.yfm-tabs-dropdown>.yfm-tabs-dropdown-menu>li.yfm-tab{padding:5px 0 5px 10px;border-radius:0;border-bottom:unset;margin:0;font-weight:500}.yfm-tabs-dropdown>.yfm-tabs-dropdown-menu>li.yfm-tab.active{background-color:var(--g-color-base-selection)}.yfm-tabs-dropdown>.yfm-tabs-dropdown-menu>li.yfm-tab:hover{color:inherit}.yfm-tabs-dropdown>.yfm-tab-panel.active{border:1px solid #f2f2f2;transform:translateY(-30px);border-radius:12px;padding:40px 12px 16px}.yfm-tabs-dropdown>.yfm-tabs{width:100%}.yfm-tabs-accordion{max-width:80%}@media(max-width:600px){.yfm-tabs-accordion{max-width:100%}}.yfm-tabs-accordion>.yfm-tab:first-of-type{border-top-color:transparent}.yfm-tabs-accordion>.yfm-tab{padding:8px 0 12px 6px;position:relative;display:flex;justify-content:space-between;gap:10px;border-top:1px solid #e5e5e5;font-weight:500;scroll-margin-top:20px}.yfm-tabs-accordion>.yfm-tab:after{content:"";display:block;transform:rotate(-180deg);transition:transform .3s,background-color .2s;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIGQ9Im0zIDYgNSA1IDUtNSIvPjwvc3ZnPg==);width:20px;height:20px;border-radius:6px;padding:6px;align-self:center}.yfm-tabs-accordion>.yfm-tab.active{border-bottom-color:transparent;font-weight:700}.yfm-tabs-accordion>.yfm-tab.active:after{transform:rotate(0)}.yfm-tabs-accordion>.yfm-tab:hover{color:#3f5799}.yfm-tabs-accordion .yfm-tab-panel.active{margin:10px 0 25px 6px}.yfm-tabs-vertical>.yfm-tab-list{flex-direction:column;border-bottom:unset}.yfm-tabs-vertical>.yfm-tab-panel{margin-left:30px}.yfm-tabs-vertical>.yfm-tab-group{display:flex;flex-direction:row;margin-bottom:5px}.yfm-tabs-vertical .yfm-vertical-tab>input[type=radio]{visibility:hidden;width:0;height:0}.yfm-tabs-vertical .yfm-vertical-tab>label{display:inline-block;cursor:pointer;position:relative;padding-left:25px;margin-right:0;line-height:18px;user-select:none}.yfm-tabs-vertical .yfm-vertical-tab>label:before{font-family:initial;content:"";position:absolute;top:0;left:0;bottom:1px;border-radius:50%;width:18px;height:18px;border:#dfdfdf 1px solid;background-color:#fff}.yfm-tabs-vertical .yfm-vertical-tab input[type=radio]:checked+label:before{content:"\2022";background-color:#5282ff;text-align:center;vertical-align:middle;font-size:20px;white-space:pre;display:inline-flex;justify-content:center;align-items:center;color:#fff}.yfm-tabs-vertical .yfm-vertical-tab{border-bottom:unset}
|
|
2
2
|
/*# sourceMappingURL=index.css.map */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/runtime/
|
|
4
|
-
"sourcesContent": [".yfm-tabs {\n margin-bottom: 15px;\n}\n\n.yfm-tab-list {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 15px;\n\n border-bottom: 1px solid rgba(0, 0, 0, 0.07);\n}\n\n
|
|
5
|
-
"mappings": "iBAAA,CAAA,SACI,cAAA,KAGJ,CAAA,aACI,QAAA,KACA,UAAA,KACA,cAAA,KAEA,cAAA,IAAA,MAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,
|
|
3
|
+
"sources": ["../../src/runtime/tabs.scss"],
|
|
4
|
+
"sourcesContent": [".yfm-tabs {\n margin-bottom: 15px;\n}\n\n.yfm-tab-list {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 15px;\n\n border-bottom: 1px solid rgba(0, 0, 0, 0.07);\n}\n\n.yfm-tab {\n margin-bottom: -1px;\n margin-right: 20px;\n border-bottom: 2px solid transparent;\n\n padding: 6px 0 7px;\n font-weight: 700;\n outline: none;\n cursor: pointer;\n user-select: none;\n white-space: break-spaces;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover,\n &:active {\n color: #004080;\n }\n\n &.active {\n border-bottom-color: #027bf3;\n }\n\n &:focus {\n outline: 2px solid #4d90fe;\n border-radius: 2px;\n }\n &:focus:not(:focus-visible) {\n outline: 0;\n }\n}\n\n.yfm-tab-panel {\n position: absolute;\n visibility: hidden;\n overflow: hidden;\n height: 0;\n\n &:first-child {\n margin-top: 0;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &.active {\n position: relative;\n visibility: visible;\n overflow: visible;\n height: auto;\n }\n}\n\n.yfm-tabs-dropdown {\n position: relative;\n width: 90%;\n margin-bottom: 0;\n\n --yfm-tabs-dropdown-color: #f2f2f2;\n --yfm-tabs-dropdown-text-color: #a8a8a8;\n --yfm-tabs-dropdown-color-border: #ccc;\n\n .yfm-tabs-dropdown-select {\n padding: 10px 30px 10px 10px;\n background: var(--g-color-base-background);\n border: 1px solid var(--yfm-tabs-dropdown-color-border);\n color: var(--yfm-tabs-dropdown-text-color);\n border-radius: 5px;\n position: relative;\n user-select: none;\n margin-bottom: 10px;\n max-width: 500px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n z-index: 100;\n\n &.filled {\n color: inherit;\n }\n\n &::after {\n content: '';\n position: absolute;\n display: block;\n right: 10px;\n top: 25%;\n transform: rotate(90deg);\n transition: transform 200ms;\n background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIGQ9Im0zIDYgNSA1IDUtNSIvPjwvc3ZnPg==);\n width: 20px;\n height: 20px;\n }\n\n &.active {\n & + .yfm-tabs-dropdown-menu {\n transform: scaleY(1);\n }\n\n &::after {\n transform: rotate(0deg);\n }\n }\n }\n\n & > .yfm-tabs-dropdown-menu {\n width: 100%;\n max-width: 500px;\n max-height: 500px;\n overflow-y: scroll;\n padding: 10px 0;\n position: absolute;\n z-index: 100;\n\n display: flex;\n flex-direction: column;\n\n border: 1px solid var(--yfm-tabs-dropdown-color-border);\n border-radius: 5px;\n background-color: var(--g-color-base-background);\n transform: scaleY(0);\n\n list-style: none;\n\n transition: transform 125ms;\n transform-origin: top center;\n\n & > li {\n user-select: none;\n cursor: pointer;\n background-color: var(--g-color-base-background);\n\n &:hover {\n background-color: var(--g-color-base-simple-hover);\n color: inherit;\n }\n\n &.yfm-tab {\n padding: 5px 0 5px 10px;\n border-radius: 0;\n border-bottom: unset;\n margin: 0;\n font-weight: 500;\n\n &.active {\n background-color: var(--g-color-base-selection);\n }\n\n &:hover {\n color: inherit;\n }\n }\n }\n }\n\n & > .yfm-tab-panel {\n &.active {\n border: 1px solid #f2f2f2;\n transform: translateY(-30px);\n border-radius: 12px;\n padding: 40px 12px 16px;\n }\n }\n\n & > .yfm-tabs {\n width: 100%;\n }\n}\n\n.yfm-tabs-accordion {\n max-width: 80%;\n @media (max-width: 600px) {\n max-width: 100%;\n }\n\n & > .yfm-tab:first-of-type {\n border-top-color: transparent;\n }\n\n & > .yfm-tab {\n padding: 8px 0 12px 6px;\n position: relative;\n display: flex;\n justify-content: space-between;\n gap: 10px;\n\n border-top: 1px solid #e5e5e5;\n font-weight: 500;\n\n scroll-margin-top: 20px;\n\n &::after {\n content: '';\n display: block;\n transform: rotate(-180deg);\n transition:\n transform 300ms,\n background-color 200ms;\n background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIGQ9Im0zIDYgNSA1IDUtNSIvPjwvc3ZnPg==);\n width: 20px;\n height: 20px;\n border-radius: 6px;\n padding: 6px;\n align-self: center;\n }\n\n &.active {\n border-bottom-color: transparent;\n font-weight: 700;\n\n &::after {\n transform: rotate(0);\n }\n }\n\n &:hover {\n color: #3f5799;\n }\n }\n\n .yfm-tab-panel {\n &.active {\n margin: 10px 0 25px 6px;\n }\n }\n}\n\n.yfm-tabs-vertical {\n & > .yfm-tab-list {\n flex-direction: column;\n border-bottom: unset;\n }\n\n & > .yfm-tab-panel {\n margin-left: 30px;\n }\n\n & > .yfm-tab-group {\n display: flex;\n flex-direction: row;\n margin-bottom: 5px;\n }\n\n .yfm-vertical-tab > input[type='radio'] {\n visibility: hidden;\n width: 0;\n height: 0;\n }\n\n .yfm-vertical-tab > label {\n display: inline-block;\n cursor: pointer;\n position: relative;\n padding-left: 25px;\n margin-right: 0;\n line-height: 18px;\n user-select: none;\n }\n\n .yfm-vertical-tab > label:before {\n font-family: initial;\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n bottom: 1px;\n border-radius: 50%;\n width: 18px;\n height: 18px;\n border: #dfdfdf 1px solid;\n background-color: #fff;\n }\n\n /* Checked */\n .yfm-vertical-tab input[type='radio']:checked + label:before {\n content: '•';\n background-color: rgb(82, 130, 255);\n text-align: center;\n vertical-align: middle;\n font-size: 20px;\n white-space: pre;\n display: inline-flex;\n justify-content: center;\n align-items: center;\n color: #fff;\n }\n\n .yfm-vertical-tab {\n border-bottom: unset;\n }\n}\n"],
|
|
5
|
+
"mappings": "iBAAA,CAAA,SACI,cAAA,KAGJ,CAAA,aACI,QAAA,KACA,UAAA,KACA,cAAA,KAEA,cAAA,IAAA,MAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAGJ,CAAA,QACI,cAAA,KACA,aAAA,KACA,cAAA,IAAA,MAAA,oBAEA,IAAA,EAAA,IACA,YAAA,IACA,QAAA,KACA,OAAA,QACA,YAAA,KACA,YAAA,aAEA,CAZJ,OAYI,YACI,aAAA,EAGJ,CAhBJ,OAgBI,OAAA,CAhBJ,OAgBI,QAEI,MAAA,QAGJ,CArBJ,OAqBI,CAAA,OACI,oBAAA,QAGJ,CAzBJ,OAyBI,OACI,QAAA,IAAA,MAAA,sBACA,IAEJ,CA7BJ,OA6BI,MAAA,KAAA,gBACI,QAAA,EAIR,CAAA,cACI,SAAA,SACA,WAAA,OACA,SAAA,OACA,OAAA,EAEA,CANJ,aAMI,aACI,WAAA,EAGJ,CAVJ,aAUI,YACI,cAAA,EAGJ,CAdJ,aAcI,CA3BA,OA4BI,SAAA,SACA,WAAA,QACA,SAAA,QACA,OAAA,KAIR,CAAA,kBACI,SAAA,SACA,MAAA,IACA,cAAA,EAEA,2BAAA,QACA,gCAAA,QACA,kCAAA,KAEA,CATJ,kBASI,CAAA,iCACI,KAAA,KAAA,KAAA,KACA,WAAA,IAAA,2BACA,OAAA,IAAA,MAAA,IAAA,kCACA,MAAA,IAAA,8CACA,IACA,SAAA,SACA,YAAA,KACA,cAAA,KACA,UAAA,MACA,cAAA,SACA,YAAA,OACA,SAAA,OACA,QAAA,IAEA,CAxBR,kBAwBQ,CAfJ,wBAeI,CAAA,OACI,MAAA,QAGJ,CA5BR,kBA4BQ,CAnBJ,wBAmBI,OACI,QAAA,GACA,SAAA,SACA,QAAA,MACA,MAAA,KACA,IAAA,IACA,UAAA,OAAA,OACA,WAAA,UAAA,IACA,iBAAA,wMACA,MAAA,KACA,OAAA,KAIA,CA1CZ,kBA0CY,CAjCR,wBAiCQ,CA7ER,MA6EQ,CAAA,CAAA,uBACI,UAAA,OAAA,GAGJ,CA9CZ,kBA8CY,CArCR,wBAqCQ,CAjFR,MAiFQ,OACI,UAAA,OAAA,GAKZ,CApDJ,iBAoDI,CAAA,CAVQ,uBAWJ,MAAA,KACA,UAAA,MACA,WAAA,MACA,WAAA,eACA,KAAA,EACA,SAAA,SACA,QAAA,IAEA,QAAA,KACA,eAAA,OAEA,OAAA,IAAA,MAAA,IAAA,gDACA,IACA,iBAAA,IAAA,2BACA,UAAA,OAAA,GAEA,WAAA,KAEA,WAAA,UAAA,MACA,iBAAA,IAAA,OAEA,CA1ER,iBA0EQ,CAAA,CAhCI,sBAgCJ,CAAA,GACI,YAAA,KACA,OAAA,QACA,iBAAA,IAAA,2BAEA,CA/EZ,iBA+EY,CAAA,CArCA,sBAqCA,CAAA,EAAA,OACI,iBAAA,IAAA,6BACA,MAAA,QAGJ,CApFZ,iBAoFY,CAAA,CA1CA,sBA0CA,CAAA,EAAA,CA5IZ,gBA6IgB,IAAA,EAAA,IAAA,mBACA,EACA,cAAA,aACA,EACA,YAAA,IAEA,CA3FhB,iBA2FgB,CAAA,CAjDJ,sBAiDI,CAAA,EAAA,CAnJhB,OAmJgB,CA9HZ,OA+HgB,iBAAA,IAAA,0BAGJ,CA/FhB,iBA+FgB,CAAA,CArDJ,sBAqDI,CAAA,EAAA,CAvJhB,OAuJgB,OACI,MAAA,QAOZ,CAvGR,iBAuGQ,CAAA,CA7HR,aA6HQ,CA1IJ,OA2IQ,OAAA,IAAA,MAAA,QACA,UAAA,WAAA,qBACA,aACA,KAAA,KAAA,KAIR,CA/GJ,iBA+GI,CAAA,CAnLJ,SAoLQ,MAAA,KAIR,CAAA,mBACI,UAAA,IACA,OAAA,UAAA,OAFJ,CAAA,mBAGQ,UAAA,MAGJ,CANJ,kBAMI,CAAA,CAlLJ,OAkLI,eACI,iBAAA,YAGJ,CAVJ,kBAUI,CAAA,CAtLJ,gBAuLQ,IAAA,EAAA,KAAA,IACA,SAAA,SACA,QAAA,KACA,gBAAA,cACA,IAAA,KAEA,WAAA,IAAA,MAAA,QACA,YAAA,IAEA,kBAAA,KAEA,CAtBR,kBAsBQ,CAAA,CAlMR,OAkMQ,OACI,QAAA,GACA,QAAA,MACA,UAAA,OAAA,SACA,WACI,UAAA,GAAA,CAAA,iBAAA,IAEJ,iBAAA,wMACA,MAAA,KACA,OAAA,mBACA,YACA,IACA,WAAA,OAGJ,CArCR,kBAqCQ,CAAA,CAjNR,OAiNQ,CA5LJ,OA6LQ,oBAAA,YACA,YAAA,IAEA,CAzCZ,kBAyCY,CAAA,CArNZ,OAqNY,CAhMR,MAgMQ,OACI,UAAA,OAAA,GAIR,CA9CR,kBA8CQ,CAAA,CA1NR,OA0NQ,OACI,MAAA,QAKJ,CApDR,mBAoDQ,CA9LR,aA8LQ,CA3MJ,cA4MQ,KAAA,EAAA,KAAA,IAMR,CAAA,iBAAA,CAAA,CA/OJ,aAgPQ,eAAA,OACA,cAAA,MAGJ,CALA,iBAKA,CAAA,CA1MJ,cA2MQ,YAAA,KAGJ,CATA,iBASA,CAAA,CAAA,cACI,QAAA,KACA,eAAA,IACA,cAAA,IAGJ,CAfA,kBAeA,CAAA,gBAAA,CAAA,KAAA,CAAA,YACI,WAAA,OACA,MAAA,EACA,OAAA,EAGJ,CArBA,kBAqBA,CANA,gBAMA,CAAA,MACI,QAAA,aACA,OAAA,QACA,SAAA,SACA,aAAA,KACA,aAAA,EACA,YAAA,KACA,YAAA,KAGJ,CA/BA,kBA+BA,CAhBA,gBAgBA,CAAA,KAAA,QACI,YAAA,QACA,QAAA,GACA,SAAA,SACA,IAAA,EACA,KAAA,EACA,OAAA,kBACA,IACA,MAAA,KACA,OAAA,KACA,OAAA,QAAA,IAAA,MACA,iBAAA,KAIJ,CA9CA,kBA8CA,CA/BA,iBA+BA,KAAA,CAAA,WAAA,QAAA,CAAA,KAAA,QACI,QAAA,QACA,iBAAA,QACA,WAAA,OACA,eAAA,OACA,UAAA,KACA,YAAA,IACA,QAAA,YACA,gBAAA,OACA,YAAA,OACA,MAAA,KAGJ,CA3DA,kBA2DA,CA5CA,iBA6CI,cAAA",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/build/runtime/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(()=>{var
|
|
1
|
+
"use strict";(()=>{var G="yfm-tabs",D="yfm-tab",h="yfm-tab-panel",Q="yfm-tab-list",d="active";var x="data-diplodoc-group",L="data-diplodoc-key",T="data-diplodoc-variant",U="data-diplodoc-id",W="defaultTabsGroup-";var F="data-diplodoc-forced";var w="yfm-tabs-dropdown-select";var E="yfm-tabs-vertical";var O=(g=>(g.Regular="regular",g.Radio="radio",g.Dropdown="dropdown",g.Accordion="accordion",g))(O||{}),v=Symbol.for("diplodocTabs");var B=n=>{let t=n.composedPath();return Array.isArray(t)&&t.length>0?t[0]:n.target},Z=n=>{let t=B(n);return!t||!t.matches},R=n=>Math.abs(n.scrollHeight-n.clientHeight)>1?n:n.parentElement?R(n.parentElement):void 0,H=(n,t)=>{let e=n.getBoundingClientRect(),o=t.getBoundingClientRect();return{top:e.top-o.top,left:e.left-o.left,scrollTop:t.scrollTop,scrollLeft:t.scrollLeft}};var m={TABS:`.${G}`,TAB_LIST:`.${Q}`,TAB:`.${D}`,TAB_PANEL:`.${h}`,VERTICAL_TABS:`.${E}`};function S(n){return n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function f(n,t,e){let o=n.querySelectorAll(`${m.TABS}[${x}="${S(t)}"]`),g=[];return o.forEach(c=>{c.querySelectorAll(m.TAB).forEach(i=>{i.getAttribute(L)===e&&g.push(i)})}),g}var y=class{constructor(t,e={}){this._onSelectTabHandlers=new Set;this._currentPageTabGroups=[];this._isRestoringTabs=!1;this._document=t,this._options=Object.assign({saveTabsToLocalStorage:!1,saveTabsToQueryStateMode:"none"},e),this._document.addEventListener("click",o=>{let g=B(o);if(o.target&&this.hideAllDropdown(o.target),Z(o))return;if(this.isElementDropdownSelect(g)){g.classList.toggle(d);return}if(!this.isValidTabElement(g))return;let c=this.getTabDataFromHTMLElement(g);c&&this._selectTab(c,g)}),this._document.addEventListener("keydown",o=>{let g=null;switch(o.key){case"ArrowLeft":{g="left";break}case"ArrowRight":{g="right";break}case"ArrowUp":{g="left";break}case"ArrowDown":{g="right";break}}if(!g)return;let c=B(o);if(Z(o)||!this.isValidTabElement(c))return;let{tabs:i,nodes:I}=this.getTabs(c),a=this.getTabDataFromHTMLElement(c),r=i.findIndex(({key:A})=>(a==null?void 0:a.key)&&A===a.key);if(!a||i.length<=1||r===-1)return;let s=(r+(g==="left"?-1:1)+i.length)%i.length;this.selectTab(i[s]),I[s].focus()})}configure(t){this._options=Object.assign(this._options,t)}onSelectTab(t){return this._onSelectTabHandlers.add(t),()=>{this._onSelectTabHandlers.delete(t)}}selectTabById(t,e){let o=this._document.querySelector(`${m.TAB}[${U}="${t}"]`);if(!o||!this.isValidTabElement(o))return;let g=this.getTabDataFromHTMLElement(o);g&&this._selectTab(g,o),e!=null&&e.scrollToElement&&o.scrollIntoView()}selectTab(t){this._selectTab(t)}restoreTabs(t){this._isRestoringTabs=!0;try{for(let[e,o]of Object.entries(t))if(e){let g={group:e,...o};this.selectTab(g)}}finally{this._isRestoringTabs=!1}}getTabsFromLocalStorage(){return JSON.parse(localStorage.getItem("tabsHistory")||"{}")}getTabsFromSearchQuery(){let t={},e=new URLSearchParams(window.location.search);return e.has("tabs")&&(e.get("tabs")||"").split(",").forEach(c=>{let i=c.split("_"),[I,a]=i,r="regular";if(i.length===3&&(r=i[2]),I&&a&&Object.values(O).includes(r)){let s=a;t[I]={key:s,variant:r}}}),t}updateLocalStorageWithTabs(t){this._options.saveTabsToLocalStorage&&(this._isRestoringTabs||localStorage.setItem("tabsHistory",JSON.stringify(t)))}updateQueryParamWithTabs(t){if(this._isRestoringTabs)return;let e=new URLSearchParams(window.location.search),o=Object.entries(t).map(([i,{key:I,variant:a}])=>a==="regular"?`${i}_${I}`:`${i}_${I}_${a}`);o.length>0?e.set("tabs",o.join(",")):e.delete("tabs");let g=history.state||{},c=new URL(window.location.href);c.search=e.toString(),window.history.replaceState({...g},document.title,c.href)}getCurrentPageTabHistory(t){return Object.fromEntries(Object.entries(t).filter(([e])=>this._currentPageTabGroups.includes(e)))}onPageChanged(){this._currentPageTabGroups=this.getCurrentPageTabGroups()}getCurrentPageTabGroups(){let t=this._document.getElementsByClassName(G),e=new Set;return Array.from(t).forEach(o=>{let g=o.getAttribute(x);g&&e.add(g)}),Array.from(e)}clearTabsPreferred(){localStorage.removeItem("tabsHistory"),this.updateQueryParamWithTabs({})}_selectTab(t,e){let{group:o,key:g,variant:c}=t;if(!o)return;this.saveTabPreferred({group:o,key:g,variant:c});let i=e&&R(e),I=i&&H(e,i);this.updateHTML({group:o,key:g,variant:c},e,c)>0&&(this.fireSelectTabEvent({group:o,key:g,variant:c},e==null?void 0:e.dataset.diplodocId),I&&this.resetScroll(e,i,I))}updateHTML(t,e,o){switch(o){case"radio":return this.updateHTMLRadio(t,e);case"accordion":return this.updateHTMLAccordion(t,e);case"regular":return this.updateHTMLRegular(t);case"dropdown":return this.updateHTMLDropdown(t);default:return 0}}saveTabPreferred(t){let e={};switch(this._options.saveTabsToLocalStorage&&(e=JSON.parse(localStorage.getItem("tabsHistory")||"{}")),e[t.group]={key:t.key,variant:t.variant},this._options.saveTabsToLocalStorage&&this.updateLocalStorageWithTabs(e),this._options.saveTabsToQueryStateMode){case"all":{this.updateQueryParamWithTabs(e);break}case"page":{this.updateQueryParamWithTabs(this.getCurrentPageTabHistory(e));break}}}updateHTMLRadio(t,e){let{group:o,key:g}=t,{isForced:c,root:i}=this.didTabOpenForce(e),I=f(this._document,o,g);c&&(I=I.filter(r=>r.getAttribute(F)==="true")),c&&(i==null||i.removeAttribute(F));let a=0;return I.forEach(r=>{let A=r.parentNode.children;for(let C=0;C<A.length;C+=2){let[b,l]=[A.item(C),A.item(C+1)],p=b.children.item(0);if(b===r){p.checked?(b.classList.remove("active"),l==null||l.classList.remove("active"),p.removeAttribute("checked")):(b.classList.add("active"),l==null||l.classList.add("active"),p.setAttribute("checked","true"));continue}p.hasAttribute("checked")&&(b.classList.remove("active"),l==null||l.classList.remove("active"),p.removeAttribute("checked")),a++}}),a}updateHTMLRegular(t){let{group:e,key:o}=t,g=f(this._document,e,o),c=0;return g.forEach(i=>{let I=i;if(!this.isValidTabElement(I)||I.dataset.diplodocIsActive==="true")return;c++;let a=i,r=a.parentNode,s=r==null?void 0:r.parentNode,A=Array.from((r==null?void 0:r.querySelectorAll(m.TAB))||[]),C=Array.from((s==null?void 0:s.children)||[]).filter(l=>l.classList.contains(h)),b=A.indexOf(a);A.forEach((l,p)=>{let X=C[p],u=p===b,N=l;N.dataset.diplodocIsActive=u?"true":"false",l.classList.toggle(d,u),l.setAttribute("aria-selected",u.toString()),l.setAttribute("tabindex",u?"0":"-1"),X.classList.toggle(d,u)})}),c}updateHTMLDropdown(t){let{group:e,key:o}=t,g=f(this._document,e,o),c=0;return g.forEach(i=>{let I=i.closest(`[${T}=dropdown]`);if(!(I!=null&&I.children))return;let a=I.children.item(0),r=I.children.item(1);a==null||a.classList.remove(d);let s=Array.from((r==null?void 0:r.children)||[]).indexOf(i)+2;for(let A=2;A<I.children.length;A++){let C=I.children.item(A),b=r==null?void 0:r.children.item(A-2);if(c++,s===A){C==null||C.classList.add(d),b.classList.add(d),a.innerHTML=i.innerHTML,a.classList.add("filled");continue}b.classList.remove(d),C.classList.remove(d)}}),c}updateHTMLAccordion(t,e){let{group:o,key:g}=t,c=f(this._document,o,g),i=0;return c.forEach(I=>{let a=I.closest(`[${T}=accordion]`);if(a!=null&&a.children)for(let r=0;r<a.children.length;r+=2){let s=a.children.item(r),A=a.children.item(r+1);if(i++,I===s){s==null||s.classList.toggle(d),A==null||A.classList.toggle(d);continue}s==null||s.classList.remove(d),A==null||A.classList.remove(d)}}),e&&!this.checkVisible(e)&&setTimeout(()=>{e.scrollIntoView({block:"nearest"})}),i}checkVisible(t){let e=t.getBoundingClientRect(),o=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-o>=0)}hideAllDropdown(t){this._document.querySelectorAll(".yfm-tabs-dropdown-select.active").forEach(o=>{o.contains(t)||o.classList.remove(d)})}resetScroll(t,e,o){let g=H(t,e),c=g.top-o.top,i=g.left-o.left,I=g.scrollTop-o.scrollTop,a=g.scrollLeft-o.scrollLeft;e.scrollTo(e.scrollLeft+i-a,e.scrollTop+c-I)}didTabOpenForce(t){if(!t)return{};if(t.dataset.diplodocForced)return{root:t,isForced:!0};let e=t.dataset.diplodocVerticalTab?t:t.parentElement,o=typeof(e==null?void 0:e.dataset.diplodocForced)!="undefined";return{root:e,isForced:o}}fireSelectTabEvent(t,e){let{group:o,key:g,variant:c}=t,i=o.startsWith(W)?{key:g,variant:c}:t;this._onSelectTabHandlers.forEach(I=>{I({tab:i,currentTabId:e})})}getTabsType(t){let e=t.closest(`[${T}]`);if(e)return e.dataset.diplodocVariant}isValidTabElement(t){return!!this.getTabsType(t)}isElementDropdownSelect(t){return t.classList.contains(w)}getTabDataFromHTMLElement(t){var c,i,I;let e=this.getTabsType(t);if(e==="radio"){let a=t.dataset.diplodocVerticalTab?t:t.parentElement,r=a.dataset.diplodocKey,s=(c=a.closest(m.TABS))==null?void 0:c.dataset.diplodocGroup;return r&&s?{group:s,key:r,variant:"radio"}:null}if(e==="dropdown"||e==="accordion"){let a=t.dataset.diplodocKey,r=(i=t.closest(m.TABS))==null?void 0:i.dataset.diplodocGroup;return a&&r?{group:r,key:a,variant:e}:null}let o=t.dataset.diplodocKey,g=(I=t.closest(m.TABS))==null?void 0:I.dataset.diplodocGroup;return o&&g?{group:g,key:o,variant:"regular"}:null}getTabs(t){var c,i;let e=(c=t.closest(m.TABS))==null?void 0:c.dataset.diplodocGroup,o=(i=t.closest(m.TAB_LIST))==null?void 0:i.querySelectorAll(m.TAB),g=[];return o.forEach(I=>{let a=I==null?void 0:I.dataset.diplodocKey;a&&g.push({group:e,key:a,variant:"regular"})}),{tabs:g,nodes:o}}};typeof window!="undefined"&&typeof document!="undefined"&&!window[v]&&(window[v]=new y(document));})();
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/common.ts", "../../src/runtime/utils.ts", "../../src/runtime/TabsController.ts", "../../src/runtime/index.ts"],
|
|
4
|
-
"sourcesContent": ["import {type TabsController} from './runtime/TabsController';\n\nexport const TAB_RE = /`?{% list tabs .*?%}`?/;\nexport const TABS_CLASSNAME = 'yfm-tabs';\nexport const TAB_CLASSNAME = 'yfm-tab';\nexport const TAB_PANEL_CLASSNAME = 'yfm-tab-panel';\nexport const TABS_LIST_CLASSNAME = 'yfm-tab-list';\nexport const ACTIVE_CLASSNAME = 'active';\nexport const TAB_GROUP_CLASSNAME = 'yfm-tab-group';\nexport const TAB_ACTIVE_KEY = 'data-diplodoc-is-active';\nexport const GROUP_DATA_KEY = 'data-diplodoc-group';\nexport const TAB_DATA_KEY = 'data-diplodoc-key';\nexport const TAB_DATA_VARIANT = 'data-diplodoc-variant';\nexport const TAB_DATA_ID = 'data-diplodoc-id';\nexport const DEFAULT_TABS_GROUP_PREFIX = 'defaultTabsGroup-';\nexport const ACTIVE_TAB_TEXT = '{selected}';\nexport const TAB_FORCED_OPEN = 'data-diplodoc-forced';\n\nexport const TABS_DROPDOWN_CLASSNAME = 'yfm-tabs-dropdown';\nexport const TABS_DROPDOWN_MENU_CLASSNAME = 'yfm-tabs-dropdown-menu';\nexport const TABS_DROPDOWN_SELECT = 'yfm-tabs-dropdown-select';\n\nexport const TABS_ACCORDION_CLASSNAME = 'yfm-tabs-accordion';\nexport const TABS_ACCORDION_CLIENT_HEIGHT = 'data-yfm-tabs-accordion-client-heights';\n\nexport const TABS_RADIO_CLASSNAME = 'yfm-tabs-vertical';\nexport const VERTICAL_TAB_CLASSNAME = 'yfm-vertical-tab';\nexport const TAB_DATA_VERTICAL_TAB = 'data-diplodoc-vertical-tab';\nexport const TAB_RADIO_KEY = 'data-diplodoc-input';\n\nexport enum TabsVariants {\n Regular = 'regular',\n Radio = 'radio',\n Dropdown = 'dropdown',\n Accordion = 'accordion',\n}\n\nexport type EnabledVariants = Partial<Record<TabsVariants, boolean>>;\n\nexport interface Tab {\n group?: string;\n key: string;\n variant: TabsVariants;\n}\n\nexport interface SelectedTabEvent {\n tab: Tab;\n currentTabId?: string;\n}\n\nexport const GLOBAL_SYMBOL: unique symbol = Symbol.for('diplodocTabs');\n\ndeclare global {\n interface Window {\n [GLOBAL_SYMBOL]: TabsController;\n }\n}\n", "export const getEventTarget = (event: Event) => {\n const path = event.composedPath();\n return Array.isArray(path) && path.length > 0 ? path[0] : event.target;\n};\n\nexport const isCustom = (event: Event) => {\n const target = getEventTarget(event);\n return !target || !(target as HTMLElement).matches;\n};\n\nexport const getClosestScrollableParent = (element: HTMLElement): HTMLElement | undefined => {\n if (Math.abs(element.scrollHeight - element.clientHeight) > 1) {\n return element;\n }\n\n return element.parentElement ? getClosestScrollableParent(element.parentElement) : undefined;\n};\n\nexport interface ElementOffset {\n top: number;\n left: number;\n scrollTop: number;\n scrollLeft: number;\n}\n\nexport const getOffsetByScrollableParent = (\n element: HTMLElement,\n scrollableParent: HTMLElement,\n): ElementOffset => {\n const elementBounds = element.getBoundingClientRect();\n const scrollableParentBounds = scrollableParent.getBoundingClientRect();\n return {\n top: elementBounds.top - scrollableParentBounds.top,\n left: elementBounds.left - scrollableParentBounds.left,\n scrollTop: scrollableParent.scrollTop,\n scrollLeft: scrollableParent.scrollLeft,\n };\n};\n", "import {\n ACTIVE_CLASSNAME,\n DEFAULT_TABS_GROUP_PREFIX,\n GROUP_DATA_KEY,\n SelectedTabEvent,\n TABS_CLASSNAME,\n TABS_DROPDOWN_SELECT,\n TABS_LIST_CLASSNAME,\n TABS_RADIO_CLASSNAME,\n TAB_CLASSNAME,\n TAB_DATA_ID,\n TAB_DATA_KEY,\n TAB_DATA_VARIANT,\n TAB_FORCED_OPEN,\n TAB_PANEL_CLASSNAME,\n Tab,\n TabsVariants,\n} from '../common';\n\nimport {\n ElementOffset,\n getClosestScrollableParent,\n getEventTarget,\n getOffsetByScrollableParent,\n isCustom,\n} from './utils';\n\nconst Selector = {\n TABS: `.${TABS_CLASSNAME}`,\n TAB_LIST: `.${TABS_LIST_CLASSNAME}`,\n TAB: `.${TAB_CLASSNAME}`,\n TAB_PANEL: `.${TAB_PANEL_CLASSNAME}`,\n VERTICAL_TABS: `.${TABS_RADIO_CLASSNAME}`,\n};\n\nexport interface ISelectTabByIdOptions {\n scrollToElement: boolean;\n}\n\ntype Handler = (data: SelectedTabEvent) => void;\n\ntype TabSwitchDirection = 'left' | 'right';\n\nexport type TabsHistory = Record<string, {key: string; variant: TabsVariants}>;\n\nexport type TabsControllerOptions = {\n saveTabsToLocalStorage: boolean;\n saveTabsToQueryStateMode: 'all' | 'page' | 'none';\n};\n\nexport class TabsController {\n private _document: Document;\n private _onSelectTabHandlers: Set<Handler> = new Set();\n private _options: TabsControllerOptions;\n private _currentPageTabGroups: string[] = [];\n private _isRestoringTabs = false;\n\n // TODO: remove side effects from constructor\n constructor(document: Document, options: Partial<TabsControllerOptions> = {}) {\n this._document = document;\n this._options = Object.assign(\n {\n saveTabsToLocalStorage: false,\n saveTabsToQueryStateMode: 'none',\n },\n options,\n );\n\n this._document.addEventListener('click', (event) => {\n const target = getEventTarget(event) as HTMLElement;\n\n if (event.target) {\n this.hideAllDropdown(event.target as HTMLElement);\n }\n\n if (isCustom(event)) {\n return;\n }\n\n if (this.isElementDropdownSelect(target)) {\n target.classList.toggle(ACTIVE_CLASSNAME);\n\n return;\n }\n\n if (!this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n\n if (tab) {\n this._selectTab(tab, target);\n }\n });\n\n this._document.addEventListener('keydown', (event) => {\n let direction: TabSwitchDirection | null = null;\n switch (event.key) {\n case 'ArrowLeft': {\n direction = 'left';\n break;\n }\n case 'ArrowRight': {\n direction = 'right';\n break;\n }\n case 'ArrowUp': {\n direction = 'left';\n break;\n }\n case 'ArrowDown': {\n direction = 'right';\n break;\n }\n }\n if (!direction) {\n return;\n }\n\n const target = getEventTarget(event) as HTMLElement;\n\n if (isCustom(event) || !this.isValidTabElement(target)) {\n return;\n }\n\n const {tabs, nodes} = this.getTabs(target);\n const currentTab = this.getTabDataFromHTMLElement(target);\n const currentTabIndex = tabs.findIndex(\n ({key}) => currentTab?.key && key === currentTab.key,\n );\n if (!currentTab || tabs.length <= 1 || currentTabIndex === -1) {\n return;\n }\n\n const newIndex =\n (currentTabIndex + (direction === 'left' ? -1 : 1) + tabs.length) % tabs.length;\n\n this.selectTab(tabs[newIndex]);\n nodes[newIndex].focus();\n });\n }\n\n configure(options: Partial<TabsControllerOptions>) {\n this._options = Object.assign(this._options, options);\n }\n\n onSelectTab(handler: Handler) {\n this._onSelectTabHandlers.add(handler);\n\n return () => {\n this._onSelectTabHandlers.delete(handler);\n };\n }\n\n selectTabById(id: string, options?: ISelectTabByIdOptions) {\n const target = this._document.querySelector(\n `${Selector.TAB}[${TAB_DATA_ID}=\"${id}\"]`,\n ) as HTMLElement;\n\n if (!target || !this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n\n if (tab) {\n this._selectTab(tab, target);\n }\n\n if (options?.scrollToElement) {\n target.scrollIntoView();\n }\n }\n\n selectTab(tab: Tab) {\n this._selectTab(tab);\n }\n\n restoreTabs(tabsHistory: TabsHistory) {\n this._isRestoringTabs = true;\n try {\n for (const [group, fields] of Object.entries(tabsHistory)) {\n if (group) {\n const tab = {group, ...fields};\n this.selectTab(tab);\n }\n }\n } finally {\n this._isRestoringTabs = false;\n }\n }\n\n getTabsFromLocalStorage(): TabsHistory {\n return JSON.parse(localStorage.getItem('tabsHistory') || '{}') as TabsHistory;\n }\n\n getTabsFromSearchQuery(): TabsHistory {\n const tabsHistory = {} as TabsHistory;\n const urlParams = new URLSearchParams(window.location.search);\n if (urlParams.has('tabs')) {\n const tabsFromQuery = urlParams.get('tabs') || '';\n const tabConfigs = tabsFromQuery.split(',');\n\n tabConfigs.forEach((config) => {\n const splitConfig = config.split('_');\n const [group, key] = splitConfig;\n let variant = TabsVariants.Regular;\n if (splitConfig.length === 3) {\n variant = splitConfig[2] as TabsVariants;\n }\n\n if (group && key && Object.values(TabsVariants).includes(variant)) {\n const keyWithSpaces = key;\n tabsHistory[group] = {key: keyWithSpaces, variant: variant};\n }\n });\n }\n\n return tabsHistory;\n }\n\n updateLocalStorageWithTabs(tabsHistory: TabsHistory) {\n if (!this._options.saveTabsToLocalStorage) {\n return;\n }\n\n // Don't update localStorage if we're just restoring tabs\n if (this._isRestoringTabs) {\n return;\n }\n\n localStorage.setItem('tabsHistory', JSON.stringify(tabsHistory));\n }\n\n updateQueryParamWithTabs(tabsHistory: TabsHistory) {\n // Don't update URL if we're just restoring tabs\n if (this._isRestoringTabs) {\n return;\n }\n\n const urlParams = new URLSearchParams(window.location.search);\n const tabsArray = Object.entries(tabsHistory).map(([group, {key, variant}]) => {\n if (variant === TabsVariants.Regular) {\n return `${group}_${key}`;\n }\n return `${group}_${key}_${variant}`;\n });\n\n // Clear or set tabs parameter\n if (tabsArray.length > 0) {\n urlParams.set('tabs', tabsArray.join(','));\n } else {\n urlParams.delete('tabs');\n }\n\n // Preserve existing state\n const currentState = history.state || {};\n\n // Use URL constructor for proper URL handling\n const url = new URL(window.location.href);\n url.search = urlParams.toString();\n\n window.history.replaceState({...currentState}, document.title, url.href);\n }\n\n getCurrentPageTabHistory(tabsHistory: TabsHistory) {\n return Object.fromEntries(\n Object.entries(tabsHistory).filter(([group]) =>\n this._currentPageTabGroups.includes(group),\n ),\n );\n }\n\n onPageChanged() {\n this._currentPageTabGroups = this.getCurrentPageTabGroups();\n }\n\n getCurrentPageTabGroups(): string[] {\n const tabs = this._document.getElementsByClassName(TABS_CLASSNAME);\n const groups = new Set<string>();\n\n Array.from(tabs).forEach((tab) => {\n const group = tab.getAttribute(GROUP_DATA_KEY);\n if (group) {\n groups.add(group);\n }\n });\n\n return Array.from(groups);\n }\n\n clearTabsPreferred() {\n localStorage.removeItem('tabsHistory');\n this.updateQueryParamWithTabs({});\n }\n\n private _selectTab(tab: Tab, targetTab?: HTMLElement) {\n const {group, key, variant} = tab;\n\n if (!group) {\n return;\n }\n\n this.saveTabPreferred({group, key, variant});\n\n const scrollableParent = targetTab && getClosestScrollableParent(targetTab);\n const previousTargetOffset =\n scrollableParent && getOffsetByScrollableParent(targetTab, scrollableParent);\n\n const updatedTabs = this.updateHTML({group, key, variant}, targetTab, variant);\n\n if (updatedTabs > 0) {\n this.fireSelectTabEvent({group, key, variant}, targetTab?.dataset.diplodocId);\n\n if (previousTargetOffset) {\n this.resetScroll(targetTab, scrollableParent, previousTargetOffset);\n }\n }\n }\n\n private updateHTML(tab: Required<Tab>, target: HTMLElement | undefined, variant: TabsVariants) {\n switch (variant) {\n case TabsVariants.Radio: {\n return this.updateHTMLRadio(tab, target);\n }\n case TabsVariants.Accordion: {\n return this.updateHTMLAccordion(tab, target);\n }\n case TabsVariants.Regular: {\n return this.updateHTMLRegular(tab);\n }\n case TabsVariants.Dropdown: {\n return this.updateHTMLDropdown(tab);\n }\n default: {\n return 0;\n }\n }\n }\n\n private saveTabPreferred(tab: Required<Tab>) {\n let tabsHistory = {} as TabsHistory;\n\n if (this._options.saveTabsToLocalStorage) {\n tabsHistory = JSON.parse(localStorage.getItem('tabsHistory') || '{}');\n }\n\n tabsHistory[tab.group] = {key: tab.key, variant: tab.variant};\n\n if (this._options.saveTabsToLocalStorage) {\n this.updateLocalStorageWithTabs(tabsHistory);\n }\n\n switch (this._options.saveTabsToQueryStateMode) {\n case 'all': {\n this.updateQueryParamWithTabs(tabsHistory);\n break;\n }\n case 'page': {\n this.updateQueryParamWithTabs(this.getCurrentPageTabHistory(tabsHistory));\n break;\n }\n }\n }\n\n private updateHTMLRadio(tab: Required<Tab>, target: HTMLElement | undefined) {\n const {group, key} = tab;\n\n const {isForced, root} = this.didTabOpenForce(target);\n\n const singleTabSelector = isForced ? `.yfm-vertical-tab[${TAB_FORCED_OPEN}=\"true\"]` : '';\n\n const tabs = this._document.querySelectorAll(\n `${Selector.TABS}[${GROUP_DATA_KEY}=\"${group}\"] ${Selector.TAB}[${TAB_DATA_KEY}=\"${key}\"]${singleTabSelector}`,\n );\n\n if (isForced) {\n root?.removeAttribute(TAB_FORCED_OPEN);\n }\n\n let updated = 0;\n\n tabs.forEach((tab) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const root = tab.parentNode!;\n const elements = root.children;\n\n for (let i = 0; i < elements.length; i += 2) {\n const [title, content] = [elements.item(i), elements.item(i + 1)] as HTMLElement[];\n\n const input = title.children.item(0) as HTMLInputElement;\n\n if (title === tab) {\n const checked = input.checked;\n\n if (checked) {\n title.classList.remove('active');\n content?.classList.remove('active');\n\n input.removeAttribute('checked');\n } else {\n title.classList.add('active');\n content?.classList.add('active');\n\n input.setAttribute('checked', 'true');\n }\n\n continue;\n }\n\n if (input.hasAttribute('checked')) {\n title.classList.remove('active');\n content?.classList.remove('active');\n\n input.removeAttribute('checked');\n }\n\n updated++;\n }\n });\n\n return updated;\n }\n\n private updateHTMLRegular(tab: Required<Tab>) {\n const {group, key} = tab;\n\n const tabs = this._document.querySelectorAll(\n `${Selector.TABS}[${GROUP_DATA_KEY}=\"${group}\"] ${Selector.TAB}[${TAB_DATA_KEY}=\"${key}\"]`,\n );\n\n let updated = 0;\n\n tabs.forEach((element) => {\n const htmlElem = element as HTMLElement;\n if (!this.isValidTabElement(htmlElem) || htmlElem.dataset.diplodocIsActive === 'true') {\n return;\n }\n\n updated++;\n\n const tab = element;\n const tabList = tab.parentNode;\n const tabsContainer = tabList?.parentNode;\n const allTabs = Array.from(tabList?.querySelectorAll(Selector.TAB) || []);\n const allPanels = Array.from(tabsContainer?.children || []).filter((node) =>\n node.classList.contains(TAB_PANEL_CLASSNAME),\n );\n const targetIndex = allTabs.indexOf(tab);\n\n allTabs.forEach((tab, i) => {\n const panel = allPanels[i];\n const isTargetTab = i === targetIndex;\n const htmlElem = tab as HTMLElement;\n\n htmlElem.dataset.diplodocIsActive = isTargetTab ? 'true' : 'false';\n\n tab.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n tab.setAttribute('aria-selected', isTargetTab.toString());\n tab.setAttribute('tabindex', isTargetTab ? '0' : '-1');\n panel.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n });\n });\n\n return updated;\n }\n\n private updateHTMLDropdown(tab: Required<Tab>) {\n const {group, key} = tab;\n\n const tabs = this._document.querySelectorAll(\n `${Selector.TABS}[${GROUP_DATA_KEY}=\"${group}\"] ${Selector.TAB}[${TAB_DATA_KEY}=\"${key}\"]`,\n );\n\n let changed = 0;\n\n tabs.forEach((tab) => {\n const dropdown = tab.closest(`[${TAB_DATA_VARIANT}=${TabsVariants.Dropdown}]`);\n\n if (!dropdown?.children) {\n return;\n }\n\n const select = dropdown.children.item(0) as HTMLElement;\n const menu = dropdown.children.item(1);\n\n select?.classList.remove(ACTIVE_CLASSNAME);\n\n /* first and second elements are select / menu, skipping them */\n const changedIndex = Array.from(menu?.children || []).indexOf(tab) + 2;\n\n for (let i = 2; i < dropdown.children.length; i++) {\n const item = dropdown.children.item(i) as HTMLElement;\n const menuItem = menu?.children.item(i - 2) as HTMLElement;\n\n changed++;\n\n if (changedIndex === i) {\n item?.classList.add(ACTIVE_CLASSNAME);\n menuItem.classList.add(ACTIVE_CLASSNAME);\n\n select.innerHTML = tab.innerHTML;\n select.classList.add('filled');\n\n continue;\n }\n\n menuItem.classList.remove(ACTIVE_CLASSNAME);\n item.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n\n return changed;\n }\n\n private updateHTMLAccordion(tab: Required<Tab>, target: HTMLElement | undefined) {\n const {group, key} = tab;\n\n const tabs = this._document.querySelectorAll(\n `${Selector.TABS}[${GROUP_DATA_KEY}=\"${group}\"] ${Selector.TAB}[${TAB_DATA_KEY}=\"${key}\"]`,\n );\n\n let changed = 0;\n\n tabs.forEach((tab) => {\n const accordion = tab.closest(`[${TAB_DATA_VARIANT}=${TabsVariants.Accordion}]`);\n\n if (!accordion?.children) {\n return;\n }\n\n for (let i = 0; i < accordion.children.length; i += 2) {\n const title = accordion.children.item(i);\n const currentTab = accordion.children.item(i + 1);\n\n changed++;\n\n if (tab === title) {\n title?.classList.toggle(ACTIVE_CLASSNAME);\n currentTab?.classList.toggle(ACTIVE_CLASSNAME);\n\n continue;\n }\n\n title?.classList.remove(ACTIVE_CLASSNAME);\n currentTab?.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n\n if (target && !this.checkVisible(target)) {\n setTimeout(() => {\n target.scrollIntoView({block: 'nearest'});\n });\n }\n\n return changed;\n }\n\n private checkVisible(element: HTMLElement) {\n const rect = element.getBoundingClientRect();\n const viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight);\n\n return !(rect.bottom < 0 || rect.top - viewHeight >= 0);\n }\n\n private hideAllDropdown(target: HTMLElement) {\n const dropdowns = this._document.querySelectorAll('.yfm-tabs-dropdown-select.active');\n\n dropdowns.forEach((menu) => {\n if (!menu.contains(target)) {\n menu.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n }\n\n private resetScroll(\n target: HTMLElement,\n scrollableParent: HTMLElement,\n previousTargetOffset: ElementOffset,\n ) {\n const targetOffset = getOffsetByScrollableParent(target, scrollableParent);\n const topDelta = targetOffset.top - previousTargetOffset.top;\n const leftDelta = targetOffset.left - previousTargetOffset.left;\n const scrollTopDelta = targetOffset.scrollTop - previousTargetOffset.scrollTop;\n const scrollLeftDelta = targetOffset.scrollLeft - previousTargetOffset.scrollLeft;\n scrollableParent.scrollTo(\n scrollableParent.scrollLeft + leftDelta - scrollLeftDelta,\n scrollableParent.scrollTop + topDelta - scrollTopDelta,\n );\n }\n\n private didTabOpenForce(target?: HTMLElement) {\n if (!target) {\n return {};\n }\n\n if (target.dataset.diplodocForced) {\n return {root: target, isForced: true};\n }\n\n const root = target.dataset.diplodocVerticalTab ? target : target.parentElement;\n\n const isForced = typeof root?.dataset.diplodocForced !== 'undefined';\n\n return {root, isForced};\n }\n\n private fireSelectTabEvent(tab: Required<Tab>, diplodocId?: string) {\n const {group, key, variant: align} = tab;\n\n const eventTab: Tab = group.startsWith(DEFAULT_TABS_GROUP_PREFIX)\n ? {key, variant: align}\n : tab;\n\n this._onSelectTabHandlers.forEach((handler) => {\n handler({tab: eventTab, currentTabId: diplodocId});\n });\n }\n\n private getTabsType(element: HTMLElement) {\n const tabsRoot = element.closest(`[${TAB_DATA_VARIANT}]`) as HTMLElement | undefined;\n\n if (!tabsRoot) {\n return undefined;\n }\n\n return tabsRoot.dataset.diplodocVariant;\n }\n\n private isValidTabElement(element: HTMLElement) {\n return Boolean(this.getTabsType(element));\n }\n\n private isElementDropdownSelect(target: HTMLElement) {\n return target.classList.contains(TABS_DROPDOWN_SELECT);\n }\n\n private getTabDataFromHTMLElement(target: HTMLElement): Tab | null {\n const type = this.getTabsType(target);\n\n if (type === TabsVariants.Radio) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const tab = target.dataset.diplodocVerticalTab ? target : target.parentElement!;\n\n const key = tab.dataset.diplodocKey;\n const group = (tab.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: TabsVariants.Radio} : null;\n }\n\n if (type === TabsVariants.Dropdown || type === TabsVariants.Accordion) {\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: type} : null;\n }\n\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: TabsVariants.Regular} : null;\n }\n\n private getTabs(target: HTMLElement): {tabs: Tab[]; nodes: NodeListOf<HTMLElement>} {\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n const nodes = (\n target.closest(Selector.TAB_LIST) as HTMLElement\n )?.querySelectorAll<HTMLElement>(Selector.TAB);\n\n const tabs: Tab[] = [];\n nodes.forEach((tabEl) => {\n const key = tabEl?.dataset.diplodocKey;\n if (!key) {\n return;\n }\n\n /** horizontal-only supported feature (used in left/right button click) */\n tabs.push({\n group,\n key,\n variant: TabsVariants.Regular,\n });\n });\n\n return {tabs, nodes};\n }\n}\n", "import {GLOBAL_SYMBOL} from '../common';\n\nimport {TabsController} from './TabsController';\nimport './scss/tabs.scss';\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined' && !window[GLOBAL_SYMBOL]) {\n window[GLOBAL_SYMBOL] = new TabsController(document);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["TABS_CLASSNAME", "TAB_CLASSNAME", "TAB_PANEL_CLASSNAME", "TABS_LIST_CLASSNAME", "ACTIVE_CLASSNAME", "GROUP_DATA_KEY", "TAB_DATA_KEY", "TAB_DATA_VARIANT", "TAB_DATA_ID", "DEFAULT_TABS_GROUP_PREFIX", "TAB_FORCED_OPEN", "TABS_DROPDOWN_SELECT", "TABS_RADIO_CLASSNAME", "TabsVariants", "GLOBAL_SYMBOL", "getEventTarget", "event", "path", "isCustom", "target", "getClosestScrollableParent", "element", "getOffsetByScrollableParent", "scrollableParent", "elementBounds", "scrollableParentBounds", "Selector", "TABS_CLASSNAME", "TABS_LIST_CLASSNAME", "TAB_CLASSNAME", "TAB_PANEL_CLASSNAME", "TABS_RADIO_CLASSNAME", "TabsController", "document", "options", "event", "target", "getEventTarget", "isCustom", "ACTIVE_CLASSNAME", "
|
|
4
|
+
"sourcesContent": ["/**\n * Shared constants, types and globals for the tabs extension.\n * Used by both the MarkdownIt plugin (compile-time) and the runtime controller (DOM).\n */\nimport {type TabsController} from './runtime/TabsController';\n\n/** Regex to match the opening `{% list tabs ... %}` tag (optionally backtick-escaped). */\nexport const TAB_RE = /`?{% list tabs .*?%}`?/;\n\n/** CSS class names for tab structure. */\nexport const TABS_CLASSNAME = 'yfm-tabs';\nexport const TAB_CLASSNAME = 'yfm-tab';\nexport const TAB_PANEL_CLASSNAME = 'yfm-tab-panel';\nexport const TABS_LIST_CLASSNAME = 'yfm-tab-list';\nexport const ACTIVE_CLASSNAME = 'active';\nexport const TAB_GROUP_CLASSNAME = 'yfm-tab-group';\n\n/** Data attributes used by the runtime to identify groups, keys, variants and active state. */\nexport const TAB_ACTIVE_KEY = 'data-diplodoc-is-active';\nexport const GROUP_DATA_KEY = 'data-diplodoc-group';\nexport const TAB_DATA_KEY = 'data-diplodoc-key';\nexport const TAB_DATA_VARIANT = 'data-diplodoc-variant';\nexport const TAB_DATA_ID = 'data-diplodoc-id';\nexport const DEFAULT_TABS_GROUP_PREFIX = 'defaultTabsGroup-';\nexport const ACTIVE_TAB_TEXT = '{selected}';\nexport const TAB_FORCED_OPEN = 'data-diplodoc-forced';\n\n/** Dropdown variant: container, menu and select element class names. */\nexport const TABS_DROPDOWN_CLASSNAME = 'yfm-tabs-dropdown';\nexport const TABS_DROPDOWN_MENU_CLASSNAME = 'yfm-tabs-dropdown-menu';\nexport const TABS_DROPDOWN_SELECT = 'yfm-tabs-dropdown-select';\n\n/** Accordion variant. */\nexport const TABS_ACCORDION_CLASSNAME = 'yfm-tabs-accordion';\nexport const TABS_ACCORDION_CLIENT_HEIGHT = 'data-yfm-tabs-accordion-client-heights';\n\n/** Radio (vertical) variant. */\nexport const TABS_RADIO_CLASSNAME = 'yfm-tabs-vertical';\nexport const VERTICAL_TAB_CLASSNAME = 'yfm-vertical-tab';\nexport const TAB_DATA_VERTICAL_TAB = 'data-diplodoc-vertical-tab';\nexport const TAB_RADIO_KEY = 'data-diplodoc-input';\n\n/** Available tab block variants (regular horizontal, radio, dropdown, accordion). */\nexport enum TabsVariants {\n Regular = 'regular',\n Radio = 'radio',\n Dropdown = 'dropdown',\n Accordion = 'accordion',\n}\n\n/** Which variants are enabled in the plugin (others fall back to Regular). */\nexport type EnabledVariants = Partial<Record<TabsVariants, boolean>>;\n\n/** Identifies a tab: group id, tab key (from content), and variant. */\nexport interface Tab {\n group?: string;\n key: string;\n variant: TabsVariants;\n}\n\n/** Payload passed to onSelectTab handlers when a tab is switched. */\nexport interface SelectedTabEvent {\n tab: Tab;\n currentTabId?: string;\n}\n\n/** Symbol under which the global TabsController instance is stored on `window`. */\nexport const GLOBAL_SYMBOL: unique symbol = Symbol.for('diplodocTabs');\n\ndeclare global {\n interface Window {\n [GLOBAL_SYMBOL]: TabsController;\n }\n}\n", "/**\n * Event target considering shadow DOM (composedPath()[0] or fallback to target).\n * @param event - DOM event\n * @returns Target element\n */\nexport const getEventTarget = (event: Event) => {\n const path = event.composedPath();\n return Array.isArray(path) && path.length > 0 ? path[0] : event.target;\n};\n\n/**\n * True if the event target is a custom element (or missing), so we skip tab handling.\n * @param event - DOM event\n * @returns Whether to ignore\n */\nexport const isCustom = (event: Event) => {\n const target = getEventTarget(event);\n return !target || !(target as HTMLElement).matches;\n};\n\n/**\n * Nearest ancestor (or self) that has overflow scroll. Used to preserve scroll when switching tabs.\n * @param element - Starting element\n * @returns Scrollable parent or undefined\n */\nexport const getClosestScrollableParent = (element: HTMLElement): HTMLElement | undefined => {\n if (Math.abs(element.scrollHeight - element.clientHeight) > 1) {\n return element;\n }\n\n return element.parentElement ? getClosestScrollableParent(element.parentElement) : undefined;\n};\n\n/** Position and scroll values used to restore scroll after tab switch. */\nexport interface ElementOffset {\n top: number;\n left: number;\n scrollTop: number;\n scrollLeft: number;\n}\n\n/**\n * Offset of element relative to scrollable parent and parent's scroll position.\n * @param element - Child element\n * @param scrollableParent - Scroll container\n * @returns Offset and scroll values\n */\nexport const getOffsetByScrollableParent = (\n element: HTMLElement,\n scrollableParent: HTMLElement,\n): ElementOffset => {\n const elementBounds = element.getBoundingClientRect();\n const scrollableParentBounds = scrollableParent.getBoundingClientRect();\n return {\n top: elementBounds.top - scrollableParentBounds.top,\n left: elementBounds.left - scrollableParentBounds.left,\n scrollTop: scrollableParent.scrollTop,\n scrollLeft: scrollableParent.scrollLeft,\n };\n};\n", "import type {SelectedTabEvent, Tab} from '../common';\nimport type {ElementOffset} from './utils';\n\nimport {\n ACTIVE_CLASSNAME,\n DEFAULT_TABS_GROUP_PREFIX,\n GROUP_DATA_KEY,\n TABS_CLASSNAME,\n TABS_DROPDOWN_SELECT,\n TABS_LIST_CLASSNAME,\n TABS_RADIO_CLASSNAME,\n TAB_CLASSNAME,\n TAB_DATA_ID,\n TAB_DATA_KEY,\n TAB_DATA_VARIANT,\n TAB_FORCED_OPEN,\n TAB_PANEL_CLASSNAME,\n TabsVariants,\n} from '../common';\n\nimport {\n getClosestScrollableParent,\n getEventTarget,\n getOffsetByScrollableParent,\n isCustom,\n} from './utils';\n\nconst Selector = {\n TABS: `.${TABS_CLASSNAME}`,\n TAB_LIST: `.${TABS_LIST_CLASSNAME}`,\n TAB: `.${TAB_CLASSNAME}`,\n TAB_PANEL: `.${TAB_PANEL_CLASSNAME}`,\n VERTICAL_TABS: `.${TABS_RADIO_CLASSNAME}`,\n};\n\n/**\n * Escape value for use in a CSS attribute selector (e.g. group id).\n * @param value - Raw attribute value.\n * @returns Escaped string safe for use inside [attr=\"...\"].\n */\nfunction escapeCssAttrValue(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Find tab elements by group and key without putting key in a selector (keys may contain %, spaces, etc.).\n * @param doc - Document to query.\n * @param group - Group id.\n * @param key - Tab key (data-tabs-key value).\n * @returns Matching tab elements.\n */\nfunction findTabsByGroupAndKey(doc: Document, group: string, key: string): Element[] {\n const containers = doc.querySelectorAll(\n `${Selector.TABS}[${GROUP_DATA_KEY}=\"${escapeCssAttrValue(group)}\"]`,\n );\n const result: Element[] = [];\n containers.forEach((container) => {\n container.querySelectorAll(Selector.TAB).forEach((tab) => {\n if (tab.getAttribute(TAB_DATA_KEY) === key) {\n result.push(tab);\n }\n });\n });\n return result;\n}\n\n/** Options for selectTabById (e.g. scroll the selected tab into view). */\nexport interface ISelectTabByIdOptions {\n scrollToElement: boolean;\n}\n\ntype Handler = (data: SelectedTabEvent) => void;\n\ntype TabSwitchDirection = 'left' | 'right';\n\n/** Persisted tab state: group id -> { key, variant }. Used for localStorage and URL. */\nexport type TabsHistory = Record<string, {key: string; variant: TabsVariants}>;\n\n/** Controller options: whether to persist selection to localStorage and/or URL query. */\nexport type TabsControllerOptions = {\n saveTabsToLocalStorage: boolean;\n saveTabsToQueryStateMode: 'all' | 'page' | 'none';\n};\n\n/**\n * DOM controller for tab blocks: click/keyboard handling, active state, persistence (localStorage\n * and URL), and events. One instance per document; registered on window[GLOBAL_SYMBOL].\n */\nexport class TabsController {\n private _document: Document;\n private _onSelectTabHandlers: Set<Handler> = new Set();\n private _options: TabsControllerOptions;\n private _currentPageTabGroups: string[] = [];\n private _isRestoringTabs = false;\n\n // TODO: remove side effects from constructor\n constructor(document: Document, options: Partial<TabsControllerOptions> = {}) {\n this._document = document;\n this._options = Object.assign(\n {\n saveTabsToLocalStorage: false,\n saveTabsToQueryStateMode: 'none',\n },\n options,\n );\n\n this._document.addEventListener('click', (event) => {\n const target = getEventTarget(event) as HTMLElement;\n\n if (event.target) {\n this.hideAllDropdown(event.target as HTMLElement);\n }\n\n if (isCustom(event)) {\n return;\n }\n\n if (this.isElementDropdownSelect(target)) {\n target.classList.toggle(ACTIVE_CLASSNAME);\n\n return;\n }\n\n if (!this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n\n if (tab) {\n this._selectTab(tab, target);\n }\n });\n\n this._document.addEventListener('keydown', (event) => {\n let direction: TabSwitchDirection | null = null;\n switch (event.key) {\n case 'ArrowLeft': {\n direction = 'left';\n break;\n }\n case 'ArrowRight': {\n direction = 'right';\n break;\n }\n case 'ArrowUp': {\n direction = 'left';\n break;\n }\n case 'ArrowDown': {\n direction = 'right';\n break;\n }\n }\n if (!direction) {\n return;\n }\n\n const target = getEventTarget(event) as HTMLElement;\n\n if (isCustom(event) || !this.isValidTabElement(target)) {\n return;\n }\n\n const {tabs, nodes} = this.getTabs(target);\n const currentTab = this.getTabDataFromHTMLElement(target);\n const currentTabIndex = tabs.findIndex(\n ({key}) => currentTab?.key && key === currentTab.key,\n );\n if (!currentTab || tabs.length <= 1 || currentTabIndex === -1) {\n return;\n }\n\n const newIndex =\n (currentTabIndex + (direction === 'left' ? -1 : 1) + tabs.length) % tabs.length;\n\n this.selectTab(tabs[newIndex]);\n nodes[newIndex].focus();\n });\n }\n\n /**\n * Update controller options (e.g. enable persistence after init).\n * @param options - Partial options to merge\n * @returns void\n */\n configure(options: Partial<TabsControllerOptions>) {\n this._options = Object.assign(this._options, options);\n }\n\n /**\n * Subscribe to tab switch events.\n * @param handler - Callback on tab switch\n * @returns Unsubscribe function\n */\n onSelectTab(handler: Handler) {\n this._onSelectTabHandlers.add(handler);\n\n return () => {\n this._onSelectTabHandlers.delete(handler);\n };\n }\n\n /**\n * Select tab by data-diplodoc-id and optionally scroll it into view.\n * @param id - data-diplodoc-id value\n * @param options - e.g. scrollToElement\n * @returns void\n */\n selectTabById(id: string, options?: ISelectTabByIdOptions) {\n const target = this._document.querySelector(\n `${Selector.TAB}[${TAB_DATA_ID}=\"${id}\"]`,\n ) as HTMLElement;\n\n if (!target || !this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n\n if (tab) {\n this._selectTab(tab, target);\n }\n\n if (options?.scrollToElement) {\n target.scrollIntoView();\n }\n }\n\n /**\n * Programmatically select a tab by { group, key, variant }.\n * @param tab - Tab descriptor\n * @returns void\n */\n selectTab(tab: Tab) {\n this._selectTab(tab);\n }\n\n /**\n * Apply saved state: select each tab in tabsHistory (e.g. after navigation).\n * @param tabsHistory - Group -> { key, variant } map\n * @returns void\n */\n restoreTabs(tabsHistory: TabsHistory) {\n this._isRestoringTabs = true;\n try {\n for (const [group, fields] of Object.entries(tabsHistory)) {\n if (group) {\n const tab = {group, ...fields};\n this.selectTab(tab);\n }\n }\n } finally {\n this._isRestoringTabs = false;\n }\n }\n\n /**\n * Read persisted tab state from localStorage (key: tabsHistory).\n * @returns Parsed TabsHistory\n */\n getTabsFromLocalStorage(): TabsHistory {\n return JSON.parse(localStorage.getItem('tabsHistory') || '{}') as TabsHistory;\n }\n\n /**\n * Parse tab state from URL search params (tabs=group_key or group_key_variant).\n * @returns Parsed TabsHistory\n */\n getTabsFromSearchQuery(): TabsHistory {\n const tabsHistory = {} as TabsHistory;\n const urlParams = new URLSearchParams(window.location.search);\n if (urlParams.has('tabs')) {\n const tabsFromQuery = urlParams.get('tabs') || '';\n const tabConfigs = tabsFromQuery.split(',');\n\n tabConfigs.forEach((config) => {\n const splitConfig = config.split('_');\n const [group, key] = splitConfig;\n let variant = TabsVariants.Regular;\n if (splitConfig.length === 3) {\n variant = splitConfig[2] as TabsVariants;\n }\n\n if (group && key && Object.values(TabsVariants).includes(variant)) {\n const keyWithSpaces = key;\n tabsHistory[group] = {key: keyWithSpaces, variant: variant};\n }\n });\n }\n\n return tabsHistory;\n }\n\n updateLocalStorageWithTabs(tabsHistory: TabsHistory) {\n if (!this._options.saveTabsToLocalStorage) {\n return;\n }\n\n // Don't update localStorage if we're just restoring tabs\n if (this._isRestoringTabs) {\n return;\n }\n\n localStorage.setItem('tabsHistory', JSON.stringify(tabsHistory));\n }\n\n updateQueryParamWithTabs(tabsHistory: TabsHistory) {\n // Don't update URL if we're just restoring tabs\n if (this._isRestoringTabs) {\n return;\n }\n\n const urlParams = new URLSearchParams(window.location.search);\n const tabsArray = Object.entries(tabsHistory).map(([group, {key, variant}]) => {\n if (variant === TabsVariants.Regular) {\n return `${group}_${key}`;\n }\n return `${group}_${key}_${variant}`;\n });\n\n // Clear or set tabs parameter\n if (tabsArray.length > 0) {\n urlParams.set('tabs', tabsArray.join(','));\n } else {\n urlParams.delete('tabs');\n }\n\n // Preserve existing state\n const currentState = history.state || {};\n\n // Use URL constructor for proper URL handling\n const url = new URL(window.location.href);\n url.search = urlParams.toString();\n\n window.history.replaceState({...currentState}, document.title, url.href);\n }\n\n /**\n * Filter tabsHistory to only groups present on the current page.\n * @param tabsHistory - Full history\n * @returns Filtered TabsHistory\n */\n getCurrentPageTabHistory(tabsHistory: TabsHistory): TabsHistory {\n return Object.fromEntries(\n Object.entries(tabsHistory).filter(([group]) =>\n this._currentPageTabGroups.includes(group),\n ),\n );\n }\n\n /**\n * Call after route/page change so persistence uses only groups on the current page.\n * @returns void\n */\n onPageChanged(): void {\n this._currentPageTabGroups = this.getCurrentPageTabGroups();\n }\n\n /**\n * List of tab group ids found in the document.\n * @returns Array of group ids\n */\n getCurrentPageTabGroups(): string[] {\n const tabs = this._document.getElementsByClassName(TABS_CLASSNAME);\n const groups = new Set<string>();\n\n Array.from(tabs).forEach((tab) => {\n const group = tab.getAttribute(GROUP_DATA_KEY);\n if (group) {\n groups.add(group);\n }\n });\n\n return Array.from(groups);\n }\n\n /**\n * Clear saved tab state from localStorage and URL.\n * @returns void\n */\n clearTabsPreferred(): void {\n localStorage.removeItem('tabsHistory');\n this.updateQueryParamWithTabs({});\n }\n\n private _selectTab(tab: Tab, targetTab?: HTMLElement) {\n const {group, key, variant} = tab;\n\n if (!group) {\n return;\n }\n\n this.saveTabPreferred({group, key, variant});\n\n const scrollableParent = targetTab && getClosestScrollableParent(targetTab);\n const previousTargetOffset =\n scrollableParent && getOffsetByScrollableParent(targetTab, scrollableParent);\n\n const updatedTabs = this.updateHTML({group, key, variant}, targetTab, variant);\n\n if (updatedTabs > 0) {\n this.fireSelectTabEvent({group, key, variant}, targetTab?.dataset.diplodocId);\n\n if (previousTargetOffset) {\n this.resetScroll(targetTab, scrollableParent, previousTargetOffset);\n }\n }\n }\n\n private updateHTML(tab: Required<Tab>, target: HTMLElement | undefined, variant: TabsVariants) {\n switch (variant) {\n case TabsVariants.Radio: {\n return this.updateHTMLRadio(tab, target);\n }\n case TabsVariants.Accordion: {\n return this.updateHTMLAccordion(tab, target);\n }\n case TabsVariants.Regular: {\n return this.updateHTMLRegular(tab);\n }\n case TabsVariants.Dropdown: {\n return this.updateHTMLDropdown(tab);\n }\n default: {\n return 0;\n }\n }\n }\n\n private saveTabPreferred(tab: Required<Tab>) {\n let tabsHistory = {} as TabsHistory;\n\n if (this._options.saveTabsToLocalStorage) {\n tabsHistory = JSON.parse(localStorage.getItem('tabsHistory') || '{}');\n }\n\n tabsHistory[tab.group] = {key: tab.key, variant: tab.variant};\n\n if (this._options.saveTabsToLocalStorage) {\n this.updateLocalStorageWithTabs(tabsHistory);\n }\n\n switch (this._options.saveTabsToQueryStateMode) {\n case 'all': {\n this.updateQueryParamWithTabs(tabsHistory);\n break;\n }\n case 'page': {\n this.updateQueryParamWithTabs(this.getCurrentPageTabHistory(tabsHistory));\n break;\n }\n }\n }\n\n private updateHTMLRadio(tab: Required<Tab>, target: HTMLElement | undefined) {\n const {group, key} = tab;\n\n const {isForced, root} = this.didTabOpenForce(target);\n\n let tabs = findTabsByGroupAndKey(this._document, group, key);\n if (isForced) {\n tabs = tabs.filter(\n (el) => (el as HTMLElement).getAttribute(TAB_FORCED_OPEN) === 'true',\n );\n }\n\n if (isForced) {\n root?.removeAttribute(TAB_FORCED_OPEN);\n }\n\n let updated = 0;\n\n tabs.forEach((tab) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const root = tab.parentNode!;\n const elements = root.children;\n\n for (let i = 0; i < elements.length; i += 2) {\n const [title, content] = [elements.item(i), elements.item(i + 1)] as HTMLElement[];\n\n const input = title.children.item(0) as HTMLInputElement;\n\n if (title === tab) {\n const checked = input.checked;\n\n if (checked) {\n title.classList.remove('active');\n content?.classList.remove('active');\n\n input.removeAttribute('checked');\n } else {\n title.classList.add('active');\n content?.classList.add('active');\n\n input.setAttribute('checked', 'true');\n }\n\n continue;\n }\n\n if (input.hasAttribute('checked')) {\n title.classList.remove('active');\n content?.classList.remove('active');\n\n input.removeAttribute('checked');\n }\n\n updated++;\n }\n });\n\n return updated;\n }\n\n private updateHTMLRegular(tab: Required<Tab>) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let updated = 0;\n\n tabs.forEach((element) => {\n const htmlElem = element as HTMLElement;\n if (!this.isValidTabElement(htmlElem) || htmlElem.dataset.diplodocIsActive === 'true') {\n return;\n }\n\n updated++;\n\n const tab = element;\n const tabList = tab.parentNode;\n const tabsContainer = tabList?.parentNode;\n const allTabs = Array.from(tabList?.querySelectorAll(Selector.TAB) || []);\n const allPanels = Array.from(tabsContainer?.children || []).filter((node) =>\n node.classList.contains(TAB_PANEL_CLASSNAME),\n );\n const targetIndex = allTabs.indexOf(tab);\n\n allTabs.forEach((tab, i) => {\n const panel = allPanels[i];\n const isTargetTab = i === targetIndex;\n const htmlElem = tab as HTMLElement;\n\n htmlElem.dataset.diplodocIsActive = isTargetTab ? 'true' : 'false';\n\n tab.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n tab.setAttribute('aria-selected', isTargetTab.toString());\n tab.setAttribute('tabindex', isTargetTab ? '0' : '-1');\n panel.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n });\n });\n\n return updated;\n }\n\n private updateHTMLDropdown(tab: Required<Tab>) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let changed = 0;\n\n tabs.forEach((tab) => {\n const dropdown = tab.closest(`[${TAB_DATA_VARIANT}=${TabsVariants.Dropdown}]`);\n\n if (!dropdown?.children) {\n return;\n }\n\n const select = dropdown.children.item(0) as HTMLElement;\n const menu = dropdown.children.item(1);\n\n select?.classList.remove(ACTIVE_CLASSNAME);\n\n /* first and second elements are select / menu, skipping them */\n const changedIndex = Array.from(menu?.children || []).indexOf(tab) + 2;\n\n for (let i = 2; i < dropdown.children.length; i++) {\n const item = dropdown.children.item(i) as HTMLElement;\n const menuItem = menu?.children.item(i - 2) as HTMLElement;\n\n changed++;\n\n if (changedIndex === i) {\n item?.classList.add(ACTIVE_CLASSNAME);\n menuItem.classList.add(ACTIVE_CLASSNAME);\n\n select.innerHTML = tab.innerHTML;\n select.classList.add('filled');\n\n continue;\n }\n\n menuItem.classList.remove(ACTIVE_CLASSNAME);\n item.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n\n return changed;\n }\n\n private updateHTMLAccordion(tab: Required<Tab>, target: HTMLElement | undefined) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let changed = 0;\n\n tabs.forEach((tab) => {\n const accordion = tab.closest(`[${TAB_DATA_VARIANT}=${TabsVariants.Accordion}]`);\n\n if (!accordion?.children) {\n return;\n }\n\n for (let i = 0; i < accordion.children.length; i += 2) {\n const title = accordion.children.item(i);\n const currentTab = accordion.children.item(i + 1);\n\n changed++;\n\n if (tab === title) {\n title?.classList.toggle(ACTIVE_CLASSNAME);\n currentTab?.classList.toggle(ACTIVE_CLASSNAME);\n\n continue;\n }\n\n title?.classList.remove(ACTIVE_CLASSNAME);\n currentTab?.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n\n if (target && !this.checkVisible(target)) {\n setTimeout(() => {\n target.scrollIntoView({block: 'nearest'});\n });\n }\n\n return changed;\n }\n\n private checkVisible(element: HTMLElement) {\n const rect = element.getBoundingClientRect();\n const viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight);\n\n return !(rect.bottom < 0 || rect.top - viewHeight >= 0);\n }\n\n private hideAllDropdown(target: HTMLElement) {\n const dropdowns = this._document.querySelectorAll('.yfm-tabs-dropdown-select.active');\n\n dropdowns.forEach((menu) => {\n if (!menu.contains(target)) {\n menu.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n }\n\n private resetScroll(\n target: HTMLElement,\n scrollableParent: HTMLElement,\n previousTargetOffset: ElementOffset,\n ) {\n const targetOffset = getOffsetByScrollableParent(target, scrollableParent);\n const topDelta = targetOffset.top - previousTargetOffset.top;\n const leftDelta = targetOffset.left - previousTargetOffset.left;\n const scrollTopDelta = targetOffset.scrollTop - previousTargetOffset.scrollTop;\n const scrollLeftDelta = targetOffset.scrollLeft - previousTargetOffset.scrollLeft;\n scrollableParent.scrollTo(\n scrollableParent.scrollLeft + leftDelta - scrollLeftDelta,\n scrollableParent.scrollTop + topDelta - scrollTopDelta,\n );\n }\n\n private didTabOpenForce(target?: HTMLElement) {\n if (!target) {\n return {};\n }\n\n if (target.dataset.diplodocForced) {\n return {root: target, isForced: true};\n }\n\n const root = target.dataset.diplodocVerticalTab ? target : target.parentElement;\n\n const isForced = typeof root?.dataset.diplodocForced !== 'undefined';\n\n return {root, isForced};\n }\n\n private fireSelectTabEvent(tab: Required<Tab>, diplodocId?: string) {\n const {group, key, variant: align} = tab;\n\n const eventTab: Tab = group.startsWith(DEFAULT_TABS_GROUP_PREFIX)\n ? {key, variant: align}\n : tab;\n\n this._onSelectTabHandlers.forEach((handler) => {\n handler({tab: eventTab, currentTabId: diplodocId});\n });\n }\n\n private getTabsType(element: HTMLElement) {\n const tabsRoot = element.closest(`[${TAB_DATA_VARIANT}]`) as HTMLElement | undefined;\n\n if (!tabsRoot) {\n return undefined;\n }\n\n return tabsRoot.dataset.diplodocVariant;\n }\n\n private isValidTabElement(element: HTMLElement) {\n return Boolean(this.getTabsType(element));\n }\n\n private isElementDropdownSelect(target: HTMLElement) {\n return target.classList.contains(TABS_DROPDOWN_SELECT);\n }\n\n private getTabDataFromHTMLElement(target: HTMLElement): Tab | null {\n const type = this.getTabsType(target);\n\n if (type === TabsVariants.Radio) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const tab = target.dataset.diplodocVerticalTab ? target : target.parentElement!;\n\n const key = tab.dataset.diplodocKey;\n const group = (tab.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: TabsVariants.Radio} : null;\n }\n\n if (type === TabsVariants.Dropdown || type === TabsVariants.Accordion) {\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: type} : null;\n }\n\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: TabsVariants.Regular} : null;\n }\n\n private getTabs(target: HTMLElement): {tabs: Tab[]; nodes: NodeListOf<HTMLElement>} {\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n const nodes = (\n target.closest(Selector.TAB_LIST) as HTMLElement\n )?.querySelectorAll<HTMLElement>(Selector.TAB);\n\n const tabs: Tab[] = [];\n nodes.forEach((tabEl) => {\n const key = tabEl?.dataset.diplodocKey;\n if (!key) {\n return;\n }\n\n /** horizontal-only supported feature (used in left/right button click) */\n tabs.push({\n group,\n key,\n variant: TabsVariants.Regular,\n });\n });\n\n return {tabs, nodes};\n }\n}\n", "/**\n * Tabs runtime entry: creates a single TabsController for the document and attaches it to window\n * under GLOBAL_SYMBOL so that React and other consumers can access it. Imports SCSS for tab styles.\n */\nimport {GLOBAL_SYMBOL} from '../common';\n\nimport {TabsController} from './TabsController';\nimport './scss/tabs.scss';\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined' && !window[GLOBAL_SYMBOL]) {\n window[GLOBAL_SYMBOL] = new TabsController(document);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TABS_CLASSNAME", "TAB_CLASSNAME", "TAB_PANEL_CLASSNAME", "TABS_LIST_CLASSNAME", "ACTIVE_CLASSNAME", "GROUP_DATA_KEY", "TAB_DATA_KEY", "TAB_DATA_VARIANT", "TAB_DATA_ID", "DEFAULT_TABS_GROUP_PREFIX", "TAB_FORCED_OPEN", "TABS_DROPDOWN_SELECT", "TABS_RADIO_CLASSNAME", "TabsVariants", "GLOBAL_SYMBOL", "getEventTarget", "event", "path", "isCustom", "target", "getClosestScrollableParent", "element", "getOffsetByScrollableParent", "scrollableParent", "elementBounds", "scrollableParentBounds", "Selector", "TABS_CLASSNAME", "TABS_LIST_CLASSNAME", "TAB_CLASSNAME", "TAB_PANEL_CLASSNAME", "TABS_RADIO_CLASSNAME", "escapeCssAttrValue", "value", "findTabsByGroupAndKey", "doc", "group", "key", "containers", "GROUP_DATA_KEY", "result", "container", "tab", "TAB_DATA_KEY", "TabsController", "document", "options", "event", "target", "getEventTarget", "isCustom", "ACTIVE_CLASSNAME", "direction", "tabs", "nodes", "currentTab", "currentTabIndex", "newIndex", "handler", "id", "TAB_DATA_ID", "tabsHistory", "fields", "urlParams", "config", "splitConfig", "variant", "TabsVariants", "keyWithSpaces", "tabsArray", "currentState", "url", "groups", "targetTab", "scrollableParent", "getClosestScrollableParent", "previousTargetOffset", "getOffsetByScrollableParent", "isForced", "root", "el", "TAB_FORCED_OPEN", "updated", "elements", "i", "title", "content", "input", "element", "htmlElem", "tabList", "tabsContainer", "allTabs", "allPanels", "node", "targetIndex", "panel", "isTargetTab", "changed", "dropdown", "TAB_DATA_VARIANT", "select", "menu", "changedIndex", "item", "menuItem", "accordion", "rect", "viewHeight", "targetOffset", "topDelta", "leftDelta", "scrollTopDelta", "scrollLeftDelta", "diplodocId", "align", "eventTab", "DEFAULT_TABS_GROUP_PREFIX", "tabsRoot", "TABS_DROPDOWN_SELECT", "_a", "_b", "_c", "type", "tabEl", "GLOBAL_SYMBOL", "TabsController"]
|
|
7
7
|
}
|
package/build/runtime/utils.d.ts
CHANGED
|
@@ -1,10 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event target considering shadow DOM (composedPath()[0] or fallback to target).
|
|
3
|
+
* @param event - DOM event
|
|
4
|
+
* @returns Target element
|
|
5
|
+
*/
|
|
1
6
|
export declare const getEventTarget: (event: Event) => EventTarget | null;
|
|
7
|
+
/**
|
|
8
|
+
* True if the event target is a custom element (or missing), so we skip tab handling.
|
|
9
|
+
* @param event - DOM event
|
|
10
|
+
* @returns Whether to ignore
|
|
11
|
+
*/
|
|
2
12
|
export declare const isCustom: (event: Event) => boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Nearest ancestor (or self) that has overflow scroll. Used to preserve scroll when switching tabs.
|
|
15
|
+
* @param element - Starting element
|
|
16
|
+
* @returns Scrollable parent or undefined
|
|
17
|
+
*/
|
|
3
18
|
export declare const getClosestScrollableParent: (element: HTMLElement) => HTMLElement | undefined;
|
|
19
|
+
/** Position and scroll values used to restore scroll after tab switch. */
|
|
4
20
|
export interface ElementOffset {
|
|
5
21
|
top: number;
|
|
6
22
|
left: number;
|
|
7
23
|
scrollTop: number;
|
|
8
24
|
scrollLeft: number;
|
|
9
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Offset of element relative to scrollable parent and parent's scroll position.
|
|
28
|
+
* @param element - Child element
|
|
29
|
+
* @param scrollableParent - Scroll container
|
|
30
|
+
* @returns Offset and scroll values
|
|
31
|
+
*/
|
|
10
32
|
export declare const getOffsetByScrollableParent: (element: HTMLElement, scrollableParent: HTMLElement) => ElementOffset;
|