@semplice-studio/pa-design-system 0.2.0 → 0.3.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/dist/components/PaAccordion/PaAccordion.vue.d.ts +0 -1
- package/dist/components/PaAccordion/PaAccordion.vue.js +3 -5
- package/dist/components/PaAccordion/PaAccordion.vue.js.map +1 -1
- package/dist/components/PaAccordion/PaAccordion.vue2.js +24 -30
- package/dist/components/PaAccordion/PaAccordion.vue2.js.map +1 -1
- package/dist/components/PaBanner/PaBanner.vue.js +6 -6
- package/dist/components/PaBanner/PaBanner.vue2.js +26 -28
- package/dist/components/PaBanner/PaBanner.vue2.js.map +1 -1
- package/dist/components/PaCard/PaCard.vue.d.ts +17 -14
- package/dist/components/PaCard/PaCard.vue.js +2 -2
- package/dist/components/PaCard/PaCard.vue2.js +37 -42
- package/dist/components/PaCard/PaCard.vue2.js.map +1 -1
- package/dist/components/PaCheckbox/PaCheckbox.vue.d.ts +5 -6
- package/dist/components/PaCheckbox/PaCheckbox.vue.js +2 -4
- package/dist/components/PaCheckbox/PaCheckbox.vue.js.map +1 -1
- package/dist/components/PaCheckbox/PaCheckbox.vue2.js +20 -26
- package/dist/components/PaCheckbox/PaCheckbox.vue2.js.map +1 -1
- package/dist/components/PaCheckboxGroup/PaCheckboxGroup.vue.d.ts +5 -6
- package/dist/components/PaCheckboxGroup/PaCheckboxGroup.vue.js +2 -4
- package/dist/components/PaCheckboxGroup/PaCheckboxGroup.vue.js.map +1 -1
- package/dist/components/PaCheckboxGroup/PaCheckboxGroup.vue2.js +25 -31
- package/dist/components/PaCheckboxGroup/PaCheckboxGroup.vue2.js.map +1 -1
- package/dist/components/PaDatePicker/PaDatePicker.vue.d.ts +13 -26
- package/dist/components/PaDatePicker/PaDatePicker.vue.js +4 -6
- package/dist/components/PaDatePicker/PaDatePicker.vue.js.map +1 -1
- package/dist/components/PaDatePicker/PaDatePicker.vue2.js +52 -58
- package/dist/components/PaDatePicker/PaDatePicker.vue2.js.map +1 -1
- package/dist/components/PaDrawer/PaDrawer.vue.js +2 -2
- package/dist/components/PaDrawer/PaDrawer.vue2.js +37 -41
- package/dist/components/PaDrawer/PaDrawer.vue2.js.map +1 -1
- package/dist/components/PaFileUpload/PaFileUpload.vue.d.ts +0 -1
- package/dist/components/PaFileUpload/PaFileUpload.vue.js +3 -5
- package/dist/components/PaFileUpload/PaFileUpload.vue.js.map +1 -1
- package/dist/components/PaFileUpload/PaFileUpload.vue2.js +22 -28
- package/dist/components/PaFileUpload/PaFileUpload.vue2.js.map +1 -1
- package/dist/components/PaFooter/PaFooter.vue.js +1 -1
- package/dist/components/PaFooter/PaFooter.vue2.js +43 -48
- package/dist/components/PaFooter/PaFooter.vue2.js.map +1 -1
- package/dist/components/PaHeaderDesktop/PaHeaderDesktop.vue.js +1 -1
- package/dist/components/PaHeaderDesktop/PaHeaderDesktop.vue2.js +61 -66
- package/dist/components/PaHeaderDesktop/PaHeaderDesktop.vue2.js.map +1 -1
- package/dist/components/PaHeaderMobile/PaHeaderMobile.vue.js +2 -2
- package/dist/components/PaHeaderMobile/PaHeaderMobile.vue2.js +69 -74
- package/dist/components/PaHeaderMobile/PaHeaderMobile.vue2.js.map +1 -1
- package/dist/components/PaHero/PaHero.vue.d.ts +15 -12
- package/dist/components/PaHero/PaHero.vue.js +2 -2
- package/dist/components/PaHero/PaHero.vue2.js +36 -41
- package/dist/components/PaHero/PaHero.vue2.js.map +1 -1
- package/dist/components/PaInput/PaInput.vue.d.ts +15 -13
- package/dist/components/PaInput/PaInput.vue.js +4 -6
- package/dist/components/PaInput/PaInput.vue.js.map +1 -1
- package/dist/components/PaInput/PaInput.vue2.js +27 -33
- package/dist/components/PaInput/PaInput.vue2.js.map +1 -1
- package/dist/components/PaModal/PaModal.vue.d.ts +14 -11
- package/dist/components/PaModal/PaModal.vue.js +3 -3
- package/dist/components/PaModal/PaModal.vue2.js +41 -46
- package/dist/components/PaModal/PaModal.vue2.js.map +1 -1
- package/dist/components/PaMonthPicker/PaMonthPicker.vue.d.ts +13 -26
- package/dist/components/PaMonthPicker/PaMonthPicker.vue.js +2 -4
- package/dist/components/PaMonthPicker/PaMonthPicker.vue.js.map +1 -1
- package/dist/components/PaMonthPicker/PaMonthPicker.vue2.js +64 -70
- package/dist/components/PaMonthPicker/PaMonthPicker.vue2.js.map +1 -1
- package/dist/components/PaPagination/PaPagination.vue.js +2 -2
- package/dist/components/PaPagination/PaPagination.vue2.js +41 -46
- package/dist/components/PaPagination/PaPagination.vue2.js.map +1 -1
- package/dist/components/PaRadioGroup/PaRadioGroup.vue.d.ts +5 -6
- package/dist/components/PaRadioGroup/PaRadioGroup.vue.js +2 -4
- package/dist/components/PaRadioGroup/PaRadioGroup.vue.js.map +1 -1
- package/dist/components/PaRadioGroup/PaRadioGroup.vue2.js +22 -28
- package/dist/components/PaRadioGroup/PaRadioGroup.vue2.js.map +1 -1
- package/dist/components/PaRangePicker/PaRangePicker.vue.d.ts +0 -1
- package/dist/components/PaRangePicker/PaRangePicker.vue.js +4 -6
- package/dist/components/PaRangePicker/PaRangePicker.vue.js.map +1 -1
- package/dist/components/PaRangePicker/PaRangePicker.vue2.js +75 -81
- package/dist/components/PaRangePicker/PaRangePicker.vue2.js.map +1 -1
- package/dist/components/PaSearchBar/PaSearchBar.vue.d.ts +0 -1
- package/dist/components/PaSearchBar/PaSearchBar.vue.js +3 -5
- package/dist/components/PaSearchBar/PaSearchBar.vue.js.map +1 -1
- package/dist/components/PaSearchBar/PaSearchBar.vue2.js +55 -61
- package/dist/components/PaSearchBar/PaSearchBar.vue2.js.map +1 -1
- package/dist/components/PaSelect/PaSelect.vue.d.ts +5 -6
- package/dist/components/PaSelect/PaSelect.vue.js +4 -6
- package/dist/components/PaSelect/PaSelect.vue.js.map +1 -1
- package/dist/components/PaSelect/PaSelect.vue2.js +25 -31
- package/dist/components/PaSelect/PaSelect.vue2.js.map +1 -1
- package/dist/components/PaTabs/PaTabs.vue.js +1 -1
- package/dist/components/PaTabs/PaTabs.vue2.js +17 -19
- package/dist/components/PaTabs/PaTabs.vue2.js.map +1 -1
- package/dist/components/PaTextarea/PaTextarea.vue.d.ts +5 -6
- package/dist/components/PaTextarea/PaTextarea.vue.js +4 -6
- package/dist/components/PaTextarea/PaTextarea.vue.js.map +1 -1
- package/dist/components/PaTextarea/PaTextarea.vue2.js +16 -22
- package/dist/components/PaTextarea/PaTextarea.vue2.js.map +1 -1
- package/dist/components/PaTimePicker/PaTimePicker.vue.d.ts +0 -1
- package/dist/components/PaTimePicker/PaTimePicker.vue.js +2 -4
- package/dist/components/PaTimePicker/PaTimePicker.vue.js.map +1 -1
- package/dist/components/PaTimePicker/PaTimePicker.vue2.js +44 -50
- package/dist/components/PaTimePicker/PaTimePicker.vue2.js.map +1 -1
- package/dist/components/PaTitleBar/PaTitleBar.vue.d.ts +12 -9
- package/dist/components/PaTitleBar/PaTitleBar.vue.js +2 -2
- package/dist/components/PaTitleBar/PaTitleBar.vue2.js +34 -39
- package/dist/components/PaTitleBar/PaTitleBar.vue2.js.map +1 -1
- package/dist/components/PaToggle/PaToggle.vue.d.ts +0 -1
- package/dist/components/PaToggle/PaToggle.vue.js +2 -4
- package/dist/components/PaToggle/PaToggle.vue.js.map +1 -1
- package/dist/components/PaToggle/PaToggle.vue2.js +20 -26
- package/dist/components/PaToggle/PaToggle.vue2.js.map +1 -1
- package/dist/components/PaYearPicker/PaYearPicker.vue.d.ts +13 -26
- package/dist/components/PaYearPicker/PaYearPicker.vue.js +4 -6
- package/dist/components/PaYearPicker/PaYearPicker.vue.js.map +1 -1
- package/dist/components/PaYearPicker/PaYearPicker.vue2.js +70 -76
- package/dist/components/PaYearPicker/PaYearPicker.vue2.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaTimePicker.vue2.js","sources":["../../../src/components/PaTimePicker/PaTimePicker.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface PaTimePickerValue {\n hours: number\n minutes: number\n}\n\nlet uid = 0\nexport function nextPaTimePickerId() {\n return `pa-time-picker-${++uid}`\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport PaIcon from '../PaIcon/PaIcon.vue'\n\nconst props = withDefaults(\n defineProps<{\n display?: 'popover' | 'inline'\n placeholder?: string\n label?: string\n required?: boolean\n helperText?: string\n error?: string | boolean\n valid?: boolean\n disabled?: boolean\n readonly?: boolean\n id?: string\n name?: string\n min?: PaTimePickerValue | null\n max?: PaTimePickerValue | null\n disabledTimes?: (time: PaTimePickerValue) => boolean\n }>(),\n {\n display: 'popover',\n placeholder: 'hh:mm',\n required: false,\n error: false,\n valid: false,\n disabled: false,\n readonly: false,\n min: null,\n max: null,\n disabledTimes: undefined,\n },\n)\n\nconst model = defineModel<PaTimePickerValue | null>({ default: null })\n\nconst rootRef = ref<HTMLElement | null>(null)\nconst triggerRef = ref<HTMLButtonElement | null>(null)\nconst open = ref(false)\nconst popoverId = `pa-time-picker-pop-${Math.random().toString(36).slice(2, 9)}`\nconst generatedId = nextPaTimePickerId()\nconst triggerId = computed(() => props.id ?? generatedId)\nconst messageId = computed(() => `${triggerId.value}-msg`)\n\nfunction pad2(n: number): string {\n return String(n).padStart(2, '0')\n}\n\nfunction toMinutes(t: PaTimePickerValue): number {\n return t.hours * 60 + t.minutes\n}\n\nfunction isDisabledTime(t: PaTimePickerValue): boolean {\n const m = toMinutes(t)\n if (props.min && m < toMinutes(props.min)) return true\n if (props.max && m > toMinutes(props.max)) return true\n return props.disabledTimes ? props.disabledTimes(t) === true : false\n}\n\n// First non-disabled minute scanned from 00:00 upward. Returns null when every\n// minute of the 24h cycle is disabled (silly but valid → spinner shows --:--).\nconst firstAllowed = computed<PaTimePickerValue | null>(() => {\n for (let m = 0; m < 24 * 60; m++) {\n const t = { hours: Math.floor(m / 60), minutes: m % 60 }\n if (!isDisabledTime(t)) return t\n }\n return null\n})\n\nconst allTimesDisabled = computed(() => firstAllowed.value === null)\n\n// Display fallback: if model is null, prefer 00:00 unless that's disabled —\n// then fall back to the first non-disabled minute (or null → --:-- placeholder).\nconst displayHours = computed(() => {\n if (model.value) return model.value.hours\n if (allTimesDisabled.value) return null\n const zero = { hours: 0, minutes: 0 }\n if (!isDisabledTime(zero)) return 0\n return firstAllowed.value!.hours\n})\nconst displayMinutes = computed(() => {\n if (model.value) return model.value.minutes\n if (allTimesDisabled.value) return null\n const zero = { hours: 0, minutes: 0 }\n if (!isDisabledTime(zero)) return 0\n return firstAllowed.value!.minutes\n})\n\nconst displayValue = computed(() => {\n const v = model.value\n if (!v) return props.placeholder\n return `${pad2(v.hours)}:${pad2(v.minutes)}`\n})\n\nconst placeholderShown = computed(() => !model.value)\n\n// Chevron inert when the entire 24h cycle is disabled (no next allowed value\n// exists). The typical partial-restriction case lets inc/dec skip over.\nconst chevronInert = computed(() => allTimesDisabled.value)\n\nconst errorActive = computed(() => Boolean(props.error))\nconst validActive = computed(() => props.valid && !errorActive.value)\nconst errorMessage = computed(() =>\n typeof props.error === 'string' && props.error.length > 0 ? props.error : null,\n)\nconst helperMessage = computed(() =>\n !errorActive.value && props.helperText ? props.helperText : null,\n)\nconst message = computed(() => errorMessage.value ?? helperMessage.value)\n\n// HH:mm matching <input type=\"time\">.\nconst serialized = computed(() => {\n const v = model.value\n if (!v) return ''\n return `${pad2(v.hours)}:${pad2(v.minutes)}`\n})\n\nfunction writeModel(hours: number, minutes: number) {\n if (props.readonly) return\n model.value = { hours, minutes }\n}\n\n// inc/dec skip semantics: advance by one step then keep walking (up to a full\n// cycle) until landing on a non-disabled candidate. If the entire cycle is\n// disabled, the operation is a no-op — model is unchanged.\nfunction incHours() {\n if (props.readonly) return\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n for (let i = 1; i <= 24; i++) {\n const candidate = { hours: (h + i) % 24, minutes: m }\n if (!isDisabledTime(candidate)) {\n writeModel(candidate.hours, candidate.minutes)\n return\n }\n }\n}\nfunction decHours() {\n if (props.readonly) return\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n for (let i = 1; i <= 24; i++) {\n const candidate = { hours: (h + 24 - i) % 24, minutes: m }\n if (!isDisabledTime(candidate)) {\n writeModel(candidate.hours, candidate.minutes)\n return\n }\n }\n}\nfunction incMinutes() {\n if (props.readonly) return\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n for (let i = 1; i <= 60; i++) {\n const candidate = { hours: h, minutes: (m + i) % 60 }\n if (!isDisabledTime(candidate)) {\n writeModel(candidate.hours, candidate.minutes)\n return\n }\n }\n}\nfunction decMinutes() {\n if (props.readonly) return\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n for (let i = 1; i <= 60; i++) {\n const candidate = { hours: h, minutes: (m + 60 - i) % 60 }\n if (!isDisabledTime(candidate)) {\n writeModel(candidate.hours, candidate.minutes)\n return\n }\n }\n}\n\nfunction openPopover() {\n if (open.value || props.disabled || props.readonly) return\n open.value = true\n}\n\nfunction closePopover(returnFocus = true) {\n if (!open.value) return\n open.value = false\n if (returnFocus) triggerRef.value?.focus()\n}\n\nfunction togglePopover() {\n if (props.disabled || props.readonly) return\n open.value ? closePopover() : openPopover()\n}\n\nfunction jumpHoursBy(delta: number) {\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n const sign = delta >= 0 ? 1 : -1\n const step = Math.abs(delta)\n const candidate = { hours: ((h + delta) % 24 + 24) % 24, minutes: m }\n if (!isDisabledTime(candidate)) {\n writeModel(candidate.hours, candidate.minutes)\n return\n }\n // Fall back to the nearest non-disabled hour in the requested direction.\n for (let i = 1; i <= 24; i++) {\n const c = { hours: ((h + step * sign + sign * i) % 24 + 24) % 24, minutes: m }\n if (!isDisabledTime(c)) {\n writeModel(c.hours, c.minutes)\n return\n }\n }\n}\n\nfunction jumpMinutesBy(delta: number) {\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n const sign = delta >= 0 ? 1 : -1\n const step = Math.abs(delta)\n const candidate = { hours: h, minutes: ((m + delta) % 60 + 60) % 60 }\n if (!isDisabledTime(candidate)) {\n writeModel(candidate.hours, candidate.minutes)\n return\n }\n for (let i = 1; i <= 60; i++) {\n const c = { hours: h, minutes: ((m + step * sign + sign * i) % 60 + 60) % 60 }\n if (!isDisabledTime(c)) {\n writeModel(c.hours, c.minutes)\n return\n }\n }\n}\n\nfunction setHoursIfAllowed(targetHours: number) {\n const m = displayMinutes.value\n if (m === null) return\n if (!isDisabledTime({ hours: targetHours, minutes: m })) {\n writeModel(targetHours, m)\n return\n }\n // Search outward for the nearest allowed hour with the same minute.\n for (let i = 1; i <= 24; i++) {\n for (const sign of [1, -1] as const) {\n const c = { hours: ((targetHours + sign * i) % 24 + 24) % 24, minutes: m }\n if (!isDisabledTime(c)) {\n writeModel(c.hours, c.minutes)\n return\n }\n }\n }\n}\n\nfunction setMinutesIfAllowed(targetMinutes: number) {\n const h = displayHours.value\n if (h === null) return\n if (!isDisabledTime({ hours: h, minutes: targetMinutes })) {\n writeModel(h, targetMinutes)\n return\n }\n for (let i = 1; i <= 60; i++) {\n for (const sign of [1, -1] as const) {\n const c = { hours: h, minutes: ((targetMinutes + sign * i) % 60 + 60) % 60 }\n if (!isDisabledTime(c)) {\n writeModel(c.hours, c.minutes)\n return\n }\n }\n }\n}\n\nfunction commitOnEnter() {\n // No-op if the current display value is disabled (per AC #5) OR if no allowed\n // time exists in the 24h cycle.\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n if (isDisabledTime({ hours: h, minutes: m })) return\n if (!model.value) writeModel(h, m)\n if (props.display === 'popover') closePopover()\n}\n\nfunction onHoursKeydown(event: KeyboardEvent) {\n if (props.readonly) return\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault()\n incHours()\n break\n case 'ArrowDown':\n event.preventDefault()\n decHours()\n break\n case 'PageUp':\n event.preventDefault()\n jumpHoursBy(10)\n break\n case 'PageDown':\n event.preventDefault()\n jumpHoursBy(-10)\n break\n case 'Home':\n event.preventDefault()\n setHoursIfAllowed(0)\n break\n case 'End':\n event.preventDefault()\n setHoursIfAllowed(23)\n break\n case 'Enter':\n event.preventDefault()\n commitOnEnter()\n break\n }\n}\n\nfunction onMinutesKeydown(event: KeyboardEvent) {\n if (props.readonly) return\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault()\n incMinutes()\n break\n case 'ArrowDown':\n event.preventDefault()\n decMinutes()\n break\n case 'PageUp':\n event.preventDefault()\n jumpMinutesBy(10)\n break\n case 'PageDown':\n event.preventDefault()\n jumpMinutesBy(-10)\n break\n case 'Home':\n event.preventDefault()\n setMinutesIfAllowed(0)\n break\n case 'End':\n event.preventDefault()\n setMinutesIfAllowed(59)\n break\n case 'Enter':\n event.preventDefault()\n commitOnEnter()\n break\n }\n}\n\nfunction onDocumentMousedown(event: MouseEvent) {\n if (!rootRef.value) return\n if (!rootRef.value.contains(event.target as Node)) closePopover(false)\n}\n\nfunction onWindowKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n event.preventDefault()\n closePopover()\n }\n}\n\nwatch(open, (isOpen) => {\n if (isOpen) {\n document.addEventListener('mousedown', onDocumentMousedown)\n window.addEventListener('keydown', onWindowKeydown)\n } else {\n document.removeEventListener('mousedown', onDocumentMousedown)\n window.removeEventListener('keydown', onWindowKeydown)\n }\n})\n\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', onDocumentMousedown)\n window.removeEventListener('keydown', onWindowKeydown)\n})\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"[\n 'pa-time-picker',\n `pa-time-picker--${display}`,\n {\n 'pa-time-picker--open': open,\n 'pa-time-picker--disabled': disabled,\n 'pa-time-picker--readonly': readonly,\n 'pa-time-picker--error': errorActive,\n 'pa-time-picker--valid': validActive,\n },\n ]\"\n >\n <label v-if=\"label\" :for=\"triggerId\" class=\"pa-time-picker__label\">\n {{ label }}<span v-if=\"required\" class=\"pa-time-picker__required\" aria-hidden=\"true\">*</span>\n </label>\n\n <button\n v-if=\"display === 'popover'\"\n :id=\"triggerId\"\n ref=\"triggerRef\"\n type=\"button\"\n :class=\"[\n 'pa-time-picker__trigger',\n {\n 'pa-time-picker__trigger--placeholder': placeholderShown,\n 'pa-time-picker__trigger--disabled': disabled,\n 'pa-time-picker__trigger--readonly': readonly && !disabled,\n 'pa-time-picker__trigger--error': errorActive && !disabled,\n 'pa-time-picker__trigger--valid': validActive && !disabled,\n },\n ]\"\n :disabled=\"disabled\"\n :aria-expanded=\"open\"\n aria-haspopup=\"dialog\"\n :aria-controls=\"popoverId\"\n :aria-required=\"required || undefined\"\n :aria-invalid=\"errorActive || undefined\"\n :aria-readonly=\"readonly || undefined\"\n :aria-describedby=\"message ? messageId : undefined\"\n @click=\"togglePopover\"\n @keydown.enter.prevent=\"togglePopover\"\n @keydown.space.prevent=\"togglePopover\"\n @keydown.down.prevent=\"openPopover\"\n >\n <span class=\"pa-time-picker__value\">{{ displayValue }}</span>\n <slot name=\"suffix\">\n <PaIcon name=\"clock\" size=\"md\" />\n </slot>\n </button>\n\n <input\n v-if=\"name\"\n type=\"hidden\"\n :name=\"name\"\n :value=\"serialized\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :required=\"required\"\n />\n\n <div\n v-show=\"display === 'inline' || open\"\n :id=\"popoverId\"\n :class=\"[\n 'pa-time-picker__popover',\n { 'pa-time-picker__popover--inline': display === 'inline' },\n ]\"\n role=\"dialog\"\n aria-modal=\"false\"\n >\n <div class=\"pa-time-picker__spinner\">\n <div class=\"pa-time-picker__column\">\n <button\n type=\"button\"\n :class=\"['pa-time-picker__chevron', { 'pa-time-picker__chevron--inert': chevronInert }]\"\n :aria-disabled=\"chevronInert || undefined\"\n aria-label=\"Aumenta ore\"\n @click=\"incHours\"\n >\n <PaIcon name=\"caret-up\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"pa-time-picker__cell\"\n aria-label=\"Ore\"\n @keydown=\"onHoursKeydown\"\n >\n {{ displayHours === null ? '--' : pad2(displayHours) }}\n </button>\n <button\n type=\"button\"\n :class=\"['pa-time-picker__chevron', { 'pa-time-picker__chevron--inert': chevronInert }]\"\n :aria-disabled=\"chevronInert || undefined\"\n aria-label=\"Diminuisci ore\"\n @click=\"decHours\"\n >\n <PaIcon name=\"caret-down\" size=\"sm\" />\n </button>\n </div>\n\n <span class=\"pa-time-picker__separator\" aria-hidden=\"true\">:</span>\n\n <div class=\"pa-time-picker__column\">\n <button\n type=\"button\"\n :class=\"['pa-time-picker__chevron', { 'pa-time-picker__chevron--inert': chevronInert }]\"\n :aria-disabled=\"chevronInert || undefined\"\n aria-label=\"Aumenta minuti\"\n @click=\"incMinutes\"\n >\n <PaIcon name=\"caret-up\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"pa-time-picker__cell\"\n aria-label=\"Minuti\"\n @keydown=\"onMinutesKeydown\"\n >\n {{ displayMinutes === null ? '--' : pad2(displayMinutes) }}\n </button>\n <button\n type=\"button\"\n :class=\"['pa-time-picker__chevron', { 'pa-time-picker__chevron--inert': chevronInert }]\"\n :aria-disabled=\"chevronInert || undefined\"\n aria-label=\"Diminuisci minuti\"\n @click=\"decMinutes\"\n >\n <PaIcon name=\"caret-down\" size=\"sm\" />\n </button>\n </div>\n </div>\n </div>\n\n <div\n v-if=\"message\"\n :id=\"messageId\"\n :class=\"['pa-time-picker__message', { 'pa-time-picker__message--error': errorActive }]\"\n >\n {{ message }}\n </div>\n </div>\n</template>\n\n<style scoped>\n.pa-time-picker {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n gap: var(--pa-space-2xs, 4px);\n font-family: var(--pa-font-family-sans, 'Inter', sans-serif);\n}\n\n.pa-time-picker__label {\n font: 600 14px/20px 'Inter', sans-serif;\n color: var(--pa-color-text-dark-blue, #00173d);\n}\n.pa-time-picker__required {\n margin-left: 2px;\n color: var(--pa-color-error, #de2049);\n}\n\n.pa-time-picker__message {\n font: 400 14px/20px 'Inter', sans-serif;\n color: var(--pa-color-neutral-gray, #454d56);\n}\n.pa-time-picker__message--error {\n color: var(--pa-color-error, #de2049);\n}\n\n.pa-time-picker__trigger {\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n min-width: 200px;\n padding: 12px 16px;\n background: #ffffff;\n border: 1px solid var(--pa-color-neutral-gray, #454d56);\n border-radius: 4px;\n font: 400 16px/20px 'Inter', sans-serif;\n color: var(--pa-color-neutral-gray, #454d56);\n cursor: pointer;\n text-align: left;\n}\n.pa-time-picker__trigger:hover { border-color: var(--pa-color-primary, #0071ff); }\n.pa-time-picker__trigger:focus-visible {\n outline: 2px solid var(--pa-color-primary-focus-border, #0065d1);\n outline-offset: 2px;\n}\n.pa-time-picker__trigger--placeholder .pa-time-picker__value {\n color: var(--pa-color-text-disabled, #5b6571);\n font-family: 'Inter', sans-serif;\n}\n.pa-time-picker__trigger--error {\n border-color: var(--pa-color-error, #de2049);\n}\n.pa-time-picker__trigger--error:hover {\n border-color: var(--pa-color-error, #de2049);\n}\n.pa-time-picker__trigger--valid {\n border-color: var(--pa-color-success, #008069);\n}\n.pa-time-picker__trigger--valid:hover {\n border-color: var(--pa-color-success, #008069);\n}\n.pa-time-picker__trigger--disabled,\n.pa-time-picker__trigger[disabled] {\n background: var(--pa-color-bg-disabled-gray, #e7e8e3);\n color: var(--pa-color-text-disabled, #5b6571);\n border-color: var(--pa-color-neutral-gray, #454d56);\n cursor: not-allowed;\n}\n.pa-time-picker__trigger--disabled:hover,\n.pa-time-picker__trigger[disabled]:hover {\n border-color: var(--pa-color-neutral-gray, #454d56);\n}\n.pa-time-picker__trigger--readonly:hover {\n border-color: var(--pa-color-neutral-gray, #454d56);\n}\n.pa-time-picker__value {\n flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n font-family: 'Roboto Mono', monospace;\n}\n\n.pa-time-picker__popover {\n position: absolute; top: calc(100% + 8px); left: 0;\n z-index: 900; min-width: 200px; padding: 24px;\n background: #ffffff; border-radius: 8px;\n box-shadow: var(--pa-shadow-elevation-02, 0 0 24px #e3e5e8);\n}\n.pa-time-picker__popover--inline {\n position: static; top: auto; left: auto; display: inline-block;\n}\n\n.pa-time-picker__spinner {\n display: grid;\n grid-template-columns: auto auto auto;\n gap: 16px;\n align-items: center;\n justify-content: center;\n}\n\n.pa-time-picker__column {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n}\n\n.pa-time-picker__separator {\n font: 400 24px/24px 'Roboto Mono', monospace;\n color: var(--pa-color-neutral-gray, #454d56);\n}\n\n.pa-time-picker__chevron {\n display: inline-flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; padding: 0;\n background: #ffffff; border: 0; border-radius: 9999px;\n color: var(--pa-color-primary, #0071ff); cursor: pointer;\n}\n.pa-time-picker__chevron:hover {\n background: var(--pa-color-bg-primary-light-40, #f2f6fc);\n}\n.pa-time-picker__chevron:focus-visible {\n outline: 2px solid var(--pa-color-primary-focus-border, #0065d1);\n outline-offset: 0;\n}\n.pa-time-picker__chevron--inert,\n.pa-time-picker__chevron--inert:hover {\n color: var(--pa-color-text-disabled, #5b6571);\n background: #ffffff;\n pointer-events: none;\n cursor: not-allowed;\n}\n\n.pa-time-picker__cell {\n display: inline-flex; align-items: center; justify-content: center;\n width: 56px; height: 40px; padding: 0;\n background: #ffffff;\n border: 0;\n border-radius: 4px;\n font: 400 16px/18px 'Roboto Mono', monospace;\n color: var(--pa-color-neutral-gray, #454d56);\n cursor: pointer;\n}\n.pa-time-picker__cell:focus-visible {\n outline: 2px solid var(--pa-color-primary-focus-border, #0065d1);\n outline-offset: -2px;\n}\n.pa-time-picker__cell:active {\n background: var(--pa-color-primary-pressed, #00173d);\n color: #ffffff;\n}\n</style>\n"],"names":["uid","nextPaTimePickerId","props","__props","model","_useModel","rootRef","ref","triggerRef","open","popoverId","generatedId","triggerId","computed","messageId","pad2","n","toMinutes","t","isDisabledTime","m","firstAllowed","allTimesDisabled","displayHours","displayMinutes","displayValue","v","placeholderShown","chevronInert","errorActive","validActive","errorMessage","helperMessage","message","serialized","writeModel","hours","minutes","incHours","h","i","candidate","decHours","incMinutes","decMinutes","openPopover","closePopover","returnFocus","_a","togglePopover","jumpHoursBy","delta","sign","step","c","jumpMinutesBy","setHoursIfAllowed","targetHours","setMinutesIfAllowed","targetMinutes","commitOnEnter","onHoursKeydown","event","onMinutesKeydown","onDocumentMousedown","onWindowKeydown","watch","isOpen","onBeforeUnmount","_createElementBlock","_normalizeClass","_hoisted_2","_createElementVNode","_hoisted_4","_toDisplayString","_renderSlot","_ctx","_createVNode","PaIcon","_hoisted_6","_hoisted_7","_hoisted_10","_vShow","_hoisted_13"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PaTimePicker.vue2.js","sources":["../../../src/components/PaTimePicker/PaTimePicker.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface PaTimePickerValue {\n hours: number\n minutes: number\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, useId, watch } from 'vue'\nimport PaIcon from '../PaIcon/PaIcon.vue'\n\nconst props = withDefaults(\n defineProps<{\n display?: 'popover' | 'inline'\n placeholder?: string\n label?: string\n required?: boolean\n helperText?: string\n error?: string | boolean\n valid?: boolean\n disabled?: boolean\n readonly?: boolean\n id?: string\n name?: string\n min?: PaTimePickerValue | null\n max?: PaTimePickerValue | null\n disabledTimes?: (time: PaTimePickerValue) => boolean\n }>(),\n {\n display: 'popover',\n placeholder: 'hh:mm',\n required: false,\n error: false,\n valid: false,\n disabled: false,\n readonly: false,\n min: null,\n max: null,\n disabledTimes: undefined,\n },\n)\n\nconst model = defineModel<PaTimePickerValue | null>({ default: null })\n\nconst rootRef = ref<HTMLElement | null>(null)\nconst triggerRef = ref<HTMLButtonElement | null>(null)\nconst open = ref(false)\nconst popoverId = `pa-time-picker-pop-${useId()}`\nconst generatedId = `pa-time-picker-${useId()}`\nconst triggerId = computed(() => props.id ?? generatedId)\nconst messageId = computed(() => `${triggerId.value}-msg`)\n\nfunction pad2(n: number): string {\n return String(n).padStart(2, '0')\n}\n\nfunction toMinutes(t: PaTimePickerValue): number {\n return t.hours * 60 + t.minutes\n}\n\nfunction isDisabledTime(t: PaTimePickerValue): boolean {\n const m = toMinutes(t)\n if (props.min && m < toMinutes(props.min)) return true\n if (props.max && m > toMinutes(props.max)) return true\n return props.disabledTimes ? props.disabledTimes(t) === true : false\n}\n\n// First non-disabled minute scanned from 00:00 upward. Returns null when every\n// minute of the 24h cycle is disabled (silly but valid → spinner shows --:--).\nconst firstAllowed = computed<PaTimePickerValue | null>(() => {\n for (let m = 0; m < 24 * 60; m++) {\n const t = { hours: Math.floor(m / 60), minutes: m % 60 }\n if (!isDisabledTime(t)) return t\n }\n return null\n})\n\nconst allTimesDisabled = computed(() => firstAllowed.value === null)\n\n// Display fallback: if model is null, prefer 00:00 unless that's disabled —\n// then fall back to the first non-disabled minute (or null → --:-- placeholder).\nconst displayHours = computed(() => {\n if (model.value) return model.value.hours\n if (allTimesDisabled.value) return null\n const zero = { hours: 0, minutes: 0 }\n if (!isDisabledTime(zero)) return 0\n return firstAllowed.value!.hours\n})\nconst displayMinutes = computed(() => {\n if (model.value) return model.value.minutes\n if (allTimesDisabled.value) return null\n const zero = { hours: 0, minutes: 0 }\n if (!isDisabledTime(zero)) return 0\n return firstAllowed.value!.minutes\n})\n\nconst displayValue = computed(() => {\n const v = model.value\n if (!v) return props.placeholder\n return `${pad2(v.hours)}:${pad2(v.minutes)}`\n})\n\nconst placeholderShown = computed(() => !model.value)\n\n// Chevron inert when the entire 24h cycle is disabled (no next allowed value\n// exists). The typical partial-restriction case lets inc/dec skip over.\nconst chevronInert = computed(() => allTimesDisabled.value)\n\nconst errorActive = computed(() => Boolean(props.error))\nconst validActive = computed(() => props.valid && !errorActive.value)\nconst errorMessage = computed(() =>\n typeof props.error === 'string' && props.error.length > 0 ? props.error : null,\n)\nconst helperMessage = computed(() =>\n !errorActive.value && props.helperText ? props.helperText : null,\n)\nconst message = computed(() => errorMessage.value ?? helperMessage.value)\n\n// HH:mm matching <input type=\"time\">.\nconst serialized = computed(() => {\n const v = model.value\n if (!v) return ''\n return `${pad2(v.hours)}:${pad2(v.minutes)}`\n})\n\nfunction writeModel(hours: number, minutes: number) {\n if (props.readonly) return\n model.value = { hours, minutes }\n}\n\n// inc/dec skip semantics: advance by one step then keep walking (up to a full\n// cycle) until landing on a non-disabled candidate. If the entire cycle is\n// disabled, the operation is a no-op — model is unchanged.\nfunction incHours() {\n if (props.readonly) return\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n for (let i = 1; i <= 24; i++) {\n const candidate = { hours: (h + i) % 24, minutes: m }\n if (!isDisabledTime(candidate)) {\n writeModel(candidate.hours, candidate.minutes)\n return\n }\n }\n}\nfunction decHours() {\n if (props.readonly) return\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n for (let i = 1; i <= 24; i++) {\n const candidate = { hours: (h + 24 - i) % 24, minutes: m }\n if (!isDisabledTime(candidate)) {\n writeModel(candidate.hours, candidate.minutes)\n return\n }\n }\n}\nfunction incMinutes() {\n if (props.readonly) return\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n for (let i = 1; i <= 60; i++) {\n const candidate = { hours: h, minutes: (m + i) % 60 }\n if (!isDisabledTime(candidate)) {\n writeModel(candidate.hours, candidate.minutes)\n return\n }\n }\n}\nfunction decMinutes() {\n if (props.readonly) return\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n for (let i = 1; i <= 60; i++) {\n const candidate = { hours: h, minutes: (m + 60 - i) % 60 }\n if (!isDisabledTime(candidate)) {\n writeModel(candidate.hours, candidate.minutes)\n return\n }\n }\n}\n\nfunction openPopover() {\n if (open.value || props.disabled || props.readonly) return\n open.value = true\n}\n\nfunction closePopover(returnFocus = true) {\n if (!open.value) return\n open.value = false\n if (returnFocus) triggerRef.value?.focus()\n}\n\nfunction togglePopover() {\n if (props.disabled || props.readonly) return\n open.value ? closePopover() : openPopover()\n}\n\nfunction jumpHoursBy(delta: number) {\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n const sign = delta >= 0 ? 1 : -1\n const step = Math.abs(delta)\n const candidate = { hours: ((h + delta) % 24 + 24) % 24, minutes: m }\n if (!isDisabledTime(candidate)) {\n writeModel(candidate.hours, candidate.minutes)\n return\n }\n // Fall back to the nearest non-disabled hour in the requested direction.\n for (let i = 1; i <= 24; i++) {\n const c = { hours: ((h + step * sign + sign * i) % 24 + 24) % 24, minutes: m }\n if (!isDisabledTime(c)) {\n writeModel(c.hours, c.minutes)\n return\n }\n }\n}\n\nfunction jumpMinutesBy(delta: number) {\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n const sign = delta >= 0 ? 1 : -1\n const step = Math.abs(delta)\n const candidate = { hours: h, minutes: ((m + delta) % 60 + 60) % 60 }\n if (!isDisabledTime(candidate)) {\n writeModel(candidate.hours, candidate.minutes)\n return\n }\n for (let i = 1; i <= 60; i++) {\n const c = { hours: h, minutes: ((m + step * sign + sign * i) % 60 + 60) % 60 }\n if (!isDisabledTime(c)) {\n writeModel(c.hours, c.minutes)\n return\n }\n }\n}\n\nfunction setHoursIfAllowed(targetHours: number) {\n const m = displayMinutes.value\n if (m === null) return\n if (!isDisabledTime({ hours: targetHours, minutes: m })) {\n writeModel(targetHours, m)\n return\n }\n // Search outward for the nearest allowed hour with the same minute.\n for (let i = 1; i <= 24; i++) {\n for (const sign of [1, -1] as const) {\n const c = { hours: ((targetHours + sign * i) % 24 + 24) % 24, minutes: m }\n if (!isDisabledTime(c)) {\n writeModel(c.hours, c.minutes)\n return\n }\n }\n }\n}\n\nfunction setMinutesIfAllowed(targetMinutes: number) {\n const h = displayHours.value\n if (h === null) return\n if (!isDisabledTime({ hours: h, minutes: targetMinutes })) {\n writeModel(h, targetMinutes)\n return\n }\n for (let i = 1; i <= 60; i++) {\n for (const sign of [1, -1] as const) {\n const c = { hours: h, minutes: ((targetMinutes + sign * i) % 60 + 60) % 60 }\n if (!isDisabledTime(c)) {\n writeModel(c.hours, c.minutes)\n return\n }\n }\n }\n}\n\nfunction commitOnEnter() {\n // No-op if the current display value is disabled (per AC #5) OR if no allowed\n // time exists in the 24h cycle.\n const h = displayHours.value\n const m = displayMinutes.value\n if (h === null || m === null) return\n if (isDisabledTime({ hours: h, minutes: m })) return\n if (!model.value) writeModel(h, m)\n if (props.display === 'popover') closePopover()\n}\n\nfunction onHoursKeydown(event: KeyboardEvent) {\n if (props.readonly) return\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault()\n incHours()\n break\n case 'ArrowDown':\n event.preventDefault()\n decHours()\n break\n case 'PageUp':\n event.preventDefault()\n jumpHoursBy(10)\n break\n case 'PageDown':\n event.preventDefault()\n jumpHoursBy(-10)\n break\n case 'Home':\n event.preventDefault()\n setHoursIfAllowed(0)\n break\n case 'End':\n event.preventDefault()\n setHoursIfAllowed(23)\n break\n case 'Enter':\n event.preventDefault()\n commitOnEnter()\n break\n }\n}\n\nfunction onMinutesKeydown(event: KeyboardEvent) {\n if (props.readonly) return\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault()\n incMinutes()\n break\n case 'ArrowDown':\n event.preventDefault()\n decMinutes()\n break\n case 'PageUp':\n event.preventDefault()\n jumpMinutesBy(10)\n break\n case 'PageDown':\n event.preventDefault()\n jumpMinutesBy(-10)\n break\n case 'Home':\n event.preventDefault()\n setMinutesIfAllowed(0)\n break\n case 'End':\n event.preventDefault()\n setMinutesIfAllowed(59)\n break\n case 'Enter':\n event.preventDefault()\n commitOnEnter()\n break\n }\n}\n\nfunction onDocumentMousedown(event: MouseEvent) {\n if (!rootRef.value) return\n if (!rootRef.value.contains(event.target as Node)) closePopover(false)\n}\n\nfunction onWindowKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n event.preventDefault()\n closePopover()\n }\n}\n\nwatch(open, (isOpen) => {\n if (isOpen) {\n document.addEventListener('mousedown', onDocumentMousedown)\n window.addEventListener('keydown', onWindowKeydown)\n } else {\n document.removeEventListener('mousedown', onDocumentMousedown)\n window.removeEventListener('keydown', onWindowKeydown)\n }\n})\n\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', onDocumentMousedown)\n window.removeEventListener('keydown', onWindowKeydown)\n})\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"[\n 'pa-time-picker',\n `pa-time-picker--${display}`,\n {\n 'pa-time-picker--open': open,\n 'pa-time-picker--disabled': disabled,\n 'pa-time-picker--readonly': readonly,\n 'pa-time-picker--error': errorActive,\n 'pa-time-picker--valid': validActive,\n },\n ]\"\n >\n <label v-if=\"label\" :for=\"triggerId\" class=\"pa-time-picker__label\">\n {{ label }}<span v-if=\"required\" class=\"pa-time-picker__required\" aria-hidden=\"true\">*</span>\n </label>\n\n <button\n v-if=\"display === 'popover'\"\n :id=\"triggerId\"\n ref=\"triggerRef\"\n type=\"button\"\n :class=\"[\n 'pa-time-picker__trigger',\n {\n 'pa-time-picker__trigger--placeholder': placeholderShown,\n 'pa-time-picker__trigger--disabled': disabled,\n 'pa-time-picker__trigger--readonly': readonly && !disabled,\n 'pa-time-picker__trigger--error': errorActive && !disabled,\n 'pa-time-picker__trigger--valid': validActive && !disabled,\n },\n ]\"\n :disabled=\"disabled\"\n :aria-expanded=\"open\"\n aria-haspopup=\"dialog\"\n :aria-controls=\"popoverId\"\n :aria-required=\"required || undefined\"\n :aria-invalid=\"errorActive || undefined\"\n :aria-readonly=\"readonly || undefined\"\n :aria-describedby=\"message ? messageId : undefined\"\n @click=\"togglePopover\"\n @keydown.enter.prevent=\"togglePopover\"\n @keydown.space.prevent=\"togglePopover\"\n @keydown.down.prevent=\"openPopover\"\n >\n <span class=\"pa-time-picker__value\">{{ displayValue }}</span>\n <slot name=\"suffix\">\n <PaIcon name=\"clock\" size=\"md\" />\n </slot>\n </button>\n\n <input\n v-if=\"name\"\n type=\"hidden\"\n :name=\"name\"\n :value=\"serialized\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :required=\"required\"\n />\n\n <div\n v-show=\"display === 'inline' || open\"\n :id=\"popoverId\"\n :class=\"[\n 'pa-time-picker__popover',\n { 'pa-time-picker__popover--inline': display === 'inline' },\n ]\"\n role=\"dialog\"\n aria-modal=\"false\"\n >\n <div class=\"pa-time-picker__spinner\">\n <div class=\"pa-time-picker__column\">\n <button\n type=\"button\"\n :class=\"['pa-time-picker__chevron', { 'pa-time-picker__chevron--inert': chevronInert }]\"\n :aria-disabled=\"chevronInert || undefined\"\n aria-label=\"Aumenta ore\"\n @click=\"incHours\"\n >\n <PaIcon name=\"caret-up\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"pa-time-picker__cell\"\n aria-label=\"Ore\"\n @keydown=\"onHoursKeydown\"\n >\n {{ displayHours === null ? '--' : pad2(displayHours) }}\n </button>\n <button\n type=\"button\"\n :class=\"['pa-time-picker__chevron', { 'pa-time-picker__chevron--inert': chevronInert }]\"\n :aria-disabled=\"chevronInert || undefined\"\n aria-label=\"Diminuisci ore\"\n @click=\"decHours\"\n >\n <PaIcon name=\"caret-down\" size=\"sm\" />\n </button>\n </div>\n\n <span class=\"pa-time-picker__separator\" aria-hidden=\"true\">:</span>\n\n <div class=\"pa-time-picker__column\">\n <button\n type=\"button\"\n :class=\"['pa-time-picker__chevron', { 'pa-time-picker__chevron--inert': chevronInert }]\"\n :aria-disabled=\"chevronInert || undefined\"\n aria-label=\"Aumenta minuti\"\n @click=\"incMinutes\"\n >\n <PaIcon name=\"caret-up\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"pa-time-picker__cell\"\n aria-label=\"Minuti\"\n @keydown=\"onMinutesKeydown\"\n >\n {{ displayMinutes === null ? '--' : pad2(displayMinutes) }}\n </button>\n <button\n type=\"button\"\n :class=\"['pa-time-picker__chevron', { 'pa-time-picker__chevron--inert': chevronInert }]\"\n :aria-disabled=\"chevronInert || undefined\"\n aria-label=\"Diminuisci minuti\"\n @click=\"decMinutes\"\n >\n <PaIcon name=\"caret-down\" size=\"sm\" />\n </button>\n </div>\n </div>\n </div>\n\n <div\n v-if=\"message\"\n :id=\"messageId\"\n :class=\"['pa-time-picker__message', { 'pa-time-picker__message--error': errorActive }]\"\n >\n {{ message }}\n </div>\n </div>\n</template>\n\n<style scoped>\n.pa-time-picker {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n gap: var(--pa-space-2xs, 4px);\n font-family: var(--pa-font-family-sans, 'Inter', sans-serif);\n}\n\n.pa-time-picker__label {\n font: 600 14px/20px 'Inter', sans-serif;\n color: var(--pa-color-text-dark-blue, #00173d);\n}\n.pa-time-picker__required {\n margin-left: 2px;\n color: var(--pa-color-error, #de2049);\n}\n\n.pa-time-picker__message {\n font: 400 14px/20px 'Inter', sans-serif;\n color: var(--pa-color-neutral-gray, #454d56);\n}\n.pa-time-picker__message--error {\n color: var(--pa-color-error, #de2049);\n}\n\n.pa-time-picker__trigger {\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n min-width: 200px;\n padding: 12px 16px;\n background: #ffffff;\n border: 1px solid var(--pa-color-neutral-gray, #454d56);\n border-radius: 4px;\n font: 400 16px/20px 'Inter', sans-serif;\n color: var(--pa-color-neutral-gray, #454d56);\n cursor: pointer;\n text-align: left;\n}\n.pa-time-picker__trigger:hover { border-color: var(--pa-color-primary, #0071ff); }\n.pa-time-picker__trigger:focus-visible {\n outline: 2px solid var(--pa-color-primary-focus-border, #0065d1);\n outline-offset: 2px;\n}\n.pa-time-picker__trigger--placeholder .pa-time-picker__value {\n color: var(--pa-color-text-disabled, #5b6571);\n font-family: 'Inter', sans-serif;\n}\n.pa-time-picker__trigger--error {\n border-color: var(--pa-color-error, #de2049);\n}\n.pa-time-picker__trigger--error:hover {\n border-color: var(--pa-color-error, #de2049);\n}\n.pa-time-picker__trigger--valid {\n border-color: var(--pa-color-success, #008069);\n}\n.pa-time-picker__trigger--valid:hover {\n border-color: var(--pa-color-success, #008069);\n}\n.pa-time-picker__trigger--disabled,\n.pa-time-picker__trigger[disabled] {\n background: var(--pa-color-bg-disabled-gray, #e7e8e3);\n color: var(--pa-color-text-disabled, #5b6571);\n border-color: var(--pa-color-neutral-gray, #454d56);\n cursor: not-allowed;\n}\n.pa-time-picker__trigger--disabled:hover,\n.pa-time-picker__trigger[disabled]:hover {\n border-color: var(--pa-color-neutral-gray, #454d56);\n}\n.pa-time-picker__trigger--readonly:hover {\n border-color: var(--pa-color-neutral-gray, #454d56);\n}\n.pa-time-picker__value {\n flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n font-family: 'Roboto Mono', monospace;\n}\n\n.pa-time-picker__popover {\n position: absolute; top: calc(100% + 8px); left: 0;\n z-index: 900; min-width: 200px; padding: 24px;\n background: #ffffff; border-radius: 8px;\n box-shadow: var(--pa-shadow-elevation-02, 0 0 24px #e3e5e8);\n}\n.pa-time-picker__popover--inline {\n position: static; top: auto; left: auto; display: inline-block;\n}\n\n.pa-time-picker__spinner {\n display: grid;\n grid-template-columns: auto auto auto;\n gap: 16px;\n align-items: center;\n justify-content: center;\n}\n\n.pa-time-picker__column {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n}\n\n.pa-time-picker__separator {\n font: 400 24px/24px 'Roboto Mono', monospace;\n color: var(--pa-color-neutral-gray, #454d56);\n}\n\n.pa-time-picker__chevron {\n display: inline-flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; padding: 0;\n background: #ffffff; border: 0; border-radius: 9999px;\n color: var(--pa-color-primary, #0071ff); cursor: pointer;\n}\n.pa-time-picker__chevron:hover {\n background: var(--pa-color-bg-primary-light-40, #f2f6fc);\n}\n.pa-time-picker__chevron:focus-visible {\n outline: 2px solid var(--pa-color-primary-focus-border, #0065d1);\n outline-offset: 0;\n}\n.pa-time-picker__chevron--inert,\n.pa-time-picker__chevron--inert:hover {\n color: var(--pa-color-text-disabled, #5b6571);\n background: #ffffff;\n pointer-events: none;\n cursor: not-allowed;\n}\n\n.pa-time-picker__cell {\n display: inline-flex; align-items: center; justify-content: center;\n width: 56px; height: 40px; padding: 0;\n background: #ffffff;\n border: 0;\n border-radius: 4px;\n font: 400 16px/18px 'Roboto Mono', monospace;\n color: var(--pa-color-neutral-gray, #454d56);\n cursor: pointer;\n}\n.pa-time-picker__cell:focus-visible {\n outline: 2px solid var(--pa-color-primary-focus-border, #0065d1);\n outline-offset: -2px;\n}\n.pa-time-picker__cell:active {\n background: var(--pa-color-primary-pressed, #00173d);\n color: #ffffff;\n}\n</style>\n"],"names":["props","__props","model","_useModel","rootRef","ref","triggerRef","open","popoverId","useId","generatedId","triggerId","computed","messageId","pad2","n","toMinutes","t","isDisabledTime","m","firstAllowed","allTimesDisabled","displayHours","displayMinutes","displayValue","v","placeholderShown","chevronInert","errorActive","validActive","errorMessage","helperMessage","message","serialized","writeModel","hours","minutes","incHours","h","i","candidate","decHours","incMinutes","decMinutes","openPopover","closePopover","returnFocus","_a","togglePopover","jumpHoursBy","delta","sign","step","c","jumpMinutesBy","setHoursIfAllowed","targetHours","setMinutesIfAllowed","targetMinutes","commitOnEnter","onHoursKeydown","event","onMinutesKeydown","onDocumentMousedown","onWindowKeydown","watch","isOpen","onBeforeUnmount","_createElementBlock","_normalizeClass","_hoisted_2","_createElementVNode","_hoisted_4","_toDisplayString","_renderSlot","_ctx","_createVNode","PaIcon","_hoisted_6","_hoisted_7","_hoisted_10","_vShow","_hoisted_13"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,UAAMA,IAAQC,GA+BRC,IAAQC,GAAqCF,GAAA,YAAkB,GAE/DG,IAAUC,EAAwB,IAAI,GACtCC,IAAaD,EAA8B,IAAI,GAC/CE,IAAOF,EAAI,EAAK,GAChBG,IAAY,sBAAsBC,GAAA,CAAO,IACzCC,KAAc,kBAAkBD,GAAA,CAAO,IACvCE,IAAYC,EAAS,MAAMZ,EAAM,MAAMU,EAAW,GAClDG,IAAYD,EAAS,MAAM,GAAGD,EAAU,KAAK,MAAM;AAEzD,aAASG,EAAKC,GAAmB;AAC/B,aAAO,OAAOA,CAAC,EAAE,SAAS,GAAG,GAAG;AAAA,IAClC;AAEA,aAASC,EAAUC,GAA8B;AAC/C,aAAOA,EAAE,QAAQ,KAAKA,EAAE;AAAA,IAC1B;AAEA,aAASC,EAAeD,GAA+B;AACrD,YAAME,IAAIH,EAAUC,CAAC;AAErB,aADIjB,EAAM,OAAOmB,IAAIH,EAAUhB,EAAM,GAAG,KACpCA,EAAM,OAAOmB,IAAIH,EAAUhB,EAAM,GAAG,IAAU,KAC3CA,EAAM,gBAAgBA,EAAM,cAAciB,CAAC,MAAM,KAAO;AAAA,IACjE;AAIA,UAAMG,IAAeR,EAAmC,MAAM;AAC5D,eAASO,IAAI,GAAGA,IAAI,KAAK,IAAIA,KAAK;AAChC,cAAMF,IAAI,EAAE,OAAO,KAAK,MAAME,IAAI,EAAE,GAAG,SAASA,IAAI,GAAA;AACpD,YAAI,CAACD,EAAeD,CAAC,EAAG,QAAOA;AAAA,MACjC;AACA,aAAO;AAAA,IACT,CAAC,GAEKI,IAAmBT,EAAS,MAAMQ,EAAa,UAAU,IAAI,GAI7DE,IAAeV,EAAS,MACxBV,EAAM,QAAcA,EAAM,MAAM,QAChCmB,EAAiB,QAAc,OAE9BH,EADQ,EAAE,OAAO,GAAG,SAAS,EAAA,CACV,IACjBE,EAAa,MAAO,QADO,CAEnC,GACKG,IAAiBX,EAAS,MAC1BV,EAAM,QAAcA,EAAM,MAAM,UAChCmB,EAAiB,QAAc,OAE9BH,EADQ,EAAE,OAAO,GAAG,SAAS,EAAA,CACV,IACjBE,EAAa,MAAO,UADO,CAEnC,GAEKI,KAAeZ,EAAS,MAAM;AAClC,YAAMa,IAAIvB,EAAM;AAChB,aAAKuB,IACE,GAAGX,EAAKW,EAAE,KAAK,CAAC,IAAIX,EAAKW,EAAE,OAAO,CAAC,KAD3BzB,EAAM;AAAA,IAEvB,CAAC,GAEK0B,KAAmBd,EAAS,MAAM,CAACV,EAAM,KAAK,GAI9CyB,IAAef,EAAS,MAAMS,EAAiB,KAAK,GAEpDO,IAAchB,EAAS,MAAM,EAAQZ,EAAM,KAAM,GACjD6B,IAAcjB,EAAS,MAAMZ,EAAM,SAAS,CAAC4B,EAAY,KAAK,GAC9DE,KAAelB;AAAA,MAAS,MAC5B,OAAOZ,EAAM,SAAU,YAAYA,EAAM,MAAM,SAAS,IAAIA,EAAM,QAAQ;AAAA,IAAA,GAEtE+B,KAAgBnB;AAAA,MAAS,MAC7B,CAACgB,EAAY,SAAS5B,EAAM,aAAaA,EAAM,aAAa;AAAA,IAAA,GAExDgC,IAAUpB,EAAS,MAAMkB,GAAa,SAASC,GAAc,KAAK,GAGlEE,KAAarB,EAAS,MAAM;AAChC,YAAMa,IAAIvB,EAAM;AAChB,aAAKuB,IACE,GAAGX,EAAKW,EAAE,KAAK,CAAC,IAAIX,EAAKW,EAAE,OAAO,CAAC,KAD3B;AAAA,IAEjB,CAAC;AAED,aAASS,EAAWC,GAAeC,GAAiB;AAClD,MAAIpC,EAAM,aACVE,EAAM,QAAQ,EAAE,OAAAiC,GAAO,SAAAC,EAAA;AAAA,IACzB;AAKA,aAASC,IAAW;AAClB,UAAIrC,EAAM,SAAU;AACpB,YAAMsC,IAAIhB,EAAa,OACjBH,IAAII,EAAe;AACzB,UAAI,EAAAe,MAAM,QAAQnB,MAAM;AACxB,iBAASoB,IAAI,GAAGA,KAAK,IAAIA,KAAK;AAC5B,gBAAMC,IAAY,EAAE,QAAQF,IAAIC,KAAK,IAAI,SAASpB,EAAA;AAClD,cAAI,CAACD,EAAesB,CAAS,GAAG;AAC9B,YAAAN,EAAWM,EAAU,OAAOA,EAAU,OAAO;AAC7C;AAAA,UACF;AAAA,QACF;AAAA,IACF;AACA,aAASC,IAAW;AAClB,UAAIzC,EAAM,SAAU;AACpB,YAAMsC,IAAIhB,EAAa,OACjBH,IAAII,EAAe;AACzB,UAAI,EAAAe,MAAM,QAAQnB,MAAM;AACxB,iBAASoB,IAAI,GAAGA,KAAK,IAAIA,KAAK;AAC5B,gBAAMC,IAAY,EAAE,QAAQF,IAAI,KAAKC,KAAK,IAAI,SAASpB,EAAA;AACvD,cAAI,CAACD,EAAesB,CAAS,GAAG;AAC9B,YAAAN,EAAWM,EAAU,OAAOA,EAAU,OAAO;AAC7C;AAAA,UACF;AAAA,QACF;AAAA,IACF;AACA,aAASE,IAAa;AACpB,UAAI1C,EAAM,SAAU;AACpB,YAAMsC,IAAIhB,EAAa,OACjBH,IAAII,EAAe;AACzB,UAAI,EAAAe,MAAM,QAAQnB,MAAM;AACxB,iBAASoB,IAAI,GAAGA,KAAK,IAAIA,KAAK;AAC5B,gBAAMC,IAAY,EAAE,OAAOF,GAAG,UAAUnB,IAAIoB,KAAK,GAAA;AACjD,cAAI,CAACrB,EAAesB,CAAS,GAAG;AAC9B,YAAAN,EAAWM,EAAU,OAAOA,EAAU,OAAO;AAC7C;AAAA,UACF;AAAA,QACF;AAAA,IACF;AACA,aAASG,IAAa;AACpB,UAAI3C,EAAM,SAAU;AACpB,YAAMsC,IAAIhB,EAAa,OACjBH,IAAII,EAAe;AACzB,UAAI,EAAAe,MAAM,QAAQnB,MAAM;AACxB,iBAASoB,IAAI,GAAGA,KAAK,IAAIA,KAAK;AAC5B,gBAAMC,IAAY,EAAE,OAAOF,GAAG,UAAUnB,IAAI,KAAKoB,KAAK,GAAA;AACtD,cAAI,CAACrB,EAAesB,CAAS,GAAG;AAC9B,YAAAN,EAAWM,EAAU,OAAOA,EAAU,OAAO;AAC7C;AAAA,UACF;AAAA,QACF;AAAA,IACF;AAEA,aAASI,IAAc;AACrB,MAAIrC,EAAK,SAASP,EAAM,YAAYA,EAAM,aAC1CO,EAAK,QAAQ;AAAA,IACf;AAEA,aAASsC,EAAaC,IAAc,IAAM;;AACxC,MAAKvC,EAAK,UACVA,EAAK,QAAQ,IACTuC,OAAaC,IAAAzC,EAAW,UAAX,QAAAyC,EAAkB;AAAA,IACrC;AAEA,aAASC,IAAgB;AACvB,MAAIhD,EAAM,YAAYA,EAAM,aAC5BO,EAAK,QAAQsC,EAAA,IAAiBD,EAAA;AAAA,IAChC;AAEA,aAASK,EAAYC,GAAe;AAClC,YAAMZ,IAAIhB,EAAa,OACjBH,IAAII,EAAe;AACzB,UAAIe,MAAM,QAAQnB,MAAM,KAAM;AAC9B,YAAMgC,IAAOD,KAAS,IAAI,IAAI,IACxBE,IAAO,KAAK,IAAIF,CAAK,GACrBV,IAAY,EAAE,SAASF,IAAIY,KAAS,KAAK,MAAM,IAAI,SAAS/B,EAAA;AAClE,UAAI,CAACD,EAAesB,CAAS,GAAG;AAC9B,QAAAN,EAAWM,EAAU,OAAOA,EAAU,OAAO;AAC7C;AAAA,MACF;AAEA,eAASD,IAAI,GAAGA,KAAK,IAAIA,KAAK;AAC5B,cAAMc,IAAI,EAAE,SAASf,IAAIc,IAAOD,IAAOA,IAAOZ,KAAK,KAAK,MAAM,IAAI,SAASpB,EAAA;AAC3E,YAAI,CAACD,EAAemC,CAAC,GAAG;AACtB,UAAAnB,EAAWmB,EAAE,OAAOA,EAAE,OAAO;AAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,aAASC,EAAcJ,GAAe;AACpC,YAAMZ,IAAIhB,EAAa,OACjBH,IAAII,EAAe;AACzB,UAAIe,MAAM,QAAQnB,MAAM,KAAM;AAC9B,YAAMgC,IAAOD,KAAS,IAAI,IAAI,IACxBE,IAAO,KAAK,IAAIF,CAAK,GACrBV,IAAY,EAAE,OAAOF,GAAG,WAAWnB,IAAI+B,KAAS,KAAK,MAAM,GAAA;AACjE,UAAI,CAAChC,EAAesB,CAAS,GAAG;AAC9B,QAAAN,EAAWM,EAAU,OAAOA,EAAU,OAAO;AAC7C;AAAA,MACF;AACA,eAASD,IAAI,GAAGA,KAAK,IAAIA,KAAK;AAC5B,cAAMc,IAAI,EAAE,OAAOf,GAAG,WAAWnB,IAAIiC,IAAOD,IAAOA,IAAOZ,KAAK,KAAK,MAAM,GAAA;AAC1E,YAAI,CAACrB,EAAemC,CAAC,GAAG;AACtB,UAAAnB,EAAWmB,EAAE,OAAOA,EAAE,OAAO;AAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,aAASE,EAAkBC,GAAqB;AAC9C,YAAMrC,IAAII,EAAe;AACzB,UAAIJ,MAAM,MACV;AAAA,YAAI,CAACD,EAAe,EAAE,OAAOsC,GAAa,SAASrC,EAAA,CAAG,GAAG;AACvD,UAAAe,EAAWsB,GAAarC,CAAC;AACzB;AAAA,QACF;AAEA,iBAASoB,IAAI,GAAGA,KAAK,IAAIA;AACvB,qBAAWY,KAAQ,CAAC,GAAG,EAAE,GAAY;AACnC,kBAAME,IAAI,EAAE,SAASG,IAAcL,IAAOZ,KAAK,KAAK,MAAM,IAAI,SAASpB,EAAA;AACvE,gBAAI,CAACD,EAAemC,CAAC,GAAG;AACtB,cAAAnB,EAAWmB,EAAE,OAAOA,EAAE,OAAO;AAC7B;AAAA,YACF;AAAA,UACF;AAAA;AAAA,IAEJ;AAEA,aAASI,EAAoBC,GAAuB;AAClD,YAAMpB,IAAIhB,EAAa;AACvB,UAAIgB,MAAM,MACV;AAAA,YAAI,CAACpB,EAAe,EAAE,OAAOoB,GAAG,SAASoB,EAAA,CAAe,GAAG;AACzD,UAAAxB,EAAWI,GAAGoB,CAAa;AAC3B;AAAA,QACF;AACA,iBAASnB,IAAI,GAAGA,KAAK,IAAIA;AACvB,qBAAWY,KAAQ,CAAC,GAAG,EAAE,GAAY;AACnC,kBAAME,IAAI,EAAE,OAAOf,GAAG,WAAWoB,IAAgBP,IAAOZ,KAAK,KAAK,MAAM,GAAA;AACxE,gBAAI,CAACrB,EAAemC,CAAC,GAAG;AACtB,cAAAnB,EAAWmB,EAAE,OAAOA,EAAE,OAAO;AAC7B;AAAA,YACF;AAAA,UACF;AAAA;AAAA,IAEJ;AAEA,aAASM,KAAgB;AAGvB,YAAMrB,IAAIhB,EAAa,OACjBH,IAAII,EAAe;AACzB,MAAIe,MAAM,QAAQnB,MAAM,QACpBD,EAAe,EAAE,OAAOoB,GAAG,SAASnB,EAAA,CAAG,MACtCjB,EAAM,SAAOgC,EAAWI,GAAGnB,CAAC,GAC7BnB,EAAM,YAAY,aAAW6C,EAAA;AAAA,IACnC;AAEA,aAASe,GAAeC,GAAsB;AAC5C,UAAI,CAAA7D,EAAM;AACV,gBAAQ6D,EAAM,KAAA;AAAA,UACZ,KAAK;AACH,YAAAA,EAAM,eAAA,GACNxB,EAAA;AACA;AAAA,UACF,KAAK;AACH,YAAAwB,EAAM,eAAA,GACNpB,EAAA;AACA;AAAA,UACF,KAAK;AACH,YAAAoB,EAAM,eAAA,GACNZ,EAAY,EAAE;AACd;AAAA,UACF,KAAK;AACH,YAAAY,EAAM,eAAA,GACNZ,EAAY,GAAG;AACf;AAAA,UACF,KAAK;AACH,YAAAY,EAAM,eAAA,GACNN,EAAkB,CAAC;AACnB;AAAA,UACF,KAAK;AACH,YAAAM,EAAM,eAAA,GACNN,EAAkB,EAAE;AACpB;AAAA,UACF,KAAK;AACH,YAAAM,EAAM,eAAA,GACNF,GAAA;AACA;AAAA,QAAA;AAAA,IAEN;AAEA,aAASG,GAAiBD,GAAsB;AAC9C,UAAI,CAAA7D,EAAM;AACV,gBAAQ6D,EAAM,KAAA;AAAA,UACZ,KAAK;AACH,YAAAA,EAAM,eAAA,GACNnB,EAAA;AACA;AAAA,UACF,KAAK;AACH,YAAAmB,EAAM,eAAA,GACNlB,EAAA;AACA;AAAA,UACF,KAAK;AACH,YAAAkB,EAAM,eAAA,GACNP,EAAc,EAAE;AAChB;AAAA,UACF,KAAK;AACH,YAAAO,EAAM,eAAA,GACNP,EAAc,GAAG;AACjB;AAAA,UACF,KAAK;AACH,YAAAO,EAAM,eAAA,GACNJ,EAAoB,CAAC;AACrB;AAAA,UACF,KAAK;AACH,YAAAI,EAAM,eAAA,GACNJ,EAAoB,EAAE;AACtB;AAAA,UACF,KAAK;AACH,YAAAI,EAAM,eAAA,GACNF,GAAA;AACA;AAAA,QAAA;AAAA,IAEN;AAEA,aAASI,EAAoBF,GAAmB;AAC9C,MAAKzD,EAAQ,UACRA,EAAQ,MAAM,SAASyD,EAAM,MAAc,OAAgB,EAAK;AAAA,IACvE;AAEA,aAASG,EAAgBH,GAAsB;AAC7C,MAAIA,EAAM,QAAQ,aAChBA,EAAM,eAAA,GACNhB,EAAA;AAAA,IAEJ;AAEA,WAAAoB,GAAM1D,GAAM,CAAC2D,MAAW;AACtB,MAAIA,KACF,SAAS,iBAAiB,aAAaH,CAAmB,GAC1D,OAAO,iBAAiB,WAAWC,CAAe,MAElD,SAAS,oBAAoB,aAAaD,CAAmB,GAC7D,OAAO,oBAAoB,WAAWC,CAAe;AAAA,IAEzD,CAAC,GAEDG,GAAgB,MAAM;AACpB,eAAS,oBAAoB,aAAaJ,CAAmB,GAC7D,OAAO,oBAAoB,WAAWC,CAAe;AAAA,IACvD,CAAC,mBAICI,EA8IM,OAAA;AAAA,eA7IA;AAAA,MAAJ,KAAIhE;AAAA,MACH,OAAKiE,EAAA;AAAA;2BAAqDpE,EAAA,OAAO;AAAA;kCAA4CM,EAAA;AAAA,sCAA0CN,EAAA;AAAA,sCAA8CA,EAAA;AAAA,mCAA2C2B,EAAA;AAAA,mCAA8CC,EAAA;AAAA,QAAA;AAAA;;MAYlR5B,EAAA,cAAbmE,EAEQ,SAAA;AAAA;QAFa,KAAKzD,EAAA;AAAA,QAAW,OAAM;AAAA,MAAA;aACtCV,EAAA,KAAK,GAAA,CAAA;AAAA,QAAeA,EAAA,iBAAZmE,EAAkF,QAAlFE,IAA0E,GAAC;;MAIhFrE,EAAA,YAAO,kBADfmE,EAgCS,UAAA;AAAA;QA9BN,IAAIzD,EAAA;AAAA,iBACD;AAAA,QAAJ,KAAIL;AAAA,QACJ,MAAK;AAAA,QACJ,OAAK+D,EAAA;AAAA;;oDAAmG3C,GAAA;AAAA,iDAAiEzB,EAAA;AAAA,YAAyD,qCAAAA,EAAA,aAAaA,EAAA;AAAA,YAAsD,kCAAA2B,EAAA,UAAgB3B,EAAA;AAAA,YAAsD,kCAAA4B,EAAA,UAAgB5B,EAAA;AAAA,UAAA;AAAA;QAU3X,UAAUA,EAAA;AAAA,QACV,iBAAeM,EAAA;AAAA,QAChB,iBAAc;AAAA,QACb,iBAAeC;AAAA,QACf,iBAAeP,EAAA,YAAY;AAAA,QAC3B,gBAAc2B,EAAA,SAAe;AAAA,QAC7B,iBAAe3B,EAAA,YAAY;AAAA,QAC3B,oBAAkB+B,EAAA,QAAUnB,EAAA,QAAY;AAAA,QACxC,SAAOmC;AAAA,QACP,WAAO;AAAA,cAAgBA,GAAa,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,cACbA,GAAa,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,cACdJ,GAAW,CAAA,SAAA,CAAA,GAAA,CAAA,MAAA,CAAA;AAAA,QAAA;AAAA;QAElC2B,EAA6D,QAA7DC,IAA6DC,EAAtBjD,GAAA,KAAY,GAAA,CAAA;AAAA,QACnDkD,GAEOC,wBAFP,MAEO;AAAA,UADLC,EAAiCC,GAAA;AAAA,YAAzB,MAAK;AAAA,YAAQ,MAAK;AAAA,UAAA;;;MAKtB5E,EAAA,aADRmE,EAQE,SAAA;AAAA;QANA,MAAK;AAAA,QACJ,MAAMnE,EAAA;AAAA,QACN,OAAOgC,GAAA;AAAA,QACP,UAAUhC,EAAA;AAAA,QACV,UAAUA,EAAA;AAAA,QACV,UAAUA,EAAA;AAAA,MAAA;SAGbsE,EAuEM,OAAA;AAAA,QArEH,IAAI/D;AAAA,QACJ,OAAK6D,EAAA;AAAA;+CAAoFpE,EAAA,YAAO,SAAA;AAAA,QAAA;QAIjG,MAAK;AAAA,QACL,cAAW;AAAA,MAAA;QAEXsE,EA4DM,OA5DNO,IA4DM;AAAA,UA3DJP,EA2BM,OA3BNQ,IA2BM;AAAA,YA1BJR,EAQS,UAAA;AAAA,cAPP,MAAK;AAAA,cACJ,yEAAuE5C,EAAA,MAAA,CAAY,CAAA;AAAA,cACnF,iBAAeA,EAAA,SAAgB;AAAA,cAChC,cAAW;AAAA,cACV,SAAOU;AAAA,YAAA;cAERuC,EAAoCC,GAAA;AAAA,gBAA5B,MAAK;AAAA,gBAAW,MAAK;AAAA,cAAA;;YAE/BN,EAOS,UAAA;AAAA,cANP,MAAK;AAAA,cACL,OAAM;AAAA,cACN,cAAW;AAAA,cACV,WAASX;AAAA,YAAA,KAEPtC,EAAA,UAAY,OAAA,OAAmBR,EAAKQ,EAAA,KAAY,CAAA,GAAA,EAAA;AAAA,YAErDiD,EAQS,UAAA;AAAA,cAPP,MAAK;AAAA,cACJ,yEAAuE5C,EAAA,MAAA,CAAY,CAAA;AAAA,cACnF,iBAAeA,EAAA,SAAgB;AAAA,cAChC,cAAW;AAAA,cACV,SAAOc;AAAA,YAAA;cAERmC,EAAsCC,GAAA;AAAA,gBAA9B,MAAK;AAAA,gBAAa,MAAK;AAAA,cAAA;;;0BAInCN,EAAmE,QAAA;AAAA,YAA7D,OAAM;AAAA,YAA4B,eAAY;AAAA,UAAA,GAAO,KAAC,EAAA;AAAA,UAE5DA,EA2BM,OA3BNS,IA2BM;AAAA,YA1BJT,EAQS,UAAA;AAAA,cAPP,MAAK;AAAA,cACJ,yEAAuE5C,EAAA,MAAA,CAAY,CAAA;AAAA,cACnF,iBAAeA,EAAA,SAAgB;AAAA,cAChC,cAAW;AAAA,cACV,SAAOe;AAAA,YAAA;cAERkC,EAAoCC,GAAA;AAAA,gBAA5B,MAAK;AAAA,gBAAW,MAAK;AAAA,cAAA;;YAE/BN,EAOS,UAAA;AAAA,cANP,MAAK;AAAA,cACL,OAAM;AAAA,cACN,cAAW;AAAA,cACV,WAAST;AAAA,YAAA,KAEPvC,EAAA,UAAc,OAAA,OAAmBT,EAAKS,EAAA,KAAc,CAAA,GAAA,EAAA;AAAA,YAEzDgD,EAQS,UAAA;AAAA,cAPP,MAAK;AAAA,cACJ,yEAAuE5C,EAAA,MAAA,CAAY,CAAA;AAAA,cACnF,iBAAeA,EAAA,SAAgB;AAAA,cAChC,cAAW;AAAA,cACV,SAAOgB;AAAA,YAAA;cAERiC,EAAsCC,GAAA;AAAA,gBAA9B,MAAK;AAAA,gBAAa,MAAK;AAAA,cAAA;;;;;QAlE7B,CAAAI,IAAAhF,EAAA,wBAAwBM,EAAA,KAAI;AAAA,MAAA;MAyE9ByB,EAAA,cADRoC,EAMM,OAAA;AAAA;QAJH,IAAIvD,EAAA;AAAA,QACJ,yEAAuEe,EAAA,OAAW,CAAA;AAAA,MAAA,KAEhFI,EAAA,KAAO,GAAA,IAAAkD,EAAA;;;;"}
|
|
@@ -12,22 +12,25 @@ export interface PaTitleBarProps {
|
|
|
12
12
|
menuItems?: PaTitleBarMenuItem[];
|
|
13
13
|
menuLabel?: string;
|
|
14
14
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
type __VLS_Props = PaTitleBarProps;
|
|
16
|
+
type __VLS_PublicProps = __VLS_Props & {
|
|
17
|
+
'menuOpen'?: boolean;
|
|
18
|
+
};
|
|
19
|
+
declare var __VLS_5: {};
|
|
20
|
+
type __VLS_Slots = {} & {
|
|
21
|
+
actions?: (props: typeof __VLS_5) => any;
|
|
22
|
+
};
|
|
23
|
+
declare const __VLS_component: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
18
24
|
"update:menuOpen": (value: boolean) => any;
|
|
19
|
-
}, string, import("vue").PublicProps, Readonly<
|
|
20
|
-
menuOpen?: boolean;
|
|
21
|
-
}> & Readonly<{
|
|
25
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
22
26
|
"onUpdate:menuOpen"?: ((value: boolean) => any) | undefined;
|
|
23
27
|
}>, {
|
|
24
28
|
variant: PaTitleBarVariant;
|
|
25
29
|
titleLevel: 1 | 2 | 3 | 4 | 5 | 6;
|
|
26
30
|
menuItems: PaTitleBarMenuItem[];
|
|
27
31
|
menuLabel: string;
|
|
28
|
-
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any
|
|
29
|
-
|
|
30
|
-
}>;
|
|
32
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
33
|
+
declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
|
|
31
34
|
export default _default;
|
|
32
35
|
type __VLS_WithSlots<T, S> = T & {
|
|
33
36
|
new (): {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import o from "./PaTitleBar.vue2.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import t from "../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const
|
|
4
|
+
const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-0a20b354"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
p as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=PaTitleBar.vue.js.map
|
|
@@ -1,19 +1,14 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import
|
|
3
|
-
const
|
|
1
|
+
import { defineComponent as x, useModel as A, computed as h, useId as z, ref as _, watch as H, onBeforeUnmount as S, openBlock as s, createElementBlock as u, normalizeClass as w, createElementVNode as y, createBlock as U, resolveDynamicComponent as F, withCtx as P, createTextVNode as j, toDisplayString as g, createCommentVNode as b, renderSlot as q, withKeys as i, withModifiers as c, createVNode as G, Fragment as J, renderList as Q, mergeModels as W, nextTick as B } from "vue";
|
|
2
|
+
import X from "../PaIcon/PaIcon.vue.js";
|
|
3
|
+
const Y = { class: "pa-title-bar__title-block" }, Z = {
|
|
4
4
|
key: 0,
|
|
5
5
|
class: "pa-title-bar__subtitle"
|
|
6
|
-
},
|
|
6
|
+
}, ee = {
|
|
7
7
|
key: 0,
|
|
8
8
|
class: "pa-title-bar__actions"
|
|
9
|
-
},
|
|
10
|
-
let ne = 0;
|
|
11
|
-
function ae() {
|
|
12
|
-
return ++ne;
|
|
13
|
-
}
|
|
14
|
-
const re = /* @__PURE__ */ V({
|
|
9
|
+
}, te = ["aria-label", "aria-expanded", "onKeydown"], ne = ["disabled", "onClick", "onKeydown"], oe = /* @__PURE__ */ x({
|
|
15
10
|
__name: "PaTitleBar",
|
|
16
|
-
props: /* @__PURE__ */
|
|
11
|
+
props: /* @__PURE__ */ W({
|
|
17
12
|
title: {},
|
|
18
13
|
titleLevel: { default: 3 },
|
|
19
14
|
subtitle: {},
|
|
@@ -26,21 +21,21 @@ const re = /* @__PURE__ */ V({
|
|
|
26
21
|
}),
|
|
27
22
|
emits: ["update:menuOpen"],
|
|
28
23
|
setup(r) {
|
|
29
|
-
const d = r, l = A(r, "menuOpen"), E = h(() => `h${d.titleLevel}`), I = `pa-title-bar-${
|
|
24
|
+
const d = r, l = A(r, "menuOpen"), E = h(() => `h${d.titleLevel}`), I = `pa-title-bar-${z()}`, M = `${I}__kebab`, D = `${I}__menu`, p = _(null), C = _(null), v = _([]);
|
|
30
25
|
function K(e, n) {
|
|
31
26
|
e instanceof HTMLButtonElement && (v.value[n] = e);
|
|
32
27
|
}
|
|
33
28
|
function O() {
|
|
34
|
-
|
|
29
|
+
B(() => {
|
|
35
30
|
var e;
|
|
36
|
-
return (e =
|
|
31
|
+
return (e = C.value) == null ? void 0 : e.focus();
|
|
37
32
|
});
|
|
38
33
|
}
|
|
39
|
-
function
|
|
34
|
+
function $() {
|
|
40
35
|
l.value = !1, O();
|
|
41
36
|
}
|
|
42
37
|
function R() {
|
|
43
|
-
l.value ? l.value = !1 : (l.value = !0,
|
|
38
|
+
l.value ? l.value = !1 : (l.value = !0, B(() => {
|
|
44
39
|
var n;
|
|
45
40
|
const e = d.menuItems.findIndex((t) => !t.disabled);
|
|
46
41
|
e >= 0 && ((n = v.value[e]) == null || n.focus());
|
|
@@ -50,7 +45,7 @@ const re = /* @__PURE__ */ V({
|
|
|
50
45
|
var n;
|
|
51
46
|
e.disabled || ((n = e.onClick) == null || n.call(e), l.value = !1);
|
|
52
47
|
}
|
|
53
|
-
function
|
|
48
|
+
function N() {
|
|
54
49
|
return d.menuItems.map((e, n) => e.disabled ? -1 : n).filter((e) => e >= 0);
|
|
55
50
|
}
|
|
56
51
|
function f(e) {
|
|
@@ -58,7 +53,7 @@ const re = /* @__PURE__ */ V({
|
|
|
58
53
|
e !== void 0 && ((n = v.value[e]) == null || n.focus());
|
|
59
54
|
}
|
|
60
55
|
function m(e, n) {
|
|
61
|
-
const t =
|
|
56
|
+
const t = N();
|
|
62
57
|
if (t.length === 0) return;
|
|
63
58
|
const o = t.indexOf(n);
|
|
64
59
|
switch (e.key) {
|
|
@@ -89,16 +84,16 @@ const re = /* @__PURE__ */ V({
|
|
|
89
84
|
const n = e.target;
|
|
90
85
|
n && p.value && !p.value.contains(n) && (l.value = !1);
|
|
91
86
|
}
|
|
92
|
-
|
|
87
|
+
H(
|
|
93
88
|
l,
|
|
94
89
|
(e) => {
|
|
95
|
-
e ? document.addEventListener("mousedown", k) : document.removeEventListener("mousedown", k);
|
|
90
|
+
typeof document > "u" || (e ? document.addEventListener("mousedown", k) : document.removeEventListener("mousedown", k));
|
|
96
91
|
},
|
|
97
92
|
{ immediate: !0 }
|
|
98
|
-
),
|
|
93
|
+
), S(() => {
|
|
99
94
|
document.removeEventListener("mousedown", k);
|
|
100
95
|
});
|
|
101
|
-
const
|
|
96
|
+
const L = h(() => d.menuItems.length > 0), V = h(() => l.value && L.value);
|
|
102
97
|
return (e, n) => (s(), u("div", {
|
|
103
98
|
ref_key: "wrapperRef",
|
|
104
99
|
ref: p,
|
|
@@ -107,23 +102,23 @@ const re = /* @__PURE__ */ V({
|
|
|
107
102
|
y("header", {
|
|
108
103
|
class: w(["pa-title-bar", `pa-title-bar--${r.variant}`])
|
|
109
104
|
}, [
|
|
110
|
-
y("div",
|
|
111
|
-
(s(),
|
|
112
|
-
default:
|
|
113
|
-
|
|
105
|
+
y("div", Y, [
|
|
106
|
+
(s(), U(F(E.value), { class: "pa-title-bar__title" }, {
|
|
107
|
+
default: P(() => [
|
|
108
|
+
j(g(r.title), 1)
|
|
114
109
|
]),
|
|
115
110
|
_: 1
|
|
116
111
|
})),
|
|
117
|
-
r.subtitle ? (s(), u("p",
|
|
112
|
+
r.subtitle ? (s(), u("p", Z, g(r.subtitle), 1)) : b("", !0)
|
|
118
113
|
]),
|
|
119
|
-
e.$slots.actions ? (s(), u("div",
|
|
120
|
-
|
|
114
|
+
e.$slots.actions ? (s(), u("div", ee, [
|
|
115
|
+
q(e.$slots, "actions", {}, void 0, !0)
|
|
121
116
|
])) : b("", !0),
|
|
122
|
-
|
|
117
|
+
L.value ? (s(), u("button", {
|
|
123
118
|
key: 1,
|
|
124
119
|
id: M,
|
|
125
120
|
ref_key: "kebabRef",
|
|
126
|
-
ref:
|
|
121
|
+
ref: C,
|
|
127
122
|
type: "button",
|
|
128
123
|
class: w(["pa-title-bar__kebab", { "pa-title-bar__kebab--open": l.value }]),
|
|
129
124
|
"aria-label": r.menuLabel,
|
|
@@ -131,22 +126,22 @@ const re = /* @__PURE__ */ V({
|
|
|
131
126
|
"aria-expanded": l.value,
|
|
132
127
|
"aria-controls": D,
|
|
133
128
|
onClick: R,
|
|
134
|
-
onKeydown: i(c(
|
|
129
|
+
onKeydown: i(c($, ["prevent"]), ["esc"])
|
|
135
130
|
}, [
|
|
136
|
-
|
|
131
|
+
G(X, {
|
|
137
132
|
name: "dots-three-vertical",
|
|
138
133
|
size: "sm"
|
|
139
134
|
})
|
|
140
|
-
], 42,
|
|
135
|
+
], 42, te)) : b("", !0)
|
|
141
136
|
], 2),
|
|
142
|
-
|
|
137
|
+
V.value ? (s(), u("ul", {
|
|
143
138
|
key: 0,
|
|
144
139
|
id: D,
|
|
145
140
|
class: "pa-title-bar__menu",
|
|
146
141
|
role: "menu",
|
|
147
142
|
"aria-labelledby": M
|
|
148
143
|
}, [
|
|
149
|
-
(s(!0), u(
|
|
144
|
+
(s(!0), u(J, null, Q(r.menuItems, (t, o) => (s(), u("li", {
|
|
150
145
|
key: o,
|
|
151
146
|
class: "pa-title-bar__menu-item",
|
|
152
147
|
role: "none"
|
|
@@ -160,19 +155,19 @@ const re = /* @__PURE__ */ V({
|
|
|
160
155
|
disabled: t.disabled,
|
|
161
156
|
onClick: (a) => T(t),
|
|
162
157
|
onKeydown: [
|
|
163
|
-
i(c(
|
|
158
|
+
i(c($, ["prevent"]), ["esc"]),
|
|
164
159
|
i(c((a) => m(a, o), ["prevent"]), ["down"]),
|
|
165
160
|
i(c((a) => m(a, o), ["prevent"]), ["up"]),
|
|
166
161
|
i(c((a) => m(a, o), ["prevent"]), ["home"]),
|
|
167
162
|
i(c((a) => m(a, o), ["prevent"]), ["end"])
|
|
168
163
|
]
|
|
169
|
-
}, g(t.label), 41,
|
|
164
|
+
}, g(t.label), 41, ne)
|
|
170
165
|
]))), 128))
|
|
171
166
|
])) : b("", !0)
|
|
172
167
|
], 2));
|
|
173
168
|
}
|
|
174
169
|
});
|
|
175
170
|
export {
|
|
176
|
-
|
|
171
|
+
oe as default
|
|
177
172
|
};
|
|
178
173
|
//# sourceMappingURL=PaTitleBar.vue2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaTitleBar.vue2.js","sources":["../../../src/components/PaTitleBar/PaTitleBar.vue"],"sourcesContent":["<script lang=\"ts\">\nlet titleBarUid = 0\nfunction nextTitleBarId() {\n return ++titleBarUid\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue'\nimport PaIcon from '../PaIcon/PaIcon.vue'\n\nexport type PaTitleBarVariant = 'dark' | 'light'\n\nexport interface PaTitleBarMenuItem {\n label: string\n onClick?: () => void\n disabled?: boolean\n}\n\nexport interface PaTitleBarProps {\n title: string\n titleLevel?: 1 | 2 | 3 | 4 | 5 | 6\n subtitle?: string\n variant?: PaTitleBarVariant\n menuItems?: PaTitleBarMenuItem[]\n menuLabel?: string\n}\n\nconst props = withDefaults(defineProps<PaTitleBarProps>(), {\n titleLevel: 3,\n variant: 'dark',\n menuItems: () => [],\n menuLabel: 'Apri menu',\n})\n\nconst menuOpen = defineModel<boolean>('menuOpen', { default: false })\n\nconst titleTag = computed(() => `h${props.titleLevel}` as const)\n\nconst baseId = `pa-title-bar-${nextTitleBarId()}`\nconst kebabId = `${baseId}__kebab`\nconst menuId = `${baseId}__menu`\n\nconst wrapperRef = ref<HTMLDivElement | null>(null)\nconst kebabRef = ref<HTMLButtonElement | null>(null)\nconst menuItemRefs = ref<HTMLButtonElement[]>([])\n\nfunction setMenuItemRef(el: unknown, index: number) {\n if (el instanceof HTMLButtonElement) {\n menuItemRefs.value[index] = el\n }\n}\n\nfunction focusKebab() {\n nextTick(() => kebabRef.value?.focus())\n}\n\nfunction closeMenu() {\n menuOpen.value = false\n focusKebab()\n}\n\nfunction toggleMenu() {\n if (menuOpen.value) {\n menuOpen.value = false\n } else {\n menuOpen.value = true\n nextTick(() => {\n const firstEnabled = props.menuItems.findIndex((i) => !i.disabled)\n if (firstEnabled >= 0) {\n menuItemRefs.value[firstEnabled]?.focus()\n }\n })\n }\n}\n\nfunction onMenuItemClick(item: PaTitleBarMenuItem) {\n if (item.disabled) return\n item.onClick?.()\n menuOpen.value = false\n}\n\nfunction enabledIndices() {\n return props.menuItems\n .map((item, i) => (item.disabled ? -1 : i))\n .filter((i) => i >= 0)\n}\n\nfunction focusByIndex(index: number | undefined) {\n if (index === undefined) return\n menuItemRefs.value[index]?.focus()\n}\n\nfunction handleMenuKeyDown(event: KeyboardEvent, currentIndex: number) {\n const enabled = enabledIndices()\n if (enabled.length === 0) return\n const pos = enabled.indexOf(currentIndex)\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault()\n const next = pos < 0 ? enabled[0] : enabled[(pos + 1) % enabled.length]\n focusByIndex(next)\n break\n }\n case 'ArrowUp': {\n event.preventDefault()\n const prev =\n pos < 0\n ? enabled[enabled.length - 1]\n : enabled[(pos - 1 + enabled.length) % enabled.length]\n focusByIndex(prev)\n break\n }\n case 'Home': {\n event.preventDefault()\n focusByIndex(enabled[0])\n break\n }\n case 'End': {\n event.preventDefault()\n focusByIndex(enabled[enabled.length - 1])\n break\n }\n }\n}\n\nfunction handleDocumentMouseDown(event: MouseEvent) {\n if (!menuOpen.value) return\n const target = event.target as Node | null\n if (target && wrapperRef.value && !wrapperRef.value.contains(target)) {\n menuOpen.value = false\n }\n}\n\nwatch(\n menuOpen,\n (open) => {\n if (open) {\n document.addEventListener('mousedown', handleDocumentMouseDown)\n } else {\n document.removeEventListener('mousedown', handleDocumentMouseDown)\n }\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', handleDocumentMouseDown)\n})\n\nconst hasMenu = computed(() => props.menuItems.length > 0)\nconst showDropdown = computed(() => menuOpen.value && hasMenu.value)\n</script>\n\n<template>\n <div\n ref=\"wrapperRef\"\n class=\"pa-title-bar-wrapper\"\n :class=\"`pa-title-bar-wrapper--${variant}`\"\n >\n <header class=\"pa-title-bar\" :class=\"`pa-title-bar--${variant}`\">\n <div class=\"pa-title-bar__title-block\">\n <component :is=\"titleTag\" class=\"pa-title-bar__title\">{{ title }}</component>\n <p v-if=\"subtitle\" class=\"pa-title-bar__subtitle\">{{ subtitle }}</p>\n </div>\n\n <div v-if=\"$slots.actions\" class=\"pa-title-bar__actions\">\n <slot name=\"actions\" />\n </div>\n\n <button\n v-if=\"hasMenu\"\n :id=\"kebabId\"\n ref=\"kebabRef\"\n type=\"button\"\n class=\"pa-title-bar__kebab\"\n :class=\"{ 'pa-title-bar__kebab--open': menuOpen }\"\n :aria-label=\"menuLabel\"\n aria-haspopup=\"menu\"\n :aria-expanded=\"menuOpen\"\n :aria-controls=\"menuId\"\n @click=\"toggleMenu\"\n @keydown.esc.prevent=\"closeMenu\"\n >\n <PaIcon name=\"dots-three-vertical\" size=\"sm\" />\n </button>\n </header>\n\n <ul\n v-if=\"showDropdown\"\n :id=\"menuId\"\n class=\"pa-title-bar__menu\"\n role=\"menu\"\n :aria-labelledby=\"kebabId\"\n >\n <li\n v-for=\"(item, index) in menuItems\"\n :key=\"index\"\n class=\"pa-title-bar__menu-item\"\n role=\"none\"\n >\n <button\n :ref=\"(el) => setMenuItemRef(el, index)\"\n class=\"pa-title-bar__menu-item-btn\"\n type=\"button\"\n role=\"menuitem\"\n :disabled=\"item.disabled\"\n @click=\"onMenuItemClick(item)\"\n @keydown.esc.prevent=\"closeMenu\"\n @keydown.down.prevent=\"handleMenuKeyDown($event, index)\"\n @keydown.up.prevent=\"handleMenuKeyDown($event, index)\"\n @keydown.home.prevent=\"handleMenuKeyDown($event, index)\"\n @keydown.end.prevent=\"handleMenuKeyDown($event, index)\"\n >\n {{ item.label }}\n </button>\n </li>\n </ul>\n </div>\n</template>\n\n<style scoped>\n.pa-title-bar-wrapper {\n container-type: inline-size;\n}\n\n.pa-title-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 60px;\n padding: 8px 24px;\n border-radius: var(--pa-radius-smooth) var(--pa-radius-smooth) 0 0;\n}\n\n.pa-title-bar--dark {\n background-color: var(--pa-color-primary);\n --pa-title-bar-title-color: var(--pa-color-bg-white);\n --pa-title-bar-subtitle-color: var(--pa-color-bg-white);\n --pa-title-bar-action-color: var(--pa-color-bg-white);\n --pa-title-bar-kebab-color: var(--pa-color-bg-white);\n}\n\n.pa-title-bar--light {\n background-color: var(--pa-color-bg-primary-light-40);\n --pa-title-bar-title-color: #000;\n --pa-title-bar-subtitle-color: var(--pa-color-text-secondary-gray);\n --pa-title-bar-action-color: var(--pa-color-primary);\n --pa-title-bar-kebab-color: var(--pa-color-primary);\n}\n\n.pa-title-bar__title-block {\n flex: 1 0 0;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--pa-space-2xs);\n}\n\n.pa-title-bar__title {\n margin: 0;\n font-family: var(--pa-font-family-base);\n font-weight: 600;\n font-size: 20px;\n line-height: 24px;\n letter-spacing: -0.5px;\n color: var(--pa-title-bar-title-color);\n}\n\n.pa-title-bar__subtitle {\n margin: 0;\n font-family: var(--pa-font-family-base);\n font-weight: 400;\n font-size: 16px;\n line-height: 20px;\n color: var(--pa-title-bar-subtitle-color);\n}\n\n.pa-title-bar__actions {\n display: flex;\n align-items: center;\n gap: var(--pa-space-xs);\n}\n\n.pa-title-bar__kebab {\n display: none;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n padding: 0;\n border: 0;\n border-radius: var(--pa-radius-smooth);\n background: transparent;\n color: var(--pa-title-bar-kebab-color);\n cursor: pointer;\n}\n\n.pa-title-bar__kebab:focus-visible {\n outline: var(--pa-border-sm) solid var(--pa-color-primary-focus-border);\n outline-offset: 2px;\n}\n\n.pa-title-bar__kebab--open {\n background-color: var(--pa-color-primary-pressed);\n color: var(--pa-color-bg-white);\n}\n\n.pa-title-bar__menu {\n list-style: none;\n margin: 0;\n padding: 0;\n background-color: var(--pa-color-bg-white);\n}\n\n.pa-title-bar__menu-item {\n display: block;\n margin-bottom: -1px;\n}\n\n.pa-title-bar__menu-item:first-child .pa-title-bar__menu-item-btn {\n border-radius: var(--pa-radius-smooth) var(--pa-radius-smooth) 0 0;\n}\n\n.pa-title-bar__menu-item:last-child {\n margin-bottom: 0;\n}\n\n.pa-title-bar__menu-item:last-child .pa-title-bar__menu-item-btn {\n border-radius: 0 0 var(--pa-radius-smooth) var(--pa-radius-smooth);\n}\n\n.pa-title-bar__menu-item-btn {\n display: block;\n width: 100%;\n min-height: 56px;\n padding: 16px;\n border: var(--pa-border-xs) solid var(--pa-color-bg-secondary-light-50);\n background-color: var(--pa-color-bg-white);\n color: var(--pa-color-text-secondary-gray);\n font-family: var(--pa-font-family-base);\n font-weight: 400;\n font-size: 16px;\n line-height: 20px;\n text-align: left;\n cursor: pointer;\n}\n\n.pa-title-bar__menu-item-btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.pa-title-bar__menu-item-btn:focus-visible {\n outline: var(--pa-border-sm) solid var(--pa-color-primary-focus-border);\n outline-offset: -2px;\n}\n\n@container (max-width: 720px) {\n .pa-title-bar {\n padding: 8px 8px 8px 16px;\n }\n\n .pa-title-bar__subtitle {\n display: none;\n }\n\n .pa-title-bar__actions {\n display: none;\n }\n\n .pa-title-bar__kebab {\n display: inline-flex;\n }\n}\n</style>\n"],"names":["titleBarUid","nextTitleBarId","props","__props","menuOpen","_useModel","titleTag","computed","baseId","kebabId","menuId","wrapperRef","ref","kebabRef","menuItemRefs","setMenuItemRef","el","index","focusKebab","nextTick","_a","closeMenu","toggleMenu","firstEnabled","i","onMenuItemClick","item","enabledIndices","focusByIndex","handleMenuKeyDown","event","currentIndex","enabled","pos","next","prev","handleDocumentMouseDown","target","watch","open","onBeforeUnmount","hasMenu","showDropdown","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_openBlock","_createBlock","_resolveDynamicComponent","_hoisted_2","_toDisplayString","$slots","_hoisted_3","_renderSlot","_ctx","_createVNode","PaIcon","_Fragment","_renderList","$event","_hoisted_5"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PaTitleBar.vue2.js","sources":["../../../src/components/PaTitleBar/PaTitleBar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue'\nimport PaIcon from '../PaIcon/PaIcon.vue'\n\nexport type PaTitleBarVariant = 'dark' | 'light'\n\nexport interface PaTitleBarMenuItem {\n label: string\n onClick?: () => void\n disabled?: boolean\n}\n\nexport interface PaTitleBarProps {\n title: string\n titleLevel?: 1 | 2 | 3 | 4 | 5 | 6\n subtitle?: string\n variant?: PaTitleBarVariant\n menuItems?: PaTitleBarMenuItem[]\n menuLabel?: string\n}\n\nconst props = withDefaults(defineProps<PaTitleBarProps>(), {\n titleLevel: 3,\n variant: 'dark',\n menuItems: () => [],\n menuLabel: 'Apri menu',\n})\n\nconst menuOpen = defineModel<boolean>('menuOpen', { default: false })\n\nconst titleTag = computed(() => `h${props.titleLevel}` as const)\n\nconst baseId = `pa-title-bar-${useId()}`\nconst kebabId = `${baseId}__kebab`\nconst menuId = `${baseId}__menu`\n\nconst wrapperRef = ref<HTMLDivElement | null>(null)\nconst kebabRef = ref<HTMLButtonElement | null>(null)\nconst menuItemRefs = ref<HTMLButtonElement[]>([])\n\nfunction setMenuItemRef(el: unknown, index: number) {\n if (el instanceof HTMLButtonElement) {\n menuItemRefs.value[index] = el\n }\n}\n\nfunction focusKebab() {\n nextTick(() => kebabRef.value?.focus())\n}\n\nfunction closeMenu() {\n menuOpen.value = false\n focusKebab()\n}\n\nfunction toggleMenu() {\n if (menuOpen.value) {\n menuOpen.value = false\n } else {\n menuOpen.value = true\n nextTick(() => {\n const firstEnabled = props.menuItems.findIndex((i) => !i.disabled)\n if (firstEnabled >= 0) {\n menuItemRefs.value[firstEnabled]?.focus()\n }\n })\n }\n}\n\nfunction onMenuItemClick(item: PaTitleBarMenuItem) {\n if (item.disabled) return\n item.onClick?.()\n menuOpen.value = false\n}\n\nfunction enabledIndices() {\n return props.menuItems\n .map((item, i) => (item.disabled ? -1 : i))\n .filter((i) => i >= 0)\n}\n\nfunction focusByIndex(index: number | undefined) {\n if (index === undefined) return\n menuItemRefs.value[index]?.focus()\n}\n\nfunction handleMenuKeyDown(event: KeyboardEvent, currentIndex: number) {\n const enabled = enabledIndices()\n if (enabled.length === 0) return\n const pos = enabled.indexOf(currentIndex)\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault()\n const next = pos < 0 ? enabled[0] : enabled[(pos + 1) % enabled.length]\n focusByIndex(next)\n break\n }\n case 'ArrowUp': {\n event.preventDefault()\n const prev =\n pos < 0\n ? enabled[enabled.length - 1]\n : enabled[(pos - 1 + enabled.length) % enabled.length]\n focusByIndex(prev)\n break\n }\n case 'Home': {\n event.preventDefault()\n focusByIndex(enabled[0])\n break\n }\n case 'End': {\n event.preventDefault()\n focusByIndex(enabled[enabled.length - 1])\n break\n }\n }\n}\n\nfunction handleDocumentMouseDown(event: MouseEvent) {\n if (!menuOpen.value) return\n const target = event.target as Node | null\n if (target && wrapperRef.value && !wrapperRef.value.contains(target)) {\n menuOpen.value = false\n }\n}\n\nwatch(\n menuOpen,\n (open) => {\n if (typeof document === 'undefined') return\n if (open) {\n document.addEventListener('mousedown', handleDocumentMouseDown)\n } else {\n document.removeEventListener('mousedown', handleDocumentMouseDown)\n }\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', handleDocumentMouseDown)\n})\n\nconst hasMenu = computed(() => props.menuItems.length > 0)\nconst showDropdown = computed(() => menuOpen.value && hasMenu.value)\n</script>\n\n<template>\n <div\n ref=\"wrapperRef\"\n class=\"pa-title-bar-wrapper\"\n :class=\"`pa-title-bar-wrapper--${variant}`\"\n >\n <header class=\"pa-title-bar\" :class=\"`pa-title-bar--${variant}`\">\n <div class=\"pa-title-bar__title-block\">\n <component :is=\"titleTag\" class=\"pa-title-bar__title\">{{ title }}</component>\n <p v-if=\"subtitle\" class=\"pa-title-bar__subtitle\">{{ subtitle }}</p>\n </div>\n\n <div v-if=\"$slots.actions\" class=\"pa-title-bar__actions\">\n <slot name=\"actions\" />\n </div>\n\n <button\n v-if=\"hasMenu\"\n :id=\"kebabId\"\n ref=\"kebabRef\"\n type=\"button\"\n class=\"pa-title-bar__kebab\"\n :class=\"{ 'pa-title-bar__kebab--open': menuOpen }\"\n :aria-label=\"menuLabel\"\n aria-haspopup=\"menu\"\n :aria-expanded=\"menuOpen\"\n :aria-controls=\"menuId\"\n @click=\"toggleMenu\"\n @keydown.esc.prevent=\"closeMenu\"\n >\n <PaIcon name=\"dots-three-vertical\" size=\"sm\" />\n </button>\n </header>\n\n <ul\n v-if=\"showDropdown\"\n :id=\"menuId\"\n class=\"pa-title-bar__menu\"\n role=\"menu\"\n :aria-labelledby=\"kebabId\"\n >\n <li\n v-for=\"(item, index) in menuItems\"\n :key=\"index\"\n class=\"pa-title-bar__menu-item\"\n role=\"none\"\n >\n <button\n :ref=\"(el) => setMenuItemRef(el, index)\"\n class=\"pa-title-bar__menu-item-btn\"\n type=\"button\"\n role=\"menuitem\"\n :disabled=\"item.disabled\"\n @click=\"onMenuItemClick(item)\"\n @keydown.esc.prevent=\"closeMenu\"\n @keydown.down.prevent=\"handleMenuKeyDown($event, index)\"\n @keydown.up.prevent=\"handleMenuKeyDown($event, index)\"\n @keydown.home.prevent=\"handleMenuKeyDown($event, index)\"\n @keydown.end.prevent=\"handleMenuKeyDown($event, index)\"\n >\n {{ item.label }}\n </button>\n </li>\n </ul>\n </div>\n</template>\n\n<style scoped>\n.pa-title-bar-wrapper {\n container-type: inline-size;\n}\n\n.pa-title-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 60px;\n padding: 8px 24px;\n border-radius: var(--pa-radius-smooth) var(--pa-radius-smooth) 0 0;\n}\n\n.pa-title-bar--dark {\n background-color: var(--pa-color-primary);\n --pa-title-bar-title-color: var(--pa-color-bg-white);\n --pa-title-bar-subtitle-color: var(--pa-color-bg-white);\n --pa-title-bar-action-color: var(--pa-color-bg-white);\n --pa-title-bar-kebab-color: var(--pa-color-bg-white);\n}\n\n.pa-title-bar--light {\n background-color: var(--pa-color-bg-primary-light-40);\n --pa-title-bar-title-color: #000;\n --pa-title-bar-subtitle-color: var(--pa-color-text-secondary-gray);\n --pa-title-bar-action-color: var(--pa-color-primary);\n --pa-title-bar-kebab-color: var(--pa-color-primary);\n}\n\n.pa-title-bar__title-block {\n flex: 1 0 0;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--pa-space-2xs);\n}\n\n.pa-title-bar__title {\n margin: 0;\n font-family: var(--pa-font-family-base);\n font-weight: 600;\n font-size: 20px;\n line-height: 24px;\n letter-spacing: -0.5px;\n color: var(--pa-title-bar-title-color);\n}\n\n.pa-title-bar__subtitle {\n margin: 0;\n font-family: var(--pa-font-family-base);\n font-weight: 400;\n font-size: 16px;\n line-height: 20px;\n color: var(--pa-title-bar-subtitle-color);\n}\n\n.pa-title-bar__actions {\n display: flex;\n align-items: center;\n gap: var(--pa-space-xs);\n}\n\n.pa-title-bar__kebab {\n display: none;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n padding: 0;\n border: 0;\n border-radius: var(--pa-radius-smooth);\n background: transparent;\n color: var(--pa-title-bar-kebab-color);\n cursor: pointer;\n}\n\n.pa-title-bar__kebab:focus-visible {\n outline: var(--pa-border-sm) solid var(--pa-color-primary-focus-border);\n outline-offset: 2px;\n}\n\n.pa-title-bar__kebab--open {\n background-color: var(--pa-color-primary-pressed);\n color: var(--pa-color-bg-white);\n}\n\n.pa-title-bar__menu {\n list-style: none;\n margin: 0;\n padding: 0;\n background-color: var(--pa-color-bg-white);\n}\n\n.pa-title-bar__menu-item {\n display: block;\n margin-bottom: -1px;\n}\n\n.pa-title-bar__menu-item:first-child .pa-title-bar__menu-item-btn {\n border-radius: var(--pa-radius-smooth) var(--pa-radius-smooth) 0 0;\n}\n\n.pa-title-bar__menu-item:last-child {\n margin-bottom: 0;\n}\n\n.pa-title-bar__menu-item:last-child .pa-title-bar__menu-item-btn {\n border-radius: 0 0 var(--pa-radius-smooth) var(--pa-radius-smooth);\n}\n\n.pa-title-bar__menu-item-btn {\n display: block;\n width: 100%;\n min-height: 56px;\n padding: 16px;\n border: var(--pa-border-xs) solid var(--pa-color-bg-secondary-light-50);\n background-color: var(--pa-color-bg-white);\n color: var(--pa-color-text-secondary-gray);\n font-family: var(--pa-font-family-base);\n font-weight: 400;\n font-size: 16px;\n line-height: 20px;\n text-align: left;\n cursor: pointer;\n}\n\n.pa-title-bar__menu-item-btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.pa-title-bar__menu-item-btn:focus-visible {\n outline: var(--pa-border-sm) solid var(--pa-color-primary-focus-border);\n outline-offset: -2px;\n}\n\n@container (max-width: 720px) {\n .pa-title-bar {\n padding: 8px 8px 8px 16px;\n }\n\n .pa-title-bar__subtitle {\n display: none;\n }\n\n .pa-title-bar__actions {\n display: none;\n }\n\n .pa-title-bar__kebab {\n display: inline-flex;\n }\n}\n</style>\n"],"names":["props","__props","menuOpen","_useModel","titleTag","computed","baseId","useId","kebabId","menuId","wrapperRef","ref","kebabRef","menuItemRefs","setMenuItemRef","el","index","focusKebab","nextTick","_a","closeMenu","toggleMenu","firstEnabled","i","onMenuItemClick","item","enabledIndices","focusByIndex","handleMenuKeyDown","event","currentIndex","enabled","pos","next","prev","handleDocumentMouseDown","target","watch","open","onBeforeUnmount","hasMenu","showDropdown","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_openBlock","_createBlock","_resolveDynamicComponent","_hoisted_2","_toDisplayString","$slots","_hoisted_3","_renderSlot","_ctx","_createVNode","PaIcon","_Fragment","_renderList","$event","_hoisted_5"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAqBA,UAAMA,IAAQC,GAORC,IAAWC,EAAoBF,GAAC,UAA8B,GAE9DG,IAAWC,EAAS,MAAM,IAAIL,EAAM,UAAU,EAAW,GAEzDM,IAAS,gBAAgBC,EAAA,CAAO,IAChCC,IAAU,GAAGF,CAAM,WACnBG,IAAS,GAAGH,CAAM,UAElBI,IAAaC,EAA2B,IAAI,GAC5CC,IAAWD,EAA8B,IAAI,GAC7CE,IAAeF,EAAyB,EAAE;AAEhD,aAASG,EAAeC,GAAaC,GAAe;AAClD,MAAID,aAAc,sBAChBF,EAAa,MAAMG,CAAK,IAAID;AAAA,IAEhC;AAEA,aAASE,IAAa;AACpB,MAAAC,EAAS,MAAA;;AAAM,gBAAAC,IAAAP,EAAS,UAAT,gBAAAO,EAAgB;AAAA,OAAO;AAAA,IACxC;AAEA,aAASC,IAAY;AACnB,MAAAlB,EAAS,QAAQ,IACjBe,EAAA;AAAA,IACF;AAEA,aAASI,IAAa;AACpB,MAAInB,EAAS,QACXA,EAAS,QAAQ,MAEjBA,EAAS,QAAQ,IACjBgB,EAAS,MAAM;;AACb,cAAMI,IAAetB,EAAM,UAAU,UAAU,CAACuB,MAAM,CAACA,EAAE,QAAQ;AACjE,QAAID,KAAgB,OAClBH,IAAAN,EAAa,MAAMS,CAAY,MAA/B,QAAAH,EAAkC;AAAA,MAEtC,CAAC;AAAA,IAEL;AAEA,aAASK,EAAgBC,GAA0B;;AACjD,MAAIA,EAAK,cACTN,IAAAM,EAAK,YAAL,QAAAN,EAAA,KAAAM,IACAvB,EAAS,QAAQ;AAAA,IACnB;AAEA,aAASwB,IAAiB;AACxB,aAAO1B,EAAM,UACV,IAAI,CAACyB,GAAMF,MAAOE,EAAK,WAAW,KAAKF,CAAE,EACzC,OAAO,CAACA,MAAMA,KAAK,CAAC;AAAA,IACzB;AAEA,aAASI,EAAaX,GAA2B;;AAC/C,MAAIA,MAAU,YACdG,IAAAN,EAAa,MAAMG,CAAK,MAAxB,QAAAG,EAA2B;AAAA,IAC7B;AAEA,aAASS,EAAkBC,GAAsBC,GAAsB;AACrE,YAAMC,IAAUL,EAAA;AAChB,UAAIK,EAAQ,WAAW,EAAG;AAC1B,YAAMC,IAAMD,EAAQ,QAAQD,CAAY;AACxC,cAAQD,EAAM,KAAA;AAAA,QACZ,KAAK,aAAa;AAChB,UAAAA,EAAM,eAAA;AACN,gBAAMI,IAAOD,IAAM,IAAID,EAAQ,CAAC,IAAIA,GAASC,IAAM,KAAKD,EAAQ,MAAM;AACtE,UAAAJ,EAAaM,CAAI;AACjB;AAAA,QACF;AAAA,QACA,KAAK,WAAW;AACd,UAAAJ,EAAM,eAAA;AACN,gBAAMK,IACJF,IAAM,IACFD,EAAQA,EAAQ,SAAS,CAAC,IAC1BA,GAASC,IAAM,IAAID,EAAQ,UAAUA,EAAQ,MAAM;AACzD,UAAAJ,EAAaO,CAAI;AACjB;AAAA,QACF;AAAA,QACA,KAAK,QAAQ;AACX,UAAAL,EAAM,eAAA,GACNF,EAAaI,EAAQ,CAAC,CAAC;AACvB;AAAA,QACF;AAAA,QACA,KAAK,OAAO;AACV,UAAAF,EAAM,eAAA,GACNF,EAAaI,EAAQA,EAAQ,SAAS,CAAC,CAAC;AACxC;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ;AAEA,aAASI,EAAwBN,GAAmB;AAClD,UAAI,CAAC3B,EAAS,MAAO;AACrB,YAAMkC,IAASP,EAAM;AACrB,MAAIO,KAAU1B,EAAW,SAAS,CAACA,EAAW,MAAM,SAAS0B,CAAM,MACjElC,EAAS,QAAQ;AAAA,IAErB;AAEA,IAAAmC;AAAA,MACEnC;AAAA,MACA,CAACoC,MAAS;AACR,QAAI,OAAO,WAAa,QACpBA,IACF,SAAS,iBAAiB,aAAaH,CAAuB,IAE9D,SAAS,oBAAoB,aAAaA,CAAuB;AAAA,MAErE;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK,GAGpBI,EAAgB,MAAM;AACpB,eAAS,oBAAoB,aAAaJ,CAAuB;AAAA,IACnE,CAAC;AAED,UAAMK,IAAUnC,EAAS,MAAML,EAAM,UAAU,SAAS,CAAC,GACnDyC,IAAepC,EAAS,MAAMH,EAAS,SAASsC,EAAQ,KAAK;2BAIjEE,EA+DM,OAAA;AAAA,eA9DA;AAAA,MAAJ,KAAIhC;AAAA,MACJ,OAAKiC,EAAA,CAAC,wBAAsB,yBACK1C,EAAA,OAAO,EAAA,CAAA;AAAA,IAAA;MAExC2C,EA0BS,UAAA;AAAA,QA1BD,OAAKD,EAAA,CAAC,gBAAc,iBAA0B1C,EAAA,OAAO,EAAA,CAAA;AAAA,MAAA;QAC3D2C,EAGM,OAHNC,GAGM;AAAA,WAFJC,EAAA,GAAAC,EAA6EC,EAA7D5C,EAAA,KAAQ,GAAA,EAAE,OAAM,yBAAqB;AAAA,uBAAC,MAAW;AAAA,kBAARH,EAAA,KAAK,GAAA,CAAA;AAAA,YAAA;;;UACrDA,EAAA,iBAATyC,EAAoE,KAApEO,GAAoEC,EAAfjD,EAAA,QAAQ,GAAA,CAAA;;QAGpDkD,EAAAA,OAAO,WAAlBL,KAAAJ,EAEM,OAFNU,IAEM;AAAA,UADJC,EAAuBC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,QAAA;QAIjBd,EAAA,cADRE,EAeS,UAAA;AAAA;UAbN,IAAIlC;AAAA,mBACD;AAAA,UAAJ,KAAII;AAAA,UACJ,MAAK;AAAA,UACL,OAAK+B,EAAA,CAAC,uBAAqB,EAAA,6BACYzC,EAAA,MAAA,CAAQ,CAAA;AAAA,UAC9C,cAAYD,EAAA;AAAA,UACb,iBAAc;AAAA,UACb,iBAAeC,EAAA;AAAA,UACf,iBAAeO;AAAA,UACf,SAAOY;AAAA,UACP,eAAqBD,GAAS,CAAA,SAAA,CAAA,GAAA,CAAA,KAAA,CAAA;AAAA,QAAA;UAE/BmC,EAA+CC,GAAA;AAAA,YAAvC,MAAK;AAAA,YAAsB,MAAK;AAAA,UAAA;;;MAKpCf,EAAA,cADRC,EA6BK,MAAA;AAAA;QA3BF,IAAIjC;AAAA,QACL,OAAM;AAAA,QACN,MAAK;AAAA,QACJ,mBAAiBD;AAAA,MAAA;SAElBsC,EAAA,EAAA,GAAAJ,EAqBKe,GAAA,MAAAC,EApBqBzD,EAAA,WAAS,CAAzBwB,GAAMT,YADhB0B,EAqBK,MAAA;AAAA,UAnBF,KAAK1B;AAAA,UACN,OAAM;AAAA,UACN,MAAK;AAAA,QAAA;UAEL4B,EAcS,UAAA;AAAA;YAbN,MAAM7B,MAAOD,EAAeC,GAAIC,CAAK;AAAA,YACtC,OAAM;AAAA,YACN,MAAK;AAAA,YACL,MAAK;AAAA,YACJ,UAAUS,EAAK;AAAA,YACf,SAAK,CAAAkC,MAAEnC,EAAgBC,CAAI;AAAA,YAC3B,WAAO;AAAA,kBAAcL,GAAS,CAAA,SAAA,CAAA,GAAA,CAAA,KAAA,CAAA;AAAA,yBACRQ,EAAkB+B,GAAQ3C,CAAK,GAAA,CAAA,SAAA,CAAA,GAAA,CAAA,MAAA,CAAA;AAAA,yBACjCY,EAAkB+B,GAAQ3C,CAAK,GAAA,CAAA,SAAA,CAAA,GAAA,CAAA,IAAA,CAAA;AAAA,yBAC7BY,EAAkB+B,GAAQ3C,CAAK,GAAA,CAAA,SAAA,CAAA,GAAA,CAAA,MAAA,CAAA;AAAA,yBAChCY,EAAkB+B,GAAQ3C,CAAK,GAAA,CAAA,SAAA,CAAA,GAAA,CAAA,KAAA,CAAA;AAAA,YAAA;AAAA,aAElDkC,EAAAzB,EAAK,KAAK,GAAA,IAAAmC,EAAA;AAAA,QAAA;;;;;"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import o from "./PaToggle.vue2.js";
|
|
2
|
-
import { nextPaToggleId as f } from "./PaToggle.vue2.js";
|
|
3
2
|
/* empty css */
|
|
4
3
|
import t from "../../_virtual/_plugin-vue_export-helper.js";
|
|
5
|
-
const
|
|
4
|
+
const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-0ed212ae"]]);
|
|
6
5
|
export {
|
|
7
|
-
|
|
8
|
-
f as nextPaToggleId
|
|
6
|
+
m as default
|
|
9
7
|
};
|
|
10
8
|
//# sourceMappingURL=PaToggle.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaToggle.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PaToggle.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
import { defineComponent as k, useModel as B, computed as l, openBlock as i, createElementBlock as
|
|
2
|
-
const
|
|
3
|
-
let V = 0;
|
|
4
|
-
function q() {
|
|
5
|
-
return `pa-toggle-${++V}`;
|
|
6
|
-
}
|
|
7
|
-
const A = /* @__PURE__ */ k({
|
|
1
|
+
import { defineComponent as k, useModel as B, useId as x, computed as l, openBlock as i, createElementBlock as s, normalizeClass as n, createElementVNode as u, toDisplayString as p, createCommentVNode as f, mergeModels as C } from "vue";
|
|
2
|
+
const I = { class: "pa-toggle__row" }, M = ["id", "aria-checked", "aria-labelledby", "aria-required", "aria-invalid", "aria-describedby", "disabled", "name", "value"], V = ["id"], q = ["id"], w = /* @__PURE__ */ k({
|
|
8
3
|
__name: "PaToggle",
|
|
9
|
-
props: /* @__PURE__ */
|
|
4
|
+
props: /* @__PURE__ */ C({
|
|
10
5
|
label: {},
|
|
11
6
|
id: {},
|
|
12
7
|
name: {},
|
|
@@ -22,58 +17,57 @@ const A = /* @__PURE__ */ k({
|
|
|
22
17
|
}),
|
|
23
18
|
emits: ["update:modelValue"],
|
|
24
19
|
setup(e) {
|
|
25
|
-
const a = e,
|
|
20
|
+
const a = e, t = B(e, "modelValue"), y = `pa-toggle-${x()}`, d = l(() => a.id ?? y), v = l(() => `${d.value}-label`), c = l(() => `${d.value}-msg`), o = l(() => !!a.error), g = l(() => a.valid && !o.value), h = l(
|
|
26
21
|
() => typeof a.error == "string" && a.error.length > 0 ? a.error : null
|
|
27
22
|
), _ = l(
|
|
28
|
-
() => !
|
|
23
|
+
() => !o.value && !g.value && a.helperText ? a.helperText : null
|
|
29
24
|
), r = l(() => h.value ?? _.value);
|
|
30
25
|
function m() {
|
|
31
|
-
a.disabled || (
|
|
26
|
+
a.disabled || (t.value = !t.value);
|
|
32
27
|
}
|
|
33
|
-
return (
|
|
34
|
-
class:
|
|
28
|
+
return (T, b) => (i(), s("div", {
|
|
29
|
+
class: n([
|
|
35
30
|
"pa-toggle",
|
|
36
31
|
{
|
|
37
|
-
"pa-toggle--error":
|
|
32
|
+
"pa-toggle--error": o.value,
|
|
38
33
|
"pa-toggle--valid": g.value
|
|
39
34
|
}
|
|
40
35
|
])
|
|
41
36
|
}, [
|
|
42
|
-
u("div",
|
|
37
|
+
u("div", I, [
|
|
43
38
|
u("button", {
|
|
44
39
|
type: "button",
|
|
45
40
|
role: "switch",
|
|
46
41
|
id: d.value,
|
|
47
|
-
"aria-checked":
|
|
42
|
+
"aria-checked": t.value,
|
|
48
43
|
"aria-labelledby": e.label ? v.value : void 0,
|
|
49
44
|
"aria-required": e.required || void 0,
|
|
50
|
-
"aria-invalid":
|
|
45
|
+
"aria-invalid": o.value || void 0,
|
|
51
46
|
"aria-describedby": r.value ? c.value : void 0,
|
|
52
47
|
disabled: e.disabled,
|
|
53
48
|
name: e.name,
|
|
54
49
|
value: e.value,
|
|
55
|
-
class:
|
|
50
|
+
class: n(["pa-toggle__button", { "pa-toggle__button--on": t.value }]),
|
|
56
51
|
onClick: m
|
|
57
52
|
}, [...b[0] || (b[0] = [
|
|
58
53
|
u("span", { class: "pa-toggle__knob" }, null, -1)
|
|
59
|
-
])], 10,
|
|
60
|
-
e.label ? (i(),
|
|
54
|
+
])], 10, M),
|
|
55
|
+
e.label ? (i(), s("span", {
|
|
61
56
|
key: 0,
|
|
62
57
|
id: v.value,
|
|
63
58
|
class: "pa-toggle__label",
|
|
64
59
|
onClick: m
|
|
65
|
-
}, p(e.label), 9,
|
|
60
|
+
}, p(e.label), 9, V)) : f("", !0)
|
|
66
61
|
]),
|
|
67
|
-
r.value ? (i(),
|
|
62
|
+
r.value ? (i(), s("div", {
|
|
68
63
|
key: 0,
|
|
69
64
|
id: c.value,
|
|
70
|
-
class:
|
|
71
|
-
}, p(r.value), 11,
|
|
65
|
+
class: n(["pa-toggle__message", { "pa-toggle__message--error": o.value }])
|
|
66
|
+
}, p(r.value), 11, q)) : f("", !0)
|
|
72
67
|
], 2));
|
|
73
68
|
}
|
|
74
69
|
});
|
|
75
70
|
export {
|
|
76
|
-
|
|
77
|
-
q as nextPaToggleId
|
|
71
|
+
w as default
|
|
78
72
|
};
|
|
79
73
|
//# sourceMappingURL=PaToggle.vue2.js.map
|