@expressivecss/expressive 0.9.0 → 0.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/CHANGELOG.md +174 -1
- package/README.md +178 -25
- package/dist/css/expressive.css +365 -1222
- package/dist/css/expressive.css.map +1 -1
- package/dist/css/expressive.min.css +1 -1
- package/dist/css/expressive.min.css.map +1 -1
- package/dist/fonts/material-symbols-outlined.woff2 +0 -0
- package/dist/fonts/material-symbols-rounded.woff2 +0 -0
- package/dist/fonts/material-symbols-sharp.woff2 +0 -0
- package/dist/js/chunks/chunk-7MM4VJJO.mjs +509 -0
- package/dist/js/chunks/chunk-7MM4VJJO.mjs.map +7 -0
- package/dist/js/chunks/chunk-7UXHSYIA.mjs +183 -0
- package/dist/js/chunks/chunk-7UXHSYIA.mjs.map +7 -0
- package/dist/js/chunks/chunk-A3BJA7V4.mjs +28 -0
- package/dist/js/chunks/chunk-A3BJA7V4.mjs.map +7 -0
- package/dist/js/chunks/chunk-AOGFNMXS.mjs +691 -0
- package/dist/js/chunks/chunk-AOGFNMXS.mjs.map +7 -0
- package/dist/js/chunks/chunk-D4UZ4HFN.mjs +560 -0
- package/dist/js/chunks/chunk-D4UZ4HFN.mjs.map +7 -0
- package/dist/js/chunks/chunk-EP3CVKB5.mjs +88 -0
- package/dist/js/chunks/chunk-EP3CVKB5.mjs.map +7 -0
- package/dist/js/chunks/chunk-G576EP5O.mjs +459 -0
- package/dist/js/chunks/chunk-G576EP5O.mjs.map +7 -0
- package/dist/js/chunks/chunk-GY2Z5CJ2.mjs +320 -0
- package/dist/js/chunks/chunk-GY2Z5CJ2.mjs.map +7 -0
- package/dist/js/chunks/chunk-JKNPQQWY.mjs +191 -0
- package/dist/js/chunks/chunk-JKNPQQWY.mjs.map +7 -0
- package/dist/js/chunks/chunk-JNPIWFJT.mjs +365 -0
- package/dist/js/chunks/chunk-JNPIWFJT.mjs.map +7 -0
- package/dist/js/chunks/chunk-JODJAGFS.mjs +267 -0
- package/dist/js/chunks/chunk-JODJAGFS.mjs.map +7 -0
- package/dist/js/chunks/chunk-JR24UB4X.mjs +100 -0
- package/dist/js/chunks/chunk-JR24UB4X.mjs.map +7 -0
- package/dist/js/chunks/chunk-KR44BSYQ.mjs +55 -0
- package/dist/js/chunks/chunk-KR44BSYQ.mjs.map +7 -0
- package/dist/js/chunks/chunk-LZVBJ33S.mjs +102 -0
- package/dist/js/chunks/chunk-LZVBJ33S.mjs.map +7 -0
- package/dist/js/chunks/chunk-MISGHDUU.mjs +326 -0
- package/dist/js/chunks/chunk-MISGHDUU.mjs.map +7 -0
- package/dist/js/chunks/chunk-N3UHGN3N.mjs +175 -0
- package/dist/js/chunks/chunk-N3UHGN3N.mjs.map +7 -0
- package/dist/js/chunks/chunk-PB5L3EXF.mjs +7 -0
- package/dist/js/chunks/chunk-PB5L3EXF.mjs.map +7 -0
- package/dist/js/chunks/chunk-PIIAEYAJ.mjs +85 -0
- package/dist/js/chunks/chunk-PIIAEYAJ.mjs.map +7 -0
- package/dist/js/chunks/chunk-QSQ24FYT.mjs +59 -0
- package/dist/js/chunks/chunk-QSQ24FYT.mjs.map +7 -0
- package/dist/js/chunks/chunk-QYCYP443.mjs +1111 -0
- package/dist/js/chunks/chunk-QYCYP443.mjs.map +7 -0
- package/dist/js/chunks/chunk-SLFNPY5M.mjs +78 -0
- package/dist/js/chunks/chunk-SLFNPY5M.mjs.map +7 -0
- package/dist/js/chunks/chunk-TK6PX2GC.mjs +663 -0
- package/dist/js/chunks/chunk-TK6PX2GC.mjs.map +7 -0
- package/dist/js/chunks/chunk-TYM6U5DY.mjs +76 -0
- package/dist/js/chunks/chunk-TYM6U5DY.mjs.map +7 -0
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs +154 -0
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs.map +7 -0
- package/dist/js/chunks/chunk-VAS6JQ6P.mjs +94 -0
- package/dist/js/chunks/chunk-VAS6JQ6P.mjs.map +7 -0
- package/dist/js/chunks/chunk-WWPAPHMA.mjs +1 -0
- package/dist/js/chunks/chunk-WWPAPHMA.mjs.map +7 -0
- package/dist/js/chunks/chunk-XDB3G6RL.mjs +114 -0
- package/dist/js/chunks/chunk-XDB3G6RL.mjs.map +7 -0
- package/dist/js/chunks/chunk-XO5WX3TK.mjs +226 -0
- package/dist/js/chunks/chunk-XO5WX3TK.mjs.map +7 -0
- package/dist/js/chunks/chunk-YFXEJ7GR.mjs +286 -0
- package/dist/js/chunks/chunk-YFXEJ7GR.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZIZVUWRL.mjs +120 -0
- package/dist/js/chunks/chunk-ZIZVUWRL.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZZBZI2XN.mjs +338 -0
- package/dist/js/chunks/chunk-ZZBZI2XN.mjs.map +7 -0
- package/dist/js/expressive.cjs +801 -761
- package/dist/js/expressive.cjs.map +4 -4
- package/dist/js/expressive.js +801 -761
- package/dist/js/expressive.js.map +4 -4
- package/dist/js/expressive.min.js +11 -15
- package/dist/js/expressive.min.js.map +4 -4
- package/dist/js/expressive.mjs +83 -7443
- package/dist/js/expressive.mjs.map +4 -4
- package/dist/js/internal/behaviors/bottomSheets.mjs +9 -0
- package/dist/js/internal/behaviors/bottomSheets.mjs.map +7 -0
- package/dist/js/internal/behaviors/dialogs.mjs +8 -0
- package/dist/js/internal/behaviors/dialogs.mjs.map +7 -0
- package/dist/js/internal/behaviors/forms.mjs +8 -0
- package/dist/js/internal/behaviors/forms.mjs.map +7 -0
- package/dist/js/internal/behaviors/sheetDrag.mjs +8 -0
- package/dist/js/internal/behaviors/sheetDrag.mjs.map +7 -0
- package/dist/js/internal/behaviors/sideSheets.mjs +9 -0
- package/dist/js/internal/behaviors/sideSheets.mjs.map +7 -0
- package/dist/js/internal/components/appBar.mjs +8 -0
- package/dist/js/internal/components/appBar.mjs.map +7 -0
- package/dist/js/internal/components/autocomplete.mjs +10 -0
- package/dist/js/internal/components/autocomplete.mjs.map +7 -0
- package/dist/js/internal/components/buttonGroup.mjs +8 -0
- package/dist/js/internal/components/buttonGroup.mjs.map +7 -0
- package/dist/js/internal/components/buttons.mjs +9 -0
- package/dist/js/internal/components/buttons.mjs.map +7 -0
- package/dist/js/internal/components/cards.mjs +13 -0
- package/dist/js/internal/components/cards.mjs.map +7 -0
- package/dist/js/internal/components/carousel.mjs +9 -0
- package/dist/js/internal/components/carousel.mjs.map +7 -0
- package/dist/js/internal/components/characterCounter.mjs +8 -0
- package/dist/js/internal/components/characterCounter.mjs.map +7 -0
- package/dist/js/internal/components/chips.mjs +11 -0
- package/dist/js/internal/components/chips.mjs.map +7 -0
- package/dist/js/internal/components/datepicker.mjs +12 -0
- package/dist/js/internal/components/datepicker.mjs.map +7 -0
- package/dist/js/internal/components/expandingCard.mjs +11 -0
- package/dist/js/internal/components/expandingCard.mjs.map +7 -0
- package/dist/js/internal/components/index.mjs +88 -0
- package/dist/js/internal/components/index.mjs.map +7 -0
- package/dist/js/internal/components/lightbox.mjs +9 -0
- package/dist/js/internal/components/lightbox.mjs.map +7 -0
- package/dist/js/internal/components/menu.mjs +9 -0
- package/dist/js/internal/components/menu.mjs.map +7 -0
- package/dist/js/internal/components/navigationRail.mjs +8 -0
- package/dist/js/internal/components/navigationRail.mjs.map +7 -0
- package/dist/js/internal/components/registry.mjs +33 -0
- package/dist/js/internal/components/registry.mjs.map +7 -0
- package/dist/js/internal/components/scrollspy.mjs +8 -0
- package/dist/js/internal/components/scrollspy.mjs.map +7 -0
- package/dist/js/internal/components/select.mjs +10 -0
- package/dist/js/internal/components/select.mjs.map +7 -0
- package/dist/js/internal/components/slider.mjs +9 -0
- package/dist/js/internal/components/slider.mjs.map +7 -0
- package/dist/js/internal/components/snackbar.mjs +8 -0
- package/dist/js/internal/components/snackbar.mjs.map +7 -0
- package/dist/js/internal/components/tabs.mjs +10 -0
- package/dist/js/internal/components/tabs.mjs.map +7 -0
- package/dist/js/internal/components/timepicker.mjs +10 -0
- package/dist/js/internal/components/timepicker.mjs.map +7 -0
- package/dist/js/internal/components/tooltip.mjs +9 -0
- package/dist/js/internal/components/tooltip.mjs.map +7 -0
- package/dist/js/internal/core/component.mjs +7 -0
- package/dist/js/internal/core/component.mjs.map +7 -0
- package/dist/js/internal/core/utils.mjs +7 -0
- package/dist/js/internal/core/utils.mjs.map +7 -0
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +8 -0
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs.map +7 -0
- package/dist/js/modular.mjs +113 -0
- package/dist/js/modular.mjs.map +7 -0
- package/dist/types/behaviors/sheetDrag.d.ts +1 -1
- package/dist/types/components/appBar.d.ts +1 -1
- package/dist/types/components/autocomplete.d.ts +9 -0
- package/dist/types/components/buttons.d.ts +4 -39
- package/dist/types/components/carousel.d.ts +10 -1
- package/dist/types/components/chips.d.ts +1 -0
- package/dist/types/components/datepicker.d.ts +11 -0
- package/dist/types/components/index.d.ts +0 -2
- package/dist/types/components/lightbox.d.ts +12 -0
- package/dist/types/components/menu.d.ts +3 -0
- package/dist/types/components/registry.d.ts +0 -4
- package/dist/types/components/select.d.ts +4 -0
- package/dist/types/components/slider.d.ts +2 -1
- package/dist/types/components/snackbar.d.ts +4 -2
- package/dist/types/components/tabs.d.ts +2 -1
- package/dist/types/components/timepicker.d.ts +5 -3
- package/dist/types/components/tooltip.d.ts +5 -3
- package/dist/types/index.d.ts +1 -8
- package/dist/types/modular.d.ts +28 -0
- package/package.json +16 -4
- package/src/sass/README.md +8 -0
- package/src/sass/components/_badges.scss +1 -6
- package/src/sass/components/_button-groups.scss +5 -1
- package/src/sass/components/_buttons.scss +8 -287
- package/src/sass/components/_chips.scss +17 -2
- package/src/sass/components/_dialog.scss +9 -4
- package/src/sass/components/_fab-menu.scss +11 -9
- package/src/sass/components/_icon-buttons.scss +0 -5
- package/src/sass/components/_index.scss +0 -5
- package/src/sass/components/_menu.scss +2 -2
- package/src/sass/components/_navigation-rail.scss +1 -1
- package/src/sass/components/_panes.scss +50 -78
- package/src/sass/components/_progress.scss +73 -13
- package/src/sass/components/_scrim.scss +4 -4
- package/src/sass/components/_side-sheet.scss +22 -12
- package/src/sass/components/_toolbar.scss +1 -4
- package/src/sass/components/_tooltip.scss +20 -2
- package/src/sass/components/forms/_input-fields.scss +5 -1
- package/src/sass/components/forms/_select.scss +1 -0
- package/src/sass/components/forms/_slider.scss +81 -25
- package/src/sass/custom.scss +38 -0
- package/dist/types/components/navigationDrawer.d.ts +0 -110
- package/src/sass/components/_banners.scss +0 -298
- package/src/sass/components/_bottom-app-bar.scss +0 -180
- package/src/sass/components/_floating-sheet.scss +0 -86
- package/src/sass/components/_navigation-drawer.scss +0 -476
- package/src/sass/components/_segmented-buttons.scss +0 -188
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/navigationRail.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface NavigationRailOptions extends BaseOptions {\n /**\n * Called before the rail expands.\n */\n onOpenStart: (el: HTMLElement) => void;\n /**\n * Called after the rail expands.\n */\n onOpenEnd: (el: HTMLElement) => void;\n /**\n * Called before the rail collapses.\n */\n onCloseStart: (el: HTMLElement) => void;\n /**\n * Called after the rail collapses.\n */\n onCloseEnd: (el: HTMLElement) => void;\n}\n\nconst _defaults: NavigationRailOptions = {\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\nconst COMPACT = '(width < 600px)';\n\n/**\n * Navigation rail. Layout is CSS (collapsed / .expanded). This class\n * toggles that class from the menu button, closes a compact overlay on\n * Escape or a scrim tap, and keeps aria-expanded in sync.\n */\nexport class NavigationRail extends Component<NavigationRailOptions> {\n isExpanded: boolean;\n private _toggle: HTMLButtonElement | null;\n private _mql: MediaQueryList;\n\n constructor(el: HTMLElement, options: Partial<NavigationRailOptions>) {\n super(el, options, NavigationRail);\n this.el['Expressive_NavigationRail'] = this;\n\n this.options = {\n ...NavigationRail.defaults,\n ...options\n };\n\n this._toggle = this._findToggle();\n this._mql = window.matchMedia(COMPACT);\n this.isExpanded = this.el.classList.contains('expanded');\n this._sync();\n this.el.addEventListener('click', this._onClick);\n document.addEventListener('keydown', this._onKeyDown);\n }\n\n static get defaults(): NavigationRailOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<NavigationRailOptions>): NavigationRail;\n static init(\n els: InitElements<InitElement>,\n options?: Partial<NavigationRailOptions>\n ): NavigationRail[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<NavigationRailOptions> = {}\n ): NavigationRail | NavigationRail[] {\n return super.init(els, options, NavigationRail);\n }\n\n static getInstance(el: HTMLElement): NavigationRail {\n return el['Expressive_NavigationRail'];\n }\n\n destroy() {\n this.el.removeEventListener('click', this._onClick);\n document.removeEventListener('keydown', this._onKeyDown);\n this.el['Expressive_NavigationRail'] = undefined;\n }\n\n /**\n * Expands the rail. On compact windows the overlay (scrim) is CSS.\n */\n expand = () => {\n if (this.isExpanded) return;\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n this.isExpanded = true;\n this.el.classList.add('expanded');\n this._sync();\n if (typeof this.options.onOpenEnd === 'function') {\n this.options.onOpenEnd.call(this, this.el);\n }\n };\n\n /**\n * Collapses the rail.\n */\n collapse = () => {\n if (!this.isExpanded) return;\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n this.isExpanded = false;\n this.el.classList.remove('expanded');\n this._sync();\n if (typeof this.options.onCloseEnd === 'function') {\n this.options.onCloseEnd.call(this, this.el);\n }\n };\n\n /**\n * Toggles expanded / collapsed.\n */\n toggle = () => {\n if (this.isExpanded) this.collapse();\n else this.expand();\n };\n\n private _findToggle(): HTMLButtonElement | null {\n const first = this.el.querySelector(':scope > button:not(.button)');\n return first instanceof HTMLButtonElement ? first : null;\n }\n\n private _isCompact() {\n return this._mql.matches;\n }\n\n private _isModal() {\n return this.el.classList.contains('modal') || this._isCompact();\n }\n\n private _sync() {\n this.el.setAttribute('aria-expanded', this.isExpanded ? 'true' : 'false');\n this._toggle?.setAttribute('aria-expanded', this.isExpanded ? 'true' : 'false');\n }\n\n private _onClick = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Node)) return;\n if (this._toggle && (target === this._toggle || this._toggle.contains(target))) {\n this.toggle();\n e.preventDefault();\n return;\n }\n if (target === this.el && this.isExpanded && this._isModal()) {\n this.collapse();\n }\n };\n\n private _onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n if (this.isExpanded && this._isModal()) this.collapse();\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Component
|
|
3
|
+
} from "./chunk-QSQ24FYT.mjs";
|
|
4
|
+
|
|
5
|
+
// src/ts/components/buttonGroup.ts
|
|
6
|
+
var _defaults = {};
|
|
7
|
+
var VALID_SELECTION_MODES = /* @__PURE__ */ new Set(["single", "multiple"]);
|
|
8
|
+
var PRESSED_CLASS = "button-group-pressed";
|
|
9
|
+
var MAX_ICON_COMPRESSION = 0.15;
|
|
10
|
+
var ButtonGroup = class _ButtonGroup extends Component {
|
|
11
|
+
constructor(el, options = {}) {
|
|
12
|
+
super(el, options, _ButtonGroup);
|
|
13
|
+
this._pressedStyles = /* @__PURE__ */ new Map();
|
|
14
|
+
this._releaseStyles = /* @__PURE__ */ new Map();
|
|
15
|
+
this._releaseTimer = null;
|
|
16
|
+
this._originalPressed = /* @__PURE__ */ new Map();
|
|
17
|
+
this._activeItem = null;
|
|
18
|
+
this._handleClick = (event) => {
|
|
19
|
+
if (!this._selectionMode) return;
|
|
20
|
+
const item = this._itemFromEvent(event);
|
|
21
|
+
if (!(item instanceof HTMLButtonElement) || this._isDisabled(item)) return;
|
|
22
|
+
this._rememberPressed(item);
|
|
23
|
+
const willSelect = item.getAttribute("aria-pressed") !== "true";
|
|
24
|
+
const selectedCount = this._toggleItems.filter(
|
|
25
|
+
(button) => button.getAttribute("aria-pressed") === "true"
|
|
26
|
+
).length;
|
|
27
|
+
if (!willSelect && this.el.hasAttribute("data-selection-required") && selectedCount === 1) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (this._selectionMode === "single" && willSelect) {
|
|
31
|
+
this._toggleItems.forEach((button) => {
|
|
32
|
+
this._rememberPressed(button);
|
|
33
|
+
button.setAttribute("aria-pressed", "false");
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
item.setAttribute("aria-pressed", willSelect ? "true" : "false");
|
|
37
|
+
};
|
|
38
|
+
this._handlePointerDown = (event) => {
|
|
39
|
+
if (event.button !== 0) return;
|
|
40
|
+
const item = this._itemFromEvent(event);
|
|
41
|
+
if (item && !this._isDisabled(item)) this._startPress(item);
|
|
42
|
+
};
|
|
43
|
+
this._handleKeyDown = (event) => {
|
|
44
|
+
if (event.repeat || event.key !== " " && event.key !== "Enter") return;
|
|
45
|
+
const item = this._itemFromEvent(event);
|
|
46
|
+
if (item && !this._isDisabled(item)) this._startPress(item);
|
|
47
|
+
};
|
|
48
|
+
this._handleKeyUp = (event) => {
|
|
49
|
+
if (event.key === " " || event.key === "Enter") this._resetPress();
|
|
50
|
+
};
|
|
51
|
+
this._handleFocusOut = (event) => {
|
|
52
|
+
if (event.target === this._activeItem) this._resetPress();
|
|
53
|
+
};
|
|
54
|
+
this._resetPress = () => {
|
|
55
|
+
this._activeItem?.classList.remove(PRESSED_CLASS);
|
|
56
|
+
this._activeItem = null;
|
|
57
|
+
if (!this._pressedStyles.size) return;
|
|
58
|
+
this._finishRelease();
|
|
59
|
+
this._releaseStyles = new Map(this._pressedStyles);
|
|
60
|
+
for (const [item, style] of this._releaseStyles) {
|
|
61
|
+
item.style.width = `${style.baseWidth}px`;
|
|
62
|
+
}
|
|
63
|
+
this._pressedStyles.clear();
|
|
64
|
+
this._releaseTimer = window.setTimeout(this._finishRelease, 200);
|
|
65
|
+
};
|
|
66
|
+
this._finishRelease = () => {
|
|
67
|
+
if (this._releaseTimer !== null) window.clearTimeout(this._releaseTimer);
|
|
68
|
+
this._releaseTimer = null;
|
|
69
|
+
for (const [item, style] of this._releaseStyles) item.style.width = style.width;
|
|
70
|
+
this._releaseStyles.clear();
|
|
71
|
+
};
|
|
72
|
+
this.el["Expressive_ButtonGroup"] = this;
|
|
73
|
+
this.options = { ..._ButtonGroup.defaults, ...options };
|
|
74
|
+
if (this._selectionMode) {
|
|
75
|
+
this._normalizeSelection();
|
|
76
|
+
this.el.addEventListener("click", this._handleClick, true);
|
|
77
|
+
}
|
|
78
|
+
this.el.addEventListener("pointerdown", this._handlePointerDown);
|
|
79
|
+
this.el.addEventListener("keydown", this._handleKeyDown);
|
|
80
|
+
this.el.addEventListener("focusout", this._handleFocusOut);
|
|
81
|
+
document.addEventListener("pointerup", this._resetPress);
|
|
82
|
+
document.addEventListener("pointercancel", this._resetPress);
|
|
83
|
+
document.addEventListener("keyup", this._handleKeyUp);
|
|
84
|
+
window.addEventListener("blur", this._resetPress);
|
|
85
|
+
}
|
|
86
|
+
static get defaults() {
|
|
87
|
+
return _defaults;
|
|
88
|
+
}
|
|
89
|
+
static init(els, options = {}) {
|
|
90
|
+
return super.init(els, options, _ButtonGroup);
|
|
91
|
+
}
|
|
92
|
+
static getInstance(el) {
|
|
93
|
+
return el["Expressive_ButtonGroup"];
|
|
94
|
+
}
|
|
95
|
+
destroy() {
|
|
96
|
+
this._resetPress();
|
|
97
|
+
this._finishRelease();
|
|
98
|
+
this.el.removeEventListener("click", this._handleClick, true);
|
|
99
|
+
this.el.removeEventListener("pointerdown", this._handlePointerDown);
|
|
100
|
+
this.el.removeEventListener("keydown", this._handleKeyDown);
|
|
101
|
+
this.el.removeEventListener("focusout", this._handleFocusOut);
|
|
102
|
+
document.removeEventListener("pointerup", this._resetPress);
|
|
103
|
+
document.removeEventListener("pointercancel", this._resetPress);
|
|
104
|
+
document.removeEventListener("keyup", this._handleKeyUp);
|
|
105
|
+
window.removeEventListener("blur", this._resetPress);
|
|
106
|
+
for (const [item, value] of this._originalPressed) {
|
|
107
|
+
if (value === null) item.removeAttribute("aria-pressed");
|
|
108
|
+
else item.setAttribute("aria-pressed", value);
|
|
109
|
+
}
|
|
110
|
+
this._originalPressed.clear();
|
|
111
|
+
this.el["Expressive_ButtonGroup"] = void 0;
|
|
112
|
+
}
|
|
113
|
+
get _selectionMode() {
|
|
114
|
+
const mode = this.el.dataset.selection;
|
|
115
|
+
return VALID_SELECTION_MODES.has(mode) ? mode : null;
|
|
116
|
+
}
|
|
117
|
+
get _items() {
|
|
118
|
+
return Array.from(this.el.children).filter(
|
|
119
|
+
(child) => child instanceof HTMLButtonElement || child instanceof HTMLAnchorElement && child.classList.contains("button")
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
get _toggleItems() {
|
|
123
|
+
return this._items.filter(
|
|
124
|
+
(item) => item instanceof HTMLButtonElement
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
_normalizeSelection() {
|
|
128
|
+
const items = this._toggleItems;
|
|
129
|
+
items.forEach((item) => {
|
|
130
|
+
this._rememberPressed(item);
|
|
131
|
+
if (!["true", "false"].includes(item.getAttribute("aria-pressed") || "")) {
|
|
132
|
+
item.setAttribute("aria-pressed", "false");
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
if (this._selectionMode === "single") {
|
|
136
|
+
const selected = items.filter((item) => item.getAttribute("aria-pressed") === "true");
|
|
137
|
+
selected.slice(1).forEach((item) => item.setAttribute("aria-pressed", "false"));
|
|
138
|
+
}
|
|
139
|
+
if (this.el.hasAttribute("data-selection-required") && !items.some((item) => item.getAttribute("aria-pressed") === "true")) {
|
|
140
|
+
items.find((item) => !this._isDisabled(item))?.setAttribute("aria-pressed", "true");
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
_itemFromEvent(event) {
|
|
144
|
+
if (!(event.target instanceof Element)) return null;
|
|
145
|
+
const item = event.target.closest("button, a.button");
|
|
146
|
+
return item instanceof HTMLElement && item.parentElement === this.el ? item : null;
|
|
147
|
+
}
|
|
148
|
+
_isDisabled(item) {
|
|
149
|
+
return item instanceof HTMLButtonElement && item.disabled || item.getAttribute("aria-disabled") === "true" || item.classList.contains("disabled");
|
|
150
|
+
}
|
|
151
|
+
_rememberPressed(item) {
|
|
152
|
+
if (!this._originalPressed.has(item)) {
|
|
153
|
+
this._originalPressed.set(item, item.getAttribute("aria-pressed"));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
_startPress(item) {
|
|
157
|
+
if (this._activeItem) return;
|
|
158
|
+
this._finishRelease();
|
|
159
|
+
const items = this._items;
|
|
160
|
+
const activeIndex = items.indexOf(item);
|
|
161
|
+
if (activeIndex < 0) return;
|
|
162
|
+
this._activeItem = item;
|
|
163
|
+
item.classList.add(PRESSED_CLASS);
|
|
164
|
+
if (this.el.classList.contains("connected") || items.length < 2) return;
|
|
165
|
+
const rects = items.map((candidate) => candidate.getBoundingClientRect());
|
|
166
|
+
const activeWidth = rects[activeIndex].width;
|
|
167
|
+
if (activeWidth <= 0) return;
|
|
168
|
+
const parsedMultiplier = Number.parseFloat(
|
|
169
|
+
getComputedStyle(this.el).getPropertyValue(
|
|
170
|
+
"--md-comp-button-group-pressed-item-width-multiplier"
|
|
171
|
+
)
|
|
172
|
+
);
|
|
173
|
+
const multiplier = Number.isFinite(parsedMultiplier) ? parsedMultiplier : 0.15;
|
|
174
|
+
const desiredGrowth = activeWidth * multiplier;
|
|
175
|
+
const neighborIndexes = [activeIndex - 1, activeIndex + 1].filter(
|
|
176
|
+
(index) => index >= 0 && index < items.length
|
|
177
|
+
);
|
|
178
|
+
const compression = /* @__PURE__ */ new Map();
|
|
179
|
+
if (neighborIndexes.length === 1) {
|
|
180
|
+
const index = neighborIndexes[0];
|
|
181
|
+
compression.set(
|
|
182
|
+
index,
|
|
183
|
+
Math.min(desiredGrowth, this._compressionCapacity(items[index], rects[index]))
|
|
184
|
+
);
|
|
185
|
+
} else {
|
|
186
|
+
const half = desiredGrowth / 2;
|
|
187
|
+
for (const index of neighborIndexes) {
|
|
188
|
+
compression.set(
|
|
189
|
+
index,
|
|
190
|
+
Math.min(half, this._compressionCapacity(items[index], rects[index]))
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
let remaining = desiredGrowth - [...compression.values()].reduce((sum, value) => sum + value, 0);
|
|
194
|
+
for (const index of neighborIndexes) {
|
|
195
|
+
if (remaining <= 0) break;
|
|
196
|
+
const capacity = this._compressionCapacity(items[index], rects[index]) - compression.get(index);
|
|
197
|
+
const extra = Math.min(remaining, capacity);
|
|
198
|
+
compression.set(index, compression.get(index) + extra);
|
|
199
|
+
remaining -= extra;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const actualGrowth = [...compression.values()].reduce((sum, value) => sum + value, 0);
|
|
203
|
+
if (actualGrowth <= 0) return;
|
|
204
|
+
items.forEach((candidate, index) => {
|
|
205
|
+
this._pressedStyles.set(candidate, {
|
|
206
|
+
width: candidate.style.width,
|
|
207
|
+
baseWidth: rects[index].width
|
|
208
|
+
});
|
|
209
|
+
candidate.style.width = `${rects[index].width}px`;
|
|
210
|
+
});
|
|
211
|
+
void this.el.offsetWidth;
|
|
212
|
+
items.forEach((candidate, index) => {
|
|
213
|
+
const adjustment = index === activeIndex ? actualGrowth : -(compression.get(index) || 0);
|
|
214
|
+
candidate.style.width = `${rects[index].width + adjustment}px`;
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
_compressionCapacity(item, rect) {
|
|
218
|
+
const minimumWidth = item.classList.contains("icon-button") ? rect.width * (1 - MAX_ICON_COMPRESSION) : rect.height;
|
|
219
|
+
return Math.max(0, rect.width - minimumWidth);
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
export {
|
|
224
|
+
ButtonGroup
|
|
225
|
+
};
|
|
226
|
+
//# sourceMappingURL=chunk-XO5WX3TK.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/buttonGroup.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, BaseOptions, InitElements, InitElement } from \"../core/component\";\n\nexport interface ButtonGroupOptions extends BaseOptions {}\n\ntype SavedItemStyle = {\n width: string;\n baseWidth: number;\n};\n\nconst _defaults: ButtonGroupOptions = {};\nconst VALID_SELECTION_MODES = new Set([\"single\", \"multiple\"]);\nconst PRESSED_CLASS = \"button-group-pressed\";\nconst MAX_ICON_COMPRESSION = 0.15;\n\n/**\n * Coordinates Material button-group press geometry and optional toggle state.\n *\n * Standard groups redistribute the pressed item's 15% width growth from its\n * immediate neighbors. `data-selection=\"single|multiple\"` also enables\n * `aria-pressed` state management.\n */\nexport class ButtonGroup extends Component<ButtonGroupOptions> {\n private _pressedStyles = new Map<HTMLElement, SavedItemStyle>();\n private _releaseStyles = new Map<HTMLElement, SavedItemStyle>();\n private _releaseTimer: number | null = null;\n private _originalPressed = new Map<HTMLButtonElement, string | null>();\n private _activeItem: HTMLElement | null = null;\n\n constructor(el: HTMLElement, options: Partial<ButtonGroupOptions> = {}) {\n super(el, options, ButtonGroup);\n this.el[\"Expressive_ButtonGroup\"] = this;\n this.options = { ...ButtonGroup.defaults, ...options };\n\n if (this._selectionMode) {\n this._normalizeSelection();\n this.el.addEventListener(\"click\", this._handleClick, true);\n }\n this.el.addEventListener(\"pointerdown\", this._handlePointerDown);\n this.el.addEventListener(\"keydown\", this._handleKeyDown);\n this.el.addEventListener(\"focusout\", this._handleFocusOut);\n document.addEventListener(\"pointerup\", this._resetPress);\n document.addEventListener(\"pointercancel\", this._resetPress);\n document.addEventListener(\"keyup\", this._handleKeyUp);\n window.addEventListener(\"blur\", this._resetPress);\n }\n\n static get defaults() {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<ButtonGroupOptions>): ButtonGroup;\n static init(\n els: InitElements<InitElement>,\n options?: Partial<ButtonGroupOptions>,\n ): ButtonGroup[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<ButtonGroupOptions> = {},\n ): ButtonGroup | ButtonGroup[] {\n return super.init(els, options, ButtonGroup);\n }\n\n static getInstance(el: HTMLElement): ButtonGroup {\n return el[\"Expressive_ButtonGroup\"];\n }\n\n destroy() {\n this._resetPress();\n this._finishRelease();\n this.el.removeEventListener(\"click\", this._handleClick, true);\n this.el.removeEventListener(\"pointerdown\", this._handlePointerDown);\n this.el.removeEventListener(\"keydown\", this._handleKeyDown);\n this.el.removeEventListener(\"focusout\", this._handleFocusOut);\n document.removeEventListener(\"pointerup\", this._resetPress);\n document.removeEventListener(\"pointercancel\", this._resetPress);\n document.removeEventListener(\"keyup\", this._handleKeyUp);\n window.removeEventListener(\"blur\", this._resetPress);\n for (const [item, value] of this._originalPressed) {\n if (value === null) item.removeAttribute(\"aria-pressed\");\n else item.setAttribute(\"aria-pressed\", value);\n }\n this._originalPressed.clear();\n this.el[\"Expressive_ButtonGroup\"] = undefined;\n }\n\n private get _selectionMode(): \"single\" | \"multiple\" | null {\n const mode = this.el.dataset.selection;\n return VALID_SELECTION_MODES.has(mode) ? (mode as \"single\" | \"multiple\") : null;\n }\n\n private get _items(): HTMLElement[] {\n return Array.from(this.el.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLButtonElement ||\n (child instanceof HTMLAnchorElement && child.classList.contains(\"button\")),\n );\n }\n\n private get _toggleItems(): HTMLButtonElement[] {\n return this._items.filter(\n (item): item is HTMLButtonElement => item instanceof HTMLButtonElement,\n );\n }\n\n private _normalizeSelection() {\n const items = this._toggleItems;\n items.forEach((item) => {\n this._rememberPressed(item);\n if (![\"true\", \"false\"].includes(item.getAttribute(\"aria-pressed\") || \"\")) {\n item.setAttribute(\"aria-pressed\", \"false\");\n }\n });\n\n if (this._selectionMode === \"single\") {\n const selected = items.filter((item) => item.getAttribute(\"aria-pressed\") === \"true\");\n selected.slice(1).forEach((item) => item.setAttribute(\"aria-pressed\", \"false\"));\n }\n\n if (\n this.el.hasAttribute(\"data-selection-required\") &&\n !items.some((item) => item.getAttribute(\"aria-pressed\") === \"true\")\n ) {\n items.find((item) => !this._isDisabled(item))?.setAttribute(\"aria-pressed\", \"true\");\n }\n }\n\n private _itemFromEvent(event: Event): HTMLElement | null {\n if (!(event.target instanceof Element)) return null;\n const item = event.target.closest(\"button, a.button\");\n return item instanceof HTMLElement && item.parentElement === this.el ? item : null;\n }\n\n private _isDisabled(item: HTMLElement): boolean {\n return (\n (item instanceof HTMLButtonElement && item.disabled) ||\n item.getAttribute(\"aria-disabled\") === \"true\" ||\n item.classList.contains(\"disabled\")\n );\n }\n\n private _handleClick = (event: MouseEvent) => {\n if (!this._selectionMode) return;\n const item = this._itemFromEvent(event);\n if (!(item instanceof HTMLButtonElement) || this._isDisabled(item)) return;\n this._rememberPressed(item);\n\n const willSelect = item.getAttribute(\"aria-pressed\") !== \"true\";\n const selectedCount = this._toggleItems.filter(\n (button) => button.getAttribute(\"aria-pressed\") === \"true\",\n ).length;\n if (\n !willSelect &&\n this.el.hasAttribute(\"data-selection-required\") &&\n selectedCount === 1\n ) {\n return;\n }\n if (this._selectionMode === \"single\" && willSelect) {\n this._toggleItems.forEach((button) => {\n this._rememberPressed(button);\n button.setAttribute(\"aria-pressed\", \"false\");\n });\n }\n item.setAttribute(\"aria-pressed\", willSelect ? \"true\" : \"false\");\n };\n\n private _rememberPressed(item: HTMLButtonElement) {\n if (!this._originalPressed.has(item)) {\n this._originalPressed.set(item, item.getAttribute(\"aria-pressed\"));\n }\n }\n\n private _handlePointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n const item = this._itemFromEvent(event);\n if (item && !this._isDisabled(item)) this._startPress(item);\n };\n\n private _handleKeyDown = (event: KeyboardEvent) => {\n if (event.repeat || (event.key !== \" \" && event.key !== \"Enter\")) return;\n const item = this._itemFromEvent(event);\n if (item && !this._isDisabled(item)) this._startPress(item);\n };\n\n private _handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === \" \" || event.key === \"Enter\") this._resetPress();\n };\n\n private _handleFocusOut = (event: FocusEvent) => {\n if (event.target === this._activeItem) this._resetPress();\n };\n\n private _startPress(item: HTMLElement) {\n if (this._activeItem) return;\n this._finishRelease();\n\n const items = this._items;\n const activeIndex = items.indexOf(item);\n if (activeIndex < 0) return;\n\n this._activeItem = item;\n item.classList.add(PRESSED_CLASS);\n if (this.el.classList.contains(\"connected\") || items.length < 2) return;\n\n const rects = items.map((candidate) => candidate.getBoundingClientRect());\n const activeWidth = rects[activeIndex].width;\n if (activeWidth <= 0) return;\n\n const parsedMultiplier = Number.parseFloat(\n getComputedStyle(this.el).getPropertyValue(\n \"--md-comp-button-group-pressed-item-width-multiplier\",\n ),\n );\n const multiplier = Number.isFinite(parsedMultiplier) ? parsedMultiplier : 0.15;\n const desiredGrowth = activeWidth * multiplier;\n const neighborIndexes = [activeIndex - 1, activeIndex + 1].filter(\n (index) => index >= 0 && index < items.length,\n );\n const compression = new Map<number, number>();\n\n if (neighborIndexes.length === 1) {\n const index = neighborIndexes[0];\n compression.set(\n index,\n Math.min(desiredGrowth, this._compressionCapacity(items[index], rects[index])),\n );\n } else {\n const half = desiredGrowth / 2;\n for (const index of neighborIndexes) {\n compression.set(\n index,\n Math.min(half, this._compressionCapacity(items[index], rects[index])),\n );\n }\n let remaining = desiredGrowth - [...compression.values()].reduce((sum, value) => sum + value, 0);\n for (const index of neighborIndexes) {\n if (remaining <= 0) break;\n const capacity =\n this._compressionCapacity(items[index], rects[index]) - compression.get(index);\n const extra = Math.min(remaining, capacity);\n compression.set(index, compression.get(index) + extra);\n remaining -= extra;\n }\n }\n\n const actualGrowth = [...compression.values()].reduce((sum, value) => sum + value, 0);\n if (actualGrowth <= 0) return;\n\n items.forEach((candidate, index) => {\n this._pressedStyles.set(candidate, {\n width: candidate.style.width,\n baseWidth: rects[index].width,\n });\n candidate.style.width = `${rects[index].width}px`;\n });\n void this.el.offsetWidth;\n items.forEach((candidate, index) => {\n const adjustment =\n index === activeIndex ? actualGrowth : -(compression.get(index) || 0);\n candidate.style.width = `${rects[index].width + adjustment}px`;\n });\n }\n\n private _compressionCapacity(item: HTMLElement, rect: DOMRect): number {\n const minimumWidth = item.classList.contains(\"icon-button\")\n ? rect.width * (1 - MAX_ICON_COMPRESSION)\n : rect.height;\n return Math.max(0, rect.width - minimumWidth);\n }\n\n private _resetPress = () => {\n this._activeItem?.classList.remove(PRESSED_CLASS);\n this._activeItem = null;\n if (!this._pressedStyles.size) return;\n this._finishRelease();\n this._releaseStyles = new Map(this._pressedStyles);\n for (const [item, style] of this._releaseStyles) {\n item.style.width = `${style.baseWidth}px`;\n }\n this._pressedStyles.clear();\n this._releaseTimer = window.setTimeout(this._finishRelease, 200);\n };\n\n private _finishRelease = () => {\n if (this._releaseTimer !== null) window.clearTimeout(this._releaseTimer);\n this._releaseTimer = null;\n for (const [item, style] of this._releaseStyles) item.style.width = style.width;\n this._releaseStyles.clear();\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Carousel
|
|
3
|
+
} from "./chunk-AOGFNMXS.mjs";
|
|
4
|
+
import {
|
|
5
|
+
Component
|
|
6
|
+
} from "./chunk-QSQ24FYT.mjs";
|
|
7
|
+
|
|
8
|
+
// src/ts/components/tabs.ts
|
|
9
|
+
var _defaults = {
|
|
10
|
+
duration: 300,
|
|
11
|
+
onShow: null,
|
|
12
|
+
swipeable: false,
|
|
13
|
+
responsiveThreshold: Infinity
|
|
14
|
+
// breakpoint for swipeable
|
|
15
|
+
};
|
|
16
|
+
var Tabs = class _Tabs extends Component {
|
|
17
|
+
constructor(el, options) {
|
|
18
|
+
var _a;
|
|
19
|
+
super(el, options, _Tabs);
|
|
20
|
+
this._originalPanels = /* @__PURE__ */ new Map();
|
|
21
|
+
this._originalLinks = /* @__PURE__ */ new Map();
|
|
22
|
+
this._handleWindowResize = () => {
|
|
23
|
+
this._setTabsAndTabWidth();
|
|
24
|
+
if (this._tabWidth !== 0 && this._tabsWidth !== 0) {
|
|
25
|
+
this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + "px";
|
|
26
|
+
this._indicator.style.right = this._calcRightPos(this._activeTabLink) + "px";
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
this._handleTabClick = (e) => {
|
|
30
|
+
const target = e.target;
|
|
31
|
+
if (!target) return;
|
|
32
|
+
const tabLink = target.closest("a");
|
|
33
|
+
if (!tabLink || !Array.from(this._tabLinks).includes(tabLink)) return;
|
|
34
|
+
const tab = tabLink.parentElement;
|
|
35
|
+
const disabled = tabLink.classList.contains("disabled") || tabLink.getAttribute("aria-disabled") === "true" || tab?.classList.contains("disabled");
|
|
36
|
+
if (disabled) {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (tabLink.hasAttribute("target")) return;
|
|
41
|
+
if (this.options.swipeable) {
|
|
42
|
+
const panel = tabLink.hash && document.querySelector(tabLink.hash);
|
|
43
|
+
const index = this._tabsCarousel.images.indexOf(panel);
|
|
44
|
+
if (index >= 0) this._tabsCarousel.set(index);
|
|
45
|
+
e.preventDefault();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const _oldContent = this._content;
|
|
49
|
+
if (tabLink.hash) this._content = document.querySelector(tabLink.hash);
|
|
50
|
+
this._tabLinks = this._queryTabLinks();
|
|
51
|
+
const prevIndex = this._index;
|
|
52
|
+
this._setActiveTabLink(tabLink);
|
|
53
|
+
if (this._content) {
|
|
54
|
+
this._content.style.display = "block";
|
|
55
|
+
this._content.classList.add("active");
|
|
56
|
+
if (typeof this.options.onShow === "function")
|
|
57
|
+
this.options.onShow.call(this, this._content);
|
|
58
|
+
if (_oldContent && _oldContent !== this._content) {
|
|
59
|
+
_oldContent.style.display = "none";
|
|
60
|
+
_oldContent.classList.remove("active");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
this._setTabsAndTabWidth();
|
|
64
|
+
this._animateIndicator(prevIndex);
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
};
|
|
67
|
+
this.el["Expressive_Tabs"] = this;
|
|
68
|
+
this.options = {
|
|
69
|
+
..._Tabs.defaults,
|
|
70
|
+
...options
|
|
71
|
+
};
|
|
72
|
+
this._tabLinks = this._queryTabLinks();
|
|
73
|
+
this._tabLinks.forEach((link) => {
|
|
74
|
+
this._originalLinks.set(link, { active: link.classList.contains("active"), current: link.getAttribute("aria-current") });
|
|
75
|
+
if (link.hasAttribute("target")) return;
|
|
76
|
+
const panel = link.hash && document.querySelector(link.hash);
|
|
77
|
+
if (panel) this._originalPanels.set(panel, {
|
|
78
|
+
display: panel.style.display,
|
|
79
|
+
priority: panel.style.getPropertyPriority("display"),
|
|
80
|
+
active: panel.classList.contains("active"),
|
|
81
|
+
carousel: panel.classList.contains("carousel-item")
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
(_a = this.options).swipeable && (_a.swipeable = window.innerWidth <= this.options.responsiveThreshold);
|
|
85
|
+
this._index = 0;
|
|
86
|
+
this._setupActiveTabLink();
|
|
87
|
+
if (this.options.swipeable) {
|
|
88
|
+
this._setupSwipeableTabs();
|
|
89
|
+
} else {
|
|
90
|
+
this._setupNormalTabs();
|
|
91
|
+
}
|
|
92
|
+
this._setTabsAndTabWidth();
|
|
93
|
+
this._createIndicator();
|
|
94
|
+
this._setupEventHandlers();
|
|
95
|
+
}
|
|
96
|
+
static get defaults() {
|
|
97
|
+
return _defaults;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Initializes instances of Tabs.
|
|
101
|
+
* @param els HTML elements.
|
|
102
|
+
* @param options Component options.
|
|
103
|
+
*/
|
|
104
|
+
static init(els, options = {}) {
|
|
105
|
+
return super.init(els, options, _Tabs);
|
|
106
|
+
}
|
|
107
|
+
static getInstance(el) {
|
|
108
|
+
return el["Expressive_Tabs"];
|
|
109
|
+
}
|
|
110
|
+
destroy() {
|
|
111
|
+
this._removeEventHandlers();
|
|
112
|
+
this._indicator.remove();
|
|
113
|
+
if (this.options.swipeable) {
|
|
114
|
+
this._teardownSwipeableTabs();
|
|
115
|
+
}
|
|
116
|
+
this._originalPanels.forEach((original, panel) => {
|
|
117
|
+
panel.style.setProperty("display", original.display, original.priority);
|
|
118
|
+
panel.classList.toggle("active", original.active);
|
|
119
|
+
panel.classList.toggle("carousel-item", original.carousel);
|
|
120
|
+
if (!panel.className) panel.removeAttribute("class");
|
|
121
|
+
});
|
|
122
|
+
this._originalLinks.forEach((original, link) => {
|
|
123
|
+
link.classList.toggle("active", original.active);
|
|
124
|
+
if (original.current === null) link.removeAttribute("aria-current");
|
|
125
|
+
else link.setAttribute("aria-current", original.current);
|
|
126
|
+
});
|
|
127
|
+
this.el["Expressive_Tabs"] = void 0;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The index of tab that is currently shown.
|
|
131
|
+
*/
|
|
132
|
+
get index() {
|
|
133
|
+
return this._index;
|
|
134
|
+
}
|
|
135
|
+
_setupEventHandlers() {
|
|
136
|
+
window.addEventListener("resize", this._handleWindowResize);
|
|
137
|
+
this.el.addEventListener("click", this._handleTabClick);
|
|
138
|
+
}
|
|
139
|
+
_removeEventHandlers() {
|
|
140
|
+
window.removeEventListener("resize", this._handleWindowResize);
|
|
141
|
+
this.el.removeEventListener("click", this._handleTabClick);
|
|
142
|
+
}
|
|
143
|
+
_queryTabLinks() {
|
|
144
|
+
return this.el.querySelectorAll(
|
|
145
|
+
":scope > a, :scope > .tab > a"
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
_createIndicator() {
|
|
149
|
+
const tag = this.el.tagName === "UL" || this.el.tagName === "OL" ? "li" : "span";
|
|
150
|
+
const indicator = document.createElement(tag);
|
|
151
|
+
indicator.classList.add("indicator");
|
|
152
|
+
this.el.appendChild(indicator);
|
|
153
|
+
this._indicator = indicator;
|
|
154
|
+
this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + "px";
|
|
155
|
+
this._indicator.style.right = this._calcRightPos(this._activeTabLink) + "px";
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Which tab is current, for the eye and for assistive technology.
|
|
159
|
+
*
|
|
160
|
+
* The class alone is a colour. `aria-current` is the part a screen reader
|
|
161
|
+
* reads, and because tabs are navigation rather than a tablist (rule 2 -
|
|
162
|
+
* there is no keyboard model here to back a tablist), "current" is exactly
|
|
163
|
+
* the right word for it. Its *value* changes as the user clicks, which makes
|
|
164
|
+
* maintaining it the component's job, not the author's - see CONTEXT.md on
|
|
165
|
+
* static semantics versus dynamic state. Writing it once in the markup and
|
|
166
|
+
* never moving it left the old tab announcing itself as current.
|
|
167
|
+
*/
|
|
168
|
+
_setActiveTabLink(tabLink) {
|
|
169
|
+
Array.from(this._tabLinks).forEach((a) => {
|
|
170
|
+
a.classList.remove("active");
|
|
171
|
+
a.removeAttribute("aria-current");
|
|
172
|
+
});
|
|
173
|
+
this._activeTabLink = tabLink;
|
|
174
|
+
tabLink.classList.add("active");
|
|
175
|
+
tabLink.setAttribute("aria-current", "page");
|
|
176
|
+
this._index = Array.from(this._tabLinks).indexOf(tabLink);
|
|
177
|
+
this._content = tabLink.hasAttribute("target") ? null : document.getElementById(tabLink.hash.slice(1));
|
|
178
|
+
}
|
|
179
|
+
_setupActiveTabLink() {
|
|
180
|
+
this._activeTabLink = Array.from(this._tabLinks).find(
|
|
181
|
+
(a) => a.getAttribute("href") === location.hash
|
|
182
|
+
);
|
|
183
|
+
if (!this._activeTabLink) {
|
|
184
|
+
let activeTabLink = this.el.querySelector("a.active");
|
|
185
|
+
if (!activeTabLink) {
|
|
186
|
+
activeTabLink = this._tabLinks[0];
|
|
187
|
+
}
|
|
188
|
+
this._activeTabLink = activeTabLink;
|
|
189
|
+
}
|
|
190
|
+
this._setActiveTabLink(this._activeTabLink);
|
|
191
|
+
this._originalPanels.forEach((_, panel) => panel.classList.toggle("active", panel === this._content));
|
|
192
|
+
}
|
|
193
|
+
_setupSwipeableTabs() {
|
|
194
|
+
const tabsContent = [];
|
|
195
|
+
this._tabLinks.forEach((a) => {
|
|
196
|
+
if (a.hash && !a.hasAttribute("target")) {
|
|
197
|
+
const currContent = document.querySelector(a.hash);
|
|
198
|
+
if (!currContent) return;
|
|
199
|
+
currContent.classList.add("carousel-item");
|
|
200
|
+
tabsContent.push(currContent);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
const tabsWrapper = document.createElement("div");
|
|
204
|
+
tabsWrapper.classList.add("tabs-content", "carousel", "flat");
|
|
205
|
+
tabsContent[0].parentElement.insertBefore(tabsWrapper, tabsContent[0]);
|
|
206
|
+
tabsContent.forEach((tabContent) => {
|
|
207
|
+
const marker = document.createComment("");
|
|
208
|
+
tabContent.before(marker);
|
|
209
|
+
this._originalPanels.get(tabContent).marker = marker;
|
|
210
|
+
tabsWrapper.appendChild(tabContent);
|
|
211
|
+
tabContent.style.display = "";
|
|
212
|
+
});
|
|
213
|
+
this._tabsCarousel = Carousel.init(tabsWrapper, {
|
|
214
|
+
fullWidth: true,
|
|
215
|
+
noWrap: true,
|
|
216
|
+
duration: this.options.duration,
|
|
217
|
+
onCycleTo: (item) => {
|
|
218
|
+
const prevIndex = this._index;
|
|
219
|
+
this._setActiveTabLink(Array.from(this._tabLinks).find((a) => !a.hasAttribute("target") && a.hash === "#" + item.id));
|
|
220
|
+
this._setTabsAndTabWidth();
|
|
221
|
+
this._animateIndicator(prevIndex);
|
|
222
|
+
if (typeof this.options.onShow === "function")
|
|
223
|
+
this.options.onShow.call(this, this._content);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
_teardownSwipeableTabs() {
|
|
228
|
+
const tabsWrapper = this._tabsCarousel.el;
|
|
229
|
+
this._tabsCarousel.destroy();
|
|
230
|
+
this._originalPanels.forEach((original, panel) => original.marker?.replaceWith(panel));
|
|
231
|
+
tabsWrapper.remove();
|
|
232
|
+
}
|
|
233
|
+
_setupNormalTabs() {
|
|
234
|
+
Array.from(this._tabLinks).forEach((a) => {
|
|
235
|
+
if (a === this._activeTabLink || a.hasAttribute("target")) return;
|
|
236
|
+
if (a.hash) {
|
|
237
|
+
const currContent = document.querySelector(a.hash);
|
|
238
|
+
if (currContent) currContent.style.display = "none";
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
_setTabsAndTabWidth() {
|
|
243
|
+
this._tabsWidth = this.el.getBoundingClientRect().width;
|
|
244
|
+
this._tabWidth = Math.max(this._tabsWidth, this.el.scrollWidth) / this._tabLinks.length;
|
|
245
|
+
}
|
|
246
|
+
_calcRightPos(el) {
|
|
247
|
+
return Math.ceil(this._tabsWidth - el.offsetLeft - el.getBoundingClientRect().width);
|
|
248
|
+
}
|
|
249
|
+
_calcLeftPos(el) {
|
|
250
|
+
return Math.floor(el.offsetLeft);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Recalculate tab indicator position. This is useful when
|
|
254
|
+
* the indicator position is not correct.
|
|
255
|
+
*/
|
|
256
|
+
updateTabIndicator() {
|
|
257
|
+
this._setTabsAndTabWidth();
|
|
258
|
+
this._animateIndicator(this._index);
|
|
259
|
+
}
|
|
260
|
+
_animateIndicator(prevIndex) {
|
|
261
|
+
let leftDelay = 0, rightDelay = 0;
|
|
262
|
+
const isMovingLeftOrStaying = this._index - prevIndex >= 0;
|
|
263
|
+
if (isMovingLeftOrStaying) leftDelay = 90;
|
|
264
|
+
else rightDelay = 90;
|
|
265
|
+
this._indicator.style.transition = `
|
|
266
|
+
left ${this.options.duration}ms ease-out ${leftDelay}ms,
|
|
267
|
+
right ${this.options.duration}ms ease-out ${rightDelay}ms`;
|
|
268
|
+
this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + "px";
|
|
269
|
+
this._indicator.style.right = this._calcRightPos(this._activeTabLink) + "px";
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Show tab content that corresponds to the tab with the id.
|
|
273
|
+
* @param tabId The id of the tab that you want to switch to.
|
|
274
|
+
*/
|
|
275
|
+
select(tabId) {
|
|
276
|
+
const tab = Array.from(this._tabLinks).find(
|
|
277
|
+
(a) => a.getAttribute("href") === "#" + tabId
|
|
278
|
+
);
|
|
279
|
+
if (tab) tab.click();
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
export {
|
|
284
|
+
Tabs
|
|
285
|
+
};
|
|
286
|
+
//# sourceMappingURL=chunk-YFXEJ7GR.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/tabs.ts"],
|
|
4
|
+
"sourcesContent": ["import { Carousel } from './carousel';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface TabsOptions extends BaseOptions {\n /**\n * Transition duration in milliseconds.\n * @default 300\n */\n duration: number;\n /**\n * Callback for when a new tab content is shown.\n * @default null\n */\n onShow: (newContent: Element) => void;\n /**\n * Set to true to enable swipeable tabs.\n * This also uses the responsiveThreshold option.\n * @default false\n */\n swipeable: boolean;\n /**\n * The maximum width of the screen, in pixels,\n * where the swipeable functionality initializes.\n * @default infinity\n */\n responsiveThreshold: number;\n}\n\nconst _defaults: TabsOptions = {\n duration: 300,\n onShow: null,\n swipeable: false,\n responsiveThreshold: Infinity // breakpoint for swipeable\n};\n\nexport class Tabs extends Component<TabsOptions> {\n _tabLinks: NodeListOf<HTMLAnchorElement>;\n _index: number;\n _indicator: HTMLElement;\n _tabWidth: number;\n _tabsWidth: number;\n _tabsCarousel: Carousel;\n _activeTabLink: HTMLAnchorElement;\n _content: HTMLElement;\n private _originalPanels = new Map<HTMLElement, { display: string; priority: string; active: boolean; carousel: boolean; marker?: Comment }>();\n private _originalLinks = new Map<HTMLAnchorElement, { active: boolean; current: string | null }>();\n\n constructor(el: HTMLElement, options: Partial<TabsOptions>) {\n super(el, options, Tabs);\n this.el['Expressive_Tabs'] = this;\n\n this.options = {\n ...Tabs.defaults,\n ...options\n };\n\n this._tabLinks = this._queryTabLinks();\n this._tabLinks.forEach(link => {\n this._originalLinks.set(link, { active: link.classList.contains('active'), current: link.getAttribute('aria-current') });\n if (link.hasAttribute('target')) return;\n const panel = link.hash && document.querySelector<HTMLElement>(link.hash);\n if (panel) this._originalPanels.set(panel, {\n display: panel.style.display, priority: panel.style.getPropertyPriority('display'),\n active: panel.classList.contains('active'), carousel: panel.classList.contains('carousel-item')\n });\n });\n this.options.swipeable &&= window.innerWidth <= this.options.responsiveThreshold;\n this._index = 0;\n this._setupActiveTabLink();\n if (this.options.swipeable) {\n this._setupSwipeableTabs();\n } else {\n this._setupNormalTabs();\n }\n // Setup tabs indicator after content to ensure accurate widths\n this._setTabsAndTabWidth();\n this._createIndicator();\n this._setupEventHandlers();\n }\n\n static get defaults(): TabsOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Tabs.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TabsOptions>): Tabs;\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<TabsOptions>): Tabs[];\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<TabsOptions> = {}\n ): Tabs | Tabs[] {\n return super.init(els, options, Tabs);\n }\n\n static getInstance(el: HTMLElement): Tabs {\n return el['Expressive_Tabs'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._indicator.remove();\n if (this.options.swipeable) {\n this._teardownSwipeableTabs();\n }\n this._originalPanels.forEach((original, panel) => {\n panel.style.setProperty('display', original.display, original.priority);\n panel.classList.toggle('active', original.active);\n panel.classList.toggle('carousel-item', original.carousel);\n if (!panel.className) panel.removeAttribute('class');\n });\n this._originalLinks.forEach((original, link) => {\n link.classList.toggle('active', original.active);\n if (original.current === null) link.removeAttribute('aria-current');\n else link.setAttribute('aria-current', original.current);\n });\n this.el['Expressive_Tabs'] = undefined;\n }\n\n /**\n * The index of tab that is currently shown.\n */\n get index() {\n return this._index;\n }\n\n _setupEventHandlers() {\n window.addEventListener('resize', this._handleWindowResize);\n this.el.addEventListener('click', this._handleTabClick);\n }\n\n _removeEventHandlers() {\n window.removeEventListener('resize', this._handleWindowResize);\n this.el.removeEventListener('click', this._handleTabClick);\n }\n\n _handleWindowResize = () => {\n this._setTabsAndTabWidth();\n if (this._tabWidth !== 0 && this._tabsWidth !== 0) {\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n };\n\n _queryTabLinks() {\n return this.el.querySelectorAll<HTMLAnchorElement>(\n ':scope > a, :scope > .tab > a'\n );\n }\n\n _handleTabClick = (e: MouseEvent) => {\n const target = e.target as Element | null;\n if (!target) return;\n const tabLink = target.closest('a') as HTMLAnchorElement | null;\n if (!tabLink || !Array.from(this._tabLinks).includes(tabLink)) return;\n\n const tab = tabLink.parentElement;\n const disabled =\n tabLink.classList.contains('disabled') ||\n tabLink.getAttribute('aria-disabled') === 'true' ||\n tab?.classList.contains('disabled');\n if (disabled) {\n e.preventDefault();\n return;\n }\n // Act as regular link if target attribute is specified.\n if (tabLink.hasAttribute('target')) return;\n if (this.options.swipeable) {\n const panel = tabLink.hash && document.querySelector(tabLink.hash);\n const index = this._tabsCarousel.images.indexOf(panel as HTMLElement);\n if (index >= 0) this._tabsCarousel.set(index);\n e.preventDefault();\n return;\n }\n const _oldContent = this._content;\n // Update the variables with the new link and content\n if (tabLink.hash) this._content = document.querySelector(tabLink.hash);\n this._tabLinks = this._queryTabLinks();\n // Moves the class and aria-current together, off the old tab and onto this\n // one - they used to be able to disagree.\n const prevIndex = this._index;\n this._setActiveTabLink(tabLink);\n\n // Swap content\n if (this._content) {\n this._content.style.display = 'block';\n this._content.classList.add('active');\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n if (_oldContent && _oldContent !== this._content) {\n _oldContent.style.display = 'none';\n _oldContent.classList.remove('active');\n }\n }\n // Update widths after content is swapped (scrollbar bugfix)\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n e.preventDefault();\n };\n\n _createIndicator() {\n const tag = this.el.tagName === 'UL' || this.el.tagName === 'OL' ? 'li' : 'span';\n const indicator = document.createElement(tag);\n indicator.classList.add('indicator');\n this.el.appendChild(indicator);\n this._indicator = indicator;\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n /**\n * Which tab is current, for the eye and for assistive technology.\n *\n * The class alone is a colour. `aria-current` is the part a screen reader\n * reads, and because tabs are navigation rather than a tablist (rule 2 -\n * there is no keyboard model here to back a tablist), \"current\" is exactly\n * the right word for it. Its *value* changes as the user clicks, which makes\n * maintaining it the component's job, not the author's - see CONTEXT.md on\n * static semantics versus dynamic state. Writing it once in the markup and\n * never moving it left the old tab announcing itself as current.\n */\n private _setActiveTabLink(tabLink: HTMLAnchorElement) {\n Array.from(this._tabLinks).forEach((a: HTMLAnchorElement) => {\n a.classList.remove('active');\n a.removeAttribute('aria-current');\n });\n this._activeTabLink = tabLink;\n tabLink.classList.add('active');\n tabLink.setAttribute('aria-current', 'page');\n this._index = Array.from(this._tabLinks).indexOf(tabLink);\n this._content = tabLink.hasAttribute('target') ? null : document.getElementById(tabLink.hash.slice(1));\n }\n\n _setupActiveTabLink() {\n // If the location.hash matches one of the links, use that as the active tab.\n this._activeTabLink = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === location.hash\n );\n // If no match is found, use the first link or any with class 'active' as the initial active tab.\n if (!this._activeTabLink) {\n let activeTabLink = this.el.querySelector('a.active');\n if (!activeTabLink) {\n activeTabLink = this._tabLinks[0];\n }\n this._activeTabLink = activeTabLink as HTMLAnchorElement;\n }\n this._setActiveTabLink(this._activeTabLink);\n\n this._originalPanels.forEach((_, panel) => panel.classList.toggle('active', panel === this._content));\n }\n\n _setupSwipeableTabs() {\n const tabsContent = [];\n this._tabLinks.forEach((a) => {\n if (a.hash && !a.hasAttribute('target')) {\n const currContent = document.querySelector(a.hash);\n if (!currContent) return;\n currContent.classList.add('carousel-item');\n tabsContent.push(currContent);\n }\n });\n\n // Create Carousel-Wrapper around Tab-Contents\n const tabsWrapper = document.createElement('div');\n tabsWrapper.classList.add('tabs-content', 'carousel', 'flat');\n\n // Wrap around\n tabsContent[0].parentElement.insertBefore(tabsWrapper, tabsContent[0]);\n tabsContent.forEach((tabContent) => {\n const marker = document.createComment('');\n tabContent.before(marker);\n this._originalPanels.get(tabContent).marker = marker;\n tabsWrapper.appendChild(tabContent);\n tabContent.style.display = '';\n });\n\n this._tabsCarousel = Carousel.init(tabsWrapper, {\n fullWidth: true,\n noWrap: true,\n duration: this.options.duration,\n onCycleTo: (item) => {\n const prevIndex = this._index;\n this._setActiveTabLink(Array.from(this._tabLinks).find(a => !a.hasAttribute('target') && a.hash === '#' + item.id));\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n }\n });\n }\n\n _teardownSwipeableTabs() {\n const tabsWrapper = this._tabsCarousel.el;\n this._tabsCarousel.destroy();\n this._originalPanels.forEach((original, panel) => original.marker?.replaceWith(panel));\n tabsWrapper.remove();\n }\n\n _setupNormalTabs() {\n // Hide Tabs Content\n Array.from(this._tabLinks).forEach((a) => {\n if (a === this._activeTabLink || a.hasAttribute('target')) return;\n if ((<HTMLAnchorElement>a).hash) {\n const currContent = document.querySelector((<HTMLAnchorElement>a).hash);\n if (currContent) (<HTMLElement>currContent).style.display = 'none';\n }\n });\n }\n\n _setTabsAndTabWidth() {\n this._tabsWidth = this.el.getBoundingClientRect().width;\n this._tabWidth = Math.max(this._tabsWidth, this.el.scrollWidth) / this._tabLinks.length;\n }\n\n _calcRightPos(el) {\n return Math.ceil(this._tabsWidth - el.offsetLeft - el.getBoundingClientRect().width);\n }\n\n _calcLeftPos(el) {\n return Math.floor(el.offsetLeft);\n }\n\n /**\n * Recalculate tab indicator position. This is useful when\n * the indicator position is not correct.\n */\n updateTabIndicator() {\n this._setTabsAndTabWidth();\n this._animateIndicator(this._index);\n }\n\n _animateIndicator(prevIndex) {\n let leftDelay = 0,\n rightDelay = 0;\n\n const isMovingLeftOrStaying = this._index - prevIndex >= 0;\n if (isMovingLeftOrStaying) leftDelay = 90;\n else rightDelay = 90;\n\n // in v1: easeOutQuad\n this._indicator.style.transition = `\n left ${this.options.duration}ms ease-out ${leftDelay}ms,\n right ${this.options.duration}ms ease-out ${rightDelay}ms`;\n\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n /**\n * Show tab content that corresponds to the tab with the id.\n * @param tabId The id of the tab that you want to switch to.\n */\n select(tabId: string) {\n const tab = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === '#' + tabId\n );\n if (tab) (<HTMLAnchorElement>tab).click();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|