@expressivecss/expressive 0.10.1 → 0.12.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 +238 -7
- package/README.md +22 -1
- package/dist/css/expressive.css +272 -107
- 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-YFXEJ7GR.mjs → chunk-3VOK6J7U.mjs} +7 -8
- package/dist/js/chunks/chunk-3VOK6J7U.mjs.map +7 -0
- package/dist/js/chunks/{chunk-XDB3G6RL.mjs → chunk-6N2XAEFK.mjs} +15 -4
- package/dist/js/chunks/{chunk-XDB3G6RL.mjs.map → chunk-6N2XAEFK.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-MISGHDUU.mjs → chunk-6OMRGML6.mjs} +9 -7
- package/dist/js/chunks/{chunk-MISGHDUU.mjs.map → chunk-6OMRGML6.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-A3BJA7V4.mjs → chunk-6WLSDZ4O.mjs} +2 -2
- package/dist/js/chunks/{chunk-JODJAGFS.mjs → chunk-CKQP6P76.mjs} +31 -8
- package/dist/js/chunks/chunk-CKQP6P76.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KR44BSYQ.mjs → chunk-DLWYKFEI.mjs} +3 -3
- package/dist/js/chunks/{chunk-SLFNPY5M.mjs → chunk-EC63CHXU.mjs} +2 -2
- package/dist/js/chunks/chunk-G3I5H2U3.mjs +7 -0
- package/dist/js/chunks/{chunk-ZAOYQ6SY.mjs.map → chunk-G3I5H2U3.mjs.map} +1 -1
- package/dist/js/chunks/{chunk-LZVBJ33S.mjs → chunk-GZWPXXY6.mjs} +15 -8
- package/dist/js/chunks/chunk-GZWPXXY6.mjs.map +7 -0
- package/dist/js/chunks/{chunk-QYCYP443.mjs → chunk-H2WA4XHH.mjs} +43 -36
- package/dist/js/chunks/chunk-H2WA4XHH.mjs.map +7 -0
- package/dist/js/chunks/{chunk-G576EP5O.mjs → chunk-HB6IW7QQ.mjs} +78 -16
- package/dist/js/chunks/chunk-HB6IW7QQ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-7MM4VJJO.mjs → chunk-HLDXZ7XB.mjs} +23 -15
- package/dist/js/chunks/chunk-HLDXZ7XB.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZIZVUWRL.mjs → chunk-HNFSMIBY.mjs} +18 -18
- package/dist/js/chunks/{chunk-D4UZ4HFN.mjs → chunk-IFXVDDDH.mjs} +23 -11
- package/dist/js/chunks/chunk-IFXVDDDH.mjs.map +7 -0
- package/dist/js/chunks/{chunk-QSQ24FYT.mjs → chunk-LTWPGFBR.mjs} +2 -2
- package/dist/js/chunks/{chunk-QSQ24FYT.mjs.map → chunk-LTWPGFBR.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-AOGFNMXS.mjs → chunk-LWBQIX5J.mjs} +16 -16
- package/dist/js/chunks/chunk-LWBQIX5J.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GY2Z5CJ2.mjs → chunk-NNYP33NB.mjs} +67 -32
- package/dist/js/chunks/chunk-NNYP33NB.mjs.map +7 -0
- package/dist/js/chunks/{chunk-VAS6JQ6P.mjs → chunk-PIJ2TAR3.mjs} +3 -3
- package/dist/js/chunks/{chunk-JR24UB4X.mjs → chunk-PSSHQWCX.mjs} +2 -2
- package/dist/js/chunks/{chunk-PIIAEYAJ.mjs → chunk-QDAL4IYN.mjs} +2 -2
- package/dist/js/chunks/chunk-QV2JAWIZ.mjs +135 -0
- package/dist/js/chunks/chunk-QV2JAWIZ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-N3UHGN3N.mjs → chunk-QVVEWBOF.mjs} +3 -3
- package/dist/js/chunks/{chunk-ZZBZI2XN.mjs → chunk-RFZZCYVU.mjs} +18 -11
- package/dist/js/chunks/chunk-RFZZCYVU.mjs.map +7 -0
- package/dist/js/chunks/{chunk-TYM6U5DY.mjs → chunk-UAEAQBRC.mjs} +2 -2
- package/dist/js/chunks/{chunk-7UXHSYIA.mjs → chunk-UBLRRJ7N.mjs} +3 -3
- package/dist/js/chunks/{chunk-EP3CVKB5.mjs → chunk-UEZUJQ66.mjs} +8 -5
- package/dist/js/chunks/chunk-UEZUJQ66.mjs.map +7 -0
- package/dist/js/chunks/{chunk-JNPIWFJT.mjs → chunk-UNEMYWEW.mjs} +3 -3
- package/dist/js/chunks/{chunk-JKNPQQWY.mjs → chunk-WJXDBPXQ.mjs} +28 -12
- package/dist/js/chunks/chunk-WJXDBPXQ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-XO5WX3TK.mjs → chunk-YDCS5S3J.mjs} +2 -2
- package/dist/js/chunks/{chunk-TK6PX2GC.mjs → chunk-YSBCHYXP.mjs} +16 -8
- package/dist/js/chunks/chunk-YSBCHYXP.mjs.map +7 -0
- package/dist/js/expressive.cjs +398 -217
- package/dist/js/expressive.cjs.map +2 -2
- package/dist/js/expressive.js +398 -217
- package/dist/js/expressive.js.map +2 -2
- package/dist/js/expressive.min.js +10 -10
- package/dist/js/expressive.min.js.map +3 -3
- package/dist/js/expressive.mjs +30 -30
- package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
- package/dist/js/internal/behaviors/dialogs.mjs +2 -2
- package/dist/js/internal/behaviors/forms.mjs +2 -2
- package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
- package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
- package/dist/js/internal/components/appBar.mjs +2 -2
- package/dist/js/internal/components/autocomplete.mjs +4 -4
- package/dist/js/internal/components/buttonGroup.mjs +2 -2
- package/dist/js/internal/components/buttons.mjs +3 -3
- package/dist/js/internal/components/cards.mjs +3 -3
- package/dist/js/internal/components/carousel.mjs +3 -3
- package/dist/js/internal/components/characterCounter.mjs +2 -2
- package/dist/js/internal/components/chips.mjs +5 -5
- package/dist/js/internal/components/datepicker.mjs +6 -6
- package/dist/js/internal/components/expandingCard.mjs +3 -3
- package/dist/js/internal/components/index.mjs +23 -23
- package/dist/js/internal/components/lightbox.mjs +3 -3
- package/dist/js/internal/components/menu.mjs +3 -3
- package/dist/js/internal/components/navigationRail.mjs +2 -2
- package/dist/js/internal/components/registry.mjs +24 -24
- package/dist/js/internal/components/scrollspy.mjs +2 -2
- package/dist/js/internal/components/select.mjs +4 -4
- package/dist/js/internal/components/slider.mjs +3 -3
- package/dist/js/internal/components/snackbar.mjs +2 -2
- package/dist/js/internal/components/tabs.mjs +4 -4
- package/dist/js/internal/components/timepicker.mjs +4 -4
- package/dist/js/internal/components/tooltip.mjs +3 -3
- package/dist/js/internal/core/component.mjs +1 -1
- package/dist/js/internal/core/utils.mjs +1 -1
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
- package/dist/js/modular.mjs +30 -30
- package/dist/types/components/appBar.d.ts +1 -1
- package/dist/types/components/autocomplete.d.ts +2 -1
- package/dist/types/components/datepicker.d.ts +6 -2
- package/dist/types/components/menu.d.ts +1 -0
- package/dist/types/components/scrollspy.d.ts +5 -4
- package/dist/types/components/select.d.ts +7 -1
- package/dist/types/components/slider.d.ts +1 -0
- package/dist/types/components/snackbar.d.ts +6 -0
- package/dist/types/components/timepicker.d.ts +4 -1
- package/dist/types/components/tooltip.d.ts +2 -1
- package/dist/types/modular.d.ts +1 -1
- package/package.json +1 -1
- package/src/sass/abstracts/_mixins.scss +19 -11
- package/src/sass/components/_buttons.scss +45 -0
- package/src/sass/components/_carousel.scss +9 -7
- package/src/sass/components/_chips.scss +5 -9
- package/src/sass/components/_dialog.scss +0 -7
- package/src/sass/components/_navbar.scss +13 -8
- package/src/sass/components/_page-footer.scss +0 -11
- package/src/sass/components/_progress.scss +25 -6
- package/src/sass/components/_snackbar.scss +1 -1
- package/src/sass/components/_timepicker.scss +2 -2
- package/src/sass/components/_toolbar.scss +1 -1
- package/src/sass/components/forms/_checkboxes.scss +2 -2
- package/src/sass/components/forms/_fieldset.scss +20 -1
- package/src/sass/components/forms/_file-input.scss +11 -3
- package/src/sass/components/forms/_input-fields.scss +35 -15
- package/src/sass/components/forms/_radio-buttons.scss +2 -2
- package/src/sass/components/forms/_select.scss +3 -2
- package/src/sass/components/forms/_slider.scss +51 -29
- package/src/sass/components/forms/_switches.scss +3 -3
- package/src/sass/utilities/_helpers.scss +14 -0
- package/src/sass/utilities/_spacing.scss +29 -23
- package/src/sass/utilities/_visibility.scss +7 -1
- package/dist/js/chunks/chunk-7MM4VJJO.mjs.map +0 -7
- package/dist/js/chunks/chunk-AOGFNMXS.mjs.map +0 -7
- package/dist/js/chunks/chunk-D4UZ4HFN.mjs.map +0 -7
- package/dist/js/chunks/chunk-EP3CVKB5.mjs.map +0 -7
- package/dist/js/chunks/chunk-G576EP5O.mjs.map +0 -7
- package/dist/js/chunks/chunk-GY2Z5CJ2.mjs.map +0 -7
- package/dist/js/chunks/chunk-JKNPQQWY.mjs.map +0 -7
- package/dist/js/chunks/chunk-JODJAGFS.mjs.map +0 -7
- package/dist/js/chunks/chunk-LZVBJ33S.mjs.map +0 -7
- package/dist/js/chunks/chunk-QYCYP443.mjs.map +0 -7
- package/dist/js/chunks/chunk-TK6PX2GC.mjs.map +0 -7
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs +0 -154
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs.map +0 -7
- package/dist/js/chunks/chunk-YFXEJ7GR.mjs.map +0 -7
- package/dist/js/chunks/chunk-ZAOYQ6SY.mjs +0 -7
- package/dist/js/chunks/chunk-ZZBZI2XN.mjs.map +0 -7
- /package/dist/js/chunks/{chunk-A3BJA7V4.mjs.map → chunk-6WLSDZ4O.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-KR44BSYQ.mjs.map → chunk-DLWYKFEI.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-SLFNPY5M.mjs.map → chunk-EC63CHXU.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-ZIZVUWRL.mjs.map → chunk-HNFSMIBY.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-VAS6JQ6P.mjs.map → chunk-PIJ2TAR3.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-JR24UB4X.mjs.map → chunk-PSSHQWCX.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-PIIAEYAJ.mjs.map → chunk-QDAL4IYN.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-N3UHGN3N.mjs.map → chunk-QVVEWBOF.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-TYM6U5DY.mjs.map → chunk-UAEAQBRC.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-7UXHSYIA.mjs.map → chunk-UBLRRJ7N.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-JNPIWFJT.mjs.map → chunk-UNEMYWEW.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-XO5WX3TK.mjs.map → chunk-YDCS5S3J.mjs.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ts/components/datepicker.ts"],
|
|
4
|
-
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { FormSelect } from './select';\nimport { BaseOptions, Component, I18nOptions, InitElements, InitElement } from '../core/component';\nimport { DockedDisplayPlugin } from '../plugins/dockedDisplayPlugin';\n\nexport interface DateI18nOptions extends I18nOptions {\n previousMonth: string;\n nextMonth: string;\n months: string[];\n monthsShort: string[];\n weekdays: string[];\n weekdaysShort: string[];\n weekdaysAbbrev: string[];\n}\n\nexport interface DatepickerOptions extends BaseOptions {\n /**\n * The date output format for the input field value\n * or a function taking the date and outputting the\n * formatted date string.\n * @default 'mmm dd, yyyy'\n */\n format: string | ((d: Date) => string);\n /**\n * Used to create date object from current input string.\n * @default null\n */\n parse: ((value: string, format: string) => Date) | null;\n /**\n * The initial condition if the datepicker is based on date range.\n * @default false\n */\n isDateRange: boolean;\n /**\n * The selector of the user specified date range end element\n */\n dateRangeEndEl: string | null;\n /**\n * The initial condition if the datepicker is based on multiple date selection.\n * @default false\n */\n isMultipleSelection: boolean;\n /**\n * The initial date to view when first opened.\n * @default null\n */\n defaultDate: Date | null;\n /**\n * The initial end date to view when first opened.\n * @default null\n */\n defaultEndDate: Date | null;\n /**\n * Make the `defaultDate` the initial selected value.\n * @default false\n */\n setDefaultDate: boolean;\n /**\n * Make the `defaultEndDate` the initial selected value.\n * @default false\n */\n setDefaultEndDate: boolean;\n /**\n * Prevent selection of any date on the weekend.\n * @default false\n */\n disableWeekends: boolean;\n /**\n * Custom function to disable certain days.\n * @default null\n */\n disableDayFn: ((day: Date) => boolean) | null;\n /**\n * First day of week (0: Sunday, 1: Monday etc).\n * @default 0\n */\n firstDay: number;\n /**\n * The earliest date that can be selected.\n * @default null\n */\n minDate: Date | null;\n /**\n * The latest date that can be selected.\n * @default null\n */\n maxDate: Date | null;\n /**\n * Number of years either side, or array of upper/lower range.\n * @default 10\n */\n yearRange: number | number[];\n /**\n * Sort year range in reverse order.\n * @default false\n */\n yearRangeReverse: boolean;\n /**\n * Changes Datepicker to RTL.\n * @default false\n */\n isRTL: boolean;\n /**\n * Show month after year in Datepicker title.\n * @default false\n */\n showMonthAfterYear: boolean;\n /**\n * Render days of the calendar grid that fall in the next\n * or previous month.\n * @default false\n */\n showDaysInNextAndPreviousMonths: boolean;\n /**\n * Specify if the docked datepicker is in open state by default\n */\n openByDefault: boolean;\n /**\n * Specify a DOM element OR selector for a DOM element to render\n * the calendar in, by default it will be placed before the input.\n * @default null\n */\n container: HTMLElement | string | null;\n /**\n * Show the clear button in the datepicker.\n * @default false\n */\n showClearBtn: boolean;\n /**\n * Autosubmit calendar day select to input field\n * @default false\n */\n autoSubmit: true;\n /**\n * Internationalization options.\n */\n i18n: Partial<DateI18nOptions>;\n /**\n * An array of string returned by `Date.toDateString()`,\n * indicating there are events in the specified days.\n * @default []\n */\n events: string[];\n /**\n * Callback function when date is selected,\n * first parameter is the newly selected date.\n * @default null\n */\n onSelect: ((selectedDate: Date) => void) | null;\n /**\n * Callback function when Datepicker HTML is refreshed.\n * @default null\n */\n onDraw: (() => void) | null;\n /**\n * Callback function for interaction with input field.\n * @default null\n */\n onInputInteraction: (() => void) | null;\n /**\n * Callback function for interaction with confirm button.\n * @default null\n */\n onConfirm: (() => void) | null;\n /**\n * Callback function for interaction with close button.\n * @default null\n */\n onCancel: (() => void) | null;\n\n /** Field used for internal calculations DO NOT CHANGE IT */\n minYear?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n maxYear?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n minMonth?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n maxMonth?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n startRange?: Date;\n /** Field used for internal calculations DO NOT CHANGE IT */\n endRange?: Date;\n /**\n * Display plugin\n */\n displayPlugin: string;\n /**\n * Configurable display plugin options\n */\n displayPluginOptions: object;\n}\n\nconst _defaults: DatepickerOptions = {\n // the default output format for the input field value\n format: 'mmm dd, yyyy',\n // Used to create date object from current input string\n parse: null,\n // The initial condition if the datepicker is based on date range\n isDateRange: false,\n // The selector of the user specified date range end element\n dateRangeEndEl: null,\n // The initial condition if the datepicker is based on multiple date selection\n isMultipleSelection: false,\n // The initial date to view when first opened\n defaultDate: null,\n // The initial end date to view when first opened\n defaultEndDate: null,\n // Make the `defaultDate` the initial selected value\n setDefaultDate: false,\n // Make the `defaultEndDate` the initial selected value\n setDefaultEndDate: false,\n disableWeekends: false,\n disableDayFn: null,\n // First day of week (0: Sunday, 1: Monday etc)\n firstDay: 0,\n // The earliest date that can be selected\n minDate: null,\n // Thelatest date that can be selected\n maxDate: null,\n // Number of years either side, or array of upper/lower range\n yearRange: 10,\n // used internally (don't config outside)\n minYear: 0,\n maxYear: 9999,\n minMonth: undefined,\n maxMonth: undefined,\n startRange: null,\n endRange: null,\n isRTL: false,\n yearRangeReverse: false,\n // Render the month after year in the calendar title\n showMonthAfterYear: false,\n // Render days of the calendar grid that fall in the next or previous month\n showDaysInNextAndPreviousMonths: false,\n // Specify if docked picker is in open state by default\n openByDefault: false,\n // Specify a DOM element to render the calendar in\n container: null,\n // Show clear button\n showClearBtn: false,\n // Autosubmit\n autoSubmit: true,\n // internationalization\n i18n: {\n cancel: 'Cancel',\n clear: 'Clear',\n done: 'Ok',\n previousMonth: '\u2039',\n nextMonth: '\u203A',\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n ],\n monthsShort: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ],\n weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n weekdaysAbbrev: ['S', 'M', 'T', 'W', 'T', 'F', 'S']\n },\n // events array\n events: [],\n // callback function\n onSelect: null,\n onDraw: null,\n onInputInteraction: null,\n displayPlugin: null,\n displayPluginOptions: null,\n onConfirm: null,\n onCancel: null,\n};\n\nexport class Datepicker extends Component<DatepickerOptions> {\n declare el: HTMLInputElement;\n id: string;\n multiple: boolean = false;\n calendarEl: HTMLElement;\n\n /** CLEAR button instance. */\n // clearBtn: HTMLElement;\n /** DONE button instance */\n /*doneBtn: HTMLElement;\n cancelBtn: HTMLElement;*/\n\n containerEl: HTMLElement;\n yearTextEl: HTMLElement;\n dateTextEl: HTMLElement;\n endDateEl: HTMLInputElement;\n dateEls: HTMLInputElement[];\n /** The selected Date. */\n date: Date;\n endDate: null | Date;\n dates: Date[];\n formats: object;\n calendars: [{ month: number; year: number }];\n private _y: number;\n private _m: number;\n private displayPlugin: DockedDisplayPlugin;\n private footer: HTMLElement;\n /** Nesting depth of {@link _batchDraws}; > 0 means draws are being collected. */\n private _drawDepth = 0;\n /** Whether a draw was requested while batching. */\n private _drawDirty = false;\n /** Shape of the currently rendered controls; see {@link _controlsCacheKey}. */\n private _controlsKey: string = null;\n /** id linking the controls element to the table's aria-labelledby. */\n private _randId: string = null;\n private _focusedDate: Date = null;\n static _template: string;\n\n constructor(el: HTMLInputElement, options: Partial<DatepickerOptions>) {\n super(el, options, Datepicker);\n this.el['Expressive_Datepicker'] = this;\n\n this.options = {\n ...Datepicker.defaults,\n ...options\n };\n\n // make sure i18n defaults are not lost when only few i18n option properties are passed\n if (!!options && options.hasOwnProperty('i18n') && typeof options.i18n === 'object') {\n this.options.i18n = { ...Datepicker.defaults.i18n, ...options.i18n };\n }\n\n // Remove time component from minDate and maxDate options\n if (this.options.minDate) this.options.minDate.setHours(0, 0, 0, 0);\n if (this.options.maxDate) this.options.maxDate.setHours(0, 0, 0, 0);\n\n this.id = Utils.guid();\n if (this.options.isMultipleSelection) {\n this.multiple = true;\n this.dates = [];\n this.dateEls = [el];\n }\n\n this._setupVariables();\n this._insertHTMLIntoDOM();\n this._setupEventHandlers();\n\n if (!this.options.defaultDate) {\n this.options.defaultDate = new Date(Date.parse(this.el.value));\n }\n\n const defDate = this.options.defaultDate;\n if (Datepicker._isDate(defDate)) {\n if (this.options.setDefaultDate) {\n this.setDate(defDate, true);\n this.setInputValue(this.el, defDate);\n } else {\n this.gotoDate(defDate);\n }\n } else {\n this.gotoDate(new Date());\n }\n if (this.options.isDateRange) {\n this.multiple = true;\n const defEndDate = this.options.defaultEndDate;\n if (Datepicker._isDate(defEndDate)) {\n if (this.options.setDefaultEndDate) {\n this.setDate(defEndDate, true, true);\n this.setInputValue(this.endDateEl, defEndDate);\n }\n }\n }\n if (this.options.displayPlugin) {\n if (this.options.displayPlugin === 'docked') this.displayPlugin = DockedDisplayPlugin.init(this.el, this.containerEl, this.options.displayPluginOptions);\n }\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Datepicker.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<DatepickerOptions>): Datepicker;\n /**\n * Initializes instances of Datepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | InitElement>,\n options?: Partial<DatepickerOptions>\n ): Datepicker[];\n /**\n * Initializes instances of Datepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | InitElement>,\n options: Partial<DatepickerOptions> = {}\n ): Datepicker | Datepicker[] {\n return super.init(els, options, Datepicker);\n }\n\n /**\n * Escape a value for interpolation into the calendar markup.\n *\n * `draw()` assembles the calendar as an HTML string, so every value that is\n * not a number this class computed itself has to go through here. In\n * practice that means the i18n strings: month and weekday names are the one\n * part of a datepicker that routinely comes from a translation file, and a\n * translation file is as trustworthy as whatever wrote it.\n */\n static _escape(value: unknown): string {\n return String(value ?? '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n static _isDate(obj) {\n return /Date/.test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n }\n\n static _isWeekend(date) {\n const day = date.getDay();\n return day === 0 || day === 6;\n }\n\n /**\n * @deprecated as this function has no effect without any return statement or global parameter setter.\n */\n static _setToStartOfDay(date) {\n if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0);\n }\n\n static _getDaysInMonth(year, month) {\n return [31, Datepicker._isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][\n month\n ];\n }\n\n static _isLeapYear(year) {\n // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n static _compareDates(a, b) {\n // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n return a.getTime() === b.getTime();\n }\n\n static _compareWithinRange(day: Date, date: Date, dateEnd: Date) {\n return day.getTime() > date.getTime() && day.getTime() < dateEnd.getTime();\n }\n\n static _comparePastDate(a: Date, b: Date) {\n return a.getTime() < b.getTime();\n }\n\n static getInstance(el: HTMLElement): Datepicker {\n return el['Expressive_Datepicker'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.dateEls?.slice(1).forEach(input => this._removeDateInput(input));\n if (!this.options.dateRangeEndEl && this.endDateEl) this._removeDateInput(this.endDateEl);\n this.displayPlugin?.destroy();\n this.containerEl.remove();\n this.destroySelects();\n this.el['Expressive_Datepicker'] = undefined;\n }\n\n destroySelects() {\n const oldYearSelect = this.calendarEl.querySelector('.orig-select-year');\n if (oldYearSelect) {\n FormSelect.getInstance(oldYearSelect as HTMLElement).destroy();\n }\n const oldMonthSelect = this.calendarEl.querySelector('.orig-select-month');\n if (oldMonthSelect) {\n FormSelect.getInstance(oldMonthSelect as HTMLElement).destroy();\n }\n }\n\n _insertHTMLIntoDOM() {\n // HTML5 input date field support\n if (this.el.type == 'date') {\n this.el.classList.add('datepicker-date-input');\n }\n\n // `!x === null` is always false, so this never ran; _renderDateInputFormat\n // now no-ops on its own when there is no hint element to fill in.\n this._renderDateInputFormat(this.el);\n\n if (this.options.isDateRange) {\n this.containerEl.classList.add('daterange');\n if (!this.options.dateRangeEndEl) {\n this.endDateEl = this.createDateInput();\n this.endDateEl.classList.add('datepicker-end-date');\n } else {\n // querySelector returns null, never undefined: the old check compared\n // against undefined, so a miss skipped the warning and fell through to\n // dereferencing null.\n this.endDateEl = document.querySelector(this.options.dateRangeEndEl);\n if (!this.endDateEl) {\n console.warn('Specified date range end input element in dateRangeEndEl not found');\n } else {\n this._renderDateInputFormat(this.endDateEl);\n }\n }\n }\n\n /*if (this.options.showClearBtn) {\n this.clearBtn.style.visibility = '';\n this.clearBtn.innerText = this.options.i18n.clear;\n }\n this.doneBtn.innerText = this.options.i18n.done;\n this.cancelBtn.innerText = this.options.i18n.cancel;*/\n Utils.createButton(this.footer, this.options.i18n.clear, ['datepicker-clear'], this.options.showClearBtn, this._handleClearClick);\n\n if (!this.options.autoSubmit) {\n Utils.createConfirmationContainer(this.footer, this.options.i18n.done, this.options.i18n.cancel, this._confirm, this._cancel);\n }\n\n if (this.options.container) {\n const optEl = this.options.container;\n this.options.container =\n optEl instanceof HTMLElement ? optEl : (document.querySelector(optEl) as HTMLElement);\n this.options.container.append(this.containerEl);\n } else {\n //this.containerEl.before(this.el);\n const appendTo = !this.endDateEl ? this.el : this.endDateEl;\n if (!this.options.openByDefault) (this.containerEl as HTMLElement).setAttribute('style', 'display: none; visibility: hidden;');\n appendTo.parentElement.after(this.containerEl);\n }\n }\n\n /**\n * Renders the date input format into the optional `.datepicker-format` hint\n * next to the input, if the consumer provided one.\n */\n _renderDateInputFormat(el: HTMLInputElement) {\n const formatEl = el.parentElement?.querySelector('.datepicker-format');\n if (!formatEl) return;\n // textContent, and nothing at all for a function format: this used to be\n // `innerHTML = format.toString()`, which rendered a format string as\n // markup and dumped a function's entire source into the page.\n formatEl.textContent =\n typeof this.options.format === 'function' ? '' : String(this.options.format);\n }\n\n /**\n * Gets a string representation of the given date.\n */\n toString(date: Date = this.date, format: string | ((d: Date) => string) = null): string {\n format = format || this.options.format;\n if (typeof format === 'function') return format(date);\n if (!Datepicker._isDate(date)) return '';\n // String Format\n return this.formatDate(date, format);\n }\n\n /**\n * Returns the formatted date.\n */\n formatDate(date: Date, format: string) {\n const formatArray = format.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g);\n return formatArray\n .map((label) => (this.formats[label] ? this.formats[label](date) : label))\n .join('');\n }\n\n /**\n * Sets date from input field.\n */\n setDateFromInput(el: HTMLInputElement) {\n const date = new Date(Date.parse(el.value));\n this.setDate(date, false, el == this.endDateEl, true);\n }\n\n /**\n * Set a date on the datepicker.\n * @param date Date to set on the datepicker.\n * @param preventOnSelect Undocumented as of 5 March 2018.\n * @param isEndDate\n * @param fromUserInput\n */\n setDate(\n date: Date = null,\n preventOnSelect: boolean = false,\n isEndDate: boolean = false,\n fromUserInput: boolean = false\n ) {\n const selectedDate = this.validateDate(date);\n if (!selectedDate) {\n return;\n }\n Datepicker._setToStartOfDay(selectedDate);\n if (!this.options.isMultipleSelection) this.setSingleDate(selectedDate, isEndDate);\n else if (!fromUserInput) this.setMultiDate(selectedDate);\n this.gotoDate(selectedDate);\n if (!preventOnSelect && typeof this.options.onSelect === 'function') {\n this.options.onSelect.call(this, selectedDate);\n }\n }\n\n validateDate(date: Date) {\n if (!date) {\n this._renderDateDisplay(date);\n return this.draw();\n }\n if (typeof date === 'string') {\n date = new Date(Date.parse(date));\n }\n if (!Datepicker._isDate(date)) {\n return;\n }\n const min = this.options.minDate,\n max = this.options.maxDate;\n if (Datepicker._isDate(min) && date < min) {\n date = min;\n } else if (Datepicker._isDate(max) && date > max) {\n date = max;\n }\n return new Date(date.getTime());\n }\n\n /**\n * Set a single date on the datepicker.\n * @param date Date to set on the datepicker.\n * @param isEndDate\n */\n setSingleDate(date: Date, isEndDate: boolean) {\n if (!isEndDate) {\n this.date = date;\n } else if (isEndDate) {\n this.endDate = date;\n }\n }\n\n /**\n * Set a multi date on the datepicker.\n * @param date Date to set on the datepicker.\n */\n setMultiDate(date: Date) {\n const selectedDate = this.dates?.find((item) => {\n return item.getTime() === date.getTime() ? item : false;\n });\n if (!selectedDate) {\n this.dates.push(date);\n } else {\n this.dates.splice(this.dates.indexOf(selectedDate), 1);\n }\n this.dates.sort((a: Date, b: Date) => (a.getTime() < b.getTime() ? -1 : 0));\n }\n\n /**\n * Sets the data-date attribute on the date input field\n */\n setDataDate(el, date) {\n el.setAttribute('data-date', this.toString(date));\n }\n\n /**\n * Sets dates on the input values.\n */\n setInputValues() {\n if (!this.options?.isMultipleSelection) {\n this.setInputValue(this.el, this.date);\n if (this.options?.isDateRange) {\n this.setInputValue(this.endDateEl, this.endDate);\n }\n return;\n }\n this.setMultipleSelectionInputValues();\n }\n\n setMultipleSelectionInputValues() {\n const count = Math.max(1, this.dates.length);\n for (const input of this.dateEls.splice(count)) this._removeDateInput(input);\n while (this.dateEls.length < count) this.dateEls.push(this.createDateInput());\n this.dateEls.forEach((input, index) => this.setInputValue(input, this.dates[index] ?? null));\n }\n\n /**\n * Sets given date as the input value on the given element.\n */\n setInputValue(el, date) {\n if (!el) return;\n if (!Datepicker._isDate(date)) {\n el.value = '';\n if (el.type === 'date') el.setAttribute('data-date', '');\n } else if (el.type == 'date') {\n this.setDataDate(el, date);\n el.value = this.formatDate(date, 'yyyy-mm-dd');\n } else {\n el.value = this.toString(date);\n }\n this.el.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { firedBy: this }\n })\n );\n }\n\n /**\n * Renders the date in the modal head section.\n */\n _renderDateDisplay(date: Date, endDate: Date = null) {\n const displayDate = Datepicker._isDate(date) ? date : new Date();\n // this.yearTextEl.innerHTML = displayDate.getFullYear().toString();\n // @todo should we include an option for date formatting by component options?\n // textContent: formatDate splices i18n month and weekday names in.\n if (!this.options.isDateRange) {\n this.dateTextEl.textContent = this.formatDate(displayDate, 'ddd, mmm d');\n } else {\n const displayEndDate = Datepicker._isDate(endDate) ? endDate : new Date();\n this.dateTextEl.textContent = `${this.formatDate(displayDate, 'mmm d')} - ${this.formatDate(displayEndDate, 'mmm d')}`;\n }\n }\n\n /**\n * Change date view to a specific date on the datepicker.\n * @param date Date to show on the datepicker.\n */\n gotoDate(date: Date) {\n let newCalendar = true;\n if (!Datepicker._isDate(date)) {\n return;\n }\n if (this.calendars) {\n const firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n lastVisibleDate = new Date(\n this.calendars[this.calendars.length - 1].year,\n this.calendars[this.calendars.length - 1].month,\n 1\n ),\n visibleDate = date.getTime();\n // get the end of the month\n lastVisibleDate.setMonth(lastVisibleDate.getMonth() + 1);\n lastVisibleDate.setDate(lastVisibleDate.getDate() - 1);\n newCalendar =\n visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate;\n }\n if (newCalendar) {\n this.calendars = [\n {\n month: date.getMonth(),\n year: date.getFullYear()\n }\n ];\n }\n this.adjustCalendars();\n }\n\n adjustCalendars() {\n this.calendars[0] = this.adjustCalendar(this.calendars[0]);\n this.draw();\n }\n\n adjustCalendar(calendar) {\n if (calendar.month < 0) {\n calendar.year -= Math.ceil(Math.abs(calendar.month) / 12);\n calendar.month += 12;\n }\n if (calendar.month > 11) {\n calendar.year += Math.floor(Math.abs(calendar.month) / 12);\n calendar.month -= 12;\n }\n return calendar;\n }\n\n nextMonth() {\n this.calendars[0].month++;\n this.adjustCalendars();\n }\n\n prevMonth() {\n this.calendars[0].month--;\n this.adjustCalendars();\n }\n\n render(year, month, randId) {\n const now = new Date(),\n days = Datepicker._getDaysInMonth(year, month),\n data = [];\n let before = new Date(year, month, 1).getDay(),\n row = [];\n Datepicker._setToStartOfDay(now);\n if (this.options.firstDay > 0) {\n before -= this.options.firstDay;\n if (before < 0) {\n before += 7;\n }\n }\n const previousMonth = month === 0 ? 11 : month - 1,\n nextMonth = month === 11 ? 0 : month + 1,\n yearOfPreviousMonth = month === 0 ? year - 1 : year,\n yearOfNextMonth = month === 11 ? year + 1 : year,\n daysInPreviousMonth = Datepicker._getDaysInMonth(yearOfPreviousMonth, previousMonth);\n let cells = days + before,\n after = cells;\n while (after > 7) {\n after -= 7;\n }\n cells += 7 - after;\n let isWeekSelected = false;\n for (let i = 0, r = 0; i < cells; i++) {\n const day = new Date(year, month, 1 + (i - before)),\n isToday = Datepicker._compareDates(day, now),\n hasEvent = this.options.events.indexOf(day.toDateString()) !== -1,\n isEmpty = i < before || i >= days + before,\n isStartRange =\n this.options.startRange && Datepicker._compareDates(this.options.startRange, day),\n isEndRange = this.options.endRange && Datepicker._compareDates(this.options.endRange, day),\n isInRange =\n this.options.startRange &&\n this.options.endRange &&\n this.options.startRange < day &&\n day < this.options.endRange,\n isDisabled =\n (this.options.minDate && day < this.options.minDate) ||\n (this.options.maxDate && day > this.options.maxDate) ||\n (this.options.disableWeekends && Datepicker._isWeekend(day)) ||\n (this.options.disableDayFn && this.options.disableDayFn(day)),\n isDateRangeStart = this.options.isDateRange && this.date && this.endDate && Datepicker._compareDates(this.date, day),\n isDateRangeEnd = this.options.isDateRange && this.endDate && Datepicker._compareDates(this.endDate, day),\n isDateRange =\n this.options.isDateRange &&\n Datepicker._isDate(this.endDate) &&\n Datepicker._compareWithinRange(day, this.date, this.endDate);\n let dayNumber = 1 + (i - before),\n monthNumber = month,\n yearNumber = year;\n\n let isSelected = false;\n if (Datepicker._isDate(this.date)) {\n isSelected = Datepicker._compareDates(day, this.date);\n }\n\n if (!isSelected && Datepicker._isDate(this.endDate)) {\n isSelected = Datepicker._compareDates(day, this.endDate);\n }\n\n if (\n this.options.isMultipleSelection &&\n this.dates?.some((item) => item.getTime() === day.getTime())\n ) {\n isSelected = true;\n }\n\n if (isEmpty) {\n if (i < before) {\n dayNumber = daysInPreviousMonth + dayNumber;\n monthNumber = previousMonth;\n yearNumber = yearOfPreviousMonth;\n } else {\n dayNumber = dayNumber - days;\n monthNumber = nextMonth;\n yearNumber = yearOfNextMonth;\n }\n }\n\n const dayConfig = {\n day: dayNumber,\n month: monthNumber,\n year: yearNumber,\n hasEvent: hasEvent,\n isSelected: isSelected,\n isToday: isToday,\n isDisabled: isDisabled,\n isEmpty: isEmpty,\n isStartRange: isStartRange,\n isEndRange: isEndRange,\n isInRange: isInRange,\n showDaysInNextAndPreviousMonths: this.options.showDaysInNextAndPreviousMonths,\n isDateRangeStart: isDateRangeStart,\n isDateRangeEnd: isDateRangeEnd,\n isDateRange: isDateRange\n };\n\n row.push(this.renderDay(dayConfig));\n\n if (++r === 7) {\n data.push(this.renderRow(row, this.options.isRTL, isWeekSelected));\n row = [];\n r = 0;\n isWeekSelected = false;\n }\n }\n return this.renderTable(this.options, data, randId);\n }\n\n renderDay(opts) {\n const classMap = {\n isDisabled: 'is-disabled',\n isToday: 'is-today',\n isSelected: 'is-selected',\n hasEvent: 'has-event',\n isInRange: 'is-inrange',\n isStartRange: 'is-startrange',\n isEndRange: 'is-endrange',\n isDateRangeStart: 'is-daterange-start',\n isDateRangeEnd: 'is-daterange-end',\n isDateRange: 'is-daterange'\n },\n ariaSelected = !(['isSelected', 'isDateRange'].filter((prop) => !!(opts.hasOwnProperty(prop) && opts[prop] === true)).length === 0),\n arr = ['datepicker-day'];\n\n if (opts.isEmpty) {\n if (opts.showDaysInNextAndPreviousMonths) {\n arr.push('is-outside-current-month');\n arr.push('is-selection-disabled');\n } else {\n return '<td class=\"is-empty\"></td>';\n }\n }\n\n for (const [property, className] of Object.entries(classMap)) {\n if (opts.hasOwnProperty(property) && opts[property]) {\n arr.push(className);\n }\n }\n\n const day = Datepicker._escape(opts.day);\n const month = Datepicker._escape(opts.month);\n const year = Datepicker._escape(opts.year);\n return (\n `<td data-day=\"${day}\" class=\"${arr.join(' ')}\" aria-selected=\"${ariaSelected}\">` +\n `<button class=\"datepicker-day-button\" type=\"button\" data-year=\"${year}\" data-month=\"${month}\" data-day=\"${day}\">${day}</button>` +\n '</td>'\n );\n }\n\n /** Assemble calendar cells; reject unsupported elements and attributes. */\n renderRow(days, isRTL, isRowSelected) {\n return (\n '<tr class=\"datepicker-row' +\n (isRowSelected ? ' is-selected' : '') +\n '\">' +\n Datepicker._calendarMarkup((isRTL ? days.reverse() : days).join(''), 'tr') +\n '</tr>'\n );\n }\n\n /** Assemble calendar rows; reject unsupported elements and attributes. */\n renderTable(opts, data, randId) {\n return (\n '<div class=\"datepicker-table-wrapper\"><table cellpadding=\"0\" cellspacing=\"0\" class=\"datepicker-table\" role=\"grid\" aria-labelledby=\"' +\n Datepicker._escape(randId) +\n '\">' +\n this.renderHead(opts) +\n this.renderBody(data) +\n '</table></div>'\n );\n }\n\n renderHead(opts) {\n const arr = [];\n let i;\n for (i = 0; i < 7; i++) {\n const full = Datepicker._escape(this.renderDayName(opts, i));\n const abbrev = Datepicker._escape(this.renderDayName(opts, i, true));\n arr.push(`<th scope=\"col\"><abbr title=\"${full}\">${abbrev}</abbr></th>`);\n }\n return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n }\n\n /** Wrap calendar rows after validating and encoding their contents. */\n renderBody(rows) {\n return '<tbody>' + Datepicker._calendarMarkup(rows.join(''), 'tbody') + '</tbody>';\n }\n\n private static _calendarMarkup(html: string, parent: string): string {\n const template = document.createElement('template');\n // Template contents stay inert. Only rebuilt, encoded markup leaves here.\n template.innerHTML = html;\n const attributes = {\n tr: ['class'],\n td: ['class', 'data-day', 'aria-selected'],\n button: ['class', 'type', 'data-year', 'data-month', 'data-day', 'aria-label', 'disabled', 'tabindex']\n };\n const render = (node: Node, container: string): string => {\n if (node.nodeType === Node.TEXT_NODE) {\n if (container === 'tbody' || container === 'tr') {\n if (node.textContent.trim()) throw new TypeError('Unsupported calendar row content');\n }\n return Datepicker._escape(node.textContent);\n }\n if (!(node instanceof HTMLElement)) throw new TypeError('Unsupported calendar row content');\n const tag = node.localName === 'tr' ? 'tr' : node.localName === 'td' ? 'td' : node.localName === 'button' ? 'button' : null;\n if (!tag || !((container === 'tbody' && tag === 'tr') || (container === 'tr' && tag === 'td') || (container === 'td' && tag === 'button'))) {\n throw new TypeError('Unsupported calendar row element');\n }\n if ([...node.attributes].some(attr => !attributes[tag].includes(attr.name))) {\n throw new TypeError('Unsupported calendar row attribute');\n }\n if (tag === 'button' && node.getAttribute('type') !== 'button') {\n throw new TypeError('Calendar day buttons require type=\"button\"');\n }\n const attrs = attributes[tag].filter(name => node.hasAttribute(name))\n .map(name => ` ${name}=\"${Datepicker._escape(node.getAttribute(name))}\"`).join('');\n return `<${tag}${attrs}>${[...node.childNodes].map(child => render(child, tag)).join('')}</${tag}>`;\n };\n return [...template.content.childNodes].map(node => render(node, parent)).join('');\n }\n\n /**\n * Whether each month arrow is usable at this position in the allowed range.\n *\n * Depends on the month, which is deliberately *not* part of the controls\n * cache key - so the reuse path has to recompute and reapply it.\n */\n private _arrowState(year: number, month: number) {\n const opts = this.options;\n const isMinYear = year === opts.minYear;\n const isMaxYear = year === opts.maxYear;\n return {\n prev: !(isMinYear && (month === 0 || opts.minMonth >= month)),\n next: !(isMaxYear && (month === 11 || opts.maxMonth <= month))\n };\n }\n\n /**\n * Identifies the *shape* of the controls - everything that changes which\n * options the month and year selects contain, as opposed to which one is\n * picked. While this is stable the two FormSelects can be left alone.\n *\n * `year` is in the key because a numeric `yearRange` centres the year list\n * on the displayed year, so paging across a year boundary does change it.\n */\n private _controlsCacheKey(year: number): string {\n const o = this.options;\n return [\n year,\n o.minYear,\n o.maxYear,\n o.minMonth,\n o.maxMonth,\n Array.isArray(o.yearRange) ? o.yearRange.join('-') : o.yearRange,\n o.yearRangeReverse,\n o.showMonthAfterYear\n ].join('|');\n }\n\n renderTitle(instance, c, year, month, refYear, randId) {\n const opts = this.options,\n isMinYear = year === opts.minYear,\n isMaxYear = year === opts.maxYear;\n let i,\n j,\n arr = [],\n html =\n '<div id=\"' +\n Datepicker._escape(randId) +\n '\" class=\"datepicker-controls\" role=\"heading\" aria-live=\"assertive\">';\n\n // Decided up front. These used to be computed *below* the month-prev\n // button that reads `prev`, so the previous arrow was never disabled at\n // the start of the allowed range.\n const { prev, next } = this._arrowState(year, month);\n\n for (i = 0; i < 12; i++) {\n arr.push(\n '<option value=\"' +\n (year === refYear ? i - c : 12 + i - c) +\n '\"' +\n (i === month ? ' selected=\"selected\"' : '') +\n ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth)\n ? 'disabled=\"disabled\"'\n : '') +\n '>' +\n Datepicker._escape(opts.i18n.months[i]) +\n '</option>'\n );\n }\n\n const monthHtml =\n '<select class=\"datepicker-select orig-select-month\" tabindex=\"-1\">' +\n arr.join('') +\n '</select>';\n\n if (Array.isArray(opts.yearRange)) {\n i = opts.yearRange[0];\n j = opts.yearRange[1] + 1;\n } else {\n i = year - opts.yearRange;\n j = 1 + year + opts.yearRange;\n }\n\n for (arr = []; i < j && i <= opts.maxYear; i++) {\n if (i >= opts.minYear) {\n arr.push(`<option value=\"${i}\" ${i === year ? 'selected=\"selected\"' : ''}>${i}</option>`);\n }\n }\n if (opts.yearRangeReverse) arr.reverse();\n\n const yearHtml = `<select class=\"datepicker-select orig-select-year\" tabindex=\"-1\">${arr.join('')}</select>`;\n\n const leftArrow =\n '<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z\"/><path d=\"M0-.5h24v24H0z\" fill=\"none\"/></svg>';\n html += `<button class=\"month-prev${\n prev ? '' : ' is-disabled'\n // @todo remove button class and add scss mixin, current implementation temporary for focus states, @see https://github.com/materializecss/materialize/issues/566\n }\" type=\"button\">${leftArrow}</button>`;\n\n html += '<div class=\"selects-container\">';\n if (opts.showMonthAfterYear) {\n html += yearHtml + monthHtml;\n } else {\n html += monthHtml + yearHtml;\n }\n html += '</div>';\n\n const rightArrow =\n '<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z\"/><path d=\"M0-.25h24v24H0z\" fill=\"none\"/></svg>';\n html += `<button class=\"month-next${\n next ? '' : ' is-disabled'\n // @todo remove button class and add scss mixin, current implementation temporary for focus states, @see https://github.com/materializecss/materialize/issues/566\n }\" type=\"button\">${rightArrow}</button>`;\n\n return (html += '</div>');\n }\n\n /**\n * Run `fn`, collapsing every draw it triggers into a single one at the end.\n *\n * A single input click reaches draw() three times - once through\n * setDateFromInput -> setDate -> gotoDate, once directly, and once through\n * the trailing gotoDate - and each one destroys two FormSelect instances,\n * reparses the calendar and builds two fresh FormSelects. The three calls\n * cannot simply be deleted: the direct draw() is what covers an empty input\n * (setDate bails before drawing when the value does not parse), and the\n * trailing gotoDate re-centres on a date validateDate may have clamped to\n * minDate/maxDate. So they are collected instead of removed.\n *\n * Deliberately synchronous: the constructor and callers read calendarEl\n * immediately after init(), which a microtask-deferred draw would leave\n * empty.\n */\n private _batchDraws(fn: () => void) {\n this._drawDepth++;\n try {\n fn();\n } finally {\n this._drawDepth--;\n if (this._drawDepth === 0 && this._drawDirty) {\n this._drawDirty = false;\n this.draw();\n }\n }\n }\n\n // refresh HTML\n draw() {\n // Inside a batch, note that a draw is due and let the batch do it once.\n if (this._drawDepth > 0) {\n this._drawDirty = true;\n return;\n }\n const active = (this.calendarEl.getRootNode() as Document | ShadowRoot).activeElement;\n const restoreDayFocus = active?.matches('.datepicker-day-button') && this.calendarEl.contains(active);\n const restoreArrow = this.calendarEl.contains(active) && active?.matches('.month-prev, .month-next')\n ? active.classList.contains('month-prev') ? '.month-prev' : '.month-next' : null;\n const opts = this.options,\n minYear = opts.minYear,\n maxYear = opts.maxYear,\n minMonth = opts.minMonth,\n maxMonth = opts.maxMonth;\n\n if (this._y <= minYear) {\n this._y = minYear;\n if (!isNaN(minMonth) && this._m < minMonth) {\n this._m = minMonth;\n }\n }\n if (this._y >= maxYear) {\n this._y = maxYear;\n if (!isNaN(maxMonth) && this._m > maxMonth) {\n this._m = maxMonth;\n }\n }\n\n const year = this.calendars[0].year;\n const month = this.calendars[0].month;\n\n if (!this.options.isDateRange) {\n this._renderDateDisplay(this.date);\n } else {\n this._renderDateDisplay(this.date, this.endDate);\n }\n\n // Only the day grid changes when you page within a year. Rebuilding the\n // controls as well meant tearing down and reconstructing two FormSelects -\n // each with its own <ul> of 12 or 21+ options, an input, a caret and a\n // Menu - on every single draw.\n const key = this._controlsCacheKey(year);\n if (key === this._controlsKey && this.calendarEl.querySelector('.datepicker-controls')) {\n this._reuseControls(year, month);\n } else {\n this._controlsKey = key;\n // Held across table re-renders: the table's aria-labelledby points at\n // the controls element's id.\n this._randId = 'datepicker-title-' + Utils.guid();\n this._rebuildControls(year, month);\n }\n this._renderCalendarTable(year, month);\n this._syncCalendarFocus(!!restoreDayFocus);\n if (restoreArrow) this.calendarEl.querySelector<HTMLButtonElement>(restoreArrow)?.focus();\n\n if (typeof this.options.onDraw === 'function') {\n this.options.onDraw.call(this);\n }\n }\n\n /** Tear down the two FormSelects and render the controls from scratch. */\n private _rebuildControls(year: number, month: number) {\n this.destroySelects();\n this.calendarEl.innerHTML = this.renderTitle(this, 0, year, month, year, this._randId);\n\n const yearSelect = this.calendarEl.querySelector('.orig-select-year') as HTMLSelectElement;\n const monthSelect = this.calendarEl.querySelector('.orig-select-month') as HTMLSelectElement;\n // @todo fix accessibility @see https://github.com/materializecss/materialize/issues/522\n FormSelect.init(yearSelect, {\n classes: 'select-year',\n menuOptions: { container: Utils.portalRoot(this.el), constrainWidth: false }\n });\n FormSelect.init(monthSelect, {\n classes: 'select-month',\n menuOptions: { container: Utils.portalRoot(this.el), constrainWidth: false }\n });\n\n // Add change handlers for select\n yearSelect.addEventListener('change', this._handleYearChange);\n monthSelect.addEventListener('change', this._handleMonthChange);\n }\n\n /**\n * Keep the existing controls and bring them up to date: the selected month,\n * and the arrow states, which depend on the month rather than on the key.\n */\n private _reuseControls(year: number, month: number) {\n const monthSelect = this.calendarEl.querySelector('.orig-select-month') as HTMLSelectElement;\n if (monthSelect && monthSelect.value !== month.toString()) {\n monthSelect.value = month.toString();\n // Assigning .value fires no change event, so the wrapper needs telling.\n FormSelect.getInstance(monthSelect)?.refresh();\n }\n\n const { prev, next } = this._arrowState(year, month);\n this.calendarEl.querySelector('.month-prev')?.classList.toggle('is-disabled', !prev);\n this.calendarEl.querySelector('.month-next')?.classList.toggle('is-disabled', !next);\n }\n\n /** Replace just the day grid, leaving the controls in place. */\n private _renderCalendarTable(year: number, month: number) {\n const html = this.render(year, month, this._randId);\n const existing = this.calendarEl.querySelector('.datepicker-table-wrapper');\n if (existing) existing.outerHTML = html;\n else this.calendarEl.insertAdjacentHTML('beforeend', html);\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleInputClick);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.el.addEventListener('change', this._handleInputChange);\n this.endDateEl?.addEventListener('click', this._handleInputClick);\n this.endDateEl?.addEventListener('keydown', this._handleInputKeydown);\n this.endDateEl?.addEventListener('change', this._handleInputChange);\n this.calendarEl.addEventListener('click', this._handleCalendarClick);\n this.calendarEl.addEventListener('keydown', this._handleCalendarKeydown);\n this.calendarEl.addEventListener('focusin', this._handleCalendarFocus);\n /* this.doneBtn.addEventListener('click', this._confirm);\n this.cancelBtn.addEventListener('click', this._cancel);\n\n if (this.options.showClearBtn) {\n this.clearBtn.addEventListener('click', this._handleClearClick);\n }*/\n }\n\n _setupVariables() {\n const template = document.createElement('template');\n template.innerHTML = Datepicker._template.trim();\n\n this.containerEl = <HTMLElement>template.content.firstChild;\n\n this.calendarEl = this.containerEl.querySelector('.datepicker-calendar');\n this.yearTextEl = this.containerEl.querySelector('.year-text');\n this.dateTextEl = this.containerEl.querySelector('.date-text');\n /* if (this.options.showClearBtn) {\n this.clearBtn = this.containerEl.querySelector('.datepicker-clear');\n }\n this.doneBtn = this.containerEl.querySelector('.datepicker-done');\n this.cancelBtn = this.containerEl.querySelector('.datepicker-cancel');*/\n this.footer = this.containerEl.querySelector('.datepicker-footer');\n\n this.formats = {\n d: (date: Date) => {\n return date.getDate();\n },\n dd: (date: Date) => {\n const d = date.getDate();\n return (d < 10 ? '0' : '') + d;\n },\n ddd: (date: Date) => {\n return this.options.i18n.weekdaysShort[date.getDay()];\n },\n dddd: (date: Date) => {\n return this.options.i18n.weekdays[date.getDay()];\n },\n m: (date: Date) => {\n return date.getMonth() + 1;\n },\n mm: (date: Date) => {\n const m = date.getMonth() + 1;\n return (m < 10 ? '0' : '') + m;\n },\n mmm: (date: Date) => {\n return this.options.i18n.monthsShort[date.getMonth()];\n },\n mmmm: (date: Date) => {\n return this.options.i18n.months[date.getMonth()];\n },\n yy: (date: Date) => {\n return ('' + date.getFullYear()).slice(2);\n },\n yyyy: (date: Date) => {\n return date.getFullYear();\n }\n };\n }\n\n _removeEventHandlers() {\n for (const input of this.dateEls ?? [this.el]) this._removeInputEventHandlers(input);\n this.calendarEl.removeEventListener('click', this._handleCalendarClick);\n this.calendarEl.removeEventListener('keydown', this._handleCalendarKeydown);\n this.calendarEl.removeEventListener('focusin', this._handleCalendarFocus);\n if (this.options.isDateRange && this.endDateEl) {\n this._removeInputEventHandlers(this.endDateEl);\n }\n }\n\n private _removeInputEventHandlers(input: HTMLInputElement) {\n input.removeEventListener('click', this._handleInputClick);\n input.removeEventListener('keydown', this._handleInputKeydown);\n input.removeEventListener('change', this._handleInputChange);\n }\n\n private _removeDateInput(input: HTMLInputElement) {\n const focused = (input.getRootNode() as Document | ShadowRoot).activeElement === input;\n this._removeInputEventHandlers(input);\n input.remove();\n if (focused && document.activeElement === document.body) this.el.focus();\n }\n\n _handleInputClick = (e) => {\n // Prevents default browser datepicker modal rendering\n if (e.type == 'date') {\n e.preventDefault();\n }\n this._batchDraws(() => {\n this.setDateFromInput(e.target as HTMLInputElement);\n this.draw();\n this.gotoDate(<HTMLElement>e.target === this.el ? this.date : this.endDate);\n });\n if (this.displayPlugin) this.displayPlugin.show();\n if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n if (e.key === Utils.keys.ENTER) {\n e.preventDefault();\n this._batchDraws(() => {\n this.setDateFromInput(e.target as HTMLInputElement);\n this._focusedDate = e.target === this.endDateEl ? this.endDate : this.date;\n this.draw();\n });\n if (this.displayPlugin) this.displayPlugin.show();\n this._syncCalendarFocus(true);\n if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);\n }\n };\n\n private _dayDate(button: HTMLElement) {\n const date = new Date(0);\n date.setFullYear(Number(button.dataset.year), Number(button.dataset.month), Number(button.dataset.day));\n Datepicker._setToStartOfDay(date);\n return date;\n }\n\n private _syncCalendarFocus(restore = false) {\n const buttons = [...this.calendarEl.querySelectorAll<HTMLButtonElement>('.datepicker-day-button')];\n const current = buttons.filter(button => !button.parentElement.classList.contains('is-selection-disabled'));\n const preferred = this._focusedDate || this.date || new Date();\n const target = current.find(button => Datepicker._compareDates(this._dayDate(button), preferred))\n || current.find(button => button.parentElement.classList.contains('is-selected'))\n || current.find(button => !button.parentElement.classList.contains('is-disabled')) || current[0];\n for (const button of buttons) {\n button.tabIndex = button === target ? 0 : -1;\n button.setAttribute('aria-disabled', String(button.parentElement.matches('.is-disabled, .is-selection-disabled')));\n }\n if (target) {\n this._focusedDate = this._dayDate(target);\n if (restore) target.focus();\n }\n }\n\n private _handleCalendarFocus = (event: FocusEvent) => {\n const button = event.target as HTMLElement;\n if (!button.matches('.datepicker-day-button')) return;\n this._focusedDate = this._dayDate(button);\n this._syncCalendarFocus();\n };\n\n private _handleCalendarKeydown = (event: KeyboardEvent) => {\n const button = event.target as HTMLElement;\n if (!button.matches('.datepicker-day-button') || event.altKey || event.ctrlKey || event.metaKey) return;\n const date = this._dayDate(button);\n const weekday = (date.getDay() - this.options.firstDay + 7) % 7;\n const offsets = { ArrowLeft: this.options.isRTL ? 1 : -1, ArrowRight: this.options.isRTL ? -1 : 1,\n ArrowUp: -7, ArrowDown: 7, Home: -weekday, End: 6 - weekday };\n if (Object.hasOwn(offsets, event.key)) date.setDate(date.getDate() + offsets[event.key]);\n else if (event.key === 'PageUp' || event.key === 'PageDown') {\n const day = date.getDate();\n date.setDate(1);\n date.setMonth(date.getMonth() + (event.key === 'PageUp' ? -1 : 1) * (event.shiftKey ? 12 : 1));\n const last = new Date(date.getTime());\n last.setMonth(last.getMonth() + 1, 0);\n date.setDate(Math.min(day, last.getDate()));\n } else return;\n event.preventDefault();\n const { minDate, maxDate, minYear, maxYear, minMonth, maxMonth } = this.options;\n if (minDate && date < minDate) date.setTime(minDate.getTime());\n if (maxDate && date > maxDate) date.setTime(maxDate.getTime());\n if (date.getFullYear() < minYear || date.getFullYear() > maxYear\n || (date.getFullYear() === minYear && date.getMonth() < (minMonth ?? 0))\n || (date.getFullYear() === maxYear && date.getMonth() > (maxMonth ?? 11))) return;\n this._focusedDate = date;\n this.gotoDate(date);\n };\n\n _handleCalendarClick = (e) => {\n const target = <HTMLElement>e.target;\n if (target.classList.contains('is-disabled')) return;\n\n this._batchDraws(() => {\n if (\n target.classList.contains('datepicker-day-button') &&\n !target.classList.contains('is-empty') &&\n !target.parentElement.classList.contains('is-disabled') &&\n !target.parentElement.classList.contains('is-selection-disabled')\n ) {\n const selectedDate = new Date(\n e.target.getAttribute('data-year'),\n e.target.getAttribute('data-month'),\n e.target.getAttribute('data-day')\n );\n\n if (!this.multiple || (this.multiple && this.options.isMultipleSelection)) {\n this.setDate(selectedDate);\n }\n\n // Selecting a range end draws a second time on top of setDate's.\n if (this.options.isDateRange) {\n this._handleDateRangeCalendarClick(selectedDate);\n }\n\n if (this.options.autoSubmit) this._finishSelection();\n } else if (target.closest('.month-prev')) {\n this.prevMonth();\n } else if (target.closest('.month-next')) {\n this.nextMonth();\n }\n });\n };\n\n _handleDateRangeCalendarClick = (date: Date) => {\n if (this.endDate == null || !Datepicker._compareDates(date, this.endDate)) {\n if (Datepicker._isDate(this.date) && Datepicker._comparePastDate(date, this.date)) {\n return;\n }\n\n this.setDate(date, false, Datepicker._isDate(this.date));\n return;\n }\n\n this._clearDates();\n this.draw();\n };\n\n _handleClearClick = () => {\n this._clearDates();\n this.setInputValues();\n };\n\n _clearDates = () => {\n this.date = null;\n this.endDate = null;\n this.dates?.splice(0);\n this.draw();\n };\n\n _handleMonthChange = (e) => {\n this.gotoMonth(e.target.value);\n };\n\n _handleYearChange = (e) => {\n this.gotoYear(e.target.value);\n };\n\n // change view to a specific month (zero-index, e.g. 0: January)\n gotoMonth(month) {\n if (!isNaN(month)) {\n this.calendars[0].month = parseInt(month, 10);\n this.adjustCalendars();\n }\n }\n\n // change view to a specific full year (e.g. \"2012\")\n gotoYear(year) {\n if (!isNaN(year)) {\n this.calendars[0].year = parseInt(year, 10);\n this.adjustCalendars();\n }\n }\n\n _handleInputChange = (e: Event) => {\n let date;\n const el = e.target as HTMLElement;\n // Prevent change event from being fired when triggered by the plugin\n if (e['detail']?.firedBy === this) return;\n // Prevent change event from being fired if an end date is set without a start date\n if (el == this.endDateEl && !this.date) return;\n if (this.options.parse) {\n date = this.options.parse(\n (e.target as HTMLInputElement).value,\n typeof this.options.format === 'function'\n ? this.options.format(new Date(this.el.value))\n : this.options.format\n );\n } else {\n date = new Date(Date.parse((e.target as HTMLInputElement).value));\n }\n if (Datepicker._isDate(date)) {\n if (el == this.endDateEl && date < this.date) return this.setInputValue(el, this.endDate);\n this.setDate(date, false, el == this.endDateEl, true);\n if (e.type == 'date') {\n this.setDataDate(e, date);\n this.setInputValues();\n }\n }\n };\n\n renderDayName(opts, day, abbr: boolean = false) {\n day += opts.firstDay;\n while (day >= 7) {\n day -= 7;\n }\n return abbr ? opts.i18n.weekdaysAbbrev[day] : opts.i18n.weekdays[day];\n }\n\n createDateInput() {\n const dateInput = <HTMLInputElement>this.el.cloneNode(true);\n // cloneNode copies the id too, and two elements sharing one id break every\n // lookup that goes through it.\n dateInput.removeAttribute('id');\n dateInput.addEventListener('click', this._handleInputClick);\n dateInput.addEventListener('keydown', this._handleInputKeydown);\n dateInput.addEventListener('change', this._handleInputChange);\n this.el.parentElement.appendChild(dateInput);\n return dateInput;\n }\n\n _finishSelection = () => {\n this.setInputValues();\n };\n\n _confirm = () => {\n this._finishSelection();\n if (typeof this.options.onConfirm === 'function') this.options.onConfirm.call(this);\n }\n\n _cancel = () => {\n if (typeof this.options.onCancel === 'function') this.options.onCancel.call(this);\n };\n\n static {\n Datepicker._template = `\n <div class=\"datepicker-container\">\n <div class=\"datepicker-date-display\">\n <span class=\"year-text\"></span>\n <span class=\"date-text\"></span>\n </div>\n <div class=\"datepicker-calendar-container\">\n <div class=\"datepicker-calendar\"></div>\n <div class=\"datepicker-footer\"></div>\n </div>\n </div>`;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ts/components/menu.ts"],
|
|
4
|
-
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement, Openable } from '../core/component';\n\nexport interface MenuOptions extends BaseOptions {\n /**\n * Defines the edge the menu is aligned to.\n * @default 'left'\n */\n alignment: 'left' | 'right';\n /**\n * If true, automatically focus menu el for keyboard.\n * @default true\n */\n autoFocus: boolean;\n /**\n * If true, constrainWidth to the size of the menu activator.\n *\n * A trigger narrower than the surface's own 112dp minimum cannot be\n * honoured, so such a menu is sized to its content instead - see\n * MIN_SURFACE_WIDTH.\n * @default true\n */\n constrainWidth: boolean;\n /**\n * Provide an element that will be the bounding container of the menu.\n * @default null\n */\n container: Element | ShadowRoot;\n /**\n * If false, the menu will show below the trigger.\n * That is the M3 placement. Pass `true` to cover the trigger.\n * @default false\n */\n coverTrigger: boolean;\n /**\n * If true, close menu on item click.\n * @default true\n */\n closeOnClick: boolean;\n /**\n * If true, the menu will open on hover.\n * @default false\n */\n hover: boolean;\n /**\n * The duration of the transition enter in milliseconds.\n * @default 150\n */\n inDuration: number;\n /**\n * The duration of the transition out in milliseconds.\n * @default 250\n */\n outDuration: number;\n /**\n * Function called when menu starts entering.\n * @default null\n */\n onOpenStart: (el: HTMLElement) => void;\n /**\n * Function called when menu finishes entering.\n * @default null\n */\n onOpenEnd: (el: HTMLElement) => void;\n /**\n * Function called when menu starts exiting.\n * @default null\n */\n onCloseStart: (el: HTMLElement) => void;\n /**\n * Function called when menu finishes exiting.\n * @default null\n */\n onCloseEnd: (el: HTMLElement) => void;\n /**\n * Function called when item is clicked.\n * @default null\n */\n onItemClick: (el: HTMLLIElement) => void;\n}\n\n// The menu surface's own width bounds, stated in `components/_menu.scss` and\n// restated here because the constraint below has to reason about them.\nconst MIN_SURFACE_WIDTH = 112;\nconst MAX_SURFACE_WIDTH = 280;\n\nconst _defaults: MenuOptions = {\n alignment: 'left',\n autoFocus: true,\n constrainWidth: true,\n container: null,\n coverTrigger: false,\n closeOnClick: true,\n hover: false,\n inDuration: 150,\n outDuration: 250,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n onItemClick: null\n};\n\nconst SPACE = ' ';\n\nexport class Menu extends Component<MenuOptions> implements Openable {\n static _menus: Menu[] = [];\n /** ID of the menu element. */\n id: string;\n /** The DOM element of the menu. */\n menuEl: HTMLElement;\n /** If the menu is open. */\n isOpen: boolean;\n /** If the menu content is scrollable. */\n isScrollable: boolean;\n isTouchMoving: boolean;\n /** The index of the item focused. */\n focusedIndex: number;\n filterQuery: string[];\n filterTimeout: ReturnType<typeof setTimeout>;\n private _pendingTimers = new Set<ReturnType<typeof setTimeout>>();\n private _transition = 0;\n private _originalInert: string | null;\n\n constructor(el: HTMLElement, options: Partial<MenuOptions>) {\n super(el, options, Menu);\n this.el['Expressive_Menu'] = this;\n\n Menu._menus.push(this);\n this.id = Utils.getIdFromTrigger(el);\n this.menuEl = Utils.getElementById(el, this.id);\n this._originalInert = this.menuEl?.getAttribute('inert') ?? null;\n\n this.options = {\n ...Menu.defaults,\n ...options\n };\n\n this.isOpen = false;\n this.isScrollable = false;\n this.isTouchMoving = false;\n this.focusedIndex = -1;\n this.filterQuery = [];\n this.el.ariaExpanded = 'false';\n if (!this.el.hasAttribute('aria-haspopup')) this.el.setAttribute('aria-haspopup', 'menu');\n if (this.id && !this.el.hasAttribute('aria-controls'))\n this.el.setAttribute('aria-controls', this.id);\n\n // Keep the menu next to the trigger so positioning stays local.\n this._moveMenuToElement();\n this._setupAccessibility();\n this._makeMenuFocusable();\n this._setupSubmenus();\n this._setupEventHandlers();\n }\n\n static get defaults(): MenuOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Menu.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<MenuOptions>): Menu;\n /**\n * Initializes instances of Menu.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<MenuOptions>): Menu[];\n /**\n * Initializes instances of Menu.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<MenuOptions> = {}\n ): Menu | Menu[] {\n return super.init(els, options, Menu);\n }\n\n static getInstance(el: HTMLElement): Menu {\n return el['Expressive_Menu'];\n }\n\n destroy() {\n this._clearPendingTimers();\n this.isOpen = false;\n this.el.ariaExpanded = 'false';\n clearTimeout(this.filterTimeout);\n this._resetMenuStyles();\n this._restoreInert();\n this._removeEventHandlers();\n // Temporary handlers only exist while open, but removing them is a no-op\n // otherwise and leaving them attached leaks the instance.\n this._removeTemporaryEventHandlers();\n const index = Menu._menus.indexOf(this);\n if (index >= 0) Menu._menus.splice(index, 1);\n this.el['Expressive_Menu'] = undefined;\n }\n\n _setupEventHandlers() {\n // Trigger keydown handler\n this.el.addEventListener('keydown', this._handleTriggerKeydown);\n // Item click handler\n this.menuEl?.addEventListener('click', this._handleMenuClick);\n if (this.menuEl?.querySelector(':scope > li > menu')) {\n this.menuEl.addEventListener('mouseover', this._handleSubmenuAlign);\n }\n // Hover event handlers\n if (this.options.hover) {\n this.el.addEventListener('mouseenter', this._handleMouseEnter);\n this.el.addEventListener('mouseleave', this._handleMouseLeave);\n this.menuEl.addEventListener('mouseleave', this._handleMouseLeave);\n // Click event handlers\n } else {\n this.el.addEventListener('click', this._handleClick);\n }\n }\n\n _removeEventHandlers() {\n // `menuEl` is optional-chained on the way in (the trigger may point at\n // an id that does not resolve); it has to be here too, or destroy() throws\n // before it can detach anything else.\n this.el.removeEventListener('keydown', this._handleTriggerKeydown);\n this.menuEl?.removeEventListener('click', this._handleMenuClick);\n this.menuEl?.removeEventListener('mouseover', this._handleSubmenuAlign);\n if (this.options.hover) {\n this.el.removeEventListener('mouseenter', this._handleMouseEnter);\n this.el.removeEventListener('mouseleave', this._handleMouseLeave);\n this.menuEl?.removeEventListener('mouseleave', this._handleMouseLeave);\n } else {\n this.el.removeEventListener('click', this._handleClick);\n }\n }\n\n _setupTemporaryEventHandlers() {\n document.body.addEventListener('click', this._handleDocumentClick);\n document.body.addEventListener('touchmove', this._handleDocumentTouchmove, {\n passive: true\n });\n this.menuEl?.addEventListener('keydown', this._handleMenuKeydown);\n window.addEventListener('resize', this._handleWindowResize);\n }\n\n _removeTemporaryEventHandlers() {\n document.body.removeEventListener('click', this._handleDocumentClick);\n document.body.removeEventListener('touchmove', this._handleDocumentTouchmove);\n this.menuEl?.removeEventListener('keydown', this._handleMenuKeydown);\n window.removeEventListener('resize', this._handleWindowResize);\n }\n\n _handleClick = (e: MouseEvent) => {\n e.preventDefault();\n //this._moveMenu((<HTMLElement>e.target).closest('li'));\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n _handleMouseEnter = () => {\n //this._moveMenu((<HTMLElement>e.target).closest('li'));\n this.open();\n };\n\n _handleMouseLeave = (e: MouseEvent) => {\n const toEl = e.relatedTarget as HTMLElement;\n // relatedTarget is null when the pointer leaves the window entirely.\n if (!toEl) {\n this.close();\n return;\n }\n const leaveToMenuContent = !!(this.menuEl && toEl && this.menuEl.contains(toEl));\n let leaveToActiveMenuTrigger = false;\n const closestTrigger = toEl.closest('.menu-trigger');\n if (\n closestTrigger &&\n !!closestTrigger['Expressive_Menu'] &&\n closestTrigger['Expressive_Menu'].isOpen\n ) {\n leaveToActiveMenuTrigger = true;\n }\n // Close hover menu if mouse did not leave to either active menu-trigger or menu-content\n if (!leaveToActiveMenuTrigger && !leaveToMenuContent) {\n this.close();\n }\n };\n\n _handleDocumentClick = (e: MouseEvent) => {\n const target = <HTMLElement>e.target;\n if (this._isSubmenuTriggerClick(target)) return;\n if (this.options.closeOnClick && this.menuEl?.contains(target) && !this.isTouchMoving) {\n // isTouchMoving to check if scrolling on mobile.\n this.close();\n } else if (!this.menuEl?.contains(target)) {\n // Do this one frame later so that if the element clicked also triggers _handleClick\n // For example, if a label for a select was clicked, that we don't close/open the menu\n this._schedule(() => {\n if (this.isOpen) {\n this.close();\n }\n }, 0);\n }\n this.isTouchMoving = false;\n };\n\n _handleTriggerKeydown = (e: KeyboardEvent) => {\n // M3: Space, Enter, Arrow Down, and Arrow Up open a closed menu.\n const opensMenu =\n e.key === SPACE ||\n e.key === Utils.keys.ENTER ||\n e.key === Utils.keys.ARROW_DOWN ||\n e.key === Utils.keys.ARROW_UP;\n if (opensMenu && !this.isOpen) {\n e.preventDefault();\n this.open();\n }\n };\n\n _handleDocumentTouchmove = (e: TouchEvent) => {\n const target = <HTMLElement>e.target;\n if (this.menuEl?.contains(target)) {\n this.isTouchMoving = true;\n }\n };\n\n _handleMenuClick = (e: MouseEvent) => {\n const target = <HTMLElement>e.target;\n const li = target.closest('li');\n if (li?.matches('.disabled, [aria-disabled=\"true\"]')) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (li && this._isSubmenuTriggerClick(target)) {\n e.preventDefault();\n e.stopPropagation();\n this._toggleSubmenu(li);\n return;\n }\n if (li && typeof this.options.onItemClick === 'function') {\n this.options.onItemClick.call(this, li);\n }\n };\n\n private _setupAccessibility() {\n if (!this.menuEl) return;\n if (!this.menuEl.hasAttribute('role')) this.menuEl.setAttribute('role', 'menu');\n\n const menus = [this.menuEl, ...this.menuEl.querySelectorAll('menu')];\n menus.forEach((menu) => {\n if (!menu.hasAttribute('role')) menu.setAttribute('role', 'menu');\n if (menu.getAttribute('role') !== 'menu') return;\n\n menu.querySelectorAll(':scope > li').forEach((li) => {\n if (li.classList.contains('divider')) {\n if (!li.hasAttribute('role')) li.setAttribute('role', 'separator');\n return;\n }\n if (li.classList.contains('gap')) {\n li.setAttribute('aria-hidden', 'true');\n return;\n }\n if (li.classList.contains('label') || li.classList.contains('optgroup')) {\n if (!li.hasAttribute('role')) li.setAttribute('role', 'presentation');\n return;\n }\n if (!li.hasAttribute('role')) li.setAttribute('role', 'menuitem');\n if (li.classList.contains('disabled') && !li.hasAttribute('aria-disabled')) {\n li.setAttribute('aria-disabled', 'true');\n }\n });\n });\n }\n\n private _isSubmenuTriggerClick(target: HTMLElement) {\n if (!this.menuEl) return false;\n const li = target.closest('li');\n if (!li || !this.menuEl.contains(li)) return false;\n const submenu = li.querySelector(':scope > menu');\n if (!submenu) return false;\n return !submenu.contains(target);\n }\n\n private _setupSubmenus() {\n this.menuEl?.querySelectorAll('li').forEach((li) => {\n if (!li.querySelector(':scope > menu')) return;\n const trigger = li.querySelector(':scope > a, :scope > button, :scope > span') ?? li;\n trigger.setAttribute('aria-haspopup', 'menu');\n trigger.setAttribute('aria-expanded', 'false');\n });\n }\n\n private _toggleSubmenu(li: HTMLElement) {\n const open = !li.classList.contains('open');\n li.parentElement?.querySelectorAll(':scope > li.open').forEach((other) => {\n if (other !== li) {\n other.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(other as HTMLElement, false);\n }\n });\n li.classList.toggle('open', open);\n if (open) this._alignSubmenu(li);\n this._syncSubmenuAria(li, open);\n }\n\n private _syncSubmenuAria(li: HTMLElement, open: boolean) {\n const trigger = li.querySelector(':scope > a, :scope > button, :scope > span') ?? li;\n trigger.setAttribute('aria-expanded', open ? 'true' : 'false');\n }\n\n private _handleSubmenuAlign = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const li = target.closest('li');\n if (li?.querySelector(':scope > menu') && this.menuEl?.contains(li)) {\n this._alignSubmenu(li as HTMLElement);\n }\n };\n\n private _alignSubmenu(li: HTMLElement) {\n const menu = li.querySelector(':scope > menu') as HTMLElement | null;\n if (!menu) return;\n // Flyouts stay `display: block` (visibility/opacity hide them) so the\n // rect is readable without temporarily painting the menu.\n li.classList.remove('submenu-start');\n const rect = menu.getBoundingClientRect();\n if (rect.left < 8 || rect.right > window.innerWidth - 8) li.classList.add('submenu-start');\n }\n\n private _closeSubmenus() {\n this.menuEl?.querySelectorAll('li.open').forEach((li) => {\n li.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(li as HTMLElement, false);\n });\n }\n\n private _containingSubmenu(e: Event): HTMLElement | null {\n const target = e.target;\n if (!(target instanceof Element)) return null;\n const submenu = target.closest('li > menu');\n if (submenu instanceof HTMLElement && this.menuEl?.contains(submenu)) return submenu;\n return null;\n }\n\n private _focusedRow(e: Event): HTMLElement | null {\n const target = e.target;\n if (!(target instanceof Element)) return null;\n const li = target.closest('li');\n if (li instanceof HTMLElement && this.menuEl?.contains(li)) return li;\n return null;\n }\n\n _handleMenuKeydown = (e: KeyboardEvent) => {\n if (!this.isOpen || e.ctrlKey || e.metaKey || e.altKey || e.isComposing) return;\n const list = this._containingSubmenu(e) ?? this.menuEl;\n const rtl = getComputedStyle(list).direction === 'rtl';\n const openKey = rtl ? Utils.keys.ARROW_LEFT : Utils.keys.ARROW_RIGHT;\n const backKey = rtl ? Utils.keys.ARROW_RIGHT : Utils.keys.ARROW_LEFT;\n if ([openKey, backKey, Utils.keys.ARROW_UP, Utils.keys.ARROW_DOWN, Utils.keys.ESC, Utils.keys.TAB].includes(e.key)) {\n clearTimeout(this.filterTimeout);\n this._resetFilterQuery();\n }\n const arrowUpOrDown =\n e.key === Utils.keys.ARROW_DOWN || e.key === Utils.keys.ARROW_UP;\n if (e.key === Utils.keys.TAB) {\n e.preventDefault();\n this.close();\n } else if (e.key === openKey) {\n const li = this._focusedRow(e);\n if (li?.querySelector(':scope > menu') && !li.matches('.disabled, [aria-disabled=\"true\"]')) {\n e.preventDefault();\n li.classList.add('open');\n this._alignSubmenu(li);\n this._syncSubmenuAria(li, true);\n const first = Array.from(li.querySelector(':scope > menu').children).find(\n child => child instanceof HTMLElement && child.tabIndex !== -1\n ) as HTMLElement | undefined;\n if (first) this._focusRow(first);\n }\n } else if (e.key === backKey) {\n const submenu = this._containingSubmenu(e);\n if (submenu) {\n e.preventDefault();\n const parentLi = submenu.parentElement as HTMLElement;\n parentLi.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(parentLi, false);\n this._focusRow(parentLi);\n }\n }\n // Navigate down menu list\n else if (arrowUpOrDown && this.isOpen) {\n e.preventDefault();\n const direction = e.key === Utils.keys.ARROW_DOWN ? 1 : -1;\n const row = this._focusedRow(e);\n let newFocusedIndex = row ? Array.from(list.children).indexOf(row) : this.focusedIndex;\n let hasFoundNewIndex = false;\n do {\n newFocusedIndex = newFocusedIndex + direction;\n if (\n !!list.children[newFocusedIndex] &&\n (<HTMLLIElement>list.children[newFocusedIndex]).tabIndex !== -1\n ) {\n hasFoundNewIndex = true;\n break;\n }\n } while (newFocusedIndex < list.children.length && newFocusedIndex >= 0);\n\n if (hasFoundNewIndex) {\n if (this.focusedIndex >= 0) list.children[this.focusedIndex]?.classList.remove('active');\n const item = list.children[newFocusedIndex] as HTMLElement;\n item.classList.add('active');\n this._focusRow(item);\n }\n }\n // SPACE OR ENTER selects the focused item.\n else if ((e.key === Utils.keys.ENTER || e.key === SPACE) && this.isOpen) {\n const li = this._focusedRow(e);\n e.preventDefault();\n if (li?.matches('.disabled, [aria-disabled=\"true\"]')) return;\n if (li?.querySelector(':scope > menu')) {\n this._toggleSubmenu(li);\n return;\n }\n const focusedElement = li ?? this.menuEl.children[this.focusedIndex];\n const activatableElement = <HTMLElement>focusedElement?.querySelector(':scope > a, :scope > button');\n if (!!activatableElement) {\n activatableElement.click();\n } else if (focusedElement instanceof HTMLElement) {\n focusedElement.click();\n }\n }\n // Close menu on ESC\n else if (e.key === Utils.keys.ESC && this.isOpen) {\n e.preventDefault();\n const openSub = this._containingSubmenu(e)?.parentElement ??\n Array.from(this.menuEl.querySelectorAll('li.open')).reverse()[0];\n if (openSub) {\n openSub.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(openSub as HTMLElement, false);\n this._focusRow(openSub as HTMLElement);\n } else {\n this.close();\n }\n }\n\n const keyText = e.key.toLowerCase();\n if (e.key.length === 1 && e.key !== SPACE && !e.ctrlKey && !e.metaKey && !e.altKey && !e.isComposing) {\n this.filterQuery.push(keyText);\n const string = this.filterQuery.join('');\n // textContent rather than innerText: this scans every item on every\n // keystroke, and innerText forces a layout flush per item.\n const newOptionEl = Array.from(list.querySelectorAll(':scope > li')).find(\n (el) => (el as HTMLElement).tabIndex !== -1 &&\n !el.matches('.disabled, [aria-disabled=\"true\"]') &&\n Array.from(el.childNodes).filter(node => !(node instanceof Element && node.matches('menu')))\n .map(node => node.textContent).join('').trim().toLowerCase().startsWith(string)\n );\n if (newOptionEl) {\n this._focusRow(newOptionEl as HTMLElement);\n }\n // Re-arm rather than stack: without the clear, every keystroke left a live\n // timer behind and the query could reset while the user was still typing.\n clearTimeout(this.filterTimeout);\n this.filterTimeout = setTimeout(this._resetFilterQuery, 1000);\n }\n };\n\n _handleWindowResize = () => {\n // Only re-place the menu if it's still visible\n // Accounts for elements hiding via media queries\n if (this.el.offsetParent) {\n this.recalculateDimensions();\n }\n };\n\n _resetFilterQuery = () => {\n this.filterQuery = [];\n };\n\n private _restoreInert() {\n if (this._originalInert === null) this.menuEl?.removeAttribute('inert');\n else this.menuEl?.setAttribute('inert', this._originalInert);\n }\n\n private _focusRow(item: HTMLElement) {\n this.focusedIndex = Array.from(item.parentElement.children).indexOf(item);\n item.focus({ preventScroll: true });\n item.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }\n\n _resetMenuStyles() {\n this.menuEl.style.display = '';\n this._resetMenuPositioningStyles();\n this.menuEl.style.transform = '';\n this.menuEl.style.opacity = '';\n }\n\n _resetMenuPositioningStyles() {\n this.menuEl.style.width = '';\n this.menuEl.style.height = '';\n this.menuEl.style.left = '';\n this.menuEl.style.top = '';\n this.menuEl.style.transformOrigin = '';\n }\n\n _moveMenuToElement(containerEl: HTMLElement = null) {\n if (this.options.container) {\n this.options.container.append(this.menuEl);\n return;\n }\n if (containerEl) {\n if (!containerEl.contains(this.menuEl)) containerEl.append(this.menuEl);\n return;\n }\n this.el.after(this.menuEl);\n }\n\n _makeMenuFocusable() {\n if (!this.menuEl) return;\n this.menuEl.popover = '';\n // Focus moves directly to menu items; the surface itself is not a stop.\n this.menuEl.tabIndex = -1;\n // Only set tabindex if it hasn't been set by user\n this.menuEl.querySelectorAll(':scope li, :scope > hr').forEach((el) => {\n if (\n el instanceof HTMLHRElement ||\n el.classList.contains('divider') ||\n el.classList.contains('gap') ||\n el.classList.contains('label') ||\n el.classList.contains('optgroup')\n ) {\n el.setAttribute('tabindex', '-1');\n return;\n }\n if (!el.getAttribute('tabindex')) el.setAttribute('tabindex', '0');\n });\n }\n\n private _focusInitialItem() {\n if (!this.menuEl || !this.options.autoFocus) return;\n const first = Array.from(this.menuEl.children).find(\n (child) => child instanceof HTMLElement && child.tabIndex !== -1\n ) as HTMLElement | undefined;\n if (!first) return;\n this.focusedIndex = Array.from(this.menuEl.children).indexOf(first);\n first.focus({ preventScroll: true });\n }\n\n _focusFocusedItem() {\n if (\n this.focusedIndex >= 0 &&\n this.focusedIndex < this.menuEl.children.length &&\n this.options.autoFocus\n ) {\n (this.menuEl.children[this.focusedIndex] as HTMLElement).focus({\n preventScroll: true\n });\n this.menuEl.children[this.focusedIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n\n _getMenuPosition(closestOverflowParent: HTMLElement) {\n const triggerBRect = this.el.getBoundingClientRect();\n const menuBRect = this.menuEl.getBoundingClientRect();\n\n let idealHeight = menuBRect.height;\n let idealWidth = menuBRect.width;\n let idealXPos = triggerBRect.left - menuBRect.left;\n let idealYPos = triggerBRect.top - menuBRect.top;\n\n const menuBounds = {\n left: idealXPos,\n top: idealYPos,\n height: idealHeight,\n width: idealWidth\n };\n\n const alignments = Utils.checkPossibleAlignments(\n this.el,\n closestOverflowParent,\n menuBounds,\n this.options.coverTrigger ? 0 : triggerBRect.height\n );\n\n let verticalAlignment = 'top';\n let horizontalAlignment = this.options.alignment;\n idealYPos += this.options.coverTrigger ? 0 : triggerBRect.height;\n\n // Reset isScrollable\n this.isScrollable = false;\n\n if (!alignments.top) {\n if (alignments.bottom) {\n verticalAlignment = 'bottom';\n\n if (!this.options.coverTrigger) {\n idealYPos -= triggerBRect.height;\n }\n } else {\n this.isScrollable = true;\n\n // Determine which side has most space and cutoff at correct height\n idealHeight -= 20; // Add padding when cutoff\n if (alignments.spaceOnTop > alignments.spaceOnBottom) {\n verticalAlignment = 'bottom';\n idealHeight += alignments.spaceOnTop;\n idealYPos -= this.options.coverTrigger\n ? alignments.spaceOnTop - 20\n : alignments.spaceOnTop - 20 + triggerBRect.height;\n } else {\n idealHeight += alignments.spaceOnBottom;\n }\n }\n }\n\n // If preferred horizontal alignment is possible\n if (!alignments[horizontalAlignment]) {\n const oppositeAlignment = horizontalAlignment === 'left' ? 'right' : 'left';\n if (alignments[oppositeAlignment]) {\n horizontalAlignment = oppositeAlignment;\n } else {\n // Determine which side has most space and cutoff at correct height\n if (alignments.spaceOnLeft > alignments.spaceOnRight) {\n horizontalAlignment = 'right';\n idealWidth += alignments.spaceOnLeft;\n idealXPos -= alignments.spaceOnLeft;\n } else {\n horizontalAlignment = 'left';\n idealWidth += alignments.spaceOnRight;\n }\n }\n }\n\n if (verticalAlignment === 'bottom') {\n idealYPos =\n idealYPos - menuBRect.height + (this.options.coverTrigger ? triggerBRect.height : 0);\n }\n if (horizontalAlignment === 'right') {\n idealXPos = idealXPos - menuBRect.width + triggerBRect.width;\n }\n return {\n x: idealXPos,\n y: idealYPos,\n verticalAlignment: verticalAlignment,\n horizontalAlignment: horizontalAlignment,\n height: idealHeight,\n width: idealWidth\n };\n }\n\n private _schedule(callback: () => void, delay: number) {\n const timer = setTimeout(() => {\n this._pendingTimers.delete(timer);\n callback();\n }, delay);\n this._pendingTimers.add(timer);\n }\n\n private _clearPendingTimers() {\n for (const timer of this._pendingTimers) clearTimeout(timer);\n this._pendingTimers.clear();\n return ++this._transition;\n }\n\n _animateIn() {\n const transition = this._transition;\n const duration = this.options.inDuration;\n this.menuEl.style.transition = 'none';\n // from\n this.menuEl.style.opacity = '0';\n this.menuEl.style.transform = 'scale(0.85)';\n this._schedule(() => {\n this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n this.menuEl.style.opacity = '1';\n this.menuEl.style.transform = 'scale(1)';\n }, 1);\n this._schedule(() => {\n this._focusInitialItem();\n if (transition !== this._transition) return;\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }, duration);\n }\n\n _animateOut() {\n const duration = this.options.outDuration;\n // easeOutQuad (opacity) & easeOutQuint\n this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n // to\n this.menuEl.style.opacity = '0';\n this.menuEl.style.transform = 'scale(0.85)';\n this._schedule(() => {\n this._resetMenuStyles();\n if (typeof this.options.onCloseEnd === 'function')\n this.options.onCloseEnd.call(this, this.el);\n }, duration);\n }\n\n private _getClosestAncestor(el: HTMLElement, condition: (Function) => boolean): HTMLElement {\n let ancestor: Node = el.parentNode;\n while (ancestor !== null && ancestor !== undefined && ancestor !== document) {\n // A shadow root is not an element and getComputedStyle() rejects it, so\n // step over it to the host - the elements that actually clip the menu\n // are above that.\n if (ancestor.nodeType === Node.ELEMENT_NODE && condition(ancestor)) {\n return <HTMLElement>ancestor;\n }\n ancestor = ancestor.parentNode ?? (<ShadowRoot>ancestor).host;\n }\n return null;\n }\n\n _placeMenu() {\n // Container here will be closest ancestor with overflow: hidden\n let closestOverflowParent: HTMLElement = this._getClosestAncestor(\n this.menuEl,\n (ancestor: HTMLElement) => {\n return (\n !['HTML', 'BODY'].includes(ancestor.tagName) &&\n getComputedStyle(ancestor).overflow !== 'visible'\n );\n }\n );\n // Fallback\n if (!closestOverflowParent) {\n const parent = !!this.menuEl.offsetParent ? this.menuEl.offsetParent : this.menuEl.parentNode;\n // Same hazard as the walk: the parent is a shadow root when the menu was\n // moved into one, and the next line reads its computed style.\n closestOverflowParent = <HTMLElement>((<ShadowRoot>parent).host ?? parent);\n }\n\n if (getComputedStyle(closestOverflowParent).position === 'static')\n closestOverflowParent.style.position = 'relative';\n\n //this._moveMenu(closestOverflowParent);\n\n // Set width before calculating positionInfo. Both callers reset the\n // positioning styles first, so this reads the surface's natural width.\n const natural = this.menuEl.getBoundingClientRect().width;\n // A trigger narrower than the surface's own minimum is not a constraint\n // the menu can honour: the width is written and `min-width` overrides it,\n // leaving the surface at the floor with every item inside it wrapped. So\n // constrain only to a trigger wide enough to mean something, and size by\n // content otherwise. An icon button and a split button's chevron are both\n // that case - 40dp and 48dp against a 112dp floor.\n const triggerWidth = this.el.getBoundingClientRect().width;\n const idealWidth =\n this.options.constrainWidth && triggerWidth >= MIN_SURFACE_WIDTH\n ? triggerWidth\n : Math.min(MAX_SURFACE_WIDTH, Math.max(MIN_SURFACE_WIDTH, natural));\n this.menuEl.style.width = idealWidth + 'px';\n\n const positionInfo = this._getMenuPosition(closestOverflowParent);\n this.menuEl.style.left = positionInfo.x + 'px';\n this.menuEl.style.top = positionInfo.y + 'px';\n this.menuEl.style.height = positionInfo.height + 'px';\n this.menuEl.style.width = positionInfo.width + 'px';\n this.menuEl.style.transformOrigin = `${\n positionInfo.horizontalAlignment === 'left' ? '0' : '100%'\n } ${positionInfo.verticalAlignment === 'top' ? '0' : '100%'}`;\n }\n\n /**\n * Open menu.\n */\n open = () => {\n if (this.isOpen || this.el['Expressive_Menu'] !== this) return;\n const transition = this._clearPendingTimers();\n this.isOpen = true;\n // onOpenStart callback\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n if (transition !== this._transition) return;\n // Reset styles\n this._resetMenuStyles();\n this.menuEl.style.display = 'block';\n this._restoreInert();\n this._placeMenu();\n // Do this one frame later so that we don't bind an event handler that's immediately\n // called when the event bubbles up to the document and closes the menu\n this._schedule(() => this._setupTemporaryEventHandlers(), 0);\n // Queue handlers before initial focus, including zero-duration entry.\n this._animateIn();\n this.el.ariaExpanded = 'true';\n };\n\n /**\n * Close menu.\n */\n close = () => {\n if (!this.isOpen) return;\n const transition = this._clearPendingTimers();\n const root = this.menuEl.getRootNode() as Document | ShadowRoot;\n const focused = root.activeElement;\n this.isOpen = false;\n this.menuEl.setAttribute('inert', '');\n clearTimeout(this.filterTimeout);\n this._resetFilterQuery();\n this.focusedIndex = -1;\n this._closeSubmenus();\n // onCloseStart callback\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n if (transition !== this._transition) return;\n this._animateOut();\n this._removeTemporaryEventHandlers();\n this.el.ariaExpanded = 'false';\n if (this.options.autoFocus && (root.activeElement === focused || !root.activeElement || root.activeElement === document.body)) {\n this.el.focus();\n }\n };\n\n /**\n * While menu is open, you can recalculate its dimensions if its contents have changed.\n */\n recalculateDimensions = () => {\n if (this.isOpen) {\n this._resetMenuPositioningStyles();\n this._placeMenu();\n }\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Component
|
|
3
|
-
} from "./chunk-QSQ24FYT.mjs";
|
|
4
|
-
|
|
5
|
-
// src/ts/components/scrollspy.ts
|
|
6
|
-
var _defaultGetActiveElement = (id) => `a[href="#${id}"]`;
|
|
7
|
-
var _defaults = {
|
|
8
|
-
scrollOffset: 200,
|
|
9
|
-
activeClass: "active",
|
|
10
|
-
getActiveElement: _defaultGetActiveElement,
|
|
11
|
-
keepTopElementActive: false
|
|
12
|
-
};
|
|
13
|
-
var _ScrollSpy = class _ScrollSpy extends Component {
|
|
14
|
-
constructor(el, options) {
|
|
15
|
-
super(el, options, _ScrollSpy);
|
|
16
|
-
this.el["Expressive_ScrollSpy"] = this;
|
|
17
|
-
this.options = {
|
|
18
|
-
..._ScrollSpy.defaults,
|
|
19
|
-
...options
|
|
20
|
-
};
|
|
21
|
-
this.el.style.setProperty(
|
|
22
|
-
"--md-comp-scrollspy-offset",
|
|
23
|
-
`${this.options.scrollOffset}px`
|
|
24
|
-
);
|
|
25
|
-
_ScrollSpy._elements.push(this);
|
|
26
|
-
_ScrollSpy._ensureObserver(this.options.scrollOffset);
|
|
27
|
-
_ScrollSpy._observer?.observe(this.el);
|
|
28
|
-
}
|
|
29
|
-
static get defaults() {
|
|
30
|
-
return _defaults;
|
|
31
|
-
}
|
|
32
|
-
static init(els, options = {}) {
|
|
33
|
-
return super.init(els, options, _ScrollSpy);
|
|
34
|
-
}
|
|
35
|
-
static getInstance(el) {
|
|
36
|
-
return el["Expressive_ScrollSpy"];
|
|
37
|
-
}
|
|
38
|
-
destroy() {
|
|
39
|
-
const index = _ScrollSpy._elements.indexOf(this);
|
|
40
|
-
if (index >= 0) _ScrollSpy._elements.splice(index, 1);
|
|
41
|
-
_ScrollSpy._ratios.delete(this.el);
|
|
42
|
-
_ScrollSpy._observer?.unobserve(this.el);
|
|
43
|
-
const link = _ScrollSpy._linkFor(this.el.id, this.options);
|
|
44
|
-
if (link && link === _ScrollSpy._active) {
|
|
45
|
-
_ScrollSpy._clearActive(this.options);
|
|
46
|
-
} else {
|
|
47
|
-
link?.classList.remove(this.options.activeClass);
|
|
48
|
-
link?.removeAttribute("aria-current");
|
|
49
|
-
}
|
|
50
|
-
if (_ScrollSpy._elements.length === 0) {
|
|
51
|
-
_ScrollSpy._observer?.disconnect();
|
|
52
|
-
_ScrollSpy._observer = null;
|
|
53
|
-
_ScrollSpy._ratios.clear();
|
|
54
|
-
_ScrollSpy._active = null;
|
|
55
|
-
} else {
|
|
56
|
-
_ScrollSpy._syncActive();
|
|
57
|
-
}
|
|
58
|
-
this.el["Expressive_ScrollSpy"] = void 0;
|
|
59
|
-
}
|
|
60
|
-
static _ensureObserver(offset) {
|
|
61
|
-
if (_ScrollSpy._observer) return;
|
|
62
|
-
if (typeof IntersectionObserver === "undefined") return;
|
|
63
|
-
_ScrollSpy._observer = new IntersectionObserver(_ScrollSpy._onIntersect, {
|
|
64
|
-
rootMargin: `-${offset}px 0px -45% 0px`,
|
|
65
|
-
threshold: [0, 0.1, 0.25, 0.5, 0.75, 1]
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
static _syncActive() {
|
|
69
|
-
if (!_ScrollSpy._elements.length) return;
|
|
70
|
-
const options = _ScrollSpy._elements[0].options;
|
|
71
|
-
let best = null;
|
|
72
|
-
let bestRatio = 0;
|
|
73
|
-
for (const spy of _ScrollSpy._elements) {
|
|
74
|
-
const ratio = _ScrollSpy._ratios.get(spy.el) ?? 0;
|
|
75
|
-
if (ratio > bestRatio) {
|
|
76
|
-
bestRatio = ratio;
|
|
77
|
-
best = spy;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
if (!best) {
|
|
81
|
-
if (options.keepTopElementActive) {
|
|
82
|
-
best = _ScrollSpy._nearestAbove() ?? _ScrollSpy._elements[0];
|
|
83
|
-
} else {
|
|
84
|
-
_ScrollSpy._clearActive(options);
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
const next = _ScrollSpy._linkFor(best.el.id, best.options);
|
|
89
|
-
if (next === _ScrollSpy._active) return;
|
|
90
|
-
_ScrollSpy._clearActive(options);
|
|
91
|
-
if (!next) return;
|
|
92
|
-
next.classList.add(best.options.activeClass);
|
|
93
|
-
next.setAttribute("aria-current", "true");
|
|
94
|
-
_ScrollSpy._active = next;
|
|
95
|
-
}
|
|
96
|
-
static _nearestAbove() {
|
|
97
|
-
let best = null;
|
|
98
|
-
let bestTop = -Infinity;
|
|
99
|
-
for (const spy of _ScrollSpy._elements) {
|
|
100
|
-
const top = spy.el.getBoundingClientRect().top;
|
|
101
|
-
if (top <= 0 && top >= bestTop) {
|
|
102
|
-
bestTop = top;
|
|
103
|
-
best = spy;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
return best;
|
|
107
|
-
}
|
|
108
|
-
static _clearActive(options) {
|
|
109
|
-
if (!_ScrollSpy._active) return;
|
|
110
|
-
_ScrollSpy._active.classList.remove(options.activeClass);
|
|
111
|
-
_ScrollSpy._active.removeAttribute("aria-current");
|
|
112
|
-
_ScrollSpy._active = null;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Default lookup compares href attributes (no interpolated selector).
|
|
116
|
-
* A custom getActiveElement still returns a selector.
|
|
117
|
-
*/
|
|
118
|
-
static _linkFor(id, options) {
|
|
119
|
-
if (!id) return null;
|
|
120
|
-
if (options.getActiveElement !== _defaultGetActiveElement) {
|
|
121
|
-
try {
|
|
122
|
-
return document.querySelector(options.getActiveElement(id));
|
|
123
|
-
} catch {
|
|
124
|
-
return null;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
const href = `#${id}`;
|
|
128
|
-
const links = document.querySelectorAll('a[href^="#"]');
|
|
129
|
-
for (let i = 0; i < links.length; i++) {
|
|
130
|
-
if (links[i].getAttribute("href") === href) return links[i];
|
|
131
|
-
}
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
_ScrollSpy._elements = [];
|
|
136
|
-
_ScrollSpy._observer = null;
|
|
137
|
-
_ScrollSpy._ratios = /* @__PURE__ */ new Map();
|
|
138
|
-
_ScrollSpy._active = null;
|
|
139
|
-
_ScrollSpy._onIntersect = (entries) => {
|
|
140
|
-
for (const entry of entries) {
|
|
141
|
-
if (entry.isIntersecting && entry.intersectionRatio > 0) {
|
|
142
|
-
_ScrollSpy._ratios.set(entry.target, entry.intersectionRatio);
|
|
143
|
-
} else {
|
|
144
|
-
_ScrollSpy._ratios.delete(entry.target);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
_ScrollSpy._syncActive();
|
|
148
|
-
};
|
|
149
|
-
var ScrollSpy = _ScrollSpy;
|
|
150
|
-
|
|
151
|
-
export {
|
|
152
|
-
ScrollSpy
|
|
153
|
-
};
|
|
154
|
-
//# sourceMappingURL=chunk-TZZ24ZQS.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ts/components/scrollspy.ts"],
|
|
4
|
-
"sourcesContent": ["import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface ScrollSpyOptions extends BaseOptions {\n /**\n * Offset used as IntersectionObserver rootMargin and as\n * `--md-comp-scrollspy-offset` (scroll-margin on the section).\n * @default 200\n */\n scrollOffset: number;\n /**\n * Class applied to active elements.\n * @default 'active'\n */\n activeClass: string;\n /**\n * Returns a CSS selector for the TOC link. The default is unused: links\n * are found by comparing `a[href^=\"#\"]` to `#id`. A custom function\n * still runs through `querySelector` (escape any author id yourself).\n * @default id => 'a[href=\"#' + id + '\"]'\n */\n getActiveElement: (id: string) => string;\n /**\n * If true, keep the last section above the viewport active when nothing\n * intersects. If there is no such section, the first one stays active.\n * @default false\n */\n keepTopElementActive: boolean;\n}\n\nconst _defaultGetActiveElement = (id: string): string => `a[href=\"#${id}\"]`;\n\nconst _defaults: ScrollSpyOptions = {\n scrollOffset: 200,\n activeClass: 'active',\n getActiveElement: _defaultGetActiveElement,\n keepTopElementActive: false\n};\n\n/**\n * ScrollSpy. IntersectionObserver decides which section is current.\n * Hash links are left to the browser (`scroll-margin` + `scroll-behavior`).\n */\nexport class ScrollSpy extends Component<ScrollSpyOptions> {\n static _elements: ScrollSpy[] = [];\n private static _observer: IntersectionObserver | null = null;\n private static _ratios = new Map<Element, number>();\n private static _active: Element | null = null;\n\n constructor(el: HTMLElement, options: Partial<ScrollSpyOptions>) {\n super(el, options, ScrollSpy);\n this.el['Expressive_ScrollSpy'] = this;\n\n this.options = {\n ...ScrollSpy.defaults,\n ...options\n };\n\n this.el.style.setProperty(\n '--md-comp-scrollspy-offset',\n `${this.options.scrollOffset}px`\n );\n\n ScrollSpy._elements.push(this);\n ScrollSpy._ensureObserver(this.options.scrollOffset);\n ScrollSpy._observer?.observe(this.el);\n }\n\n static get defaults(): ScrollSpyOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<ScrollSpyOptions>): ScrollSpy;\n static init(els: InitElements<InitElement>, options?: Partial<ScrollSpyOptions>): ScrollSpy[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<ScrollSpyOptions> = {}\n ): ScrollSpy | ScrollSpy[] {\n return super.init(els, options, ScrollSpy);\n }\n\n static getInstance(el: HTMLElement): ScrollSpy {\n return el['Expressive_ScrollSpy'];\n }\n\n destroy() {\n const index = ScrollSpy._elements.indexOf(this);\n if (index >= 0) ScrollSpy._elements.splice(index, 1);\n ScrollSpy._ratios.delete(this.el);\n ScrollSpy._observer?.unobserve(this.el);\n\n const link = ScrollSpy._linkFor(this.el.id, this.options);\n if (link && link === ScrollSpy._active) {\n ScrollSpy._clearActive(this.options);\n } else {\n link?.classList.remove(this.options.activeClass);\n link?.removeAttribute('aria-current');\n }\n\n if (ScrollSpy._elements.length === 0) {\n ScrollSpy._observer?.disconnect();\n ScrollSpy._observer = null;\n ScrollSpy._ratios.clear();\n ScrollSpy._active = null;\n } else {\n ScrollSpy._syncActive();\n }\n\n this.el['Expressive_ScrollSpy'] = undefined;\n }\n\n private static _ensureObserver(offset: number) {\n if (ScrollSpy._observer) return;\n if (typeof IntersectionObserver === 'undefined') return;\n ScrollSpy._observer = new IntersectionObserver(ScrollSpy._onIntersect, {\n rootMargin: `-${offset}px 0px -45% 0px`,\n threshold: [0, 0.1, 0.25, 0.5, 0.75, 1]\n });\n }\n\n private static _onIntersect = (entries: IntersectionObserverEntry[]) => {\n for (const entry of entries) {\n if (entry.isIntersecting && entry.intersectionRatio > 0) {\n ScrollSpy._ratios.set(entry.target, entry.intersectionRatio);\n } else {\n ScrollSpy._ratios.delete(entry.target);\n }\n }\n ScrollSpy._syncActive();\n };\n\n private static _syncActive() {\n if (!ScrollSpy._elements.length) return;\n const options = ScrollSpy._elements[0].options;\n\n let best: ScrollSpy | null = null;\n let bestRatio = 0;\n for (const spy of ScrollSpy._elements) {\n const ratio = ScrollSpy._ratios.get(spy.el) ?? 0;\n if (ratio > bestRatio) {\n bestRatio = ratio;\n best = spy;\n }\n }\n\n if (!best) {\n if (options.keepTopElementActive) {\n best = ScrollSpy._nearestAbove() ?? ScrollSpy._elements[0];\n } else {\n ScrollSpy._clearActive(options);\n return;\n }\n }\n\n const next = ScrollSpy._linkFor(best.el.id, best.options);\n if (next === ScrollSpy._active) return;\n ScrollSpy._clearActive(options);\n if (!next) return;\n next.classList.add(best.options.activeClass);\n next.setAttribute('aria-current', 'true');\n ScrollSpy._active = next;\n }\n\n private static _nearestAbove(): ScrollSpy | null {\n let best: ScrollSpy | null = null;\n let bestTop = -Infinity;\n for (const spy of ScrollSpy._elements) {\n const top = spy.el.getBoundingClientRect().top;\n if (top <= 0 && top >= bestTop) {\n bestTop = top;\n best = spy;\n }\n }\n return best;\n }\n\n private static _clearActive(options: ScrollSpyOptions) {\n if (!ScrollSpy._active) return;\n ScrollSpy._active.classList.remove(options.activeClass);\n ScrollSpy._active.removeAttribute('aria-current');\n ScrollSpy._active = null;\n }\n\n /**\n * Default lookup compares href attributes (no interpolated selector).\n * A custom getActiveElement still returns a selector.\n */\n static _linkFor(id: string, options: ScrollSpyOptions): Element | null {\n if (!id) return null;\n if (options.getActiveElement !== _defaultGetActiveElement) {\n try {\n return document.querySelector(options.getActiveElement(id));\n } catch {\n return null;\n }\n }\n const href = `#${id}`;\n const links = document.querySelectorAll('a[href^=\"#\"]');\n for (let i = 0; i < links.length; i++) {\n if (links[i].getAttribute('href') === href) return links[i];\n }\n return null;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|