@nepdatejs/vanilla 0.0.0-bootstrap → 0.1.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/LICENSE +21 -0
- package/README.md +123 -1
- package/dist/auto-define.cjs +11 -0
- package/dist/auto-define.cjs.map +1 -0
- package/dist/auto-define.d.cts +2 -0
- package/dist/auto-define.d.ts +2 -0
- package/dist/auto-define.js +9 -0
- package/dist/auto-define.js.map +1 -0
- package/dist/calendar-BAcO-jYq.js +142 -0
- package/dist/calendar-BAcO-jYq.js.map +1 -0
- package/dist/calendar-BNdN8qJv.d.ts +87 -0
- package/dist/calendar-C1LZI7XN.cjs +159 -0
- package/dist/calendar-C1LZI7XN.cjs.map +1 -0
- package/dist/calendar-QWPX0IfD.d.cts +87 -0
- package/dist/calendar.cjs +7 -0
- package/dist/calendar.d.cts +2 -0
- package/dist/calendar.d.ts +2 -0
- package/dist/calendar.js +3 -0
- package/dist/date-picker-BidCGOz0.d.cts +74 -0
- package/dist/date-picker-CQoabjlj.cjs +600 -0
- package/dist/date-picker-CQoabjlj.cjs.map +1 -0
- package/dist/date-picker-DyvpYe29.d.ts +74 -0
- package/dist/date-picker-ucoEFnMW.js +577 -0
- package/dist/date-picker-ucoEFnMW.js.map +1 -0
- package/dist/date-picker.cjs +6 -0
- package/dist/date-picker.d.cts +3 -0
- package/dist/date-picker.d.ts +3 -0
- package/dist/date-picker.js +1 -0
- package/dist/date-range-picker-BQKcZeqG.cjs +489 -0
- package/dist/date-range-picker-BQKcZeqG.cjs.map +1 -0
- package/dist/date-range-picker-D3eNvlgv.d.ts +98 -0
- package/dist/date-range-picker-DAkCzVgT.js +466 -0
- package/dist/date-range-picker-DAkCzVgT.js.map +1 -0
- package/dist/date-range-picker-SIl0vhUV.d.cts +98 -0
- package/dist/date-range-picker.cjs +6 -0
- package/dist/date-range-picker.d.cts +2 -0
- package/dist/date-range-picker.d.ts +2 -0
- package/dist/date-range-picker.js +1 -0
- package/dist/date-time-picker-BqweOP2u.js +487 -0
- package/dist/date-time-picker-BqweOP2u.js.map +1 -0
- package/dist/date-time-picker-Bxfn-a9T.cjs +510 -0
- package/dist/date-time-picker-Bxfn-a9T.cjs.map +1 -0
- package/dist/date-time-picker-BzSyQxrf.d.cts +92 -0
- package/dist/date-time-picker-DzDpzLMZ.d.ts +92 -0
- package/dist/date-time-picker.cjs +6 -0
- package/dist/date-time-picker.d.cts +2 -0
- package/dist/date-time-picker.d.ts +2 -0
- package/dist/date-time-picker.js +1 -0
- package/dist/define-7natoEH4.js +18 -0
- package/dist/define-7natoEH4.js.map +1 -0
- package/dist/define-B8NUA3yj.d.cts +16 -0
- package/dist/define-B8NUA3yj.d.ts +16 -0
- package/dist/define-DTTdLfIM.cjs +23 -0
- package/dist/define-DTTdLfIM.cjs.map +1 -0
- package/dist/element-utils-BVye8UQq.d.cts +82 -0
- package/dist/element-utils-C-r5gPlk.d.ts +82 -0
- package/dist/index.cjs +30 -0
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/multi-date-picker-B2mQbjZM.d.ts +105 -0
- package/dist/multi-date-picker-BMEYUPBa.cjs +462 -0
- package/dist/multi-date-picker-BMEYUPBa.cjs.map +1 -0
- package/dist/multi-date-picker-BUNf5zyJ.d.cts +105 -0
- package/dist/multi-date-picker-XCg8Y0sF.js +439 -0
- package/dist/multi-date-picker-XCg8Y0sF.js.map +1 -0
- package/dist/multi-date-picker.cjs +6 -0
- package/dist/multi-date-picker.d.cts +2 -0
- package/dist/multi-date-picker.d.ts +2 -0
- package/dist/multi-date-picker.js +1 -0
- package/dist/nepdate-picker.global.js +3 -0
- package/dist/nepdate-picker.global.js.map +1 -0
- package/dist/preset-list-CASwnwmS.js +45 -0
- package/dist/preset-list-CASwnwmS.js.map +1 -0
- package/dist/preset-list-Cs8H12Wp.cjs +50 -0
- package/dist/preset-list-Cs8H12Wp.cjs.map +1 -0
- package/dist/registry-3qzdVB7H.cjs +591 -0
- package/dist/registry-3qzdVB7H.cjs.map +1 -0
- package/dist/registry-BvkGnkvV.js +466 -0
- package/dist/registry-BvkGnkvV.js.map +1 -0
- package/package.json +159 -4
- package/src/auto-define.ts +6 -0
- package/src/calendar-element.ts +129 -0
- package/src/calendar-view.ts +406 -0
- package/src/calendar.ts +45 -0
- package/src/date-picker-element.ts +249 -0
- package/src/date-picker.ts +91 -0
- package/src/date-range-picker-element.ts +201 -0
- package/src/date-range-picker.ts +20 -0
- package/src/date-time-picker-element.ts +191 -0
- package/src/date-time-picker.ts +20 -0
- package/src/datetime-view.ts +459 -0
- package/src/define.ts +16 -0
- package/src/dom.ts +109 -0
- package/src/element-utils.ts +86 -0
- package/src/global.ts +7 -0
- package/src/index.ts +15 -0
- package/src/multi-date-picker-element.ts +187 -0
- package/src/multi-date-picker.ts +53 -0
- package/src/multi-view.ts +345 -0
- package/src/picker-view.ts +448 -0
- package/src/preset-list.ts +51 -0
- package/src/range-view.ts +393 -0
- package/src/registry.ts +27 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-3qzdVB7H.cjs","names":["getLocale","toIsoDate"],"sources":["../src/dom.ts","../src/calendar-view.ts","../src/element-utils.ts","../src/registry.ts"],"sourcesContent":["/** Tiny DOM builders. Text goes through textContent; nothing user-supplied becomes HTML. */\n\ntype Attrs = Record<string, string | number | boolean | null | undefined>;\n\nexport function el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs: Attrs = {},\n children: (Node | string)[] = [],\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n setAttrs(node, attrs);\n node.append(...children);\n\n return node;\n}\n\n/** Set, update or remove attributes: false/null/undefined removes, true sets \"\". */\nexport function setAttrs(node: Element, attrs: Attrs): void {\n for (const [name, value] of Object.entries(attrs)) {\n if (value === false || value === null || value === undefined) {\n node.removeAttribute(name);\n } else {\n const text = value === true ? '' : String(value);\n if (node.getAttribute(name) !== text) {\n node.setAttribute(name, text);\n }\n }\n }\n}\n\nexport function setText(node: Node, text: string): void {\n if (node.textContent !== text) {\n node.textContent = text;\n }\n}\n\nlet counter = 0;\n/** A document-unique id for aria-controls / aria-describedby. */\nexport function uid(prefix: string): string {\n counter += 1;\n\n return `${prefix}-${counter}`;\n}\n\nconst SVG = 'http://www.w3.org/2000/svg';\nconst PATHS: Record<IconName, string[]> = {\n 'chevron-left': ['M10 3.5 5.5 8l4.5 4.5'],\n 'chevron-right': ['M6 3.5 10.5 8 6 12.5'],\n calendar: [\n 'M2 6.5h12',\n 'M5.5 1.5v3',\n 'M10.5 1.5v3',\n 'M4 3h8a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2Z',\n ],\n close: ['M4 4l8 8', 'M12 4l-8 8'],\n};\n\nexport type IconName = 'chevron-left' | 'chevron-right' | 'calendar' | 'close';\n\n/** The Figma icon set at 16px, drawn with currentColor. */\nexport function icon(name: IconName): SVGSVGElement {\n const svg = document.createElementNS(SVG, 'svg');\n svg.setAttribute('viewBox', '0 0 16 16');\n svg.setAttribute('fill', 'none');\n svg.setAttribute('stroke', 'currentColor');\n svg.setAttribute('stroke-width', '1.5');\n svg.setAttribute('stroke-linecap', 'round');\n svg.setAttribute('stroke-linejoin', 'round');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('focusable', 'false');\n for (const d of PATHS[name]) {\n const path = document.createElementNS(SVG, 'path');\n path.setAttribute('d', d);\n svg.append(path);\n }\n\n return svg;\n}\n\n/**\n * Popup or inline: an inline picker's calendar is always in the page, so its\n * inputs are plain text fields, its toggle is hidden and its panel is a group\n * in normal flow rather than a top-layer dialog.\n */\nexport function setPopupMode(\n state: { readonly open: boolean; readonly inline: boolean },\n inputs: readonly HTMLElement[],\n toggle: HTMLElement,\n panel: HTMLElement,\n): void {\n const { inline } = state;\n for (const input of inputs) {\n setAttrs(input, {\n role: inline ? null : 'combobox',\n 'aria-haspopup': inline ? null : 'dialog',\n 'aria-expanded': inline ? null : String(state.open),\n });\n }\n toggle.hidden = inline;\n setAttrs(panel, {\n role: inline ? 'group' : 'dialog',\n popover: inline ? null : 'manual',\n });\n if (inline) {\n panel.dataset['layout'] = 'inline';\n } else if (panel.dataset['layout'] === 'inline') {\n delete panel.dataset['layout'];\n }\n}\n","import { getLocale, type CalendarDate, type LocaleCode } from '@nepdatejs/core';\nimport type {\n CalendarState,\n CalendarStore,\n DayCell,\n FocusKey,\n PickerCell,\n} from '@nepdatejs/calendar';\nimport { el, icon, setAttrs, setText } from './dom';\n\nconst FOCUS_KEYS: ReadonlySet<string> = new Set([\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n 'Home',\n 'End',\n 'PageUp',\n 'PageDown',\n]);\n\nexport interface CalendarViewOptions {\n /** The locale for labels; read on every render so a change applies at once. */\n readonly locale?: (() => LocaleCode | undefined) | undefined;\n /** Called for a day click or Enter/Space; defaults to store.actions.select. */\n readonly onDayActivate?: ((date: CalendarDate) => void) | undefined;\n}\n\n/**\n * Renders a calendar store into `root` with the @nepdatejs/styles markup and\n * keeps it in step. Elements are updated in place, so a click or focus never\n * lands on a replaced button; only switching view or row count rebuilds the body.\n */\nexport class CalendarView {\n readonly element: HTMLDivElement;\n private readonly store: CalendarStore;\n private readonly options: CalendarViewOptions;\n private readonly prev: HTMLButtonElement;\n private readonly next: HTMLButtonElement;\n private readonly title: HTMLDivElement;\n private readonly body: HTMLDivElement;\n private bodyKey = '';\n private cells: (DayCell | null)[] = [];\n private tiles: PickerCell[] = [];\n private focusAfterRender = false;\n private readonly unsubscribe: () => void;\n\n constructor(\n root: HTMLElement,\n store: CalendarStore,\n options: CalendarViewOptions = {},\n ) {\n this.store = store;\n this.options = options;\n this.prev = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'prev' },\n [icon('chevron-left')],\n );\n this.next = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'next' },\n [icon('chevron-right')],\n );\n this.title = el('div', { class: 'ndp-calendar__title', 'aria-live': 'polite' });\n this.body = el('div');\n this.element = el('div', { class: 'ndp-calendar' }, [\n el('div', { class: 'ndp-calendar__header' }, [this.prev, this.title, this.next]),\n this.body,\n ]);\n this.element.addEventListener('click', this.onClick);\n this.element.addEventListener('keydown', this.onKeyDown);\n this.element.addEventListener('mouseover', this.onMouseOver);\n this.element.addEventListener('mouseleave', this.onMouseLeave);\n this.element.addEventListener('focusin', this.onFocusIn);\n root.append(this.element);\n this.unsubscribe = store.subscribe(() => {\n this.render();\n });\n this.render();\n }\n\n /** Move keyboard focus to the day that should have it. */\n focusGrid(): void {\n this.element\n .querySelector<HTMLElement>('.ndp-day[tabindex=\"0\"], .ndp-option[tabindex=\"0\"]')\n ?.focus();\n }\n\n destroy(): void {\n this.unsubscribe();\n this.element.remove();\n }\n\n render(): void {\n const state = this.store.getState();\n const labels = getLocale(this.options.locale?.()).labels;\n const stepLabels =\n state.view === 'day'\n ? [labels.previousMonth, labels.nextMonth]\n : [labels.previousYear, labels.nextYear];\n setAttrs(this.prev, { 'aria-label': stepLabels[0], disabled: !state.canPrev });\n setAttrs(this.next, { 'aria-label': stepLabels[1], disabled: !state.canNext });\n this.renderTitle(state, labels.month, labels.year);\n\n const key = `${state.view}:${state.view === 'day' ? state.weeks.length : 12}`;\n if (key !== this.bodyKey) {\n this.bodyKey = key;\n this.body.replaceChildren(\n state.view === 'day' ? this.buildGrid(state) : this.buildOptions(),\n );\n }\n if (state.view === 'day') {\n this.patchGrid(state);\n } else {\n this.patchOptions(\n state.view === 'month'\n ? state.months\n : state.view === 'year'\n ? state.years\n : state.fiscalYears,\n );\n }\n this.flushFocus();\n }\n\n /** Focus the grid if a keyboard move or view change asked for it. */\n private flushFocus(): void {\n if (this.focusAfterRender) {\n this.focusAfterRender = false;\n this.focusGrid();\n }\n }\n\n private renderTitle(state: CalendarState, monthLabel: string, yearLabel: string): void {\n const [monthName, yearText] =\n state.view === 'day' ? splitTitle(state.title) : ['', state.title];\n const wanted =\n state.view === 'day'\n ? [\n {\n action: 'view-month',\n text: monthName,\n label: `${monthLabel}: ${monthName}`,\n },\n { action: 'view-year', text: yearText, label: `${yearLabel}: ${yearText}` },\n ]\n : [\n {\n action: state.view === 'month' ? 'view-year' : 'view-day',\n text: state.title,\n label:\n state.view === 'fiscal' ? state.title : `${yearLabel}: ${state.title}`,\n },\n ];\n const buttons = [...this.title.children] as HTMLButtonElement[];\n if (buttons.length !== wanted.length) {\n this.title.replaceChildren(\n ...wanted.map(() =>\n el('button', { type: 'button', class: 'ndp-calendar__title-button' }),\n ),\n );\n }\n wanted.forEach((item, index) => {\n const button = this.title.children[index] as HTMLButtonElement;\n setAttrs(button, { 'data-action': item.action, 'aria-label': item.label });\n setText(button, item.text);\n });\n }\n\n private buildGrid(state: CalendarState): HTMLTableElement {\n const head = el('tr', { role: 'row' });\n for (let i = 0; i < 7; i++) {\n head.append(el('th', { class: 'ndp-weekday', scope: 'col', role: 'columnheader' }));\n }\n const rows = state.weeks.map(() => {\n const row = el('tr', { role: 'row' });\n for (let i = 0; i < 7; i++) {\n row.append(\n el('td', { role: 'gridcell' }, [\n el('button', { type: 'button', class: 'ndp-day' }, [\n el('span', { class: 'ndp-sr-only' }),\n el('span', { class: 'ndp-day__label', 'aria-hidden': 'true' }),\n el('span', { class: 'ndp-day__sub', 'aria-hidden': 'true' }),\n el('span', { class: 'ndp-day__dot', 'aria-hidden': 'true', hidden: true }),\n ]),\n ]),\n );\n }\n return row;\n });\n\n return el('table', { class: 'ndp-grid', role: 'grid' }, [\n el('thead', {}, [head]),\n el('tbody', {}, rows),\n ]);\n }\n\n private patchGrid(state: CalendarState): void {\n const table = this.body.firstElementChild as HTMLTableElement;\n setAttrs(table, { 'aria-label': state.title });\n const headers = table.querySelectorAll('th');\n state.weekdays.forEach((weekday, index) => {\n const th = headers[index];\n if (th) {\n setAttrs(th, { abbr: weekday.longLabel, 'data-weekend': weekday.isWeekend });\n setText(th, weekday.label);\n }\n });\n this.cells = state.weeks.flat();\n const buttons = table.querySelectorAll<HTMLButtonElement>('.ndp-day');\n this.cells.forEach((cell, index) => {\n const button = buttons[index];\n if (button) {\n patchDay(button, cell);\n }\n });\n }\n\n private buildOptions(): HTMLDivElement {\n const buttons = Array.from({ length: 12 }, () =>\n el('button', { type: 'button', class: 'ndp-option' }, [\n el('span', { class: 'ndp-sr-only' }),\n el('span', { class: 'ndp-option__label', 'aria-hidden': 'true' }),\n el('span', { class: 'ndp-option__sub', 'aria-hidden': 'true' }),\n ]),\n );\n\n return el('div', { class: 'ndp-options', role: 'group' }, buttons);\n }\n\n private patchOptions(tiles: readonly PickerCell[]): void {\n this.tiles = [...tiles];\n const focusIndex = Math.max(\n 0,\n tiles.findIndex((tile) => tile.isSelected) === -1\n ? tiles.findIndex((tile) => tile.isCurrent)\n : tiles.findIndex((tile) => tile.isSelected),\n );\n const buttons = this.body.querySelectorAll<HTMLButtonElement>('.ndp-option');\n tiles.forEach((tile, index) => {\n const button = buttons[index];\n if (!button) {\n return;\n }\n setAttrs(button, {\n 'data-state': tile.isSelected\n ? 'selected'\n : tile.isCurrent\n ? 'current'\n : 'default',\n 'aria-pressed': tile.isSelected ? 'true' : 'false',\n tabindex: index === focusIndex ? 0 : -1,\n disabled: tile.isDisabled,\n });\n const [name, label, sub] = button.children;\n if (name && label && sub) {\n setText(name, tile.subLabel ? `${tile.label} (${tile.subLabel})` : tile.label);\n setText(label, tile.label);\n setText(sub, tile.subLabel ?? '');\n }\n });\n }\n\n private cellOf(target: EventTarget | null): DayCell | null {\n const button =\n target instanceof Element ? target.closest<HTMLButtonElement>('.ndp-day') : null;\n if (!button || !this.element.contains(button)) {\n return null;\n }\n const index = [...this.element.querySelectorAll('.ndp-day')].indexOf(button);\n\n return this.cells[index] ?? null;\n }\n\n private readonly onClick = (event: MouseEvent): void => {\n const target = event.target instanceof Element ? event.target : null;\n const action = target?.closest<HTMLElement>('[data-action]')?.dataset['action'];\n const { actions } = this.store;\n switch (action) {\n case 'prev':\n actions.prev();\n return;\n case 'next':\n actions.next();\n return;\n case 'view-month':\n actions.setView('month');\n this.focusAfterRender = true;\n this.render();\n return;\n case 'view-year':\n actions.setView('year');\n this.focusAfterRender = true;\n this.render();\n return;\n case 'view-day':\n actions.setView('day');\n return;\n default:\n break;\n }\n const option = target?.closest<HTMLButtonElement>('.ndp-option');\n if (option) {\n const index = [...this.body.querySelectorAll('.ndp-option')].indexOf(option);\n const tile = this.tiles[index];\n if (tile && !tile.isDisabled) {\n this.focusAfterRender = true;\n const view = this.store.getState().view;\n if (view === 'month') {\n actions.chooseMonth(tile.value as 1);\n } else if (view === 'year') {\n actions.chooseYear(tile.value);\n } else {\n actions.chooseFiscalYear(tile.value);\n }\n this.render();\n }\n return;\n }\n const cell = this.cellOf(target);\n if (cell && !cell.isDisabled) {\n (this.options.onDayActivate ?? ((date: CalendarDate) => actions.select(date)))(\n cell.date,\n );\n }\n };\n\n private readonly onKeyDown = (event: KeyboardEvent): void => {\n if (!FOCUS_KEYS.has(event.key) || !this.cellOf(event.target)) {\n return;\n }\n event.preventDefault();\n this.focusAfterRender = true;\n this.store.actions.moveFocus(event.key as FocusKey, { shift: event.shiftKey });\n // A move that changes nothing (at a limit) still keeps focus where it is.\n this.flushFocus();\n };\n\n private readonly onMouseOver = (event: MouseEvent): void => {\n const cell = this.cellOf(event.target);\n if (cell && this.store.getState().selectionMode === 'range') {\n this.store.actions.hover(cell.isDisabled ? null : cell.date);\n }\n };\n\n private readonly onMouseLeave = (): void => {\n if (this.store.getState().selectionMode === 'range') {\n this.store.actions.hover(null);\n }\n };\n\n private readonly onFocusIn = (event: FocusEvent): void => {\n const cell = this.cellOf(event.target);\n if (cell && !cell.isFocusTarget) {\n this.store.actions.focus(cell.date);\n }\n };\n}\n\nfunction patchDay(button: HTMLButtonElement, cell: DayCell | null): void {\n const td = button.parentElement;\n if (!cell) {\n button.hidden = true;\n setAttrs(button, { tabindex: -1, 'data-key': null });\n if (td) {\n setAttrs(td, { 'aria-selected': null });\n }\n return;\n }\n button.hidden = false;\n setAttrs(button, {\n 'data-key': cell.key,\n 'data-state': cell.state,\n 'data-weekend': cell.isWeekend,\n 'data-preview': cell.isInRangePreview && !cell.isSelected,\n 'data-outside': cell.isOutside,\n tabindex: cell.isFocusTarget ? 0 : -1,\n disabled: cell.isDisabled,\n 'aria-pressed': cell.isSelected ? 'true' : 'false',\n 'aria-current': cell.isToday ? 'date' : null,\n });\n if (td) {\n setAttrs(td, { 'aria-selected': cell.isSelected ? 'true' : null });\n }\n const [name, label, sub, dot] = button.children as unknown as [\n HTMLElement,\n HTMLElement,\n HTMLElement,\n HTMLElement,\n ];\n setText(name, cell.ariaLabel);\n setText(label, cell.label);\n setText(sub, cell.subLabel ?? '');\n sub.hidden = cell.subLabel === null;\n const event = cell.events[0];\n dot.hidden = !event;\n dot.style.setProperty('--ndp-dot-color', event?.color ?? null);\n}\n\n/** \"Kartik 2083\" → [\"Kartik\", \"2083\"]; the year is the last word in every locale we ship. */\nfunction splitTitle(title: string): [string, string] {\n const space = title.lastIndexOf(' ');\n\n return space === -1 ? [title, ''] : [title.slice(0, space), title.slice(space + 1)];\n}\n","/** Attribute parsing and shared helpers for the custom elements. */\nimport {\n toIsoDate,\n type CalendarDate,\n type CalendarSystem,\n type Weekday,\n} from '@nepdatejs/core';\nimport type { EventMarker, HolidayInput, HolidayLookup } from '@nepdatejs/calendar';\nimport type { PanelLayout } from '@nepdatejs/dom';\nimport type { Theme } from './picker-view';\n\n/** Lets this module load during server rendering, where HTMLElement does not exist. */\nexport const Base: typeof HTMLElement =\n typeof HTMLElement === 'undefined'\n ? (Object as unknown as typeof HTMLElement)\n : HTMLElement;\n\n/** Options that cannot be attributes: functions and lists. Set them as properties. */\nexport interface RichProps {\n holidays?: readonly HolidayInput[] | HolidayLookup | undefined;\n events?: ((date: CalendarDate) => readonly EventMarker[]) | undefined;\n isDateDisabled?: ((date: CalendarDate) => boolean) | undefined;\n}\n\nexport function str(element: Element, name: string): string | undefined {\n return element.getAttribute(name) ?? undefined;\n}\nexport function bool(element: Element, name: string): boolean {\n return element.hasAttribute(name);\n}\n/** An attribute that is on unless set to \"false\". */\nexport function onUnlessFalse(element: Element, name: string): boolean | undefined {\n const value = element.getAttribute(name);\n return value === null ? undefined : value !== 'false';\n}\nexport function calendarAttr(element: Element, name: string): CalendarSystem | undefined {\n const value = element.getAttribute(name)?.toUpperCase();\n return value === 'BS' || value === 'AD' ? value : undefined;\n}\nexport function weekday(element: Element, name: string): Weekday | undefined {\n const value = Number(element.getAttribute(name) ?? NaN);\n return Number.isInteger(value) && value >= 0 && value <= 6\n ? (value as Weekday)\n : undefined;\n}\nexport function int(element: Element, name: string): number | undefined {\n const value = Number(element.getAttribute(name) ?? NaN);\n return Number.isInteger(value) ? value : undefined;\n}\nexport function theme(element: Element): Theme | undefined {\n const value = element.getAttribute('theme');\n return value === 'light' || value === 'dark' || value === 'auto' ? value : undefined;\n}\n\nexport function panelLayout(element: Element): PanelLayout | undefined {\n const value = element.getAttribute('panel-layout');\n return value === 'auto' || value === 'popover' || value === 'sheet' ? value : undefined;\n}\n\n/** presets=\"today, last7Days\" → ['today', 'last7Days']; unknown ids show as disabled. */\nexport function presetIds(element: Element): readonly string[] | undefined {\n const value = element.getAttribute('presets');\n return value === null\n ? undefined\n : value\n .split(',')\n .map((id) => id.trim())\n .filter(Boolean);\n}\n\n/** Stop the inner inputs' native change events: the element fires its own. */\nexport function swallowInnerChange(host: HTMLElement): void {\n host.addEventListener(\n 'change',\n (event) => {\n if (event.target !== host) {\n event.stopPropagation();\n }\n },\n true,\n );\n}\n\nexport function isoOf(date: CalendarDate | null): string {\n return date ? toIsoDate(date) : '';\n}\n","/** The tag names this package registers. */\nexport const ELEMENT_NAMES: {\n readonly datePicker: 'nep-date-picker';\n readonly calendar: 'nep-calendar';\n readonly dateRangePicker: 'nep-date-range-picker';\n readonly dateTimePicker: 'nep-date-time-picker';\n readonly multiDatePicker: 'nep-multi-date-picker';\n} = Object.freeze({\n datePicker: 'nep-date-picker',\n calendar: 'nep-calendar',\n dateRangePicker: 'nep-date-range-picker',\n dateTimePicker: 'nep-date-time-picker',\n multiDatePicker: 'nep-multi-date-picker',\n});\n\n/** Define one element unless the name is taken. No-op during server rendering. */\nexport function defineElement(\n name: string,\n element: CustomElementConstructor,\n registry?: CustomElementRegistry,\n): void {\n const target =\n registry ?? (typeof customElements === 'undefined' ? undefined : customElements);\n if (target && !target.get(name)) {\n target.define(name, element);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import { getLocale, toIsoDate } from "@nepdatejs/core";
|
|
2
|
+
//#region src/dom.ts
|
|
3
|
+
function el(tag, attrs = {}, children = []) {
|
|
4
|
+
const node = document.createElement(tag);
|
|
5
|
+
setAttrs(node, attrs);
|
|
6
|
+
node.append(...children);
|
|
7
|
+
return node;
|
|
8
|
+
}
|
|
9
|
+
/** Set, update or remove attributes: false/null/undefined removes, true sets "". */
|
|
10
|
+
function setAttrs(node, attrs) {
|
|
11
|
+
for (const [name, value] of Object.entries(attrs)) if (value === false || value === null || value === void 0) node.removeAttribute(name);
|
|
12
|
+
else {
|
|
13
|
+
const text = value === true ? "" : String(value);
|
|
14
|
+
if (node.getAttribute(name) !== text) node.setAttribute(name, text);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function setText(node, text) {
|
|
18
|
+
if (node.textContent !== text) node.textContent = text;
|
|
19
|
+
}
|
|
20
|
+
let counter = 0;
|
|
21
|
+
/** A document-unique id for aria-controls / aria-describedby. */
|
|
22
|
+
function uid(prefix) {
|
|
23
|
+
counter += 1;
|
|
24
|
+
return `${prefix}-${counter}`;
|
|
25
|
+
}
|
|
26
|
+
const SVG = "http://www.w3.org/2000/svg";
|
|
27
|
+
const PATHS = {
|
|
28
|
+
"chevron-left": ["M10 3.5 5.5 8l4.5 4.5"],
|
|
29
|
+
"chevron-right": ["M6 3.5 10.5 8 6 12.5"],
|
|
30
|
+
calendar: [
|
|
31
|
+
"M2 6.5h12",
|
|
32
|
+
"M5.5 1.5v3",
|
|
33
|
+
"M10.5 1.5v3",
|
|
34
|
+
"M4 3h8a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2Z"
|
|
35
|
+
],
|
|
36
|
+
close: ["M4 4l8 8", "M12 4l-8 8"]
|
|
37
|
+
};
|
|
38
|
+
/** The Figma icon set at 16px, drawn with currentColor. */
|
|
39
|
+
function icon(name) {
|
|
40
|
+
const svg = document.createElementNS(SVG, "svg");
|
|
41
|
+
svg.setAttribute("viewBox", "0 0 16 16");
|
|
42
|
+
svg.setAttribute("fill", "none");
|
|
43
|
+
svg.setAttribute("stroke", "currentColor");
|
|
44
|
+
svg.setAttribute("stroke-width", "1.5");
|
|
45
|
+
svg.setAttribute("stroke-linecap", "round");
|
|
46
|
+
svg.setAttribute("stroke-linejoin", "round");
|
|
47
|
+
svg.setAttribute("aria-hidden", "true");
|
|
48
|
+
svg.setAttribute("focusable", "false");
|
|
49
|
+
for (const d of PATHS[name]) {
|
|
50
|
+
const path = document.createElementNS(SVG, "path");
|
|
51
|
+
path.setAttribute("d", d);
|
|
52
|
+
svg.append(path);
|
|
53
|
+
}
|
|
54
|
+
return svg;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Popup or inline: an inline picker's calendar is always in the page, so its
|
|
58
|
+
* inputs are plain text fields, its toggle is hidden and its panel is a group
|
|
59
|
+
* in normal flow rather than a top-layer dialog.
|
|
60
|
+
*/
|
|
61
|
+
function setPopupMode(state, inputs, toggle, panel) {
|
|
62
|
+
const { inline } = state;
|
|
63
|
+
for (const input of inputs) setAttrs(input, {
|
|
64
|
+
role: inline ? null : "combobox",
|
|
65
|
+
"aria-haspopup": inline ? null : "dialog",
|
|
66
|
+
"aria-expanded": inline ? null : String(state.open)
|
|
67
|
+
});
|
|
68
|
+
toggle.hidden = inline;
|
|
69
|
+
setAttrs(panel, {
|
|
70
|
+
role: inline ? "group" : "dialog",
|
|
71
|
+
popover: inline ? null : "manual"
|
|
72
|
+
});
|
|
73
|
+
if (inline) panel.dataset["layout"] = "inline";
|
|
74
|
+
else if (panel.dataset["layout"] === "inline") delete panel.dataset["layout"];
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region src/calendar-view.ts
|
|
78
|
+
const FOCUS_KEYS = /* @__PURE__ */ new Set([
|
|
79
|
+
"ArrowLeft",
|
|
80
|
+
"ArrowRight",
|
|
81
|
+
"ArrowUp",
|
|
82
|
+
"ArrowDown",
|
|
83
|
+
"Home",
|
|
84
|
+
"End",
|
|
85
|
+
"PageUp",
|
|
86
|
+
"PageDown"
|
|
87
|
+
]);
|
|
88
|
+
/**
|
|
89
|
+
* Renders a calendar store into `root` with the @nepdatejs/styles markup and
|
|
90
|
+
* keeps it in step. Elements are updated in place, so a click or focus never
|
|
91
|
+
* lands on a replaced button; only switching view or row count rebuilds the body.
|
|
92
|
+
*/
|
|
93
|
+
var CalendarView = class {
|
|
94
|
+
constructor(root, store, options = {}) {
|
|
95
|
+
this.bodyKey = "";
|
|
96
|
+
this.cells = [];
|
|
97
|
+
this.tiles = [];
|
|
98
|
+
this.focusAfterRender = false;
|
|
99
|
+
this.onClick = (event) => {
|
|
100
|
+
const target = event.target instanceof Element ? event.target : null;
|
|
101
|
+
const action = target?.closest("[data-action]")?.dataset["action"];
|
|
102
|
+
const { actions } = this.store;
|
|
103
|
+
switch (action) {
|
|
104
|
+
case "prev":
|
|
105
|
+
actions.prev();
|
|
106
|
+
return;
|
|
107
|
+
case "next":
|
|
108
|
+
actions.next();
|
|
109
|
+
return;
|
|
110
|
+
case "view-month":
|
|
111
|
+
actions.setView("month");
|
|
112
|
+
this.focusAfterRender = true;
|
|
113
|
+
this.render();
|
|
114
|
+
return;
|
|
115
|
+
case "view-year":
|
|
116
|
+
actions.setView("year");
|
|
117
|
+
this.focusAfterRender = true;
|
|
118
|
+
this.render();
|
|
119
|
+
return;
|
|
120
|
+
case "view-day":
|
|
121
|
+
actions.setView("day");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const option = target?.closest(".ndp-option");
|
|
125
|
+
if (option) {
|
|
126
|
+
const index = [...this.body.querySelectorAll(".ndp-option")].indexOf(option);
|
|
127
|
+
const tile = this.tiles[index];
|
|
128
|
+
if (tile && !tile.isDisabled) {
|
|
129
|
+
this.focusAfterRender = true;
|
|
130
|
+
const view = this.store.getState().view;
|
|
131
|
+
if (view === "month") actions.chooseMonth(tile.value);
|
|
132
|
+
else if (view === "year") actions.chooseYear(tile.value);
|
|
133
|
+
else actions.chooseFiscalYear(tile.value);
|
|
134
|
+
this.render();
|
|
135
|
+
}
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const cell = this.cellOf(target);
|
|
139
|
+
if (cell && !cell.isDisabled) (this.options.onDayActivate ?? ((date) => actions.select(date)))(cell.date);
|
|
140
|
+
};
|
|
141
|
+
this.onKeyDown = (event) => {
|
|
142
|
+
if (!FOCUS_KEYS.has(event.key) || !this.cellOf(event.target)) return;
|
|
143
|
+
event.preventDefault();
|
|
144
|
+
this.focusAfterRender = true;
|
|
145
|
+
this.store.actions.moveFocus(event.key, { shift: event.shiftKey });
|
|
146
|
+
this.flushFocus();
|
|
147
|
+
};
|
|
148
|
+
this.onMouseOver = (event) => {
|
|
149
|
+
const cell = this.cellOf(event.target);
|
|
150
|
+
if (cell && this.store.getState().selectionMode === "range") this.store.actions.hover(cell.isDisabled ? null : cell.date);
|
|
151
|
+
};
|
|
152
|
+
this.onMouseLeave = () => {
|
|
153
|
+
if (this.store.getState().selectionMode === "range") this.store.actions.hover(null);
|
|
154
|
+
};
|
|
155
|
+
this.onFocusIn = (event) => {
|
|
156
|
+
const cell = this.cellOf(event.target);
|
|
157
|
+
if (cell && !cell.isFocusTarget) this.store.actions.focus(cell.date);
|
|
158
|
+
};
|
|
159
|
+
this.store = store;
|
|
160
|
+
this.options = options;
|
|
161
|
+
this.prev = el("button", {
|
|
162
|
+
type: "button",
|
|
163
|
+
class: "ndp-icon-button",
|
|
164
|
+
"data-action": "prev"
|
|
165
|
+
}, [icon("chevron-left")]);
|
|
166
|
+
this.next = el("button", {
|
|
167
|
+
type: "button",
|
|
168
|
+
class: "ndp-icon-button",
|
|
169
|
+
"data-action": "next"
|
|
170
|
+
}, [icon("chevron-right")]);
|
|
171
|
+
this.title = el("div", {
|
|
172
|
+
class: "ndp-calendar__title",
|
|
173
|
+
"aria-live": "polite"
|
|
174
|
+
});
|
|
175
|
+
this.body = el("div");
|
|
176
|
+
this.element = el("div", { class: "ndp-calendar" }, [el("div", { class: "ndp-calendar__header" }, [
|
|
177
|
+
this.prev,
|
|
178
|
+
this.title,
|
|
179
|
+
this.next
|
|
180
|
+
]), this.body]);
|
|
181
|
+
this.element.addEventListener("click", this.onClick);
|
|
182
|
+
this.element.addEventListener("keydown", this.onKeyDown);
|
|
183
|
+
this.element.addEventListener("mouseover", this.onMouseOver);
|
|
184
|
+
this.element.addEventListener("mouseleave", this.onMouseLeave);
|
|
185
|
+
this.element.addEventListener("focusin", this.onFocusIn);
|
|
186
|
+
root.append(this.element);
|
|
187
|
+
this.unsubscribe = store.subscribe(() => {
|
|
188
|
+
this.render();
|
|
189
|
+
});
|
|
190
|
+
this.render();
|
|
191
|
+
}
|
|
192
|
+
/** Move keyboard focus to the day that should have it. */
|
|
193
|
+
focusGrid() {
|
|
194
|
+
this.element.querySelector(".ndp-day[tabindex=\"0\"], .ndp-option[tabindex=\"0\"]")?.focus();
|
|
195
|
+
}
|
|
196
|
+
destroy() {
|
|
197
|
+
this.unsubscribe();
|
|
198
|
+
this.element.remove();
|
|
199
|
+
}
|
|
200
|
+
render() {
|
|
201
|
+
const state = this.store.getState();
|
|
202
|
+
const labels = getLocale(this.options.locale?.()).labels;
|
|
203
|
+
const stepLabels = state.view === "day" ? [labels.previousMonth, labels.nextMonth] : [labels.previousYear, labels.nextYear];
|
|
204
|
+
setAttrs(this.prev, {
|
|
205
|
+
"aria-label": stepLabels[0],
|
|
206
|
+
disabled: !state.canPrev
|
|
207
|
+
});
|
|
208
|
+
setAttrs(this.next, {
|
|
209
|
+
"aria-label": stepLabels[1],
|
|
210
|
+
disabled: !state.canNext
|
|
211
|
+
});
|
|
212
|
+
this.renderTitle(state, labels.month, labels.year);
|
|
213
|
+
const key = `${state.view}:${state.view === "day" ? state.weeks.length : 12}`;
|
|
214
|
+
if (key !== this.bodyKey) {
|
|
215
|
+
this.bodyKey = key;
|
|
216
|
+
this.body.replaceChildren(state.view === "day" ? this.buildGrid(state) : this.buildOptions());
|
|
217
|
+
}
|
|
218
|
+
if (state.view === "day") this.patchGrid(state);
|
|
219
|
+
else this.patchOptions(state.view === "month" ? state.months : state.view === "year" ? state.years : state.fiscalYears);
|
|
220
|
+
this.flushFocus();
|
|
221
|
+
}
|
|
222
|
+
/** Focus the grid if a keyboard move or view change asked for it. */
|
|
223
|
+
flushFocus() {
|
|
224
|
+
if (this.focusAfterRender) {
|
|
225
|
+
this.focusAfterRender = false;
|
|
226
|
+
this.focusGrid();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
renderTitle(state, monthLabel, yearLabel) {
|
|
230
|
+
const [monthName, yearText] = state.view === "day" ? splitTitle(state.title) : ["", state.title];
|
|
231
|
+
const wanted = state.view === "day" ? [{
|
|
232
|
+
action: "view-month",
|
|
233
|
+
text: monthName,
|
|
234
|
+
label: `${monthLabel}: ${monthName}`
|
|
235
|
+
}, {
|
|
236
|
+
action: "view-year",
|
|
237
|
+
text: yearText,
|
|
238
|
+
label: `${yearLabel}: ${yearText}`
|
|
239
|
+
}] : [{
|
|
240
|
+
action: state.view === "month" ? "view-year" : "view-day",
|
|
241
|
+
text: state.title,
|
|
242
|
+
label: state.view === "fiscal" ? state.title : `${yearLabel}: ${state.title}`
|
|
243
|
+
}];
|
|
244
|
+
if ([...this.title.children].length !== wanted.length) this.title.replaceChildren(...wanted.map(() => el("button", {
|
|
245
|
+
type: "button",
|
|
246
|
+
class: "ndp-calendar__title-button"
|
|
247
|
+
})));
|
|
248
|
+
wanted.forEach((item, index) => {
|
|
249
|
+
const button = this.title.children[index];
|
|
250
|
+
setAttrs(button, {
|
|
251
|
+
"data-action": item.action,
|
|
252
|
+
"aria-label": item.label
|
|
253
|
+
});
|
|
254
|
+
setText(button, item.text);
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
buildGrid(state) {
|
|
258
|
+
const head = el("tr", { role: "row" });
|
|
259
|
+
for (let i = 0; i < 7; i++) head.append(el("th", {
|
|
260
|
+
class: "ndp-weekday",
|
|
261
|
+
scope: "col",
|
|
262
|
+
role: "columnheader"
|
|
263
|
+
}));
|
|
264
|
+
const rows = state.weeks.map(() => {
|
|
265
|
+
const row = el("tr", { role: "row" });
|
|
266
|
+
for (let i = 0; i < 7; i++) row.append(el("td", { role: "gridcell" }, [el("button", {
|
|
267
|
+
type: "button",
|
|
268
|
+
class: "ndp-day"
|
|
269
|
+
}, [
|
|
270
|
+
el("span", { class: "ndp-sr-only" }),
|
|
271
|
+
el("span", {
|
|
272
|
+
class: "ndp-day__label",
|
|
273
|
+
"aria-hidden": "true"
|
|
274
|
+
}),
|
|
275
|
+
el("span", {
|
|
276
|
+
class: "ndp-day__sub",
|
|
277
|
+
"aria-hidden": "true"
|
|
278
|
+
}),
|
|
279
|
+
el("span", {
|
|
280
|
+
class: "ndp-day__dot",
|
|
281
|
+
"aria-hidden": "true",
|
|
282
|
+
hidden: true
|
|
283
|
+
})
|
|
284
|
+
])]));
|
|
285
|
+
return row;
|
|
286
|
+
});
|
|
287
|
+
return el("table", {
|
|
288
|
+
class: "ndp-grid",
|
|
289
|
+
role: "grid"
|
|
290
|
+
}, [el("thead", {}, [head]), el("tbody", {}, rows)]);
|
|
291
|
+
}
|
|
292
|
+
patchGrid(state) {
|
|
293
|
+
const table = this.body.firstElementChild;
|
|
294
|
+
setAttrs(table, { "aria-label": state.title });
|
|
295
|
+
const headers = table.querySelectorAll("th");
|
|
296
|
+
state.weekdays.forEach((weekday, index) => {
|
|
297
|
+
const th = headers[index];
|
|
298
|
+
if (th) {
|
|
299
|
+
setAttrs(th, {
|
|
300
|
+
abbr: weekday.longLabel,
|
|
301
|
+
"data-weekend": weekday.isWeekend
|
|
302
|
+
});
|
|
303
|
+
setText(th, weekday.label);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
this.cells = state.weeks.flat();
|
|
307
|
+
const buttons = table.querySelectorAll(".ndp-day");
|
|
308
|
+
this.cells.forEach((cell, index) => {
|
|
309
|
+
const button = buttons[index];
|
|
310
|
+
if (button) patchDay(button, cell);
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
buildOptions() {
|
|
314
|
+
return el("div", {
|
|
315
|
+
class: "ndp-options",
|
|
316
|
+
role: "group"
|
|
317
|
+
}, Array.from({ length: 12 }, () => el("button", {
|
|
318
|
+
type: "button",
|
|
319
|
+
class: "ndp-option"
|
|
320
|
+
}, [
|
|
321
|
+
el("span", { class: "ndp-sr-only" }),
|
|
322
|
+
el("span", {
|
|
323
|
+
class: "ndp-option__label",
|
|
324
|
+
"aria-hidden": "true"
|
|
325
|
+
}),
|
|
326
|
+
el("span", {
|
|
327
|
+
class: "ndp-option__sub",
|
|
328
|
+
"aria-hidden": "true"
|
|
329
|
+
})
|
|
330
|
+
])));
|
|
331
|
+
}
|
|
332
|
+
patchOptions(tiles) {
|
|
333
|
+
this.tiles = [...tiles];
|
|
334
|
+
const focusIndex = Math.max(0, tiles.findIndex((tile) => tile.isSelected) === -1 ? tiles.findIndex((tile) => tile.isCurrent) : tiles.findIndex((tile) => tile.isSelected));
|
|
335
|
+
const buttons = this.body.querySelectorAll(".ndp-option");
|
|
336
|
+
tiles.forEach((tile, index) => {
|
|
337
|
+
const button = buttons[index];
|
|
338
|
+
if (!button) return;
|
|
339
|
+
setAttrs(button, {
|
|
340
|
+
"data-state": tile.isSelected ? "selected" : tile.isCurrent ? "current" : "default",
|
|
341
|
+
"aria-pressed": tile.isSelected ? "true" : "false",
|
|
342
|
+
tabindex: index === focusIndex ? 0 : -1,
|
|
343
|
+
disabled: tile.isDisabled
|
|
344
|
+
});
|
|
345
|
+
const [name, label, sub] = button.children;
|
|
346
|
+
if (name && label && sub) {
|
|
347
|
+
setText(name, tile.subLabel ? `${tile.label} (${tile.subLabel})` : tile.label);
|
|
348
|
+
setText(label, tile.label);
|
|
349
|
+
setText(sub, tile.subLabel ?? "");
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
cellOf(target) {
|
|
354
|
+
const button = target instanceof Element ? target.closest(".ndp-day") : null;
|
|
355
|
+
if (!button || !this.element.contains(button)) return null;
|
|
356
|
+
const index = [...this.element.querySelectorAll(".ndp-day")].indexOf(button);
|
|
357
|
+
return this.cells[index] ?? null;
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
function patchDay(button, cell) {
|
|
361
|
+
const td = button.parentElement;
|
|
362
|
+
if (!cell) {
|
|
363
|
+
button.hidden = true;
|
|
364
|
+
setAttrs(button, {
|
|
365
|
+
tabindex: -1,
|
|
366
|
+
"data-key": null
|
|
367
|
+
});
|
|
368
|
+
if (td) setAttrs(td, { "aria-selected": null });
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
button.hidden = false;
|
|
372
|
+
setAttrs(button, {
|
|
373
|
+
"data-key": cell.key,
|
|
374
|
+
"data-state": cell.state,
|
|
375
|
+
"data-weekend": cell.isWeekend,
|
|
376
|
+
"data-preview": cell.isInRangePreview && !cell.isSelected,
|
|
377
|
+
"data-outside": cell.isOutside,
|
|
378
|
+
tabindex: cell.isFocusTarget ? 0 : -1,
|
|
379
|
+
disabled: cell.isDisabled,
|
|
380
|
+
"aria-pressed": cell.isSelected ? "true" : "false",
|
|
381
|
+
"aria-current": cell.isToday ? "date" : null
|
|
382
|
+
});
|
|
383
|
+
if (td) setAttrs(td, { "aria-selected": cell.isSelected ? "true" : null });
|
|
384
|
+
const [name, label, sub, dot] = button.children;
|
|
385
|
+
setText(name, cell.ariaLabel);
|
|
386
|
+
setText(label, cell.label);
|
|
387
|
+
setText(sub, cell.subLabel ?? "");
|
|
388
|
+
sub.hidden = cell.subLabel === null;
|
|
389
|
+
const event = cell.events[0];
|
|
390
|
+
dot.hidden = !event;
|
|
391
|
+
dot.style.setProperty("--ndp-dot-color", event?.color ?? null);
|
|
392
|
+
}
|
|
393
|
+
/** "Kartik 2083" → ["Kartik", "2083"]; the year is the last word in every locale we ship. */
|
|
394
|
+
function splitTitle(title) {
|
|
395
|
+
const space = title.lastIndexOf(" ");
|
|
396
|
+
return space === -1 ? [title, ""] : [title.slice(0, space), title.slice(space + 1)];
|
|
397
|
+
}
|
|
398
|
+
//#endregion
|
|
399
|
+
//#region src/element-utils.ts
|
|
400
|
+
/** Attribute parsing and shared helpers for the custom elements. */
|
|
401
|
+
/** Lets this module load during server rendering, where HTMLElement does not exist. */
|
|
402
|
+
const Base = typeof HTMLElement === "undefined" ? Object : HTMLElement;
|
|
403
|
+
function str(element, name) {
|
|
404
|
+
return element.getAttribute(name) ?? void 0;
|
|
405
|
+
}
|
|
406
|
+
function bool(element, name) {
|
|
407
|
+
return element.hasAttribute(name);
|
|
408
|
+
}
|
|
409
|
+
/** An attribute that is on unless set to "false". */
|
|
410
|
+
function onUnlessFalse(element, name) {
|
|
411
|
+
const value = element.getAttribute(name);
|
|
412
|
+
return value === null ? void 0 : value !== "false";
|
|
413
|
+
}
|
|
414
|
+
function calendarAttr(element, name) {
|
|
415
|
+
const value = element.getAttribute(name)?.toUpperCase();
|
|
416
|
+
return value === "BS" || value === "AD" ? value : void 0;
|
|
417
|
+
}
|
|
418
|
+
function weekday(element, name) {
|
|
419
|
+
const value = Number(element.getAttribute(name) ?? NaN);
|
|
420
|
+
return Number.isInteger(value) && value >= 0 && value <= 6 ? value : void 0;
|
|
421
|
+
}
|
|
422
|
+
function int(element, name) {
|
|
423
|
+
const value = Number(element.getAttribute(name) ?? NaN);
|
|
424
|
+
return Number.isInteger(value) ? value : void 0;
|
|
425
|
+
}
|
|
426
|
+
function theme(element) {
|
|
427
|
+
const value = element.getAttribute("theme");
|
|
428
|
+
return value === "light" || value === "dark" || value === "auto" ? value : void 0;
|
|
429
|
+
}
|
|
430
|
+
function panelLayout(element) {
|
|
431
|
+
const value = element.getAttribute("panel-layout");
|
|
432
|
+
return value === "auto" || value === "popover" || value === "sheet" ? value : void 0;
|
|
433
|
+
}
|
|
434
|
+
/** presets="today, last7Days" → ['today', 'last7Days']; unknown ids show as disabled. */
|
|
435
|
+
function presetIds(element) {
|
|
436
|
+
const value = element.getAttribute("presets");
|
|
437
|
+
return value === null ? void 0 : value.split(",").map((id) => id.trim()).filter(Boolean);
|
|
438
|
+
}
|
|
439
|
+
/** Stop the inner inputs' native change events: the element fires its own. */
|
|
440
|
+
function swallowInnerChange(host) {
|
|
441
|
+
host.addEventListener("change", (event) => {
|
|
442
|
+
if (event.target !== host) event.stopPropagation();
|
|
443
|
+
}, true);
|
|
444
|
+
}
|
|
445
|
+
function isoOf(date) {
|
|
446
|
+
return date ? toIsoDate(date) : "";
|
|
447
|
+
}
|
|
448
|
+
//#endregion
|
|
449
|
+
//#region src/registry.ts
|
|
450
|
+
/** The tag names this package registers. */
|
|
451
|
+
const ELEMENT_NAMES = Object.freeze({
|
|
452
|
+
datePicker: "nep-date-picker",
|
|
453
|
+
calendar: "nep-calendar",
|
|
454
|
+
dateRangePicker: "nep-date-range-picker",
|
|
455
|
+
dateTimePicker: "nep-date-time-picker",
|
|
456
|
+
multiDatePicker: "nep-multi-date-picker"
|
|
457
|
+
});
|
|
458
|
+
/** Define one element unless the name is taken. No-op during server rendering. */
|
|
459
|
+
function defineElement(name, element, registry) {
|
|
460
|
+
const target = registry ?? (typeof customElements === "undefined" ? void 0 : customElements);
|
|
461
|
+
if (target && !target.get(name)) target.define(name, element);
|
|
462
|
+
}
|
|
463
|
+
//#endregion
|
|
464
|
+
export { icon as _, calendarAttr as a, setText as b, onUnlessFalse as c, str as d, swallowInnerChange as f, el as g, CalendarView as h, bool as i, panelLayout as l, weekday as m, defineElement as n, int as o, theme as p, Base as r, isoOf as s, ELEMENT_NAMES as t, presetIds as u, setAttrs as v, uid as x, setPopupMode as y };
|
|
465
|
+
|
|
466
|
+
//# sourceMappingURL=registry-BvkGnkvV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-BvkGnkvV.js","names":[],"sources":["../src/dom.ts","../src/calendar-view.ts","../src/element-utils.ts","../src/registry.ts"],"sourcesContent":["/** Tiny DOM builders. Text goes through textContent; nothing user-supplied becomes HTML. */\n\ntype Attrs = Record<string, string | number | boolean | null | undefined>;\n\nexport function el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs: Attrs = {},\n children: (Node | string)[] = [],\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n setAttrs(node, attrs);\n node.append(...children);\n\n return node;\n}\n\n/** Set, update or remove attributes: false/null/undefined removes, true sets \"\". */\nexport function setAttrs(node: Element, attrs: Attrs): void {\n for (const [name, value] of Object.entries(attrs)) {\n if (value === false || value === null || value === undefined) {\n node.removeAttribute(name);\n } else {\n const text = value === true ? '' : String(value);\n if (node.getAttribute(name) !== text) {\n node.setAttribute(name, text);\n }\n }\n }\n}\n\nexport function setText(node: Node, text: string): void {\n if (node.textContent !== text) {\n node.textContent = text;\n }\n}\n\nlet counter = 0;\n/** A document-unique id for aria-controls / aria-describedby. */\nexport function uid(prefix: string): string {\n counter += 1;\n\n return `${prefix}-${counter}`;\n}\n\nconst SVG = 'http://www.w3.org/2000/svg';\nconst PATHS: Record<IconName, string[]> = {\n 'chevron-left': ['M10 3.5 5.5 8l4.5 4.5'],\n 'chevron-right': ['M6 3.5 10.5 8 6 12.5'],\n calendar: [\n 'M2 6.5h12',\n 'M5.5 1.5v3',\n 'M10.5 1.5v3',\n 'M4 3h8a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2Z',\n ],\n close: ['M4 4l8 8', 'M12 4l-8 8'],\n};\n\nexport type IconName = 'chevron-left' | 'chevron-right' | 'calendar' | 'close';\n\n/** The Figma icon set at 16px, drawn with currentColor. */\nexport function icon(name: IconName): SVGSVGElement {\n const svg = document.createElementNS(SVG, 'svg');\n svg.setAttribute('viewBox', '0 0 16 16');\n svg.setAttribute('fill', 'none');\n svg.setAttribute('stroke', 'currentColor');\n svg.setAttribute('stroke-width', '1.5');\n svg.setAttribute('stroke-linecap', 'round');\n svg.setAttribute('stroke-linejoin', 'round');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('focusable', 'false');\n for (const d of PATHS[name]) {\n const path = document.createElementNS(SVG, 'path');\n path.setAttribute('d', d);\n svg.append(path);\n }\n\n return svg;\n}\n\n/**\n * Popup or inline: an inline picker's calendar is always in the page, so its\n * inputs are plain text fields, its toggle is hidden and its panel is a group\n * in normal flow rather than a top-layer dialog.\n */\nexport function setPopupMode(\n state: { readonly open: boolean; readonly inline: boolean },\n inputs: readonly HTMLElement[],\n toggle: HTMLElement,\n panel: HTMLElement,\n): void {\n const { inline } = state;\n for (const input of inputs) {\n setAttrs(input, {\n role: inline ? null : 'combobox',\n 'aria-haspopup': inline ? null : 'dialog',\n 'aria-expanded': inline ? null : String(state.open),\n });\n }\n toggle.hidden = inline;\n setAttrs(panel, {\n role: inline ? 'group' : 'dialog',\n popover: inline ? null : 'manual',\n });\n if (inline) {\n panel.dataset['layout'] = 'inline';\n } else if (panel.dataset['layout'] === 'inline') {\n delete panel.dataset['layout'];\n }\n}\n","import { getLocale, type CalendarDate, type LocaleCode } from '@nepdatejs/core';\nimport type {\n CalendarState,\n CalendarStore,\n DayCell,\n FocusKey,\n PickerCell,\n} from '@nepdatejs/calendar';\nimport { el, icon, setAttrs, setText } from './dom';\n\nconst FOCUS_KEYS: ReadonlySet<string> = new Set([\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n 'Home',\n 'End',\n 'PageUp',\n 'PageDown',\n]);\n\nexport interface CalendarViewOptions {\n /** The locale for labels; read on every render so a change applies at once. */\n readonly locale?: (() => LocaleCode | undefined) | undefined;\n /** Called for a day click or Enter/Space; defaults to store.actions.select. */\n readonly onDayActivate?: ((date: CalendarDate) => void) | undefined;\n}\n\n/**\n * Renders a calendar store into `root` with the @nepdatejs/styles markup and\n * keeps it in step. Elements are updated in place, so a click or focus never\n * lands on a replaced button; only switching view or row count rebuilds the body.\n */\nexport class CalendarView {\n readonly element: HTMLDivElement;\n private readonly store: CalendarStore;\n private readonly options: CalendarViewOptions;\n private readonly prev: HTMLButtonElement;\n private readonly next: HTMLButtonElement;\n private readonly title: HTMLDivElement;\n private readonly body: HTMLDivElement;\n private bodyKey = '';\n private cells: (DayCell | null)[] = [];\n private tiles: PickerCell[] = [];\n private focusAfterRender = false;\n private readonly unsubscribe: () => void;\n\n constructor(\n root: HTMLElement,\n store: CalendarStore,\n options: CalendarViewOptions = {},\n ) {\n this.store = store;\n this.options = options;\n this.prev = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'prev' },\n [icon('chevron-left')],\n );\n this.next = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'next' },\n [icon('chevron-right')],\n );\n this.title = el('div', { class: 'ndp-calendar__title', 'aria-live': 'polite' });\n this.body = el('div');\n this.element = el('div', { class: 'ndp-calendar' }, [\n el('div', { class: 'ndp-calendar__header' }, [this.prev, this.title, this.next]),\n this.body,\n ]);\n this.element.addEventListener('click', this.onClick);\n this.element.addEventListener('keydown', this.onKeyDown);\n this.element.addEventListener('mouseover', this.onMouseOver);\n this.element.addEventListener('mouseleave', this.onMouseLeave);\n this.element.addEventListener('focusin', this.onFocusIn);\n root.append(this.element);\n this.unsubscribe = store.subscribe(() => {\n this.render();\n });\n this.render();\n }\n\n /** Move keyboard focus to the day that should have it. */\n focusGrid(): void {\n this.element\n .querySelector<HTMLElement>('.ndp-day[tabindex=\"0\"], .ndp-option[tabindex=\"0\"]')\n ?.focus();\n }\n\n destroy(): void {\n this.unsubscribe();\n this.element.remove();\n }\n\n render(): void {\n const state = this.store.getState();\n const labels = getLocale(this.options.locale?.()).labels;\n const stepLabels =\n state.view === 'day'\n ? [labels.previousMonth, labels.nextMonth]\n : [labels.previousYear, labels.nextYear];\n setAttrs(this.prev, { 'aria-label': stepLabels[0], disabled: !state.canPrev });\n setAttrs(this.next, { 'aria-label': stepLabels[1], disabled: !state.canNext });\n this.renderTitle(state, labels.month, labels.year);\n\n const key = `${state.view}:${state.view === 'day' ? state.weeks.length : 12}`;\n if (key !== this.bodyKey) {\n this.bodyKey = key;\n this.body.replaceChildren(\n state.view === 'day' ? this.buildGrid(state) : this.buildOptions(),\n );\n }\n if (state.view === 'day') {\n this.patchGrid(state);\n } else {\n this.patchOptions(\n state.view === 'month'\n ? state.months\n : state.view === 'year'\n ? state.years\n : state.fiscalYears,\n );\n }\n this.flushFocus();\n }\n\n /** Focus the grid if a keyboard move or view change asked for it. */\n private flushFocus(): void {\n if (this.focusAfterRender) {\n this.focusAfterRender = false;\n this.focusGrid();\n }\n }\n\n private renderTitle(state: CalendarState, monthLabel: string, yearLabel: string): void {\n const [monthName, yearText] =\n state.view === 'day' ? splitTitle(state.title) : ['', state.title];\n const wanted =\n state.view === 'day'\n ? [\n {\n action: 'view-month',\n text: monthName,\n label: `${monthLabel}: ${monthName}`,\n },\n { action: 'view-year', text: yearText, label: `${yearLabel}: ${yearText}` },\n ]\n : [\n {\n action: state.view === 'month' ? 'view-year' : 'view-day',\n text: state.title,\n label:\n state.view === 'fiscal' ? state.title : `${yearLabel}: ${state.title}`,\n },\n ];\n const buttons = [...this.title.children] as HTMLButtonElement[];\n if (buttons.length !== wanted.length) {\n this.title.replaceChildren(\n ...wanted.map(() =>\n el('button', { type: 'button', class: 'ndp-calendar__title-button' }),\n ),\n );\n }\n wanted.forEach((item, index) => {\n const button = this.title.children[index] as HTMLButtonElement;\n setAttrs(button, { 'data-action': item.action, 'aria-label': item.label });\n setText(button, item.text);\n });\n }\n\n private buildGrid(state: CalendarState): HTMLTableElement {\n const head = el('tr', { role: 'row' });\n for (let i = 0; i < 7; i++) {\n head.append(el('th', { class: 'ndp-weekday', scope: 'col', role: 'columnheader' }));\n }\n const rows = state.weeks.map(() => {\n const row = el('tr', { role: 'row' });\n for (let i = 0; i < 7; i++) {\n row.append(\n el('td', { role: 'gridcell' }, [\n el('button', { type: 'button', class: 'ndp-day' }, [\n el('span', { class: 'ndp-sr-only' }),\n el('span', { class: 'ndp-day__label', 'aria-hidden': 'true' }),\n el('span', { class: 'ndp-day__sub', 'aria-hidden': 'true' }),\n el('span', { class: 'ndp-day__dot', 'aria-hidden': 'true', hidden: true }),\n ]),\n ]),\n );\n }\n return row;\n });\n\n return el('table', { class: 'ndp-grid', role: 'grid' }, [\n el('thead', {}, [head]),\n el('tbody', {}, rows),\n ]);\n }\n\n private patchGrid(state: CalendarState): void {\n const table = this.body.firstElementChild as HTMLTableElement;\n setAttrs(table, { 'aria-label': state.title });\n const headers = table.querySelectorAll('th');\n state.weekdays.forEach((weekday, index) => {\n const th = headers[index];\n if (th) {\n setAttrs(th, { abbr: weekday.longLabel, 'data-weekend': weekday.isWeekend });\n setText(th, weekday.label);\n }\n });\n this.cells = state.weeks.flat();\n const buttons = table.querySelectorAll<HTMLButtonElement>('.ndp-day');\n this.cells.forEach((cell, index) => {\n const button = buttons[index];\n if (button) {\n patchDay(button, cell);\n }\n });\n }\n\n private buildOptions(): HTMLDivElement {\n const buttons = Array.from({ length: 12 }, () =>\n el('button', { type: 'button', class: 'ndp-option' }, [\n el('span', { class: 'ndp-sr-only' }),\n el('span', { class: 'ndp-option__label', 'aria-hidden': 'true' }),\n el('span', { class: 'ndp-option__sub', 'aria-hidden': 'true' }),\n ]),\n );\n\n return el('div', { class: 'ndp-options', role: 'group' }, buttons);\n }\n\n private patchOptions(tiles: readonly PickerCell[]): void {\n this.tiles = [...tiles];\n const focusIndex = Math.max(\n 0,\n tiles.findIndex((tile) => tile.isSelected) === -1\n ? tiles.findIndex((tile) => tile.isCurrent)\n : tiles.findIndex((tile) => tile.isSelected),\n );\n const buttons = this.body.querySelectorAll<HTMLButtonElement>('.ndp-option');\n tiles.forEach((tile, index) => {\n const button = buttons[index];\n if (!button) {\n return;\n }\n setAttrs(button, {\n 'data-state': tile.isSelected\n ? 'selected'\n : tile.isCurrent\n ? 'current'\n : 'default',\n 'aria-pressed': tile.isSelected ? 'true' : 'false',\n tabindex: index === focusIndex ? 0 : -1,\n disabled: tile.isDisabled,\n });\n const [name, label, sub] = button.children;\n if (name && label && sub) {\n setText(name, tile.subLabel ? `${tile.label} (${tile.subLabel})` : tile.label);\n setText(label, tile.label);\n setText(sub, tile.subLabel ?? '');\n }\n });\n }\n\n private cellOf(target: EventTarget | null): DayCell | null {\n const button =\n target instanceof Element ? target.closest<HTMLButtonElement>('.ndp-day') : null;\n if (!button || !this.element.contains(button)) {\n return null;\n }\n const index = [...this.element.querySelectorAll('.ndp-day')].indexOf(button);\n\n return this.cells[index] ?? null;\n }\n\n private readonly onClick = (event: MouseEvent): void => {\n const target = event.target instanceof Element ? event.target : null;\n const action = target?.closest<HTMLElement>('[data-action]')?.dataset['action'];\n const { actions } = this.store;\n switch (action) {\n case 'prev':\n actions.prev();\n return;\n case 'next':\n actions.next();\n return;\n case 'view-month':\n actions.setView('month');\n this.focusAfterRender = true;\n this.render();\n return;\n case 'view-year':\n actions.setView('year');\n this.focusAfterRender = true;\n this.render();\n return;\n case 'view-day':\n actions.setView('day');\n return;\n default:\n break;\n }\n const option = target?.closest<HTMLButtonElement>('.ndp-option');\n if (option) {\n const index = [...this.body.querySelectorAll('.ndp-option')].indexOf(option);\n const tile = this.tiles[index];\n if (tile && !tile.isDisabled) {\n this.focusAfterRender = true;\n const view = this.store.getState().view;\n if (view === 'month') {\n actions.chooseMonth(tile.value as 1);\n } else if (view === 'year') {\n actions.chooseYear(tile.value);\n } else {\n actions.chooseFiscalYear(tile.value);\n }\n this.render();\n }\n return;\n }\n const cell = this.cellOf(target);\n if (cell && !cell.isDisabled) {\n (this.options.onDayActivate ?? ((date: CalendarDate) => actions.select(date)))(\n cell.date,\n );\n }\n };\n\n private readonly onKeyDown = (event: KeyboardEvent): void => {\n if (!FOCUS_KEYS.has(event.key) || !this.cellOf(event.target)) {\n return;\n }\n event.preventDefault();\n this.focusAfterRender = true;\n this.store.actions.moveFocus(event.key as FocusKey, { shift: event.shiftKey });\n // A move that changes nothing (at a limit) still keeps focus where it is.\n this.flushFocus();\n };\n\n private readonly onMouseOver = (event: MouseEvent): void => {\n const cell = this.cellOf(event.target);\n if (cell && this.store.getState().selectionMode === 'range') {\n this.store.actions.hover(cell.isDisabled ? null : cell.date);\n }\n };\n\n private readonly onMouseLeave = (): void => {\n if (this.store.getState().selectionMode === 'range') {\n this.store.actions.hover(null);\n }\n };\n\n private readonly onFocusIn = (event: FocusEvent): void => {\n const cell = this.cellOf(event.target);\n if (cell && !cell.isFocusTarget) {\n this.store.actions.focus(cell.date);\n }\n };\n}\n\nfunction patchDay(button: HTMLButtonElement, cell: DayCell | null): void {\n const td = button.parentElement;\n if (!cell) {\n button.hidden = true;\n setAttrs(button, { tabindex: -1, 'data-key': null });\n if (td) {\n setAttrs(td, { 'aria-selected': null });\n }\n return;\n }\n button.hidden = false;\n setAttrs(button, {\n 'data-key': cell.key,\n 'data-state': cell.state,\n 'data-weekend': cell.isWeekend,\n 'data-preview': cell.isInRangePreview && !cell.isSelected,\n 'data-outside': cell.isOutside,\n tabindex: cell.isFocusTarget ? 0 : -1,\n disabled: cell.isDisabled,\n 'aria-pressed': cell.isSelected ? 'true' : 'false',\n 'aria-current': cell.isToday ? 'date' : null,\n });\n if (td) {\n setAttrs(td, { 'aria-selected': cell.isSelected ? 'true' : null });\n }\n const [name, label, sub, dot] = button.children as unknown as [\n HTMLElement,\n HTMLElement,\n HTMLElement,\n HTMLElement,\n ];\n setText(name, cell.ariaLabel);\n setText(label, cell.label);\n setText(sub, cell.subLabel ?? '');\n sub.hidden = cell.subLabel === null;\n const event = cell.events[0];\n dot.hidden = !event;\n dot.style.setProperty('--ndp-dot-color', event?.color ?? null);\n}\n\n/** \"Kartik 2083\" → [\"Kartik\", \"2083\"]; the year is the last word in every locale we ship. */\nfunction splitTitle(title: string): [string, string] {\n const space = title.lastIndexOf(' ');\n\n return space === -1 ? [title, ''] : [title.slice(0, space), title.slice(space + 1)];\n}\n","/** Attribute parsing and shared helpers for the custom elements. */\nimport {\n toIsoDate,\n type CalendarDate,\n type CalendarSystem,\n type Weekday,\n} from '@nepdatejs/core';\nimport type { EventMarker, HolidayInput, HolidayLookup } from '@nepdatejs/calendar';\nimport type { PanelLayout } from '@nepdatejs/dom';\nimport type { Theme } from './picker-view';\n\n/** Lets this module load during server rendering, where HTMLElement does not exist. */\nexport const Base: typeof HTMLElement =\n typeof HTMLElement === 'undefined'\n ? (Object as unknown as typeof HTMLElement)\n : HTMLElement;\n\n/** Options that cannot be attributes: functions and lists. Set them as properties. */\nexport interface RichProps {\n holidays?: readonly HolidayInput[] | HolidayLookup | undefined;\n events?: ((date: CalendarDate) => readonly EventMarker[]) | undefined;\n isDateDisabled?: ((date: CalendarDate) => boolean) | undefined;\n}\n\nexport function str(element: Element, name: string): string | undefined {\n return element.getAttribute(name) ?? undefined;\n}\nexport function bool(element: Element, name: string): boolean {\n return element.hasAttribute(name);\n}\n/** An attribute that is on unless set to \"false\". */\nexport function onUnlessFalse(element: Element, name: string): boolean | undefined {\n const value = element.getAttribute(name);\n return value === null ? undefined : value !== 'false';\n}\nexport function calendarAttr(element: Element, name: string): CalendarSystem | undefined {\n const value = element.getAttribute(name)?.toUpperCase();\n return value === 'BS' || value === 'AD' ? value : undefined;\n}\nexport function weekday(element: Element, name: string): Weekday | undefined {\n const value = Number(element.getAttribute(name) ?? NaN);\n return Number.isInteger(value) && value >= 0 && value <= 6\n ? (value as Weekday)\n : undefined;\n}\nexport function int(element: Element, name: string): number | undefined {\n const value = Number(element.getAttribute(name) ?? NaN);\n return Number.isInteger(value) ? value : undefined;\n}\nexport function theme(element: Element): Theme | undefined {\n const value = element.getAttribute('theme');\n return value === 'light' || value === 'dark' || value === 'auto' ? value : undefined;\n}\n\nexport function panelLayout(element: Element): PanelLayout | undefined {\n const value = element.getAttribute('panel-layout');\n return value === 'auto' || value === 'popover' || value === 'sheet' ? value : undefined;\n}\n\n/** presets=\"today, last7Days\" → ['today', 'last7Days']; unknown ids show as disabled. */\nexport function presetIds(element: Element): readonly string[] | undefined {\n const value = element.getAttribute('presets');\n return value === null\n ? undefined\n : value\n .split(',')\n .map((id) => id.trim())\n .filter(Boolean);\n}\n\n/** Stop the inner inputs' native change events: the element fires its own. */\nexport function swallowInnerChange(host: HTMLElement): void {\n host.addEventListener(\n 'change',\n (event) => {\n if (event.target !== host) {\n event.stopPropagation();\n }\n },\n true,\n );\n}\n\nexport function isoOf(date: CalendarDate | null): string {\n return date ? toIsoDate(date) : '';\n}\n","/** The tag names this package registers. */\nexport const ELEMENT_NAMES: {\n readonly datePicker: 'nep-date-picker';\n readonly calendar: 'nep-calendar';\n readonly dateRangePicker: 'nep-date-range-picker';\n readonly dateTimePicker: 'nep-date-time-picker';\n readonly multiDatePicker: 'nep-multi-date-picker';\n} = Object.freeze({\n datePicker: 'nep-date-picker',\n calendar: 'nep-calendar',\n dateRangePicker: 'nep-date-range-picker',\n dateTimePicker: 'nep-date-time-picker',\n multiDatePicker: 'nep-multi-date-picker',\n});\n\n/** Define one element unless the name is taken. No-op during server rendering. */\nexport function defineElement(\n name: string,\n element: CustomElementConstructor,\n registry?: CustomElementRegistry,\n): void {\n const target =\n registry ?? (typeof customElements === 'undefined' ? undefined : customElements);\n if (target && !target.get(name)) {\n target.define(name, element);\n }\n}\n"],"mappings":"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"}
|