@zuii/calendar 0.1.1 → 1.0.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/trads/i18n.ts","../../../src/components/Form/js/select.ts","../src/js/Calendar.ts","../src/js/mockData.ts"],"names":["fr","en","initSelect","element","config","onChange","selectOptions","template","renderContent","data","conf","item","highlightedState","itemSelectable","placeholder","stateClass","activeAttr","disabledAttr","placeholderClass","itemChoice","itemDisabled","choiceAttr","choices","Choices","value","Calendar","container","options","startOfMonth","addMonths","subMonths","date","lang","monthName","year","start","startOfWeek","end","addDays","days","eachDayOfInterval","now","isPastMonth","canGoPrev","_","i","y","day","dateStr","format","isCurrentMonth","isSameMonth","isPast","startOfDay","isSelected","isInRange","isSameDay","isAvailable","isUnavailable","classes","e","yearSelect","selectedYear","el","m","d","MOCK_AVAILABILITY"],"mappings":"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","file":"index.cjs","sourcesContent":["export const fr = {\n\tmonths: [\n\t\t'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',\n\t\t'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'\n\t],\n\tdays: ['lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'],\n\treservation: {\n\t\tselectSlot: 'Sélectionner un horaire pour le',\n\t\tnoSlots: 'Pas de créneaux disponibles pour cette date.'\n\t}\n};\n\nexport const en = {\n\tmonths: [\n\t\t'January', 'February', 'March', 'April', 'May', 'June',\n\t\t'July', 'August', 'September', 'October', 'November', 'December'\n\t],\n\tdays: ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],\n\treservation: {\n\t\tselectSlot: 'Select a time slot for',\n\t\tnoSlots: 'No slots available for this date.'\n\t}\n};\n","import Choices from 'choices.js';\nimport 'flag-icons/css/flag-icons.min.css';\n\n/**\n * Initialise un sélecteur Choices.js générique.\n *\n * @param {HTMLSelectElement} element - L'élément select à transformer.\n * @param {any} config - Options de configuration de Choices.js.\n * @param {(value: string | string[]) => void} onChange - Callback lors du changement.\n * @returns {Choices} L'instance Choices.js.\n */\nexport const initSelect = (\n\telement: HTMLSelectElement,\n\tconfig: any = {},\n\tonChange?: (value: string | string[]) => void\n): Choices => {\n\tconst selectOptions: any = {\n\t\titemSelectText: '',\n\t\tremoveItemButton: config.removeItemButton || false,\n\t\tsearchEnabled: config.searchEnabled !== undefined ? config.searchEnabled : true,\n\t\tshouldSort: false,\n\t\tplaceholder: true,\n\t\tplaceholderValue: config.placeholderValue || 'Sélectionnez une option',\n\t\t...config\n\t};\n\n\t// Gestion du rendu des drapeaux pour la variante 'country'\n\tif (config.variant === 'country') {\n\t\tselectOptions.callbackOnCreateTemplates = (template: any) => {\n\t\t\tconst renderContent = (data: any) => {\n\t\t\t\tif (data.placeholder || !data.customProperties?.flag) return `<span>${data.label}</span>`;\n\t\t\t\treturn `<span class=\"fi fi-${data.customProperties.flag} select__flag\"></span> <span>${data.label}</span>`;\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\titem: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, highlightedState, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.highlighted ? highlightedState : itemSelectable;\n\t\t\t\t\tconst activeAttr = data.active ? 'aria-selected=\"true\"' : '';\n\t\t\t\t\tconst disabledAttr = data.disabled ? 'aria-disabled=\"true\"' : '';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${stateClass} ${placeholderClass}\" data-item data-id=\"${data.id}\" data-value=\"${data.value}\" ${activeAttr} ${disabledAttr}>\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t\tchoice: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, itemChoice, itemDisabled, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.disabled ? itemDisabled : itemSelectable;\n\t\t\t\t\tconst choiceAttr = data.disabled ? 'data-choice-disabled aria-disabled=\"true\"' : 'data-choice-selectable';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${itemChoice} ${stateClass} ${placeholderClass}\" data-select-text=\"${conf.itemSelectText}\" data-choice ${choiceAttr} data-id=\"${data.id}\" data-value=\"${data.value}\" role=\"option\">\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t}\n\n\tconst choices = new Choices(element, selectOptions);\n\n\tif (onChange) {\n\t\telement.addEventListener('change', () => {\n\t\t\tconst value = choices.getValue(true);\n\t\t\tonChange(value);\n\t\t});\n\t}\n\n\treturn choices;\n};\n","import {\n\tformat,\n\taddMonths,\n\tsubMonths,\n\tstartOfMonth,\n\tstartOfWeek,\n\teachDayOfInterval,\n\tisSameMonth,\n\tisSameDay,\n\tstartOfDay,\n\taddDays,\n} from 'date-fns';\nimport { fr, en } from '../trads/i18n';\nimport { initSelect } from '../../../../src/components/Form/js/select';\n\nexport interface CalendarOptions {\n\tlang?: 'fr' | 'en';\n\tmode?: 'single' | 'range';\n\tdisablePast?: boolean;\n\tavailability?: Record<string, string[]>;\n\tonDateSelect?: (date: Date) => void;\n\tonRangeSelect?: (start: Date, end: Date) => void;\n\tinitialDate?: Date;\n}\n\n/**\n * Composant Calendrier Vanilla JS.\n */\nexport class Calendar {\n\tprivate container: HTMLElement;\n\tprivate currentMonth: Date;\n\tprivate selectedDate: Date | null = null;\n\tprivate startDate: Date | null = null;\n\tprivate endDate: Date | null = null;\n\tprivate options: Required<CalendarOptions>;\n\tprivate trads: any;\n\n\t/**\n\t * @param {HTMLElement} container - Élément DOM où injecter le calendrier.\n\t * @param {CalendarOptions} options - Options de configuration.\n\t */\n\tconstructor(container: HTMLElement, options: CalendarOptions = {}) {\n\t\tthis.container = container;\n\t\tthis.options = {\n\t\t\tlang: 'fr',\n\t\t\tmode: 'single',\n\t\t\tdisablePast: false,\n\t\t\tavailability: {},\n\t\t\tonDateSelect: () => {},\n\t\t\tonRangeSelect: () => {},\n\t\t\tinitialDate: new Date(),\n\t\t\t...(options as any)\n\t\t};\n\t\t// On s'assure d'être au début du mois pour les calculs\n\t\tthis.currentMonth = startOfMonth(this.options.initialDate);\n\t\tthis.trads = this.options.lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois suivant.\n\t */\n\tpublic nextMonth(): void {\n\t\tthis.currentMonth = addMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois précédent.\n\t */\n\tpublic prevMonth(): void {\n\t\tthis.currentMonth = subMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Sélectionne une date ou gère la plage.\n\t * @param {Date} date - La date à sélectionner.\n\t */\n\tpublic selectDate(date: Date): void {\n\t\tif (this.options.mode === 'single') {\n\t\t\tthis.selectedDate = date;\n\t\t\tthis.options.onDateSelect(date);\n\t\t} else {\n\t\t\t// Mode Range\n\t\t\tif (!this.startDate || (this.startDate && this.endDate)) {\n\t\t\t\tthis.startDate = date;\n\t\t\t\tthis.endDate = null;\n\t\t\t} else {\n\t\t\t\t// Assurer que startDate < endDate\n\t\t\t\tif (date < this.startDate) {\n\t\t\t\t\tthis.endDate = this.startDate;\n\t\t\t\t\tthis.startDate = date;\n\t\t\t\t} else {\n\t\t\t\t\tthis.endDate = date;\n\t\t\t\t}\n\t\t\t\tthis.options.onRangeSelect(this.startDate, this.endDate);\n\t\t\t}\n\t\t}\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Change la langue du calendrier.\n\t * @param {string} lang - 'fr' ou 'en'.\n\t */\n\tpublic setLanguage(lang: 'fr' | 'en'): void {\n\t\tthis.options.lang = lang;\n\t\tthis.trads = lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Rendu HTML du calendrier.\n\t */\n\tprivate render(): void {\n\t\tconst monthName = this.trads.months[this.currentMonth.getMonth()];\n\t\tconst year = this.currentMonth.getFullYear();\n\n\t\t// Intervalle de 42 jours (6 semaines fixes) pour garantir une hauteur identique mois après mois\n\t\tconst start = startOfWeek(startOfMonth(this.currentMonth), { weekStartsOn: 1 });\n\t\tconst end = addDays(start, 41);\n\t\tconst days = eachDayOfInterval({ start, end });\n\t\tconst now = new Date();\n\t\tconst isPastMonth = startOfMonth(this.currentMonth) <= startOfMonth(now);\n\t\tconst canGoPrev = !this.options.disablePast || !isPastMonth;\n\n\t\tthis.container.innerHTML = `\n\t\t\t<div class=\"calendar\">\n\t\t\t\t<div class=\"calendar__header\">\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"prev\" aria-label=\"Mois précédent\" ${!canGoPrev ? 'disabled style=\"opacity: 0.3; cursor: default;\"' : ''}>\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<span class=\"calendar__header--month\">${monthName}</span>\n\t\t\t\t\t<div class=\"calendar__header--year-wrapper\">\n\t\t\t\t\t\t<select class=\"calendar__header--year-select\">\n\t\t\t\t\t\t\t${Array.from({ length: 71 }, (_, i) => year - 50 + i)\n\t\t\t\t\t\t\t\t.filter(y => !this.options.disablePast || y >= now.getFullYear())\n\t\t\t\t\t\t\t\t.map(y => `\n\t\t\t\t\t\t\t\t\t<option value=\"${y}\" ${y === year ? 'selected' : ''}>${y}</option>\n\t\t\t\t\t\t\t\t`).join('')}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"next\" aria-label=\"Mois suivant\">\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__body\">\n\t\t\t\t<div class=\"calendar__weekdays\">\n\t\t\t\t\t${this.trads.days.map((day: string) => `<span>${day}</span>`).join('')}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__days\">\n\t\t\t\t\t${days.map((day: Date) => {\n\t\t\t\t\t\tconst dateStr = format(day, 'yyyy-MM-dd');\n\t\t\t\t\t\tconst isCurrentMonth = isSameMonth(day, this.currentMonth);\n\t\t\t\t\t\tconst isPast = day < startOfDay(now);\n\t\t\t\t\t\tlet isSelected = false;\n\t\t\t\t\t\tlet isInRange = false;\n\n\t\t\t\t\t\tif (this.options.mode === 'single') {\n\t\t\t\t\t\t\tisSelected = !!(this.selectedDate && isSameDay(day, this.selectedDate));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tisSelected = !!((this.startDate && isSameDay(day, this.startDate)) || (this.endDate && isSameDay(day, this.endDate)));\n\t\t\t\t\t\t\tif (this.startDate && this.endDate) {\n\t\t\t\t\t\t\t\tisInRange = day > this.startDate && day < this.endDate;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAvailable = !!this.options.availability[dateStr];\n\t\t\t\t\t\t// Si des disponibilités sont définies, les jours sans créneau sont désactivés\n\t\t\t\t\t\tconst hasAvailabilityDefined = Object.keys(this.options.availability).length > 0;\n\t\t\t\t\t\tconst isUnavailable = hasAvailabilityDefined && !isAvailable;\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet classes = ['calendar__day'];\n\t\t\t\t\t\tif (isCurrentMonth) classes.push('calendar__day--current-month');\n\t\t\t\t\t\telse classes.push('calendar__day--other-month');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (isPast) classes.push('calendar__day--past');\n\t\t\t\t\t\tif (isSelected) classes.push('calendar__day--selected');\n\t\t\t\t\t\tif (isInRange) classes.push('calendar__day--range');\n\t\t\t\t\t\tif (isAvailable) classes.push('calendar__day--available');\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Désactiver : hors mois courant, passé, ou non disponible\n\t\t\t\t\t\tif (!isCurrentMonth || isPast || isUnavailable) classes.push('calendar__day--disabled');\n\n\t\t\t\t\t\treturn `<div class=\"${classes.join(' ')}\" data-date=\"${dateStr}\" role=\"button\" tabindex=\"0\">${day.getDate()}</div>`;\n\t\t\t\t\t}).join('')}\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.bindEvents();\n\t}\n\n\t/**\n\t * Attache les événements DOM.\n\t */\n\tprivate bindEvents(): void {\n\t\tconst prevBtn = this.container.querySelector('[data-action=\"prev\"]');\n\t\tprevBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.prevMonth();\n\t\t});\n\n\t\tconst nextBtn = this.container.querySelector('[data-action=\"next\"]');\n\t\tnextBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.nextMonth();\n\t\t});\n\n\t\tconst yearSelect = this.container.querySelector('.calendar__header--year-select') as HTMLSelectElement;\n\t\tif (yearSelect) {\n\t\t\tinitSelect(yearSelect, {\n\t\t\t\tsearchEnabled: false,\n\t\t\t\titemSelectText: '',\n\t\t\t}, (value) => {\n\t\t\t\tconst selectedYear = parseInt(value as string, 10);\n\t\t\t\tthis.currentMonth = new Date(selectedYear, this.currentMonth.getMonth(), 1);\n\t\t\t\tthis.render();\n\t\t\t});\n\t\t}\n\n\t\tconst dayEls = this.container.querySelectorAll('.calendar__day:not(.calendar__day--disabled)');\n\t\tdayEls.forEach(el => {\n\t\t\tel.addEventListener('click', () => {\n\t\t\t\tconst dateStr = el.getAttribute('data-date');\n\t\t\t\tif (dateStr) {\n\t\t\t\t\t// Splitting to avoid TZ issues with new Date(string)\n\t\t\t\t\tconst [y, m, d] = dateStr.split('-').map(Number);\n\t\t\t\t\tthis.selectDate(new Date(y, m - 1, d));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n","/**\n * Données factices pour les disponibilités.\n */\nexport const MOCK_AVAILABILITY = {\n\t\"2026-04-02\": [\"10:00\", \"12:00\", \"13:30\", \"15:00\", \"19:00\"],\n\t\"2026-04-03\": [\"08:00\", \"09:00\", \"11:30\", \"14:00\"],\n\t\"2026-04-08\": [\"09:00\", \"10:00\", \"11:00\", \"15:00\", \"17:00\"],\n\t\"2026-04-09\": [\"14:00\", \"15:00\", \"16:30\"],\n\t\"2026-04-13\": [\"09:00\", \"10:30\", \"12:00\"],\n\t\"2026-04-14\": [\"11:00\", \"12:30\", \"14:00\", \"15:30\"],\n\t\"2026-04-15\": [\"10:00\", \"13:00\", \"15:00\"],\n\t\"2026-04-17\": [\"11:00\", \"13:00\", \"15:00\", \"17:00\"],\n\t\"2026-04-21\": [\"09:00\", \"11:00\", \"13:00\"],\n\t\"2026-04-22\": [\"14:00\", \"16:00\"],\n\t\"2026-04-23\": [\"10:00\", \"12:00\", \"14:00\"],\n\t\"2026-04-24\": [\"11:00\", \"13:00\", \"15:00\"],\n\t\"2026-04-27\": [\"10:00\"],\n\t\"2026-04-28\": [\"09:00\", \"11:30\"],\n\t\"2026-04-30\": [\"10:00\", \"15:00\"],\n\t\"2026-05-04\": [\"08:00\"],\n\t\"2026-05-05\": [\"10:00\"],\n\t\"2026-05-06\": [\"12:00\"],\n\t\"2026-05-07\": [\"matin\", \"après-midi\"]\n};\n"]}
1
+ {"version":3,"sources":["../src/trads/i18n.ts","../../../src/components/Form/js/select.ts","../src/js/Calendar.ts","../src/js/mockData.ts"],"names":["fr","en","initSelect","element","config","onChange","selectOptions","template","renderContent","data","conf","item","highlightedState","itemSelectable","placeholder","stateClass","activeAttr","disabledAttr","placeholderClass","itemChoice","itemDisabled","choiceAttr","choices","Choices","value","Calendar","container","options","startOfMonth","addMonths","subMonths","date","lang","monthName","year","start","startOfWeek","end","addDays","days","eachDayOfInterval","now","isPastMonth","canGoPrev","_","i","y","day","dateStr","format","isCurrentMonth","isSameMonth","isPast","startOfDay","isSelected","isInRange","isSameDay","isAvailable","isUnavailable","classes","e","yearSelect","selectedYear","el","m","d","MOCK_AVAILABILITY"],"mappings":"qLAAO,IAAMA,CAAAA,CAAK,CACjB,MAAA,CAAQ,CACP,UAAW,YAAA,CAAW,MAAA,CAAQ,QAAS,KAAA,CAAO,MAAA,CAC9C,SAAA,CAAW,SAAA,CAAQ,WAAA,CAAa,SAAA,CAAW,WAAY,aACxD,CAAA,CACA,KAAM,CAAC,KAAA,CAAO,MAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAK,CAAA,CACtD,YAAa,CACZ,UAAA,CAAY,qCACZ,OAAA,CAAS,iDACV,CACD,CAAA,CAEaC,CAAAA,CAAK,CACjB,MAAA,CAAQ,CACP,UAAW,UAAA,CAAY,OAAA,CAAS,QAAS,KAAA,CAAO,MAAA,CAChD,OAAQ,QAAA,CAAU,WAAA,CAAa,SAAA,CAAW,UAAA,CAAY,UACvD,CAAA,CACA,KAAM,CAAC,KAAA,CAAO,MAAO,KAAA,CAAO,KAAA,CAAO,MAAO,KAAA,CAAO,KAAK,CAAA,CACtD,WAAA,CAAa,CACZ,UAAA,CAAY,yBACZ,OAAA,CAAS,mCACV,CACD,ECXO,IAAMC,CAAAA,CAAa,CACzBC,CAAAA,CACAC,CAAAA,CAAc,EAAC,CACfC,CAAAA,GACa,CACb,IAAMC,CAAAA,CAAqB,CAC1B,cAAA,CAAgB,EAAA,CAChB,iBAAkBF,CAAAA,CAAO,gBAAA,EAAoB,MAC7C,aAAA,CAAeA,CAAAA,CAAO,gBAAkB,MAAA,CAAYA,CAAAA,CAAO,cAAgB,IAAA,CAC3E,UAAA,CAAY,KAAA,CACZ,WAAA,CAAa,IAAA,CACb,gBAAA,CAAkBA,EAAO,gBAAA,EAAoB,4BAAA,CAC7C,GAAGA,CACJ,CAAA,CAGIA,EAAO,OAAA,GAAY,SAAA,GACtBE,CAAAA,CAAc,yBAAA,CAA6BC,CAAAA,EAAkB,CAC5D,IAAMC,CAAAA,CAAiBC,CAAAA,EAClBA,EAAK,WAAA,EAAe,CAACA,EAAK,gBAAA,EAAkB,IAAA,CAAa,CAAA,MAAA,EAASA,CAAAA,CAAK,KAAK,CAAA,OAAA,CAAA,CACzE,sBAAsBA,CAAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA,6BAAA,EAAgCA,CAAAA,CAAK,KAAK,CAAA,OAAA,CAAA,CAGlG,OAAO,CACN,IAAA,CAAM,CAACC,EAAWD,CAAAA,GAAc,CAC/B,GAAM,CAAE,IAAA,CAAAE,EAAM,gBAAA,CAAAC,CAAAA,CAAkB,cAAA,CAAAC,CAAAA,CAAgB,WAAA,CAAAC,CAAY,EAAIJ,CAAAA,CAAK,UAAA,CAC/DK,EAAaN,CAAAA,CAAK,WAAA,CAAcG,EAAmBC,CAAAA,CACnDG,CAAAA,CAAaP,CAAAA,CAAK,MAAA,CAAS,sBAAA,CAAyB,EAAA,CACpDQ,EAAeR,CAAAA,CAAK,QAAA,CAAW,uBAAyB,EAAA,CACxDS,CAAAA,CAAmBT,EAAK,WAAA,CAAcK,CAAAA,CAAc,EAAA,CAE1D,OAAOP,CAAAA,CAAS;AAAA,kBAAA,EACDI,CAAI,CAAA,CAAA,EAAII,CAAU,CAAA,CAAA,EAAIG,CAAgB,CAAA,qBAAA,EAAwBT,CAAAA,CAAK,EAAE,CAAA,cAAA,EAAiBA,CAAAA,CAAK,KAAK,CAAA,EAAA,EAAKO,CAAU,IAAIC,CAAY,CAAA;AAAA,OAAA,EAC1IT,CAAAA,CAAcC,CAAI,CAAC;AAAA,YAAA,CAAA,CACd,MAAM,CAChB,EACA,MAAA,CAAQ,CAACC,EAAWD,CAAAA,GAAc,CACjC,GAAM,CAAE,KAAAE,CAAAA,CAAM,UAAA,CAAAQ,EAAY,YAAA,CAAAC,CAAAA,CAAc,eAAAP,CAAAA,CAAgB,WAAA,CAAAC,CAAY,CAAA,CAAIJ,EAAK,UAAA,CACvEK,CAAAA,CAAaN,EAAK,QAAA,CAAWW,CAAAA,CAAeP,EAC5CQ,CAAAA,CAAaZ,CAAAA,CAAK,QAAA,CAAW,2CAAA,CAA8C,yBAC3ES,CAAAA,CAAmBT,CAAAA,CAAK,YAAcK,CAAAA,CAAc,EAAA,CAE1D,OAAOP,CAAAA,CAAS;AAAA,kBAAA,EACDI,CAAI,CAAA,CAAA,EAAIQ,CAAU,CAAA,CAAA,EAAIJ,CAAU,IAAIG,CAAgB,CAAA,oBAAA,EAAuBR,CAAAA,CAAK,cAAc,iBAAiBW,CAAU,CAAA,UAAA,EAAaZ,EAAK,EAAE,CAAA,cAAA,EAAiBA,EAAK,KAAK,CAAA;AAAA,OAAA,EACnLD,CAAAA,CAAcC,CAAI,CAAC;AAAA,YAAA,CAAA,CACd,IAAA,EAAM,CAChB,CACD,CACD,CAAA,CAAA,CAGD,IAAMa,CAAAA,CAAU,IAAIC,kBAAAA,CAAQpB,CAAAA,CAASG,CAAa,CAAA,CAElD,OAAID,CAAAA,EACHF,CAAAA,CAAQ,gBAAA,CAAiB,QAAA,CAAU,IAAM,CACxC,IAAMqB,CAAAA,CAAQF,CAAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,CACnCjB,CAAAA,CAASmB,CAAK,EACf,CAAC,CAAA,CAGKF,CACR,CAAA,CC5CO,IAAMG,CAAAA,CAAN,KAAe,CACb,SAAA,CACA,YAAA,CACA,YAAA,CAA4B,IAAA,CAC5B,SAAA,CAAyB,IAAA,CACzB,OAAA,CAAuB,IAAA,CACvB,OAAA,CACA,KAAA,CAMR,WAAA,CAAYC,CAAAA,CAAwBC,CAAAA,CAA2B,EAAC,CAAG,CAClE,IAAA,CAAK,SAAA,CAAYD,CAAAA,CACjB,IAAA,CAAK,OAAA,CAAU,CACd,IAAA,CAAM,KACN,IAAA,CAAM,QAAA,CACN,WAAA,CAAa,KAAA,CACb,YAAA,CAAc,EAAC,CACf,YAAA,CAAc,IAAM,CAAC,CAAA,CACrB,aAAA,CAAe,IAAM,CAAC,CAAA,CACtB,WAAA,CAAa,IAAI,IAAA,CACjB,GAAIC,CACL,CAAA,CAEA,IAAA,CAAK,YAAA,CAAeC,oBAAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,CACzD,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,OAAS,IAAA,CAAO5B,CAAAA,CAAKC,CAAAA,CAC/C,IAAA,CAAK,MAAA,GACN,CAKO,SAAA,EAAkB,CACxB,IAAA,CAAK,YAAA,CAAe4B,iBAAAA,CAAU,IAAA,CAAK,YAAA,CAAc,CAAC,CAAA,CAClD,IAAA,CAAK,MAAA,GACN,CAKO,SAAA,EAAkB,CACxB,IAAA,CAAK,YAAA,CAAeC,iBAAAA,CAAU,IAAA,CAAK,YAAA,CAAc,CAAC,CAAA,CAClD,IAAA,CAAK,MAAA,GACN,CAMO,UAAA,CAAWC,CAAAA,CAAkB,CAC/B,IAAA,CAAK,OAAA,CAAQ,IAAA,GAAS,QAAA,EACzB,IAAA,CAAK,YAAA,CAAeA,CAAAA,CACpB,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAaA,CAAI,CAAA,EAG1B,CAAC,IAAA,CAAK,SAAA,EAAc,IAAA,CAAK,SAAA,EAAa,IAAA,CAAK,OAAA,EAC9C,IAAA,CAAK,SAAA,CAAYA,CAAAA,CACjB,IAAA,CAAK,OAAA,CAAU,IAAA,GAGXA,CAAAA,CAAO,IAAA,CAAK,SAAA,EACf,IAAA,CAAK,QAAU,IAAA,CAAK,SAAA,CACpB,IAAA,CAAK,SAAA,CAAYA,CAAAA,EAEjB,IAAA,CAAK,OAAA,CAAUA,CAAAA,CAEhB,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,IAAA,CAAK,SAAA,CAAW,IAAA,CAAK,OAAO,CAAA,CAAA,CAGzD,IAAA,CAAK,MAAA,GACN,CAMO,WAAA,CAAYC,CAAAA,CAAyB,CAC3C,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAOA,CAAAA,CACpB,IAAA,CAAK,KAAA,CAAQA,CAAAA,GAAS,IAAA,CAAOhC,CAAAA,CAAKC,EAClC,IAAA,CAAK,MAAA,GACN,CAKQ,MAAA,EAAe,CACtB,IAAMgC,CAAAA,CAAY,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,CAAA,CAC1DC,CAAAA,CAAO,IAAA,CAAK,YAAA,CAAa,WAAA,EAAY,CAGrCC,CAAAA,CAAQC,mBAAAA,CAAYR,oBAAAA,CAAa,IAAA,CAAK,YAAY,CAAA,CAAG,CAAE,YAAA,CAAc,CAAE,CAAC,CAAA,CACxES,EAAMC,eAAAA,CAAQH,CAAAA,CAAO,EAAE,CAAA,CACvBI,CAAAA,CAAOC,yBAAAA,CAAkB,CAAE,KAAA,CAAAL,CAAAA,CAAO,GAAA,CAAAE,CAAI,CAAC,CAAA,CACvCI,CAAAA,CAAM,IAAI,IAAA,CACVC,CAAAA,CAAcd,oBAAAA,CAAa,IAAA,CAAK,YAAY,CAAA,EAAKA,oBAAAA,CAAaa,CAAG,CAAA,CACjEE,CAAAA,CAAY,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAe,CAACD,CAAAA,CAEhD,IAAA,CAAK,UAAU,SAAA,CAAY;AAAA;AAAA;AAAA,+FAAA,EAG+DC,CAAAA,CAAgE,GAApD,iDAAsD,CAAA;AAAA;AAAA;AAAA,2CAAA,EAGjHV,CAAS,CAAA;AAAA;AAAA;AAAA,OAAA,EAG7C,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,EAAG,EAAG,CAACW,CAAAA,CAAGC,CAAAA,GAAMX,CAAAA,CAAO,EAAA,CAAKW,CAAC,EAClD,MAAA,CAAOC,CAAAA,EAAK,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAeA,CAAAA,EAAKL,CAAAA,CAAI,WAAA,EAAa,CAAA,CAC/D,GAAA,CAAIK,CAAAA,EAAK;AAAA,wBAAA,EACQA,CAAC,CAAA,EAAA,EAAKA,CAAAA,GAAMZ,EAAO,UAAA,CAAa,EAAE,IAAIY,CAAC,CAAA;AAAA,QAAA,CACxD,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAA,EASZ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAKC,CAAAA,EAAgB,CAAA,MAAA,EAASA,CAAG,CAAA,OAAA,CAAS,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA,KAAA,EAGpER,CAAAA,CAAK,GAAA,CAAKQ,CAAAA,EAAc,CACzB,IAAMC,CAAAA,CAAUC,cAAAA,CAAOF,CAAAA,CAAK,YAAY,CAAA,CAClCG,CAAAA,CAAiBC,mBAAAA,CAAYJ,CAAAA,CAAK,KAAK,YAAY,CAAA,CACnDK,CAAAA,CAASL,CAAAA,CAAMM,kBAAAA,CAAWZ,CAAG,CAAA,CAC/Ba,CAAAA,CAAa,MACbC,CAAAA,CAAY,KAAA,CAEZ,IAAA,CAAK,OAAA,CAAQ,OAAS,QAAA,CACzBD,CAAAA,CAAa,CAAC,EAAE,KAAK,YAAA,EAAgBE,iBAAAA,CAAUT,CAAAA,CAAK,IAAA,CAAK,YAAY,CAAA,CAAA,EAErEO,CAAAA,CAAa,CAAC,EAAG,IAAA,CAAK,SAAA,EAAaE,iBAAAA,CAAUT,CAAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAO,IAAA,CAAK,SAAWS,iBAAAA,CAAUT,CAAAA,CAAK,IAAA,CAAK,OAAO,CAAA,CAAA,CAC9G,IAAA,CAAK,SAAA,EAAa,IAAA,CAAK,UAC1BQ,CAAAA,CAAYR,CAAAA,CAAM,IAAA,CAAK,SAAA,EAAaA,EAAM,IAAA,CAAK,OAAA,CAAA,CAAA,CAIjD,IAAMU,CAAAA,CAAc,CAAC,CAAC,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAaT,CAAO,CAAA,CAGjDU,CAAAA,CADyB,MAAA,CAAO,KAAK,IAAA,CAAK,OAAA,CAAQ,YAAY,CAAA,CAAE,MAAA,CAAS,CAAA,EAC/B,CAACD,CAAAA,CAE7CE,EAAU,CAAC,eAAe,CAAA,CAC9B,OAAIT,CAAAA,CAAgBS,CAAAA,CAAQ,IAAA,CAAK,8BAA8B,EAC1DA,CAAAA,CAAQ,IAAA,CAAK,4BAA4B,CAAA,CAE1CP,GAAQO,CAAAA,CAAQ,IAAA,CAAK,qBAAqB,CAAA,CAC1CL,GAAYK,CAAAA,CAAQ,IAAA,CAAK,yBAAyB,CAAA,CAClDJ,CAAAA,EAAWI,CAAAA,CAAQ,IAAA,CAAK,sBAAsB,EAC9CF,CAAAA,EAAaE,CAAAA,CAAQ,IAAA,CAAK,0BAA0B,GAGpD,CAACT,CAAAA,EAAkBE,CAAAA,EAAUM,CAAAA,GAAeC,EAAQ,IAAA,CAAK,yBAAyB,CAAA,CAE/E,CAAA,YAAA,EAAeA,CAAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,gBAAgBX,CAAO,CAAA,6BAAA,EAAgCD,CAAAA,CAAI,OAAA,EAAS,CAAA,MAAA,CAC5G,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAMd,IAAA,CAAK,UAAA,GACN,CAKQ,UAAA,EAAmB,CACV,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,sBAAsB,CAAA,EAC1D,gBAAA,CAAiB,OAAA,CAAUa,GAAM,CACzCA,CAAAA,CAAE,cAAA,EAAe,CACjB,IAAA,CAAK,SAAA,GACN,CAAC,CAAA,CAEe,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,sBAAsB,CAAA,EAC1D,iBAAiB,OAAA,CAAUA,CAAAA,EAAM,CACzCA,CAAAA,CAAE,cAAA,EAAe,CACjB,IAAA,CAAK,SAAA,GACN,CAAC,CAAA,CAED,IAAMC,CAAAA,CAAa,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,gCAAgC,CAAA,CAC5EA,CAAAA,EACH3D,CAAAA,CAAW2D,CAAAA,CAAY,CACtB,aAAA,CAAe,KAAA,CACf,cAAA,CAAgB,EACjB,CAAA,CAAIrC,CAAAA,EAAU,CACb,IAAMsC,EAAe,QAAA,CAAStC,CAAAA,CAAiB,EAAE,CAAA,CACjD,IAAA,CAAK,YAAA,CAAe,IAAI,IAAA,CAAKsC,CAAAA,CAAc,IAAA,CAAK,YAAA,CAAa,QAAA,EAAS,CAAG,CAAC,CAAA,CAC1E,IAAA,CAAK,MAAA,GACN,CAAC,CAAA,CAGa,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,8CAA8C,CAAA,CACtF,OAAA,CAAQC,CAAAA,EAAM,CACpBA,CAAAA,CAAG,gBAAA,CAAiB,QAAS,IAAM,CAClC,IAAMf,CAAAA,CAAUe,CAAAA,CAAG,YAAA,CAAa,WAAW,CAAA,CAC3C,GAAIf,CAAAA,CAAS,CAEZ,GAAM,CAACF,CAAAA,CAAGkB,CAAAA,CAAGC,CAAC,CAAA,CAAIjB,CAAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA,CAC/C,IAAA,CAAK,UAAA,CAAW,IAAI,IAAA,CAAKF,CAAAA,CAAGkB,CAAAA,CAAI,EAAGC,CAAC,CAAC,EACtC,CACD,CAAC,EACF,CAAC,EACF,CACD,ECxOO,IAAMC,CAAAA,CAAoB,CAChC,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CAC1D,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACjD,YAAA,CAAc,CAAC,QAAS,OAAA,CAAS,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CAC1D,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACxC,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACxC,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACjD,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACxC,aAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACjD,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACxC,YAAA,CAAc,CAAC,OAAA,CAAS,OAAO,CAAA,CAC/B,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACxC,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACxC,YAAA,CAAc,CAAC,OAAO,CAAA,CACtB,YAAA,CAAc,CAAC,OAAA,CAAS,OAAO,CAAA,CAC/B,YAAA,CAAc,CAAC,OAAA,CAAS,OAAO,CAAA,CAC/B,YAAA,CAAc,CAAC,OAAO,CAAA,CACtB,YAAA,CAAc,CAAC,OAAO,CAAA,CACtB,YAAA,CAAc,CAAC,OAAO,CAAA,CACtB,YAAA,CAAc,CAAC,OAAA,CAAS,eAAY,CACrC","file":"index.cjs","sourcesContent":["export const fr = {\n\tmonths: [\n\t\t'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',\n\t\t'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'\n\t],\n\tdays: ['lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'],\n\treservation: {\n\t\tselectSlot: 'Sélectionner un horaire pour le',\n\t\tnoSlots: 'Pas de créneaux disponibles pour cette date.'\n\t}\n};\n\nexport const en = {\n\tmonths: [\n\t\t'January', 'February', 'March', 'April', 'May', 'June',\n\t\t'July', 'August', 'September', 'October', 'November', 'December'\n\t],\n\tdays: ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],\n\treservation: {\n\t\tselectSlot: 'Select a time slot for',\n\t\tnoSlots: 'No slots available for this date.'\n\t}\n};\n","import Choices from 'choices.js';\nimport 'flag-icons/css/flag-icons.min.css';\n\n/**\n * Initialise un sélecteur Choices.js générique.\n *\n * @param {HTMLSelectElement} element - L'élément select à transformer.\n * @param {any} config - Options de configuration de Choices.js.\n * @param {(value: string | string[]) => void} onChange - Callback lors du changement.\n * @returns {Choices} L'instance Choices.js.\n */\nexport const initSelect = (\n\telement: HTMLSelectElement,\n\tconfig: any = {},\n\tonChange?: (value: string | string[]) => void\n): Choices => {\n\tconst selectOptions: any = {\n\t\titemSelectText: '',\n\t\tremoveItemButton: config.removeItemButton || false,\n\t\tsearchEnabled: config.searchEnabled !== undefined ? config.searchEnabled : true,\n\t\tshouldSort: false,\n\t\tplaceholder: true,\n\t\tplaceholderValue: config.placeholderValue || 'Sélectionnez une option',\n\t\t...config\n\t};\n\n\t// Gestion du rendu des drapeaux pour la variante 'country'\n\tif (config.variant === 'country') {\n\t\tselectOptions.callbackOnCreateTemplates = (template: any) => {\n\t\t\tconst renderContent = (data: any) => {\n\t\t\t\tif (data.placeholder || !data.customProperties?.flag) return `<span>${data.label}</span>`;\n\t\t\t\treturn `<span class=\"fi fi-${data.customProperties.flag} select__flag\"></span> <span>${data.label}</span>`;\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\titem: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, highlightedState, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.highlighted ? highlightedState : itemSelectable;\n\t\t\t\t\tconst activeAttr = data.active ? 'aria-selected=\"true\"' : '';\n\t\t\t\t\tconst disabledAttr = data.disabled ? 'aria-disabled=\"true\"' : '';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${stateClass} ${placeholderClass}\" data-item data-id=\"${data.id}\" data-value=\"${data.value}\" ${activeAttr} ${disabledAttr}>\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t\tchoice: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, itemChoice, itemDisabled, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.disabled ? itemDisabled : itemSelectable;\n\t\t\t\t\tconst choiceAttr = data.disabled ? 'data-choice-disabled aria-disabled=\"true\"' : 'data-choice-selectable';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${itemChoice} ${stateClass} ${placeholderClass}\" data-select-text=\"${conf.itemSelectText}\" data-choice ${choiceAttr} data-id=\"${data.id}\" data-value=\"${data.value}\" role=\"option\">\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t}\n\n\tconst choices = new Choices(element, selectOptions);\n\n\tif (onChange) {\n\t\telement.addEventListener('change', () => {\n\t\t\tconst value = choices.getValue(true);\n\t\t\tonChange(value);\n\t\t});\n\t}\n\n\treturn choices;\n};\n","import {\n\tformat,\n\taddMonths,\n\tsubMonths,\n\tstartOfMonth,\n\tstartOfWeek,\n\teachDayOfInterval,\n\tisSameMonth,\n\tisSameDay,\n\tstartOfDay,\n\taddDays,\n} from 'date-fns';\nimport { fr, en } from '../trads/i18n';\nimport { initSelect } from '../../../../src/components/Form/js/select';\n\nexport interface CalendarOptions {\n\tlang?: 'fr' | 'en';\n\tmode?: 'single' | 'range';\n\tdisablePast?: boolean;\n\tavailability?: Record<string, string[]>;\n\tonDateSelect?: (date: Date) => void;\n\tonRangeSelect?: (start: Date, end: Date) => void;\n\tinitialDate?: Date;\n}\n\n/**\n * Composant Calendrier Vanilla JS.\n */\nexport class Calendar {\n\tprivate container: HTMLElement;\n\tprivate currentMonth: Date;\n\tprivate selectedDate: Date | null = null;\n\tprivate startDate: Date | null = null;\n\tprivate endDate: Date | null = null;\n\tprivate options: Required<CalendarOptions>;\n\tprivate trads: any;\n\n\t/**\n\t * @param {HTMLElement} container - Élément DOM où injecter le calendrier.\n\t * @param {CalendarOptions} options - Options de configuration.\n\t */\n\tconstructor(container: HTMLElement, options: CalendarOptions = {}) {\n\t\tthis.container = container;\n\t\tthis.options = {\n\t\t\tlang: 'fr',\n\t\t\tmode: 'single',\n\t\t\tdisablePast: false,\n\t\t\tavailability: {},\n\t\t\tonDateSelect: () => {},\n\t\t\tonRangeSelect: () => {},\n\t\t\tinitialDate: new Date(),\n\t\t\t...(options as any)\n\t\t};\n\t\t// On s'assure d'être au début du mois pour les calculs\n\t\tthis.currentMonth = startOfMonth(this.options.initialDate);\n\t\tthis.trads = this.options.lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois suivant.\n\t */\n\tpublic nextMonth(): void {\n\t\tthis.currentMonth = addMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois précédent.\n\t */\n\tpublic prevMonth(): void {\n\t\tthis.currentMonth = subMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Sélectionne une date ou gère la plage.\n\t * @param {Date} date - La date à sélectionner.\n\t */\n\tpublic selectDate(date: Date): void {\n\t\tif (this.options.mode === 'single') {\n\t\t\tthis.selectedDate = date;\n\t\t\tthis.options.onDateSelect(date);\n\t\t} else {\n\t\t\t// Mode Range\n\t\t\tif (!this.startDate || (this.startDate && this.endDate)) {\n\t\t\t\tthis.startDate = date;\n\t\t\t\tthis.endDate = null;\n\t\t\t} else {\n\t\t\t\t// Assurer que startDate < endDate\n\t\t\t\tif (date < this.startDate) {\n\t\t\t\t\tthis.endDate = this.startDate;\n\t\t\t\t\tthis.startDate = date;\n\t\t\t\t} else {\n\t\t\t\t\tthis.endDate = date;\n\t\t\t\t}\n\t\t\t\tthis.options.onRangeSelect(this.startDate, this.endDate);\n\t\t\t}\n\t\t}\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Change la langue du calendrier.\n\t * @param {string} lang - 'fr' ou 'en'.\n\t */\n\tpublic setLanguage(lang: 'fr' | 'en'): void {\n\t\tthis.options.lang = lang;\n\t\tthis.trads = lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Rendu HTML du calendrier.\n\t */\n\tprivate render(): void {\n\t\tconst monthName = this.trads.months[this.currentMonth.getMonth()];\n\t\tconst year = this.currentMonth.getFullYear();\n\n\t\t// Intervalle de 42 jours (6 semaines fixes) pour garantir une hauteur identique mois après mois\n\t\tconst start = startOfWeek(startOfMonth(this.currentMonth), { weekStartsOn: 1 });\n\t\tconst end = addDays(start, 41);\n\t\tconst days = eachDayOfInterval({ start, end });\n\t\tconst now = new Date();\n\t\tconst isPastMonth = startOfMonth(this.currentMonth) <= startOfMonth(now);\n\t\tconst canGoPrev = !this.options.disablePast || !isPastMonth;\n\n\t\tthis.container.innerHTML = `\n\t\t\t<div class=\"calendar\">\n\t\t\t\t<div class=\"calendar__header\">\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"prev\" aria-label=\"Mois précédent\" ${!canGoPrev ? 'disabled style=\"opacity: 0.3; cursor: default;\"' : ''}>\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<span class=\"calendar__header--month\">${monthName}</span>\n\t\t\t\t\t<div class=\"calendar__header--year-wrapper\">\n\t\t\t\t\t\t<select class=\"calendar__header--year-select\">\n\t\t\t\t\t\t\t${Array.from({ length: 71 }, (_, i) => year - 50 + i)\n\t\t\t\t\t\t\t\t.filter(y => !this.options.disablePast || y >= now.getFullYear())\n\t\t\t\t\t\t\t\t.map(y => `\n\t\t\t\t\t\t\t\t\t<option value=\"${y}\" ${y === year ? 'selected' : ''}>${y}</option>\n\t\t\t\t\t\t\t\t`).join('')}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"next\" aria-label=\"Mois suivant\">\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__body\">\n\t\t\t\t<div class=\"calendar__weekdays\">\n\t\t\t\t\t${this.trads.days.map((day: string) => `<span>${day}</span>`).join('')}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__days\">\n\t\t\t\t\t${days.map((day: Date) => {\n\t\t\t\t\t\tconst dateStr = format(day, 'yyyy-MM-dd');\n\t\t\t\t\t\tconst isCurrentMonth = isSameMonth(day, this.currentMonth);\n\t\t\t\t\t\tconst isPast = day < startOfDay(now);\n\t\t\t\t\t\tlet isSelected = false;\n\t\t\t\t\t\tlet isInRange = false;\n\n\t\t\t\t\t\tif (this.options.mode === 'single') {\n\t\t\t\t\t\t\tisSelected = !!(this.selectedDate && isSameDay(day, this.selectedDate));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tisSelected = !!((this.startDate && isSameDay(day, this.startDate)) || (this.endDate && isSameDay(day, this.endDate)));\n\t\t\t\t\t\t\tif (this.startDate && this.endDate) {\n\t\t\t\t\t\t\t\tisInRange = day > this.startDate && day < this.endDate;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAvailable = !!this.options.availability[dateStr];\n\t\t\t\t\t\t// Si des disponibilités sont définies, les jours sans créneau sont désactivés\n\t\t\t\t\t\tconst hasAvailabilityDefined = Object.keys(this.options.availability).length > 0;\n\t\t\t\t\t\tconst isUnavailable = hasAvailabilityDefined && !isAvailable;\n\n\t\t\t\t\t\tlet classes = ['calendar__day'];\n\t\t\t\t\t\tif (isCurrentMonth) classes.push('calendar__day--current-month');\n\t\t\t\t\t\telse classes.push('calendar__day--other-month');\n\n\t\t\t\t\t\tif (isPast) classes.push('calendar__day--past');\n\t\t\t\t\t\tif (isSelected) classes.push('calendar__day--selected');\n\t\t\t\t\t\tif (isInRange) classes.push('calendar__day--range');\n\t\t\t\t\t\tif (isAvailable) classes.push('calendar__day--available');\n\n\t\t\t\t\t\t// Désactiver : hors mois courant, passé, ou non disponible\n\t\t\t\t\t\tif (!isCurrentMonth || isPast || isUnavailable) classes.push('calendar__day--disabled');\n\n\t\t\t\t\t\treturn `<div class=\"${classes.join(' ')}\" data-date=\"${dateStr}\" role=\"button\" tabindex=\"0\">${day.getDate()}</div>`;\n\t\t\t\t\t}).join('')}\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.bindEvents();\n\t}\n\n\t/**\n\t * Attache les événements DOM.\n\t */\n\tprivate bindEvents(): void {\n\t\tconst prevBtn = this.container.querySelector('[data-action=\"prev\"]');\n\t\tprevBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.prevMonth();\n\t\t});\n\n\t\tconst nextBtn = this.container.querySelector('[data-action=\"next\"]');\n\t\tnextBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.nextMonth();\n\t\t});\n\n\t\tconst yearSelect = this.container.querySelector('.calendar__header--year-select') as HTMLSelectElement;\n\t\tif (yearSelect) {\n\t\t\tinitSelect(yearSelect, {\n\t\t\t\tsearchEnabled: false,\n\t\t\t\titemSelectText: ''\n\t\t\t}, (value) => {\n\t\t\t\tconst selectedYear = parseInt(value as string, 10);\n\t\t\t\tthis.currentMonth = new Date(selectedYear, this.currentMonth.getMonth(), 1);\n\t\t\t\tthis.render();\n\t\t\t});\n\t\t}\n\n\t\tconst dayEls = this.container.querySelectorAll('.calendar__day:not(.calendar__day--disabled)');\n\t\tdayEls.forEach(el => {\n\t\t\tel.addEventListener('click', () => {\n\t\t\t\tconst dateStr = el.getAttribute('data-date');\n\t\t\t\tif (dateStr) {\n\t\t\t\t\t// Splitting to avoid TZ issues with new Date(string)\n\t\t\t\t\tconst [y, m, d] = dateStr.split('-').map(Number);\n\t\t\t\t\tthis.selectDate(new Date(y, m - 1, d));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n","/**\n * Données factices pour les disponibilités.\n */\nexport const MOCK_AVAILABILITY = {\n\t\"2026-04-02\": [\"10:00\", \"12:00\", \"13:30\", \"15:00\", \"19:00\"],\n\t\"2026-04-03\": [\"08:00\", \"09:00\", \"11:30\", \"14:00\"],\n\t\"2026-04-08\": [\"09:00\", \"10:00\", \"11:00\", \"15:00\", \"17:00\"],\n\t\"2026-04-09\": [\"14:00\", \"15:00\", \"16:30\"],\n\t\"2026-04-13\": [\"09:00\", \"10:30\", \"12:00\"],\n\t\"2026-04-14\": [\"11:00\", \"12:30\", \"14:00\", \"15:30\"],\n\t\"2026-04-15\": [\"10:00\", \"13:00\", \"15:00\"],\n\t\"2026-04-17\": [\"11:00\", \"13:00\", \"15:00\", \"17:00\"],\n\t\"2026-04-21\": [\"09:00\", \"11:00\", \"13:00\"],\n\t\"2026-04-22\": [\"14:00\", \"16:00\"],\n\t\"2026-04-23\": [\"10:00\", \"12:00\", \"14:00\"],\n\t\"2026-04-24\": [\"11:00\", \"13:00\", \"15:00\"],\n\t\"2026-04-27\": [\"10:00\"],\n\t\"2026-04-28\": [\"09:00\", \"11:30\"],\n\t\"2026-04-30\": [\"10:00\", \"15:00\"],\n\t\"2026-05-04\": [\"08:00\"],\n\t\"2026-05-05\": [\"10:00\"],\n\t\"2026-05-06\": [\"12:00\"],\n\t\"2026-05-07\": [\"matin\", \"après-midi\"]\n};\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/trads/i18n.ts","../../../src/components/Form/js/select.ts","../src/js/Calendar.ts","../src/js/mockData.ts"],"names":["fr","en","initSelect","element","config","onChange","selectOptions","template","renderContent","data","conf","item","highlightedState","itemSelectable","placeholder","stateClass","activeAttr","disabledAttr","placeholderClass","itemChoice","itemDisabled","choiceAttr","choices","Choices","value","Calendar","container","options","startOfMonth","addMonths","subMonths","date","lang","monthName","year","start","startOfWeek","end","addDays","days","eachDayOfInterval","now","isPastMonth","canGoPrev","_","i","y","day","dateStr","format","isCurrentMonth","isSameMonth","isPast","startOfDay","isSelected","isInRange","isSameDay","isAvailable","isUnavailable","classes","e","yearSelect","selectedYear","el","m","d","MOCK_AVAILABILITY"],"mappings":"gKAAO,IAAMA,CAAAA,CAAK,CACjB,MAAA,CAAQ,CACP,UAAW,YAAA,CAAW,MAAA,CAAQ,QAAS,KAAA,CAAO,MAAA,CAC9C,SAAA,CAAW,SAAA,CAAQ,WAAA,CAAa,SAAA,CAAW,WAAY,aACxD,CAAA,CACA,KAAM,CAAC,KAAA,CAAO,MAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAK,CAAA,CACtD,YAAa,CACZ,UAAA,CAAY,qCACZ,OAAA,CAAS,iDACV,CACD,CAAA,CAEaC,CAAAA,CAAK,CACjB,MAAA,CAAQ,CACP,UAAW,UAAA,CAAY,OAAA,CAAS,QAAS,KAAA,CAAO,MAAA,CAChD,OAAQ,QAAA,CAAU,WAAA,CAAa,SAAA,CAAW,UAAA,CAAY,UACvD,CAAA,CACA,KAAM,CAAC,KAAA,CAAO,MAAO,KAAA,CAAO,KAAA,CAAO,MAAO,KAAA,CAAO,KAAK,CAAA,CACtD,WAAA,CAAa,CACZ,UAAA,CAAY,yBACZ,OAAA,CAAS,mCACV,CACD,ECXO,IAAMC,CAAAA,CAAa,CACzBC,CAAAA,CACAC,CAAAA,CAAc,EAAC,CACfC,CAAAA,GACa,CACb,IAAMC,CAAAA,CAAqB,CAC1B,cAAA,CAAgB,EAAA,CAChB,iBAAkBF,CAAAA,CAAO,gBAAA,EAAoB,MAC7C,aAAA,CAAeA,CAAAA,CAAO,gBAAkB,MAAA,CAAYA,CAAAA,CAAO,cAAgB,IAAA,CAC3E,UAAA,CAAY,KAAA,CACZ,WAAA,CAAa,IAAA,CACb,gBAAA,CAAkBA,EAAO,gBAAA,EAAoB,4BAAA,CAC7C,GAAGA,CACJ,CAAA,CAGIA,EAAO,OAAA,GAAY,SAAA,GACtBE,CAAAA,CAAc,yBAAA,CAA6BC,CAAAA,EAAkB,CAC5D,IAAMC,CAAAA,CAAiBC,CAAAA,EAClBA,EAAK,WAAA,EAAe,CAACA,EAAK,gBAAA,EAAkB,IAAA,CAAa,CAAA,MAAA,EAASA,CAAAA,CAAK,KAAK,CAAA,OAAA,CAAA,CACzE,sBAAsBA,CAAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA,6BAAA,EAAgCA,CAAAA,CAAK,KAAK,CAAA,OAAA,CAAA,CAGlG,OAAO,CACN,IAAA,CAAM,CAACC,EAAWD,CAAAA,GAAc,CAC/B,GAAM,CAAE,IAAA,CAAAE,EAAM,gBAAA,CAAAC,CAAAA,CAAkB,cAAA,CAAAC,CAAAA,CAAgB,WAAA,CAAAC,CAAY,EAAIJ,CAAAA,CAAK,UAAA,CAC/DK,EAAaN,CAAAA,CAAK,WAAA,CAAcG,EAAmBC,CAAAA,CACnDG,CAAAA,CAAaP,CAAAA,CAAK,MAAA,CAAS,sBAAA,CAAyB,EAAA,CACpDQ,EAAeR,CAAAA,CAAK,QAAA,CAAW,uBAAyB,EAAA,CACxDS,CAAAA,CAAmBT,EAAK,WAAA,CAAcK,CAAAA,CAAc,EAAA,CAE1D,OAAOP,CAAAA,CAAS;AAAA,kBAAA,EACDI,CAAI,CAAA,CAAA,EAAII,CAAU,CAAA,CAAA,EAAIG,CAAgB,CAAA,qBAAA,EAAwBT,CAAAA,CAAK,EAAE,CAAA,cAAA,EAAiBA,CAAAA,CAAK,KAAK,CAAA,EAAA,EAAKO,CAAU,IAAIC,CAAY,CAAA;AAAA,OAAA,EAC1IT,CAAAA,CAAcC,CAAI,CAAC;AAAA,YAAA,CAAA,CACd,MAAM,CAChB,EACA,MAAA,CAAQ,CAACC,EAAWD,CAAAA,GAAc,CACjC,GAAM,CAAE,KAAAE,CAAAA,CAAM,UAAA,CAAAQ,EAAY,YAAA,CAAAC,CAAAA,CAAc,eAAAP,CAAAA,CAAgB,WAAA,CAAAC,CAAY,CAAA,CAAIJ,EAAK,UAAA,CACvEK,CAAAA,CAAaN,EAAK,QAAA,CAAWW,CAAAA,CAAeP,EAC5CQ,CAAAA,CAAaZ,CAAAA,CAAK,QAAA,CAAW,2CAAA,CAA8C,yBAC3ES,CAAAA,CAAmBT,CAAAA,CAAK,YAAcK,CAAAA,CAAc,EAAA,CAE1D,OAAOP,CAAAA,CAAS;AAAA,kBAAA,EACDI,CAAI,CAAA,CAAA,EAAIQ,CAAU,CAAA,CAAA,EAAIJ,CAAU,IAAIG,CAAgB,CAAA,oBAAA,EAAuBR,CAAAA,CAAK,cAAc,iBAAiBW,CAAU,CAAA,UAAA,EAAaZ,EAAK,EAAE,CAAA,cAAA,EAAiBA,EAAK,KAAK,CAAA;AAAA,OAAA,EACnLD,CAAAA,CAAcC,CAAI,CAAC;AAAA,YAAA,CAAA,CACd,IAAA,EAAM,CAChB,CACD,CACD,CAAA,CAAA,CAGD,IAAMa,CAAAA,CAAU,IAAIC,CAAAA,CAAQpB,CAAAA,CAASG,CAAa,CAAA,CAElD,OAAID,CAAAA,EACHF,CAAAA,CAAQ,gBAAA,CAAiB,QAAA,CAAU,IAAM,CACxC,IAAMqB,CAAAA,CAAQF,CAAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,CACnCjB,CAAAA,CAASmB,CAAK,EACf,CAAC,CAAA,CAGKF,CACR,CAAA,CC5CO,IAAMG,CAAAA,CAAN,KAAe,CACb,SAAA,CACA,YAAA,CACA,YAAA,CAA4B,IAAA,CAC5B,SAAA,CAAyB,IAAA,CACzB,OAAA,CAAuB,IAAA,CACvB,OAAA,CACA,KAAA,CAMR,WAAA,CAAYC,CAAAA,CAAwBC,CAAAA,CAA2B,EAAC,CAAG,CAClE,IAAA,CAAK,SAAA,CAAYD,CAAAA,CACjB,IAAA,CAAK,OAAA,CAAU,CACd,IAAA,CAAM,KACN,IAAA,CAAM,QAAA,CACN,WAAA,CAAa,KAAA,CACb,YAAA,CAAc,EAAC,CACf,YAAA,CAAc,IAAM,CAAC,CAAA,CACrB,aAAA,CAAe,IAAM,CAAC,CAAA,CACtB,WAAA,CAAa,IAAI,IAAA,CACjB,GAAIC,CACL,CAAA,CAEA,IAAA,CAAK,YAAA,CAAeC,YAAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,CACzD,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,OAAS,IAAA,CAAO5B,CAAAA,CAAKC,CAAAA,CAC/C,IAAA,CAAK,MAAA,GACN,CAKO,SAAA,EAAkB,CACxB,IAAA,CAAK,YAAA,CAAe4B,SAAAA,CAAU,IAAA,CAAK,YAAA,CAAc,CAAC,CAAA,CAClD,IAAA,CAAK,MAAA,GACN,CAKO,SAAA,EAAkB,CACxB,IAAA,CAAK,YAAA,CAAeC,SAAAA,CAAU,IAAA,CAAK,YAAA,CAAc,CAAC,CAAA,CAClD,IAAA,CAAK,MAAA,GACN,CAMO,UAAA,CAAWC,CAAAA,CAAkB,CAC/B,IAAA,CAAK,OAAA,CAAQ,IAAA,GAAS,QAAA,EACzB,IAAA,CAAK,YAAA,CAAeA,CAAAA,CACpB,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAaA,CAAI,CAAA,EAG1B,CAAC,IAAA,CAAK,SAAA,EAAc,IAAA,CAAK,SAAA,EAAa,IAAA,CAAK,OAAA,EAC9C,IAAA,CAAK,SAAA,CAAYA,CAAAA,CACjB,IAAA,CAAK,OAAA,CAAU,IAAA,GAGXA,CAAAA,CAAO,IAAA,CAAK,SAAA,EACf,IAAA,CAAK,QAAU,IAAA,CAAK,SAAA,CACpB,IAAA,CAAK,SAAA,CAAYA,CAAAA,EAEjB,IAAA,CAAK,OAAA,CAAUA,CAAAA,CAEhB,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,IAAA,CAAK,SAAA,CAAW,IAAA,CAAK,OAAO,CAAA,CAAA,CAGzD,IAAA,CAAK,MAAA,GACN,CAMO,WAAA,CAAYC,CAAAA,CAAyB,CAC3C,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAOA,CAAAA,CACpB,IAAA,CAAK,KAAA,CAAQA,CAAAA,GAAS,IAAA,CAAOhC,CAAAA,CAAKC,EAClC,IAAA,CAAK,MAAA,GACN,CAKQ,MAAA,EAAe,CACtB,IAAMgC,CAAAA,CAAY,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,CAAA,CAC1DC,CAAAA,CAAO,IAAA,CAAK,YAAA,CAAa,WAAA,EAAY,CAGrCC,CAAAA,CAAQC,WAAAA,CAAYR,YAAAA,CAAa,IAAA,CAAK,YAAY,CAAA,CAAG,CAAE,YAAA,CAAc,CAAE,CAAC,CAAA,CACxES,EAAMC,OAAAA,CAAQH,CAAAA,CAAO,EAAE,CAAA,CACvBI,CAAAA,CAAOC,iBAAAA,CAAkB,CAAE,KAAA,CAAAL,CAAAA,CAAO,GAAA,CAAAE,CAAI,CAAC,CAAA,CACvCI,CAAAA,CAAM,IAAI,IAAA,CACVC,CAAAA,CAAcd,YAAAA,CAAa,IAAA,CAAK,YAAY,CAAA,EAAKA,YAAAA,CAAaa,CAAG,CAAA,CACjEE,CAAAA,CAAY,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAe,CAACD,CAAAA,CAEhD,IAAA,CAAK,UAAU,SAAA,CAAY;AAAA;AAAA;AAAA,+FAAA,EAG+DC,CAAAA,CAAgE,GAApD,iDAAsD,CAAA;AAAA;AAAA;AAAA,2CAAA,EAGjHV,CAAS,CAAA;AAAA;AAAA;AAAA,OAAA,EAG7C,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,EAAG,EAAG,CAACW,CAAAA,CAAGC,CAAAA,GAAMX,CAAAA,CAAO,EAAA,CAAKW,CAAC,EAClD,MAAA,CAAOC,CAAAA,EAAK,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAeA,CAAAA,EAAKL,CAAAA,CAAI,WAAA,EAAa,CAAA,CAC/D,GAAA,CAAIK,CAAAA,EAAK;AAAA,wBAAA,EACQA,CAAC,CAAA,EAAA,EAAKA,CAAAA,GAAMZ,EAAO,UAAA,CAAa,EAAE,IAAIY,CAAC,CAAA;AAAA,QAAA,CACxD,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAA,EASZ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAKC,CAAAA,EAAgB,CAAA,MAAA,EAASA,CAAG,CAAA,OAAA,CAAS,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA,KAAA,EAGpER,CAAAA,CAAK,GAAA,CAAKQ,CAAAA,EAAc,CACzB,IAAMC,CAAAA,CAAUC,MAAAA,CAAOF,CAAAA,CAAK,YAAY,CAAA,CAClCG,CAAAA,CAAiBC,WAAAA,CAAYJ,CAAAA,CAAK,KAAK,YAAY,CAAA,CACnDK,CAAAA,CAASL,CAAAA,CAAMM,UAAAA,CAAWZ,CAAG,CAAA,CAC/Ba,CAAAA,CAAa,MACbC,CAAAA,CAAY,KAAA,CAEZ,IAAA,CAAK,OAAA,CAAQ,OAAS,QAAA,CACzBD,CAAAA,CAAa,CAAC,EAAE,KAAK,YAAA,EAAgBE,SAAAA,CAAUT,CAAAA,CAAK,IAAA,CAAK,YAAY,CAAA,CAAA,EAErEO,CAAAA,CAAa,CAAC,EAAG,IAAA,CAAK,SAAA,EAAaE,SAAAA,CAAUT,CAAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAO,IAAA,CAAK,SAAWS,SAAAA,CAAUT,CAAAA,CAAK,IAAA,CAAK,OAAO,CAAA,CAAA,CAC9G,IAAA,CAAK,SAAA,EAAa,IAAA,CAAK,UAC1BQ,CAAAA,CAAYR,CAAAA,CAAM,IAAA,CAAK,SAAA,EAAaA,EAAM,IAAA,CAAK,OAAA,CAAA,CAAA,CAIjD,IAAMU,CAAAA,CAAc,CAAC,CAAC,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAaT,CAAO,CAAA,CAGjDU,CAAAA,CADyB,MAAA,CAAO,KAAK,IAAA,CAAK,OAAA,CAAQ,YAAY,CAAA,CAAE,MAAA,CAAS,CAAA,EAC/B,CAACD,CAAAA,CAE7CE,EAAU,CAAC,eAAe,CAAA,CAC9B,OAAIT,CAAAA,CAAgBS,CAAAA,CAAQ,IAAA,CAAK,8BAA8B,EAC1DA,CAAAA,CAAQ,IAAA,CAAK,4BAA4B,CAAA,CAE1CP,GAAQO,CAAAA,CAAQ,IAAA,CAAK,qBAAqB,CAAA,CAC1CL,GAAYK,CAAAA,CAAQ,IAAA,CAAK,yBAAyB,CAAA,CAClDJ,CAAAA,EAAWI,CAAAA,CAAQ,IAAA,CAAK,sBAAsB,EAC9CF,CAAAA,EAAaE,CAAAA,CAAQ,IAAA,CAAK,0BAA0B,GAGpD,CAACT,CAAAA,EAAkBE,CAAAA,EAAUM,CAAAA,GAAeC,EAAQ,IAAA,CAAK,yBAAyB,CAAA,CAE/E,CAAA,YAAA,EAAeA,CAAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,gBAAgBX,CAAO,CAAA,6BAAA,EAAgCD,CAAAA,CAAI,OAAA,EAAS,CAAA,MAAA,CAC5G,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAMd,IAAA,CAAK,UAAA,GACN,CAKQ,UAAA,EAAmB,CACV,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,sBAAsB,CAAA,EAC1D,gBAAA,CAAiB,OAAA,CAAUa,GAAM,CACzCA,CAAAA,CAAE,cAAA,EAAe,CACjB,IAAA,CAAK,SAAA,GACN,CAAC,CAAA,CAEe,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,sBAAsB,CAAA,EAC1D,iBAAiB,OAAA,CAAUA,CAAAA,EAAM,CACzCA,CAAAA,CAAE,cAAA,EAAe,CACjB,IAAA,CAAK,SAAA,GACN,CAAC,CAAA,CAED,IAAMC,CAAAA,CAAa,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,gCAAgC,CAAA,CAC5EA,CAAAA,EACH3D,CAAAA,CAAW2D,CAAAA,CAAY,CACtB,aAAA,CAAe,KAAA,CACf,cAAA,CAAgB,EACjB,CAAA,CAAIrC,CAAAA,EAAU,CACb,IAAMsC,EAAe,QAAA,CAAStC,CAAAA,CAAiB,EAAE,CAAA,CACjD,IAAA,CAAK,YAAA,CAAe,IAAI,IAAA,CAAKsC,CAAAA,CAAc,IAAA,CAAK,YAAA,CAAa,QAAA,EAAS,CAAG,CAAC,CAAA,CAC1E,IAAA,CAAK,MAAA,GACN,CAAC,CAAA,CAGa,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,8CAA8C,CAAA,CACtF,OAAA,CAAQC,CAAAA,EAAM,CACpBA,CAAAA,CAAG,gBAAA,CAAiB,QAAS,IAAM,CAClC,IAAMf,CAAAA,CAAUe,CAAAA,CAAG,YAAA,CAAa,WAAW,CAAA,CAC3C,GAAIf,CAAAA,CAAS,CAEZ,GAAM,CAACF,CAAAA,CAAGkB,CAAAA,CAAGC,CAAC,CAAA,CAAIjB,CAAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA,CAC/C,IAAA,CAAK,UAAA,CAAW,IAAI,IAAA,CAAKF,CAAAA,CAAGkB,CAAAA,CAAI,EAAGC,CAAC,CAAC,EACtC,CACD,CAAC,EACF,CAAC,EACF,CACD,ECxOO,IAAMC,CAAAA,CAAoB,CAChC,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CAC1D,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACjD,YAAA,CAAc,CAAC,QAAS,OAAA,CAAS,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CAC1D,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACxC,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACxC,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACjD,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACxC,aAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACjD,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACxC,YAAA,CAAc,CAAC,OAAA,CAAS,OAAO,CAAA,CAC/B,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACxC,YAAA,CAAc,CAAC,OAAA,CAAS,OAAA,CAAS,OAAO,CAAA,CACxC,YAAA,CAAc,CAAC,OAAO,CAAA,CACtB,YAAA,CAAc,CAAC,OAAA,CAAS,OAAO,CAAA,CAC/B,YAAA,CAAc,CAAC,OAAA,CAAS,OAAO,CAAA,CAC/B,YAAA,CAAc,CAAC,OAAO,CAAA,CACtB,YAAA,CAAc,CAAC,OAAO,CAAA,CACtB,YAAA,CAAc,CAAC,OAAO,CAAA,CACtB,YAAA,CAAc,CAAC,OAAA,CAAS,eAAY,CACrC","file":"index.js","sourcesContent":["export const fr = {\n\tmonths: [\n\t\t'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',\n\t\t'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'\n\t],\n\tdays: ['lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'],\n\treservation: {\n\t\tselectSlot: 'Sélectionner un horaire pour le',\n\t\tnoSlots: 'Pas de créneaux disponibles pour cette date.'\n\t}\n};\n\nexport const en = {\n\tmonths: [\n\t\t'January', 'February', 'March', 'April', 'May', 'June',\n\t\t'July', 'August', 'September', 'October', 'November', 'December'\n\t],\n\tdays: ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],\n\treservation: {\n\t\tselectSlot: 'Select a time slot for',\n\t\tnoSlots: 'No slots available for this date.'\n\t}\n};\n","import Choices from 'choices.js';\nimport 'flag-icons/css/flag-icons.min.css';\n\n/**\n * Initialise un sélecteur Choices.js générique.\n *\n * @param {HTMLSelectElement} element - L'élément select à transformer.\n * @param {any} config - Options de configuration de Choices.js.\n * @param {(value: string | string[]) => void} onChange - Callback lors du changement.\n * @returns {Choices} L'instance Choices.js.\n */\nexport const initSelect = (\n\telement: HTMLSelectElement,\n\tconfig: any = {},\n\tonChange?: (value: string | string[]) => void\n): Choices => {\n\tconst selectOptions: any = {\n\t\titemSelectText: '',\n\t\tremoveItemButton: config.removeItemButton || false,\n\t\tsearchEnabled: config.searchEnabled !== undefined ? config.searchEnabled : true,\n\t\tshouldSort: false,\n\t\tplaceholder: true,\n\t\tplaceholderValue: config.placeholderValue || 'Sélectionnez une option',\n\t\t...config\n\t};\n\n\t// Gestion du rendu des drapeaux pour la variante 'country'\n\tif (config.variant === 'country') {\n\t\tselectOptions.callbackOnCreateTemplates = (template: any) => {\n\t\t\tconst renderContent = (data: any) => {\n\t\t\t\tif (data.placeholder || !data.customProperties?.flag) return `<span>${data.label}</span>`;\n\t\t\t\treturn `<span class=\"fi fi-${data.customProperties.flag} select__flag\"></span> <span>${data.label}</span>`;\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\titem: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, highlightedState, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.highlighted ? highlightedState : itemSelectable;\n\t\t\t\t\tconst activeAttr = data.active ? 'aria-selected=\"true\"' : '';\n\t\t\t\t\tconst disabledAttr = data.disabled ? 'aria-disabled=\"true\"' : '';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${stateClass} ${placeholderClass}\" data-item data-id=\"${data.id}\" data-value=\"${data.value}\" ${activeAttr} ${disabledAttr}>\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t\tchoice: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, itemChoice, itemDisabled, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.disabled ? itemDisabled : itemSelectable;\n\t\t\t\t\tconst choiceAttr = data.disabled ? 'data-choice-disabled aria-disabled=\"true\"' : 'data-choice-selectable';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${itemChoice} ${stateClass} ${placeholderClass}\" data-select-text=\"${conf.itemSelectText}\" data-choice ${choiceAttr} data-id=\"${data.id}\" data-value=\"${data.value}\" role=\"option\">\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t}\n\n\tconst choices = new Choices(element, selectOptions);\n\n\tif (onChange) {\n\t\telement.addEventListener('change', () => {\n\t\t\tconst value = choices.getValue(true);\n\t\t\tonChange(value);\n\t\t});\n\t}\n\n\treturn choices;\n};\n","import {\n\tformat,\n\taddMonths,\n\tsubMonths,\n\tstartOfMonth,\n\tstartOfWeek,\n\teachDayOfInterval,\n\tisSameMonth,\n\tisSameDay,\n\tstartOfDay,\n\taddDays,\n} from 'date-fns';\nimport { fr, en } from '../trads/i18n';\nimport { initSelect } from '../../../../src/components/Form/js/select';\n\nexport interface CalendarOptions {\n\tlang?: 'fr' | 'en';\n\tmode?: 'single' | 'range';\n\tdisablePast?: boolean;\n\tavailability?: Record<string, string[]>;\n\tonDateSelect?: (date: Date) => void;\n\tonRangeSelect?: (start: Date, end: Date) => void;\n\tinitialDate?: Date;\n}\n\n/**\n * Composant Calendrier Vanilla JS.\n */\nexport class Calendar {\n\tprivate container: HTMLElement;\n\tprivate currentMonth: Date;\n\tprivate selectedDate: Date | null = null;\n\tprivate startDate: Date | null = null;\n\tprivate endDate: Date | null = null;\n\tprivate options: Required<CalendarOptions>;\n\tprivate trads: any;\n\n\t/**\n\t * @param {HTMLElement} container - Élément DOM où injecter le calendrier.\n\t * @param {CalendarOptions} options - Options de configuration.\n\t */\n\tconstructor(container: HTMLElement, options: CalendarOptions = {}) {\n\t\tthis.container = container;\n\t\tthis.options = {\n\t\t\tlang: 'fr',\n\t\t\tmode: 'single',\n\t\t\tdisablePast: false,\n\t\t\tavailability: {},\n\t\t\tonDateSelect: () => {},\n\t\t\tonRangeSelect: () => {},\n\t\t\tinitialDate: new Date(),\n\t\t\t...(options as any)\n\t\t};\n\t\t// On s'assure d'être au début du mois pour les calculs\n\t\tthis.currentMonth = startOfMonth(this.options.initialDate);\n\t\tthis.trads = this.options.lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois suivant.\n\t */\n\tpublic nextMonth(): void {\n\t\tthis.currentMonth = addMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois précédent.\n\t */\n\tpublic prevMonth(): void {\n\t\tthis.currentMonth = subMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Sélectionne une date ou gère la plage.\n\t * @param {Date} date - La date à sélectionner.\n\t */\n\tpublic selectDate(date: Date): void {\n\t\tif (this.options.mode === 'single') {\n\t\t\tthis.selectedDate = date;\n\t\t\tthis.options.onDateSelect(date);\n\t\t} else {\n\t\t\t// Mode Range\n\t\t\tif (!this.startDate || (this.startDate && this.endDate)) {\n\t\t\t\tthis.startDate = date;\n\t\t\t\tthis.endDate = null;\n\t\t\t} else {\n\t\t\t\t// Assurer que startDate < endDate\n\t\t\t\tif (date < this.startDate) {\n\t\t\t\t\tthis.endDate = this.startDate;\n\t\t\t\t\tthis.startDate = date;\n\t\t\t\t} else {\n\t\t\t\t\tthis.endDate = date;\n\t\t\t\t}\n\t\t\t\tthis.options.onRangeSelect(this.startDate, this.endDate);\n\t\t\t}\n\t\t}\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Change la langue du calendrier.\n\t * @param {string} lang - 'fr' ou 'en'.\n\t */\n\tpublic setLanguage(lang: 'fr' | 'en'): void {\n\t\tthis.options.lang = lang;\n\t\tthis.trads = lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Rendu HTML du calendrier.\n\t */\n\tprivate render(): void {\n\t\tconst monthName = this.trads.months[this.currentMonth.getMonth()];\n\t\tconst year = this.currentMonth.getFullYear();\n\n\t\t// Intervalle de 42 jours (6 semaines fixes) pour garantir une hauteur identique mois après mois\n\t\tconst start = startOfWeek(startOfMonth(this.currentMonth), { weekStartsOn: 1 });\n\t\tconst end = addDays(start, 41);\n\t\tconst days = eachDayOfInterval({ start, end });\n\t\tconst now = new Date();\n\t\tconst isPastMonth = startOfMonth(this.currentMonth) <= startOfMonth(now);\n\t\tconst canGoPrev = !this.options.disablePast || !isPastMonth;\n\n\t\tthis.container.innerHTML = `\n\t\t\t<div class=\"calendar\">\n\t\t\t\t<div class=\"calendar__header\">\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"prev\" aria-label=\"Mois précédent\" ${!canGoPrev ? 'disabled style=\"opacity: 0.3; cursor: default;\"' : ''}>\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<span class=\"calendar__header--month\">${monthName}</span>\n\t\t\t\t\t<div class=\"calendar__header--year-wrapper\">\n\t\t\t\t\t\t<select class=\"calendar__header--year-select\">\n\t\t\t\t\t\t\t${Array.from({ length: 71 }, (_, i) => year - 50 + i)\n\t\t\t\t\t\t\t\t.filter(y => !this.options.disablePast || y >= now.getFullYear())\n\t\t\t\t\t\t\t\t.map(y => `\n\t\t\t\t\t\t\t\t\t<option value=\"${y}\" ${y === year ? 'selected' : ''}>${y}</option>\n\t\t\t\t\t\t\t\t`).join('')}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"next\" aria-label=\"Mois suivant\">\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__body\">\n\t\t\t\t<div class=\"calendar__weekdays\">\n\t\t\t\t\t${this.trads.days.map((day: string) => `<span>${day}</span>`).join('')}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__days\">\n\t\t\t\t\t${days.map((day: Date) => {\n\t\t\t\t\t\tconst dateStr = format(day, 'yyyy-MM-dd');\n\t\t\t\t\t\tconst isCurrentMonth = isSameMonth(day, this.currentMonth);\n\t\t\t\t\t\tconst isPast = day < startOfDay(now);\n\t\t\t\t\t\tlet isSelected = false;\n\t\t\t\t\t\tlet isInRange = false;\n\n\t\t\t\t\t\tif (this.options.mode === 'single') {\n\t\t\t\t\t\t\tisSelected = !!(this.selectedDate && isSameDay(day, this.selectedDate));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tisSelected = !!((this.startDate && isSameDay(day, this.startDate)) || (this.endDate && isSameDay(day, this.endDate)));\n\t\t\t\t\t\t\tif (this.startDate && this.endDate) {\n\t\t\t\t\t\t\t\tisInRange = day > this.startDate && day < this.endDate;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAvailable = !!this.options.availability[dateStr];\n\t\t\t\t\t\t// Si des disponibilités sont définies, les jours sans créneau sont désactivés\n\t\t\t\t\t\tconst hasAvailabilityDefined = Object.keys(this.options.availability).length > 0;\n\t\t\t\t\t\tconst isUnavailable = hasAvailabilityDefined && !isAvailable;\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet classes = ['calendar__day'];\n\t\t\t\t\t\tif (isCurrentMonth) classes.push('calendar__day--current-month');\n\t\t\t\t\t\telse classes.push('calendar__day--other-month');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (isPast) classes.push('calendar__day--past');\n\t\t\t\t\t\tif (isSelected) classes.push('calendar__day--selected');\n\t\t\t\t\t\tif (isInRange) classes.push('calendar__day--range');\n\t\t\t\t\t\tif (isAvailable) classes.push('calendar__day--available');\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Désactiver : hors mois courant, passé, ou non disponible\n\t\t\t\t\t\tif (!isCurrentMonth || isPast || isUnavailable) classes.push('calendar__day--disabled');\n\n\t\t\t\t\t\treturn `<div class=\"${classes.join(' ')}\" data-date=\"${dateStr}\" role=\"button\" tabindex=\"0\">${day.getDate()}</div>`;\n\t\t\t\t\t}).join('')}\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.bindEvents();\n\t}\n\n\t/**\n\t * Attache les événements DOM.\n\t */\n\tprivate bindEvents(): void {\n\t\tconst prevBtn = this.container.querySelector('[data-action=\"prev\"]');\n\t\tprevBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.prevMonth();\n\t\t});\n\n\t\tconst nextBtn = this.container.querySelector('[data-action=\"next\"]');\n\t\tnextBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.nextMonth();\n\t\t});\n\n\t\tconst yearSelect = this.container.querySelector('.calendar__header--year-select') as HTMLSelectElement;\n\t\tif (yearSelect) {\n\t\t\tinitSelect(yearSelect, {\n\t\t\t\tsearchEnabled: false,\n\t\t\t\titemSelectText: '',\n\t\t\t}, (value) => {\n\t\t\t\tconst selectedYear = parseInt(value as string, 10);\n\t\t\t\tthis.currentMonth = new Date(selectedYear, this.currentMonth.getMonth(), 1);\n\t\t\t\tthis.render();\n\t\t\t});\n\t\t}\n\n\t\tconst dayEls = this.container.querySelectorAll('.calendar__day:not(.calendar__day--disabled)');\n\t\tdayEls.forEach(el => {\n\t\t\tel.addEventListener('click', () => {\n\t\t\t\tconst dateStr = el.getAttribute('data-date');\n\t\t\t\tif (dateStr) {\n\t\t\t\t\t// Splitting to avoid TZ issues with new Date(string)\n\t\t\t\t\tconst [y, m, d] = dateStr.split('-').map(Number);\n\t\t\t\t\tthis.selectDate(new Date(y, m - 1, d));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n","/**\n * Données factices pour les disponibilités.\n */\nexport const MOCK_AVAILABILITY = {\n\t\"2026-04-02\": [\"10:00\", \"12:00\", \"13:30\", \"15:00\", \"19:00\"],\n\t\"2026-04-03\": [\"08:00\", \"09:00\", \"11:30\", \"14:00\"],\n\t\"2026-04-08\": [\"09:00\", \"10:00\", \"11:00\", \"15:00\", \"17:00\"],\n\t\"2026-04-09\": [\"14:00\", \"15:00\", \"16:30\"],\n\t\"2026-04-13\": [\"09:00\", \"10:30\", \"12:00\"],\n\t\"2026-04-14\": [\"11:00\", \"12:30\", \"14:00\", \"15:30\"],\n\t\"2026-04-15\": [\"10:00\", \"13:00\", \"15:00\"],\n\t\"2026-04-17\": [\"11:00\", \"13:00\", \"15:00\", \"17:00\"],\n\t\"2026-04-21\": [\"09:00\", \"11:00\", \"13:00\"],\n\t\"2026-04-22\": [\"14:00\", \"16:00\"],\n\t\"2026-04-23\": [\"10:00\", \"12:00\", \"14:00\"],\n\t\"2026-04-24\": [\"11:00\", \"13:00\", \"15:00\"],\n\t\"2026-04-27\": [\"10:00\"],\n\t\"2026-04-28\": [\"09:00\", \"11:30\"],\n\t\"2026-04-30\": [\"10:00\", \"15:00\"],\n\t\"2026-05-04\": [\"08:00\"],\n\t\"2026-05-05\": [\"10:00\"],\n\t\"2026-05-06\": [\"12:00\"],\n\t\"2026-05-07\": [\"matin\", \"après-midi\"]\n};\n"]}
1
+ {"version":3,"sources":["../src/trads/i18n.ts","../../../src/components/Form/js/select.ts","../src/js/Calendar.ts","../src/js/mockData.ts"],"names":["fr","en","initSelect","element","config","onChange","selectOptions","template","renderContent","data","conf","item","highlightedState","itemSelectable","placeholder","stateClass","activeAttr","disabledAttr","placeholderClass","itemChoice","itemDisabled","choiceAttr","choices","Choices","value","Calendar","container","options","startOfMonth","addMonths","subMonths","date","lang","monthName","year","start","startOfWeek","end","addDays","days","eachDayOfInterval","now","isPastMonth","canGoPrev","_","i","y","day","dateStr","format","isCurrentMonth","isSameMonth","isPast","startOfDay","isSelected","isInRange","isSameDay","isAvailable","isUnavailable","classes","e","yearSelect","selectedYear","el","m","d","MOCK_AVAILABILITY"],"mappings":"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","file":"index.js","sourcesContent":["export const fr = {\n\tmonths: [\n\t\t'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',\n\t\t'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'\n\t],\n\tdays: ['lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'],\n\treservation: {\n\t\tselectSlot: 'Sélectionner un horaire pour le',\n\t\tnoSlots: 'Pas de créneaux disponibles pour cette date.'\n\t}\n};\n\nexport const en = {\n\tmonths: [\n\t\t'January', 'February', 'March', 'April', 'May', 'June',\n\t\t'July', 'August', 'September', 'October', 'November', 'December'\n\t],\n\tdays: ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],\n\treservation: {\n\t\tselectSlot: 'Select a time slot for',\n\t\tnoSlots: 'No slots available for this date.'\n\t}\n};\n","import Choices from 'choices.js';\nimport 'flag-icons/css/flag-icons.min.css';\n\n/**\n * Initialise un sélecteur Choices.js générique.\n *\n * @param {HTMLSelectElement} element - L'élément select à transformer.\n * @param {any} config - Options de configuration de Choices.js.\n * @param {(value: string | string[]) => void} onChange - Callback lors du changement.\n * @returns {Choices} L'instance Choices.js.\n */\nexport const initSelect = (\n\telement: HTMLSelectElement,\n\tconfig: any = {},\n\tonChange?: (value: string | string[]) => void\n): Choices => {\n\tconst selectOptions: any = {\n\t\titemSelectText: '',\n\t\tremoveItemButton: config.removeItemButton || false,\n\t\tsearchEnabled: config.searchEnabled !== undefined ? config.searchEnabled : true,\n\t\tshouldSort: false,\n\t\tplaceholder: true,\n\t\tplaceholderValue: config.placeholderValue || 'Sélectionnez une option',\n\t\t...config\n\t};\n\n\t// Gestion du rendu des drapeaux pour la variante 'country'\n\tif (config.variant === 'country') {\n\t\tselectOptions.callbackOnCreateTemplates = (template: any) => {\n\t\t\tconst renderContent = (data: any) => {\n\t\t\t\tif (data.placeholder || !data.customProperties?.flag) return `<span>${data.label}</span>`;\n\t\t\t\treturn `<span class=\"fi fi-${data.customProperties.flag} select__flag\"></span> <span>${data.label}</span>`;\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\titem: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, highlightedState, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.highlighted ? highlightedState : itemSelectable;\n\t\t\t\t\tconst activeAttr = data.active ? 'aria-selected=\"true\"' : '';\n\t\t\t\t\tconst disabledAttr = data.disabled ? 'aria-disabled=\"true\"' : '';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${stateClass} ${placeholderClass}\" data-item data-id=\"${data.id}\" data-value=\"${data.value}\" ${activeAttr} ${disabledAttr}>\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t\tchoice: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, itemChoice, itemDisabled, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.disabled ? itemDisabled : itemSelectable;\n\t\t\t\t\tconst choiceAttr = data.disabled ? 'data-choice-disabled aria-disabled=\"true\"' : 'data-choice-selectable';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${itemChoice} ${stateClass} ${placeholderClass}\" data-select-text=\"${conf.itemSelectText}\" data-choice ${choiceAttr} data-id=\"${data.id}\" data-value=\"${data.value}\" role=\"option\">\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t}\n\n\tconst choices = new Choices(element, selectOptions);\n\n\tif (onChange) {\n\t\telement.addEventListener('change', () => {\n\t\t\tconst value = choices.getValue(true);\n\t\t\tonChange(value);\n\t\t});\n\t}\n\n\treturn choices;\n};\n","import {\n\tformat,\n\taddMonths,\n\tsubMonths,\n\tstartOfMonth,\n\tstartOfWeek,\n\teachDayOfInterval,\n\tisSameMonth,\n\tisSameDay,\n\tstartOfDay,\n\taddDays,\n} from 'date-fns';\nimport { fr, en } from '../trads/i18n';\nimport { initSelect } from '../../../../src/components/Form/js/select';\n\nexport interface CalendarOptions {\n\tlang?: 'fr' | 'en';\n\tmode?: 'single' | 'range';\n\tdisablePast?: boolean;\n\tavailability?: Record<string, string[]>;\n\tonDateSelect?: (date: Date) => void;\n\tonRangeSelect?: (start: Date, end: Date) => void;\n\tinitialDate?: Date;\n}\n\n/**\n * Composant Calendrier Vanilla JS.\n */\nexport class Calendar {\n\tprivate container: HTMLElement;\n\tprivate currentMonth: Date;\n\tprivate selectedDate: Date | null = null;\n\tprivate startDate: Date | null = null;\n\tprivate endDate: Date | null = null;\n\tprivate options: Required<CalendarOptions>;\n\tprivate trads: any;\n\n\t/**\n\t * @param {HTMLElement} container - Élément DOM où injecter le calendrier.\n\t * @param {CalendarOptions} options - Options de configuration.\n\t */\n\tconstructor(container: HTMLElement, options: CalendarOptions = {}) {\n\t\tthis.container = container;\n\t\tthis.options = {\n\t\t\tlang: 'fr',\n\t\t\tmode: 'single',\n\t\t\tdisablePast: false,\n\t\t\tavailability: {},\n\t\t\tonDateSelect: () => {},\n\t\t\tonRangeSelect: () => {},\n\t\t\tinitialDate: new Date(),\n\t\t\t...(options as any)\n\t\t};\n\t\t// On s'assure d'être au début du mois pour les calculs\n\t\tthis.currentMonth = startOfMonth(this.options.initialDate);\n\t\tthis.trads = this.options.lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois suivant.\n\t */\n\tpublic nextMonth(): void {\n\t\tthis.currentMonth = addMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois précédent.\n\t */\n\tpublic prevMonth(): void {\n\t\tthis.currentMonth = subMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Sélectionne une date ou gère la plage.\n\t * @param {Date} date - La date à sélectionner.\n\t */\n\tpublic selectDate(date: Date): void {\n\t\tif (this.options.mode === 'single') {\n\t\t\tthis.selectedDate = date;\n\t\t\tthis.options.onDateSelect(date);\n\t\t} else {\n\t\t\t// Mode Range\n\t\t\tif (!this.startDate || (this.startDate && this.endDate)) {\n\t\t\t\tthis.startDate = date;\n\t\t\t\tthis.endDate = null;\n\t\t\t} else {\n\t\t\t\t// Assurer que startDate < endDate\n\t\t\t\tif (date < this.startDate) {\n\t\t\t\t\tthis.endDate = this.startDate;\n\t\t\t\t\tthis.startDate = date;\n\t\t\t\t} else {\n\t\t\t\t\tthis.endDate = date;\n\t\t\t\t}\n\t\t\t\tthis.options.onRangeSelect(this.startDate, this.endDate);\n\t\t\t}\n\t\t}\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Change la langue du calendrier.\n\t * @param {string} lang - 'fr' ou 'en'.\n\t */\n\tpublic setLanguage(lang: 'fr' | 'en'): void {\n\t\tthis.options.lang = lang;\n\t\tthis.trads = lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Rendu HTML du calendrier.\n\t */\n\tprivate render(): void {\n\t\tconst monthName = this.trads.months[this.currentMonth.getMonth()];\n\t\tconst year = this.currentMonth.getFullYear();\n\n\t\t// Intervalle de 42 jours (6 semaines fixes) pour garantir une hauteur identique mois après mois\n\t\tconst start = startOfWeek(startOfMonth(this.currentMonth), { weekStartsOn: 1 });\n\t\tconst end = addDays(start, 41);\n\t\tconst days = eachDayOfInterval({ start, end });\n\t\tconst now = new Date();\n\t\tconst isPastMonth = startOfMonth(this.currentMonth) <= startOfMonth(now);\n\t\tconst canGoPrev = !this.options.disablePast || !isPastMonth;\n\n\t\tthis.container.innerHTML = `\n\t\t\t<div class=\"calendar\">\n\t\t\t\t<div class=\"calendar__header\">\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"prev\" aria-label=\"Mois précédent\" ${!canGoPrev ? 'disabled style=\"opacity: 0.3; cursor: default;\"' : ''}>\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<span class=\"calendar__header--month\">${monthName}</span>\n\t\t\t\t\t<div class=\"calendar__header--year-wrapper\">\n\t\t\t\t\t\t<select class=\"calendar__header--year-select\">\n\t\t\t\t\t\t\t${Array.from({ length: 71 }, (_, i) => year - 50 + i)\n\t\t\t\t\t\t\t\t.filter(y => !this.options.disablePast || y >= now.getFullYear())\n\t\t\t\t\t\t\t\t.map(y => `\n\t\t\t\t\t\t\t\t\t<option value=\"${y}\" ${y === year ? 'selected' : ''}>${y}</option>\n\t\t\t\t\t\t\t\t`).join('')}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"next\" aria-label=\"Mois suivant\">\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__body\">\n\t\t\t\t<div class=\"calendar__weekdays\">\n\t\t\t\t\t${this.trads.days.map((day: string) => `<span>${day}</span>`).join('')}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__days\">\n\t\t\t\t\t${days.map((day: Date) => {\n\t\t\t\t\t\tconst dateStr = format(day, 'yyyy-MM-dd');\n\t\t\t\t\t\tconst isCurrentMonth = isSameMonth(day, this.currentMonth);\n\t\t\t\t\t\tconst isPast = day < startOfDay(now);\n\t\t\t\t\t\tlet isSelected = false;\n\t\t\t\t\t\tlet isInRange = false;\n\n\t\t\t\t\t\tif (this.options.mode === 'single') {\n\t\t\t\t\t\t\tisSelected = !!(this.selectedDate && isSameDay(day, this.selectedDate));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tisSelected = !!((this.startDate && isSameDay(day, this.startDate)) || (this.endDate && isSameDay(day, this.endDate)));\n\t\t\t\t\t\t\tif (this.startDate && this.endDate) {\n\t\t\t\t\t\t\t\tisInRange = day > this.startDate && day < this.endDate;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAvailable = !!this.options.availability[dateStr];\n\t\t\t\t\t\t// Si des disponibilités sont définies, les jours sans créneau sont désactivés\n\t\t\t\t\t\tconst hasAvailabilityDefined = Object.keys(this.options.availability).length > 0;\n\t\t\t\t\t\tconst isUnavailable = hasAvailabilityDefined && !isAvailable;\n\n\t\t\t\t\t\tlet classes = ['calendar__day'];\n\t\t\t\t\t\tif (isCurrentMonth) classes.push('calendar__day--current-month');\n\t\t\t\t\t\telse classes.push('calendar__day--other-month');\n\n\t\t\t\t\t\tif (isPast) classes.push('calendar__day--past');\n\t\t\t\t\t\tif (isSelected) classes.push('calendar__day--selected');\n\t\t\t\t\t\tif (isInRange) classes.push('calendar__day--range');\n\t\t\t\t\t\tif (isAvailable) classes.push('calendar__day--available');\n\n\t\t\t\t\t\t// Désactiver : hors mois courant, passé, ou non disponible\n\t\t\t\t\t\tif (!isCurrentMonth || isPast || isUnavailable) classes.push('calendar__day--disabled');\n\n\t\t\t\t\t\treturn `<div class=\"${classes.join(' ')}\" data-date=\"${dateStr}\" role=\"button\" tabindex=\"0\">${day.getDate()}</div>`;\n\t\t\t\t\t}).join('')}\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.bindEvents();\n\t}\n\n\t/**\n\t * Attache les événements DOM.\n\t */\n\tprivate bindEvents(): void {\n\t\tconst prevBtn = this.container.querySelector('[data-action=\"prev\"]');\n\t\tprevBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.prevMonth();\n\t\t});\n\n\t\tconst nextBtn = this.container.querySelector('[data-action=\"next\"]');\n\t\tnextBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.nextMonth();\n\t\t});\n\n\t\tconst yearSelect = this.container.querySelector('.calendar__header--year-select') as HTMLSelectElement;\n\t\tif (yearSelect) {\n\t\t\tinitSelect(yearSelect, {\n\t\t\t\tsearchEnabled: false,\n\t\t\t\titemSelectText: ''\n\t\t\t}, (value) => {\n\t\t\t\tconst selectedYear = parseInt(value as string, 10);\n\t\t\t\tthis.currentMonth = new Date(selectedYear, this.currentMonth.getMonth(), 1);\n\t\t\t\tthis.render();\n\t\t\t});\n\t\t}\n\n\t\tconst dayEls = this.container.querySelectorAll('.calendar__day:not(.calendar__day--disabled)');\n\t\tdayEls.forEach(el => {\n\t\t\tel.addEventListener('click', () => {\n\t\t\t\tconst dateStr = el.getAttribute('data-date');\n\t\t\t\tif (dateStr) {\n\t\t\t\t\t// Splitting to avoid TZ issues with new Date(string)\n\t\t\t\t\tconst [y, m, d] = dateStr.split('-').map(Number);\n\t\t\t\t\tthis.selectDate(new Date(y, m - 1, d));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n","/**\n * Données factices pour les disponibilités.\n */\nexport const MOCK_AVAILABILITY = {\n\t\"2026-04-02\": [\"10:00\", \"12:00\", \"13:30\", \"15:00\", \"19:00\"],\n\t\"2026-04-03\": [\"08:00\", \"09:00\", \"11:30\", \"14:00\"],\n\t\"2026-04-08\": [\"09:00\", \"10:00\", \"11:00\", \"15:00\", \"17:00\"],\n\t\"2026-04-09\": [\"14:00\", \"15:00\", \"16:30\"],\n\t\"2026-04-13\": [\"09:00\", \"10:30\", \"12:00\"],\n\t\"2026-04-14\": [\"11:00\", \"12:30\", \"14:00\", \"15:30\"],\n\t\"2026-04-15\": [\"10:00\", \"13:00\", \"15:00\"],\n\t\"2026-04-17\": [\"11:00\", \"13:00\", \"15:00\", \"17:00\"],\n\t\"2026-04-21\": [\"09:00\", \"11:00\", \"13:00\"],\n\t\"2026-04-22\": [\"14:00\", \"16:00\"],\n\t\"2026-04-23\": [\"10:00\", \"12:00\", \"14:00\"],\n\t\"2026-04-24\": [\"11:00\", \"13:00\", \"15:00\"],\n\t\"2026-04-27\": [\"10:00\"],\n\t\"2026-04-28\": [\"09:00\", \"11:30\"],\n\t\"2026-04-30\": [\"10:00\", \"15:00\"],\n\t\"2026-05-04\": [\"08:00\"],\n\t\"2026-05-05\": [\"10:00\"],\n\t\"2026-05-06\": [\"12:00\"],\n\t\"2026-05-07\": [\"matin\", \"après-midi\"]\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/trads/i18n.ts","../../../../src/components/Form/js/select.ts","../../src/js/Calendar.ts","../../src/react/Calendar.tsx"],"names":["fr","en","initSelect","element","config","onChange","selectOptions","template","renderContent","data","conf","item","highlightedState","itemSelectable","placeholder","stateClass","activeAttr","disabledAttr","placeholderClass","itemChoice","itemDisabled","choiceAttr","choices","Choices","value","Calendar","container","options","startOfMonth","addMonths","subMonths","date","lang","monthName","year","start","startOfWeek","end","addDays","days","eachDayOfInterval","now","isPastMonth","canGoPrev","_","i","y","day","dateStr","format","isCurrentMonth","isSameMonth","isPast","startOfDay","isSelected","isInRange","isSameDay","isAvailable","isUnavailable","classes","e","yearSelect","selectedYear","el","m","d","mode","disablePast","availability","onDateSelect","onRangeSelect","initialDate","className","containerRef","useRef","calendarInstance","useEffect","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["export const fr = {\n\tmonths: [\n\t\t'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',\n\t\t'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'\n\t],\n\tdays: ['lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'],\n\treservation: {\n\t\tselectSlot: 'Sélectionner un horaire pour le',\n\t\tnoSlots: 'Pas de créneaux disponibles pour cette date.'\n\t}\n};\n\nexport const en = {\n\tmonths: [\n\t\t'January', 'February', 'March', 'April', 'May', 'June',\n\t\t'July', 'August', 'September', 'October', 'November', 'December'\n\t],\n\tdays: ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],\n\treservation: {\n\t\tselectSlot: 'Select a time slot for',\n\t\tnoSlots: 'No slots available for this date.'\n\t}\n};\n","import Choices from 'choices.js';\nimport 'flag-icons/css/flag-icons.min.css';\n\n/**\n * Initialise un sélecteur Choices.js générique.\n *\n * @param {HTMLSelectElement} element - L'élément select à transformer.\n * @param {any} config - Options de configuration de Choices.js.\n * @param {(value: string | string[]) => void} onChange - Callback lors du changement.\n * @returns {Choices} L'instance Choices.js.\n */\nexport const initSelect = (\n\telement: HTMLSelectElement,\n\tconfig: any = {},\n\tonChange?: (value: string | string[]) => void\n): Choices => {\n\tconst selectOptions: any = {\n\t\titemSelectText: '',\n\t\tremoveItemButton: config.removeItemButton || false,\n\t\tsearchEnabled: config.searchEnabled !== undefined ? config.searchEnabled : true,\n\t\tshouldSort: false,\n\t\tplaceholder: true,\n\t\tplaceholderValue: config.placeholderValue || 'Sélectionnez une option',\n\t\t...config\n\t};\n\n\t// Gestion du rendu des drapeaux pour la variante 'country'\n\tif (config.variant === 'country') {\n\t\tselectOptions.callbackOnCreateTemplates = (template: any) => {\n\t\t\tconst renderContent = (data: any) => {\n\t\t\t\tif (data.placeholder || !data.customProperties?.flag) return `<span>${data.label}</span>`;\n\t\t\t\treturn `<span class=\"fi fi-${data.customProperties.flag} select__flag\"></span> <span>${data.label}</span>`;\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\titem: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, highlightedState, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.highlighted ? highlightedState : itemSelectable;\n\t\t\t\t\tconst activeAttr = data.active ? 'aria-selected=\"true\"' : '';\n\t\t\t\t\tconst disabledAttr = data.disabled ? 'aria-disabled=\"true\"' : '';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${stateClass} ${placeholderClass}\" data-item data-id=\"${data.id}\" data-value=\"${data.value}\" ${activeAttr} ${disabledAttr}>\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t\tchoice: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, itemChoice, itemDisabled, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.disabled ? itemDisabled : itemSelectable;\n\t\t\t\t\tconst choiceAttr = data.disabled ? 'data-choice-disabled aria-disabled=\"true\"' : 'data-choice-selectable';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${itemChoice} ${stateClass} ${placeholderClass}\" data-select-text=\"${conf.itemSelectText}\" data-choice ${choiceAttr} data-id=\"${data.id}\" data-value=\"${data.value}\" role=\"option\">\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t}\n\n\tconst choices = new Choices(element, selectOptions);\n\n\tif (onChange) {\n\t\telement.addEventListener('change', () => {\n\t\t\tconst value = choices.getValue(true);\n\t\t\tonChange(value);\n\t\t});\n\t}\n\n\treturn choices;\n};\n","import {\n\tformat,\n\taddMonths,\n\tsubMonths,\n\tstartOfMonth,\n\tstartOfWeek,\n\teachDayOfInterval,\n\tisSameMonth,\n\tisSameDay,\n\tstartOfDay,\n\taddDays,\n} from 'date-fns';\nimport { fr, en } from '../trads/i18n';\nimport { initSelect } from '../../../../src/components/Form/js/select';\n\nexport interface CalendarOptions {\n\tlang?: 'fr' | 'en';\n\tmode?: 'single' | 'range';\n\tdisablePast?: boolean;\n\tavailability?: Record<string, string[]>;\n\tonDateSelect?: (date: Date) => void;\n\tonRangeSelect?: (start: Date, end: Date) => void;\n\tinitialDate?: Date;\n}\n\n/**\n * Composant Calendrier Vanilla JS.\n */\nexport class Calendar {\n\tprivate container: HTMLElement;\n\tprivate currentMonth: Date;\n\tprivate selectedDate: Date | null = null;\n\tprivate startDate: Date | null = null;\n\tprivate endDate: Date | null = null;\n\tprivate options: Required<CalendarOptions>;\n\tprivate trads: any;\n\n\t/**\n\t * @param {HTMLElement} container - Élément DOM où injecter le calendrier.\n\t * @param {CalendarOptions} options - Options de configuration.\n\t */\n\tconstructor(container: HTMLElement, options: CalendarOptions = {}) {\n\t\tthis.container = container;\n\t\tthis.options = {\n\t\t\tlang: 'fr',\n\t\t\tmode: 'single',\n\t\t\tdisablePast: false,\n\t\t\tavailability: {},\n\t\t\tonDateSelect: () => {},\n\t\t\tonRangeSelect: () => {},\n\t\t\tinitialDate: new Date(),\n\t\t\t...(options as any)\n\t\t};\n\t\t// On s'assure d'être au début du mois pour les calculs\n\t\tthis.currentMonth = startOfMonth(this.options.initialDate);\n\t\tthis.trads = this.options.lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois suivant.\n\t */\n\tpublic nextMonth(): void {\n\t\tthis.currentMonth = addMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois précédent.\n\t */\n\tpublic prevMonth(): void {\n\t\tthis.currentMonth = subMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Sélectionne une date ou gère la plage.\n\t * @param {Date} date - La date à sélectionner.\n\t */\n\tpublic selectDate(date: Date): void {\n\t\tif (this.options.mode === 'single') {\n\t\t\tthis.selectedDate = date;\n\t\t\tthis.options.onDateSelect(date);\n\t\t} else {\n\t\t\t// Mode Range\n\t\t\tif (!this.startDate || (this.startDate && this.endDate)) {\n\t\t\t\tthis.startDate = date;\n\t\t\t\tthis.endDate = null;\n\t\t\t} else {\n\t\t\t\t// Assurer que startDate < endDate\n\t\t\t\tif (date < this.startDate) {\n\t\t\t\t\tthis.endDate = this.startDate;\n\t\t\t\t\tthis.startDate = date;\n\t\t\t\t} else {\n\t\t\t\t\tthis.endDate = date;\n\t\t\t\t}\n\t\t\t\tthis.options.onRangeSelect(this.startDate, this.endDate);\n\t\t\t}\n\t\t}\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Change la langue du calendrier.\n\t * @param {string} lang - 'fr' ou 'en'.\n\t */\n\tpublic setLanguage(lang: 'fr' | 'en'): void {\n\t\tthis.options.lang = lang;\n\t\tthis.trads = lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Rendu HTML du calendrier.\n\t */\n\tprivate render(): void {\n\t\tconst monthName = this.trads.months[this.currentMonth.getMonth()];\n\t\tconst year = this.currentMonth.getFullYear();\n\n\t\t// Intervalle de 42 jours (6 semaines fixes) pour garantir une hauteur identique mois après mois\n\t\tconst start = startOfWeek(startOfMonth(this.currentMonth), { weekStartsOn: 1 });\n\t\tconst end = addDays(start, 41);\n\t\tconst days = eachDayOfInterval({ start, end });\n\t\tconst now = new Date();\n\t\tconst isPastMonth = startOfMonth(this.currentMonth) <= startOfMonth(now);\n\t\tconst canGoPrev = !this.options.disablePast || !isPastMonth;\n\n\t\tthis.container.innerHTML = `\n\t\t\t<div class=\"calendar\">\n\t\t\t\t<div class=\"calendar__header\">\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"prev\" aria-label=\"Mois précédent\" ${!canGoPrev ? 'disabled style=\"opacity: 0.3; cursor: default;\"' : ''}>\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<span class=\"calendar__header--month\">${monthName}</span>\n\t\t\t\t\t<div class=\"calendar__header--year-wrapper\">\n\t\t\t\t\t\t<select class=\"calendar__header--year-select\">\n\t\t\t\t\t\t\t${Array.from({ length: 71 }, (_, i) => year - 50 + i)\n\t\t\t\t\t\t\t\t.filter(y => !this.options.disablePast || y >= now.getFullYear())\n\t\t\t\t\t\t\t\t.map(y => `\n\t\t\t\t\t\t\t\t\t<option value=\"${y}\" ${y === year ? 'selected' : ''}>${y}</option>\n\t\t\t\t\t\t\t\t`).join('')}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"next\" aria-label=\"Mois suivant\">\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__body\">\n\t\t\t\t<div class=\"calendar__weekdays\">\n\t\t\t\t\t${this.trads.days.map((day: string) => `<span>${day}</span>`).join('')}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__days\">\n\t\t\t\t\t${days.map((day: Date) => {\n\t\t\t\t\t\tconst dateStr = format(day, 'yyyy-MM-dd');\n\t\t\t\t\t\tconst isCurrentMonth = isSameMonth(day, this.currentMonth);\n\t\t\t\t\t\tconst isPast = day < startOfDay(now);\n\t\t\t\t\t\tlet isSelected = false;\n\t\t\t\t\t\tlet isInRange = false;\n\n\t\t\t\t\t\tif (this.options.mode === 'single') {\n\t\t\t\t\t\t\tisSelected = !!(this.selectedDate && isSameDay(day, this.selectedDate));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tisSelected = !!((this.startDate && isSameDay(day, this.startDate)) || (this.endDate && isSameDay(day, this.endDate)));\n\t\t\t\t\t\t\tif (this.startDate && this.endDate) {\n\t\t\t\t\t\t\t\tisInRange = day > this.startDate && day < this.endDate;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAvailable = !!this.options.availability[dateStr];\n\t\t\t\t\t\t// Si des disponibilités sont définies, les jours sans créneau sont désactivés\n\t\t\t\t\t\tconst hasAvailabilityDefined = Object.keys(this.options.availability).length > 0;\n\t\t\t\t\t\tconst isUnavailable = hasAvailabilityDefined && !isAvailable;\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet classes = ['calendar__day'];\n\t\t\t\t\t\tif (isCurrentMonth) classes.push('calendar__day--current-month');\n\t\t\t\t\t\telse classes.push('calendar__day--other-month');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (isPast) classes.push('calendar__day--past');\n\t\t\t\t\t\tif (isSelected) classes.push('calendar__day--selected');\n\t\t\t\t\t\tif (isInRange) classes.push('calendar__day--range');\n\t\t\t\t\t\tif (isAvailable) classes.push('calendar__day--available');\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Désactiver : hors mois courant, passé, ou non disponible\n\t\t\t\t\t\tif (!isCurrentMonth || isPast || isUnavailable) classes.push('calendar__day--disabled');\n\n\t\t\t\t\t\treturn `<div class=\"${classes.join(' ')}\" data-date=\"${dateStr}\" role=\"button\" tabindex=\"0\">${day.getDate()}</div>`;\n\t\t\t\t\t}).join('')}\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.bindEvents();\n\t}\n\n\t/**\n\t * Attache les événements DOM.\n\t */\n\tprivate bindEvents(): void {\n\t\tconst prevBtn = this.container.querySelector('[data-action=\"prev\"]');\n\t\tprevBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.prevMonth();\n\t\t});\n\n\t\tconst nextBtn = this.container.querySelector('[data-action=\"next\"]');\n\t\tnextBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.nextMonth();\n\t\t});\n\n\t\tconst yearSelect = this.container.querySelector('.calendar__header--year-select') as HTMLSelectElement;\n\t\tif (yearSelect) {\n\t\t\tinitSelect(yearSelect, {\n\t\t\t\tsearchEnabled: false,\n\t\t\t\titemSelectText: '',\n\t\t\t}, (value) => {\n\t\t\t\tconst selectedYear = parseInt(value as string, 10);\n\t\t\t\tthis.currentMonth = new Date(selectedYear, this.currentMonth.getMonth(), 1);\n\t\t\t\tthis.render();\n\t\t\t});\n\t\t}\n\n\t\tconst dayEls = this.container.querySelectorAll('.calendar__day:not(.calendar__day--disabled)');\n\t\tdayEls.forEach(el => {\n\t\t\tel.addEventListener('click', () => {\n\t\t\t\tconst dateStr = el.getAttribute('data-date');\n\t\t\t\tif (dateStr) {\n\t\t\t\t\t// Splitting to avoid TZ issues with new Date(string)\n\t\t\t\t\tconst [y, m, d] = dateStr.split('-').map(Number);\n\t\t\t\t\tthis.selectDate(new Date(y, m - 1, d));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n","import { useEffect, useRef } from 'react';\nimport { Calendar as VanillaCalendar } from '../js/Calendar';\n\nexport interface CalendarProps {\n\tlang?: 'fr' | 'en';\n\tmode?: 'single' | 'range';\n\tdisablePast?: boolean;\n\tavailability?: Record<string, string[]>;\n\tonDateSelect?: (date: Date) => void;\n\tonRangeSelect?: (start: Date, end: Date) => void;\n\tinitialDate?: Date;\n\tclassName?: string;\n}\n\n/**\n * Wrapper React pour le composant Calendar.\n * @param {CalendarProps} props - Les propriétés du calendrier.\n * @returns {JSX.Element}\n */\nexport const Calendar = ({\n\tlang = 'fr',\n\tmode = 'single',\n\tdisablePast = false,\n\tavailability = {},\n\tonDateSelect,\n\tonRangeSelect,\n\tinitialDate,\n\tclassName = '',\n}: CalendarProps) => {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst calendarInstance = useRef<VanillaCalendar | null>(null);\n\n\tuseEffect(() => {\n\t\tif (containerRef.current && !calendarInstance.current) {\n\t\t\tcalendarInstance.current = new VanillaCalendar(containerRef.current, {\n\t\t\t\tlang,\n\t\t\t\tmode,\n\t\t\t\tdisablePast,\n\t\t\t\tavailability,\n\t\t\t\tonDateSelect,\n\t\t\t\tonRangeSelect,\n\t\t\t\tinitialDate,\n\t\t\t});\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (calendarInstance.current) {\n\t\t\tcalendarInstance.current.setLanguage(lang);\n\t\t}\n\t}, [lang]);\n\n\treturn <div ref={containerRef} className={`calendar-wrapper ${className}`} />;\n};\n"]}
1
+ {"version":3,"sources":["../../src/trads/i18n.ts","../../../../src/components/Form/js/select.ts","../../src/js/Calendar.ts","../../src/react/Calendar.tsx"],"names":["fr","en","initSelect","element","config","onChange","selectOptions","template","renderContent","data","conf","item","highlightedState","itemSelectable","placeholder","stateClass","activeAttr","disabledAttr","placeholderClass","itemChoice","itemDisabled","choiceAttr","choices","Choices","value","Calendar","container","options","startOfMonth","addMonths","subMonths","date","lang","monthName","year","start","startOfWeek","end","addDays","days","eachDayOfInterval","now","isPastMonth","canGoPrev","_","i","y","day","dateStr","format","isCurrentMonth","isSameMonth","isPast","startOfDay","isSelected","isInRange","isSameDay","isAvailable","isUnavailable","classes","e","yearSelect","selectedYear","el","m","d","mode","disablePast","availability","onDateSelect","onRangeSelect","initialDate","className","containerRef","useRef","calendarInstance","useEffect","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["export const fr = {\n\tmonths: [\n\t\t'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',\n\t\t'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'\n\t],\n\tdays: ['lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'],\n\treservation: {\n\t\tselectSlot: 'Sélectionner un horaire pour le',\n\t\tnoSlots: 'Pas de créneaux disponibles pour cette date.'\n\t}\n};\n\nexport const en = {\n\tmonths: [\n\t\t'January', 'February', 'March', 'April', 'May', 'June',\n\t\t'July', 'August', 'September', 'October', 'November', 'December'\n\t],\n\tdays: ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],\n\treservation: {\n\t\tselectSlot: 'Select a time slot for',\n\t\tnoSlots: 'No slots available for this date.'\n\t}\n};\n","import Choices from 'choices.js';\nimport 'flag-icons/css/flag-icons.min.css';\n\n/**\n * Initialise un sélecteur Choices.js générique.\n *\n * @param {HTMLSelectElement} element - L'élément select à transformer.\n * @param {any} config - Options de configuration de Choices.js.\n * @param {(value: string | string[]) => void} onChange - Callback lors du changement.\n * @returns {Choices} L'instance Choices.js.\n */\nexport const initSelect = (\n\telement: HTMLSelectElement,\n\tconfig: any = {},\n\tonChange?: (value: string | string[]) => void\n): Choices => {\n\tconst selectOptions: any = {\n\t\titemSelectText: '',\n\t\tremoveItemButton: config.removeItemButton || false,\n\t\tsearchEnabled: config.searchEnabled !== undefined ? config.searchEnabled : true,\n\t\tshouldSort: false,\n\t\tplaceholder: true,\n\t\tplaceholderValue: config.placeholderValue || 'Sélectionnez une option',\n\t\t...config\n\t};\n\n\t// Gestion du rendu des drapeaux pour la variante 'country'\n\tif (config.variant === 'country') {\n\t\tselectOptions.callbackOnCreateTemplates = (template: any) => {\n\t\t\tconst renderContent = (data: any) => {\n\t\t\t\tif (data.placeholder || !data.customProperties?.flag) return `<span>${data.label}</span>`;\n\t\t\t\treturn `<span class=\"fi fi-${data.customProperties.flag} select__flag\"></span> <span>${data.label}</span>`;\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\titem: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, highlightedState, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.highlighted ? highlightedState : itemSelectable;\n\t\t\t\t\tconst activeAttr = data.active ? 'aria-selected=\"true\"' : '';\n\t\t\t\t\tconst disabledAttr = data.disabled ? 'aria-disabled=\"true\"' : '';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${stateClass} ${placeholderClass}\" data-item data-id=\"${data.id}\" data-value=\"${data.value}\" ${activeAttr} ${disabledAttr}>\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t\tchoice: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, itemChoice, itemDisabled, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.disabled ? itemDisabled : itemSelectable;\n\t\t\t\t\tconst choiceAttr = data.disabled ? 'data-choice-disabled aria-disabled=\"true\"' : 'data-choice-selectable';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${itemChoice} ${stateClass} ${placeholderClass}\" data-select-text=\"${conf.itemSelectText}\" data-choice ${choiceAttr} data-id=\"${data.id}\" data-value=\"${data.value}\" role=\"option\">\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t}\n\n\tconst choices = new Choices(element, selectOptions);\n\n\tif (onChange) {\n\t\telement.addEventListener('change', () => {\n\t\t\tconst value = choices.getValue(true);\n\t\t\tonChange(value);\n\t\t});\n\t}\n\n\treturn choices;\n};\n","import {\n\tformat,\n\taddMonths,\n\tsubMonths,\n\tstartOfMonth,\n\tstartOfWeek,\n\teachDayOfInterval,\n\tisSameMonth,\n\tisSameDay,\n\tstartOfDay,\n\taddDays,\n} from 'date-fns';\nimport { fr, en } from '../trads/i18n';\nimport { initSelect } from '../../../../src/components/Form/js/select';\n\nexport interface CalendarOptions {\n\tlang?: 'fr' | 'en';\n\tmode?: 'single' | 'range';\n\tdisablePast?: boolean;\n\tavailability?: Record<string, string[]>;\n\tonDateSelect?: (date: Date) => void;\n\tonRangeSelect?: (start: Date, end: Date) => void;\n\tinitialDate?: Date;\n}\n\n/**\n * Composant Calendrier Vanilla JS.\n */\nexport class Calendar {\n\tprivate container: HTMLElement;\n\tprivate currentMonth: Date;\n\tprivate selectedDate: Date | null = null;\n\tprivate startDate: Date | null = null;\n\tprivate endDate: Date | null = null;\n\tprivate options: Required<CalendarOptions>;\n\tprivate trads: any;\n\n\t/**\n\t * @param {HTMLElement} container - Élément DOM où injecter le calendrier.\n\t * @param {CalendarOptions} options - Options de configuration.\n\t */\n\tconstructor(container: HTMLElement, options: CalendarOptions = {}) {\n\t\tthis.container = container;\n\t\tthis.options = {\n\t\t\tlang: 'fr',\n\t\t\tmode: 'single',\n\t\t\tdisablePast: false,\n\t\t\tavailability: {},\n\t\t\tonDateSelect: () => {},\n\t\t\tonRangeSelect: () => {},\n\t\t\tinitialDate: new Date(),\n\t\t\t...(options as any)\n\t\t};\n\t\t// On s'assure d'être au début du mois pour les calculs\n\t\tthis.currentMonth = startOfMonth(this.options.initialDate);\n\t\tthis.trads = this.options.lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois suivant.\n\t */\n\tpublic nextMonth(): void {\n\t\tthis.currentMonth = addMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois précédent.\n\t */\n\tpublic prevMonth(): void {\n\t\tthis.currentMonth = subMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Sélectionne une date ou gère la plage.\n\t * @param {Date} date - La date à sélectionner.\n\t */\n\tpublic selectDate(date: Date): void {\n\t\tif (this.options.mode === 'single') {\n\t\t\tthis.selectedDate = date;\n\t\t\tthis.options.onDateSelect(date);\n\t\t} else {\n\t\t\t// Mode Range\n\t\t\tif (!this.startDate || (this.startDate && this.endDate)) {\n\t\t\t\tthis.startDate = date;\n\t\t\t\tthis.endDate = null;\n\t\t\t} else {\n\t\t\t\t// Assurer que startDate < endDate\n\t\t\t\tif (date < this.startDate) {\n\t\t\t\t\tthis.endDate = this.startDate;\n\t\t\t\t\tthis.startDate = date;\n\t\t\t\t} else {\n\t\t\t\t\tthis.endDate = date;\n\t\t\t\t}\n\t\t\t\tthis.options.onRangeSelect(this.startDate, this.endDate);\n\t\t\t}\n\t\t}\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Change la langue du calendrier.\n\t * @param {string} lang - 'fr' ou 'en'.\n\t */\n\tpublic setLanguage(lang: 'fr' | 'en'): void {\n\t\tthis.options.lang = lang;\n\t\tthis.trads = lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Rendu HTML du calendrier.\n\t */\n\tprivate render(): void {\n\t\tconst monthName = this.trads.months[this.currentMonth.getMonth()];\n\t\tconst year = this.currentMonth.getFullYear();\n\n\t\t// Intervalle de 42 jours (6 semaines fixes) pour garantir une hauteur identique mois après mois\n\t\tconst start = startOfWeek(startOfMonth(this.currentMonth), { weekStartsOn: 1 });\n\t\tconst end = addDays(start, 41);\n\t\tconst days = eachDayOfInterval({ start, end });\n\t\tconst now = new Date();\n\t\tconst isPastMonth = startOfMonth(this.currentMonth) <= startOfMonth(now);\n\t\tconst canGoPrev = !this.options.disablePast || !isPastMonth;\n\n\t\tthis.container.innerHTML = `\n\t\t\t<div class=\"calendar\">\n\t\t\t\t<div class=\"calendar__header\">\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"prev\" aria-label=\"Mois précédent\" ${!canGoPrev ? 'disabled style=\"opacity: 0.3; cursor: default;\"' : ''}>\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<span class=\"calendar__header--month\">${monthName}</span>\n\t\t\t\t\t<div class=\"calendar__header--year-wrapper\">\n\t\t\t\t\t\t<select class=\"calendar__header--year-select\">\n\t\t\t\t\t\t\t${Array.from({ length: 71 }, (_, i) => year - 50 + i)\n\t\t\t\t\t\t\t\t.filter(y => !this.options.disablePast || y >= now.getFullYear())\n\t\t\t\t\t\t\t\t.map(y => `\n\t\t\t\t\t\t\t\t\t<option value=\"${y}\" ${y === year ? 'selected' : ''}>${y}</option>\n\t\t\t\t\t\t\t\t`).join('')}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"next\" aria-label=\"Mois suivant\">\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__body\">\n\t\t\t\t<div class=\"calendar__weekdays\">\n\t\t\t\t\t${this.trads.days.map((day: string) => `<span>${day}</span>`).join('')}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__days\">\n\t\t\t\t\t${days.map((day: Date) => {\n\t\t\t\t\t\tconst dateStr = format(day, 'yyyy-MM-dd');\n\t\t\t\t\t\tconst isCurrentMonth = isSameMonth(day, this.currentMonth);\n\t\t\t\t\t\tconst isPast = day < startOfDay(now);\n\t\t\t\t\t\tlet isSelected = false;\n\t\t\t\t\t\tlet isInRange = false;\n\n\t\t\t\t\t\tif (this.options.mode === 'single') {\n\t\t\t\t\t\t\tisSelected = !!(this.selectedDate && isSameDay(day, this.selectedDate));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tisSelected = !!((this.startDate && isSameDay(day, this.startDate)) || (this.endDate && isSameDay(day, this.endDate)));\n\t\t\t\t\t\t\tif (this.startDate && this.endDate) {\n\t\t\t\t\t\t\t\tisInRange = day > this.startDate && day < this.endDate;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAvailable = !!this.options.availability[dateStr];\n\t\t\t\t\t\t// Si des disponibilités sont définies, les jours sans créneau sont désactivés\n\t\t\t\t\t\tconst hasAvailabilityDefined = Object.keys(this.options.availability).length > 0;\n\t\t\t\t\t\tconst isUnavailable = hasAvailabilityDefined && !isAvailable;\n\n\t\t\t\t\t\tlet classes = ['calendar__day'];\n\t\t\t\t\t\tif (isCurrentMonth) classes.push('calendar__day--current-month');\n\t\t\t\t\t\telse classes.push('calendar__day--other-month');\n\n\t\t\t\t\t\tif (isPast) classes.push('calendar__day--past');\n\t\t\t\t\t\tif (isSelected) classes.push('calendar__day--selected');\n\t\t\t\t\t\tif (isInRange) classes.push('calendar__day--range');\n\t\t\t\t\t\tif (isAvailable) classes.push('calendar__day--available');\n\n\t\t\t\t\t\t// Désactiver : hors mois courant, passé, ou non disponible\n\t\t\t\t\t\tif (!isCurrentMonth || isPast || isUnavailable) classes.push('calendar__day--disabled');\n\n\t\t\t\t\t\treturn `<div class=\"${classes.join(' ')}\" data-date=\"${dateStr}\" role=\"button\" tabindex=\"0\">${day.getDate()}</div>`;\n\t\t\t\t\t}).join('')}\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.bindEvents();\n\t}\n\n\t/**\n\t * Attache les événements DOM.\n\t */\n\tprivate bindEvents(): void {\n\t\tconst prevBtn = this.container.querySelector('[data-action=\"prev\"]');\n\t\tprevBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.prevMonth();\n\t\t});\n\n\t\tconst nextBtn = this.container.querySelector('[data-action=\"next\"]');\n\t\tnextBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.nextMonth();\n\t\t});\n\n\t\tconst yearSelect = this.container.querySelector('.calendar__header--year-select') as HTMLSelectElement;\n\t\tif (yearSelect) {\n\t\t\tinitSelect(yearSelect, {\n\t\t\t\tsearchEnabled: false,\n\t\t\t\titemSelectText: ''\n\t\t\t}, (value) => {\n\t\t\t\tconst selectedYear = parseInt(value as string, 10);\n\t\t\t\tthis.currentMonth = new Date(selectedYear, this.currentMonth.getMonth(), 1);\n\t\t\t\tthis.render();\n\t\t\t});\n\t\t}\n\n\t\tconst dayEls = this.container.querySelectorAll('.calendar__day:not(.calendar__day--disabled)');\n\t\tdayEls.forEach(el => {\n\t\t\tel.addEventListener('click', () => {\n\t\t\t\tconst dateStr = el.getAttribute('data-date');\n\t\t\t\tif (dateStr) {\n\t\t\t\t\t// Splitting to avoid TZ issues with new Date(string)\n\t\t\t\t\tconst [y, m, d] = dateStr.split('-').map(Number);\n\t\t\t\t\tthis.selectDate(new Date(y, m - 1, d));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n","import { useEffect, useRef } from 'react';\nimport { Calendar as VanillaCalendar } from '../js/Calendar';\n\nexport interface CalendarProps {\n\tlang?: 'fr' | 'en';\n\tmode?: 'single' | 'range';\n\tdisablePast?: boolean;\n\tavailability?: Record<string, string[]>;\n\tonDateSelect?: (date: Date) => void;\n\tonRangeSelect?: (start: Date, end: Date) => void;\n\tinitialDate?: Date;\n\tclassName?: string;\n}\n\n/**\n * Wrapper React pour le composant Calendar.\n * @param {CalendarProps} props - Les propriétés du calendrier.\n * @returns {JSX.Element}\n */\nexport const Calendar = ({\n\tlang = 'fr',\n\tmode = 'single',\n\tdisablePast = false,\n\tavailability = {},\n\tonDateSelect,\n\tonRangeSelect,\n\tinitialDate,\n\tclassName = '',\n}: CalendarProps) => {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst calendarInstance = useRef<VanillaCalendar | null>(null);\n\n\tuseEffect(() => {\n\t\tif (containerRef.current && !calendarInstance.current) {\n\t\t\tcalendarInstance.current = new VanillaCalendar(containerRef.current, {\n\t\t\t\tlang,\n\t\t\t\tmode,\n\t\t\t\tdisablePast,\n\t\t\t\tavailability,\n\t\t\t\tonDateSelect,\n\t\t\t\tonRangeSelect,\n\t\t\t\tinitialDate,\n\t\t\t});\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (calendarInstance.current) {\n\t\t\tcalendarInstance.current.setLanguage(lang);\n\t\t}\n\t}, [lang]);\n\n\treturn <div ref={containerRef} className={`calendar-wrapper ${className}`} />;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/trads/i18n.ts","../../../../src/components/Form/js/select.ts","../../src/js/Calendar.ts","../../src/react/Calendar.tsx"],"names":["fr","en","initSelect","element","config","onChange","selectOptions","template","renderContent","data","conf","item","highlightedState","itemSelectable","placeholder","stateClass","activeAttr","disabledAttr","placeholderClass","itemChoice","itemDisabled","choiceAttr","choices","Choices","value","Calendar","container","options","startOfMonth","addMonths","subMonths","date","lang","monthName","year","start","startOfWeek","end","addDays","days","eachDayOfInterval","now","isPastMonth","canGoPrev","_","i","y","day","dateStr","format","isCurrentMonth","isSameMonth","isPast","startOfDay","isSelected","isInRange","isSameDay","isAvailable","isUnavailable","classes","e","yearSelect","selectedYear","el","m","d","mode","disablePast","availability","onDateSelect","onRangeSelect","initialDate","className","containerRef","useRef","calendarInstance","useEffect","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export const fr = {\n\tmonths: [\n\t\t'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',\n\t\t'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'\n\t],\n\tdays: ['lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'],\n\treservation: {\n\t\tselectSlot: 'Sélectionner un horaire pour le',\n\t\tnoSlots: 'Pas de créneaux disponibles pour cette date.'\n\t}\n};\n\nexport const en = {\n\tmonths: [\n\t\t'January', 'February', 'March', 'April', 'May', 'June',\n\t\t'July', 'August', 'September', 'October', 'November', 'December'\n\t],\n\tdays: ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],\n\treservation: {\n\t\tselectSlot: 'Select a time slot for',\n\t\tnoSlots: 'No slots available for this date.'\n\t}\n};\n","import Choices from 'choices.js';\nimport 'flag-icons/css/flag-icons.min.css';\n\n/**\n * Initialise un sélecteur Choices.js générique.\n *\n * @param {HTMLSelectElement} element - L'élément select à transformer.\n * @param {any} config - Options de configuration de Choices.js.\n * @param {(value: string | string[]) => void} onChange - Callback lors du changement.\n * @returns {Choices} L'instance Choices.js.\n */\nexport const initSelect = (\n\telement: HTMLSelectElement,\n\tconfig: any = {},\n\tonChange?: (value: string | string[]) => void\n): Choices => {\n\tconst selectOptions: any = {\n\t\titemSelectText: '',\n\t\tremoveItemButton: config.removeItemButton || false,\n\t\tsearchEnabled: config.searchEnabled !== undefined ? config.searchEnabled : true,\n\t\tshouldSort: false,\n\t\tplaceholder: true,\n\t\tplaceholderValue: config.placeholderValue || 'Sélectionnez une option',\n\t\t...config\n\t};\n\n\t// Gestion du rendu des drapeaux pour la variante 'country'\n\tif (config.variant === 'country') {\n\t\tselectOptions.callbackOnCreateTemplates = (template: any) => {\n\t\t\tconst renderContent = (data: any) => {\n\t\t\t\tif (data.placeholder || !data.customProperties?.flag) return `<span>${data.label}</span>`;\n\t\t\t\treturn `<span class=\"fi fi-${data.customProperties.flag} select__flag\"></span> <span>${data.label}</span>`;\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\titem: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, highlightedState, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.highlighted ? highlightedState : itemSelectable;\n\t\t\t\t\tconst activeAttr = data.active ? 'aria-selected=\"true\"' : '';\n\t\t\t\t\tconst disabledAttr = data.disabled ? 'aria-disabled=\"true\"' : '';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${stateClass} ${placeholderClass}\" data-item data-id=\"${data.id}\" data-value=\"${data.value}\" ${activeAttr} ${disabledAttr}>\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t\tchoice: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, itemChoice, itemDisabled, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.disabled ? itemDisabled : itemSelectable;\n\t\t\t\t\tconst choiceAttr = data.disabled ? 'data-choice-disabled aria-disabled=\"true\"' : 'data-choice-selectable';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${itemChoice} ${stateClass} ${placeholderClass}\" data-select-text=\"${conf.itemSelectText}\" data-choice ${choiceAttr} data-id=\"${data.id}\" data-value=\"${data.value}\" role=\"option\">\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t}\n\n\tconst choices = new Choices(element, selectOptions);\n\n\tif (onChange) {\n\t\telement.addEventListener('change', () => {\n\t\t\tconst value = choices.getValue(true);\n\t\t\tonChange(value);\n\t\t});\n\t}\n\n\treturn choices;\n};\n","import {\n\tformat,\n\taddMonths,\n\tsubMonths,\n\tstartOfMonth,\n\tstartOfWeek,\n\teachDayOfInterval,\n\tisSameMonth,\n\tisSameDay,\n\tstartOfDay,\n\taddDays,\n} from 'date-fns';\nimport { fr, en } from '../trads/i18n';\nimport { initSelect } from '../../../../src/components/Form/js/select';\n\nexport interface CalendarOptions {\n\tlang?: 'fr' | 'en';\n\tmode?: 'single' | 'range';\n\tdisablePast?: boolean;\n\tavailability?: Record<string, string[]>;\n\tonDateSelect?: (date: Date) => void;\n\tonRangeSelect?: (start: Date, end: Date) => void;\n\tinitialDate?: Date;\n}\n\n/**\n * Composant Calendrier Vanilla JS.\n */\nexport class Calendar {\n\tprivate container: HTMLElement;\n\tprivate currentMonth: Date;\n\tprivate selectedDate: Date | null = null;\n\tprivate startDate: Date | null = null;\n\tprivate endDate: Date | null = null;\n\tprivate options: Required<CalendarOptions>;\n\tprivate trads: any;\n\n\t/**\n\t * @param {HTMLElement} container - Élément DOM où injecter le calendrier.\n\t * @param {CalendarOptions} options - Options de configuration.\n\t */\n\tconstructor(container: HTMLElement, options: CalendarOptions = {}) {\n\t\tthis.container = container;\n\t\tthis.options = {\n\t\t\tlang: 'fr',\n\t\t\tmode: 'single',\n\t\t\tdisablePast: false,\n\t\t\tavailability: {},\n\t\t\tonDateSelect: () => {},\n\t\t\tonRangeSelect: () => {},\n\t\t\tinitialDate: new Date(),\n\t\t\t...(options as any)\n\t\t};\n\t\t// On s'assure d'être au début du mois pour les calculs\n\t\tthis.currentMonth = startOfMonth(this.options.initialDate);\n\t\tthis.trads = this.options.lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois suivant.\n\t */\n\tpublic nextMonth(): void {\n\t\tthis.currentMonth = addMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois précédent.\n\t */\n\tpublic prevMonth(): void {\n\t\tthis.currentMonth = subMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Sélectionne une date ou gère la plage.\n\t * @param {Date} date - La date à sélectionner.\n\t */\n\tpublic selectDate(date: Date): void {\n\t\tif (this.options.mode === 'single') {\n\t\t\tthis.selectedDate = date;\n\t\t\tthis.options.onDateSelect(date);\n\t\t} else {\n\t\t\t// Mode Range\n\t\t\tif (!this.startDate || (this.startDate && this.endDate)) {\n\t\t\t\tthis.startDate = date;\n\t\t\t\tthis.endDate = null;\n\t\t\t} else {\n\t\t\t\t// Assurer que startDate < endDate\n\t\t\t\tif (date < this.startDate) {\n\t\t\t\t\tthis.endDate = this.startDate;\n\t\t\t\t\tthis.startDate = date;\n\t\t\t\t} else {\n\t\t\t\t\tthis.endDate = date;\n\t\t\t\t}\n\t\t\t\tthis.options.onRangeSelect(this.startDate, this.endDate);\n\t\t\t}\n\t\t}\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Change la langue du calendrier.\n\t * @param {string} lang - 'fr' ou 'en'.\n\t */\n\tpublic setLanguage(lang: 'fr' | 'en'): void {\n\t\tthis.options.lang = lang;\n\t\tthis.trads = lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Rendu HTML du calendrier.\n\t */\n\tprivate render(): void {\n\t\tconst monthName = this.trads.months[this.currentMonth.getMonth()];\n\t\tconst year = this.currentMonth.getFullYear();\n\n\t\t// Intervalle de 42 jours (6 semaines fixes) pour garantir une hauteur identique mois après mois\n\t\tconst start = startOfWeek(startOfMonth(this.currentMonth), { weekStartsOn: 1 });\n\t\tconst end = addDays(start, 41);\n\t\tconst days = eachDayOfInterval({ start, end });\n\t\tconst now = new Date();\n\t\tconst isPastMonth = startOfMonth(this.currentMonth) <= startOfMonth(now);\n\t\tconst canGoPrev = !this.options.disablePast || !isPastMonth;\n\n\t\tthis.container.innerHTML = `\n\t\t\t<div class=\"calendar\">\n\t\t\t\t<div class=\"calendar__header\">\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"prev\" aria-label=\"Mois précédent\" ${!canGoPrev ? 'disabled style=\"opacity: 0.3; cursor: default;\"' : ''}>\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<span class=\"calendar__header--month\">${monthName}</span>\n\t\t\t\t\t<div class=\"calendar__header--year-wrapper\">\n\t\t\t\t\t\t<select class=\"calendar__header--year-select\">\n\t\t\t\t\t\t\t${Array.from({ length: 71 }, (_, i) => year - 50 + i)\n\t\t\t\t\t\t\t\t.filter(y => !this.options.disablePast || y >= now.getFullYear())\n\t\t\t\t\t\t\t\t.map(y => `\n\t\t\t\t\t\t\t\t\t<option value=\"${y}\" ${y === year ? 'selected' : ''}>${y}</option>\n\t\t\t\t\t\t\t\t`).join('')}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"next\" aria-label=\"Mois suivant\">\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__body\">\n\t\t\t\t<div class=\"calendar__weekdays\">\n\t\t\t\t\t${this.trads.days.map((day: string) => `<span>${day}</span>`).join('')}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__days\">\n\t\t\t\t\t${days.map((day: Date) => {\n\t\t\t\t\t\tconst dateStr = format(day, 'yyyy-MM-dd');\n\t\t\t\t\t\tconst isCurrentMonth = isSameMonth(day, this.currentMonth);\n\t\t\t\t\t\tconst isPast = day < startOfDay(now);\n\t\t\t\t\t\tlet isSelected = false;\n\t\t\t\t\t\tlet isInRange = false;\n\n\t\t\t\t\t\tif (this.options.mode === 'single') {\n\t\t\t\t\t\t\tisSelected = !!(this.selectedDate && isSameDay(day, this.selectedDate));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tisSelected = !!((this.startDate && isSameDay(day, this.startDate)) || (this.endDate && isSameDay(day, this.endDate)));\n\t\t\t\t\t\t\tif (this.startDate && this.endDate) {\n\t\t\t\t\t\t\t\tisInRange = day > this.startDate && day < this.endDate;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAvailable = !!this.options.availability[dateStr];\n\t\t\t\t\t\t// Si des disponibilités sont définies, les jours sans créneau sont désactivés\n\t\t\t\t\t\tconst hasAvailabilityDefined = Object.keys(this.options.availability).length > 0;\n\t\t\t\t\t\tconst isUnavailable = hasAvailabilityDefined && !isAvailable;\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet classes = ['calendar__day'];\n\t\t\t\t\t\tif (isCurrentMonth) classes.push('calendar__day--current-month');\n\t\t\t\t\t\telse classes.push('calendar__day--other-month');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (isPast) classes.push('calendar__day--past');\n\t\t\t\t\t\tif (isSelected) classes.push('calendar__day--selected');\n\t\t\t\t\t\tif (isInRange) classes.push('calendar__day--range');\n\t\t\t\t\t\tif (isAvailable) classes.push('calendar__day--available');\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Désactiver : hors mois courant, passé, ou non disponible\n\t\t\t\t\t\tif (!isCurrentMonth || isPast || isUnavailable) classes.push('calendar__day--disabled');\n\n\t\t\t\t\t\treturn `<div class=\"${classes.join(' ')}\" data-date=\"${dateStr}\" role=\"button\" tabindex=\"0\">${day.getDate()}</div>`;\n\t\t\t\t\t}).join('')}\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.bindEvents();\n\t}\n\n\t/**\n\t * Attache les événements DOM.\n\t */\n\tprivate bindEvents(): void {\n\t\tconst prevBtn = this.container.querySelector('[data-action=\"prev\"]');\n\t\tprevBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.prevMonth();\n\t\t});\n\n\t\tconst nextBtn = this.container.querySelector('[data-action=\"next\"]');\n\t\tnextBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.nextMonth();\n\t\t});\n\n\t\tconst yearSelect = this.container.querySelector('.calendar__header--year-select') as HTMLSelectElement;\n\t\tif (yearSelect) {\n\t\t\tinitSelect(yearSelect, {\n\t\t\t\tsearchEnabled: false,\n\t\t\t\titemSelectText: '',\n\t\t\t}, (value) => {\n\t\t\t\tconst selectedYear = parseInt(value as string, 10);\n\t\t\t\tthis.currentMonth = new Date(selectedYear, this.currentMonth.getMonth(), 1);\n\t\t\t\tthis.render();\n\t\t\t});\n\t\t}\n\n\t\tconst dayEls = this.container.querySelectorAll('.calendar__day:not(.calendar__day--disabled)');\n\t\tdayEls.forEach(el => {\n\t\t\tel.addEventListener('click', () => {\n\t\t\t\tconst dateStr = el.getAttribute('data-date');\n\t\t\t\tif (dateStr) {\n\t\t\t\t\t// Splitting to avoid TZ issues with new Date(string)\n\t\t\t\t\tconst [y, m, d] = dateStr.split('-').map(Number);\n\t\t\t\t\tthis.selectDate(new Date(y, m - 1, d));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n","import { useEffect, useRef } from 'react';\nimport { Calendar as VanillaCalendar } from '../js/Calendar';\n\nexport interface CalendarProps {\n\tlang?: 'fr' | 'en';\n\tmode?: 'single' | 'range';\n\tdisablePast?: boolean;\n\tavailability?: Record<string, string[]>;\n\tonDateSelect?: (date: Date) => void;\n\tonRangeSelect?: (start: Date, end: Date) => void;\n\tinitialDate?: Date;\n\tclassName?: string;\n}\n\n/**\n * Wrapper React pour le composant Calendar.\n * @param {CalendarProps} props - Les propriétés du calendrier.\n * @returns {JSX.Element}\n */\nexport const Calendar = ({\n\tlang = 'fr',\n\tmode = 'single',\n\tdisablePast = false,\n\tavailability = {},\n\tonDateSelect,\n\tonRangeSelect,\n\tinitialDate,\n\tclassName = '',\n}: CalendarProps) => {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst calendarInstance = useRef<VanillaCalendar | null>(null);\n\n\tuseEffect(() => {\n\t\tif (containerRef.current && !calendarInstance.current) {\n\t\t\tcalendarInstance.current = new VanillaCalendar(containerRef.current, {\n\t\t\t\tlang,\n\t\t\t\tmode,\n\t\t\t\tdisablePast,\n\t\t\t\tavailability,\n\t\t\t\tonDateSelect,\n\t\t\t\tonRangeSelect,\n\t\t\t\tinitialDate,\n\t\t\t});\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (calendarInstance.current) {\n\t\t\tcalendarInstance.current.setLanguage(lang);\n\t\t}\n\t}, [lang]);\n\n\treturn <div ref={containerRef} className={`calendar-wrapper ${className}`} />;\n};\n"]}
1
+ {"version":3,"sources":["../../src/trads/i18n.ts","../../../../src/components/Form/js/select.ts","../../src/js/Calendar.ts","../../src/react/Calendar.tsx"],"names":["fr","en","initSelect","element","config","onChange","selectOptions","template","renderContent","data","conf","item","highlightedState","itemSelectable","placeholder","stateClass","activeAttr","disabledAttr","placeholderClass","itemChoice","itemDisabled","choiceAttr","choices","Choices","value","Calendar","container","options","startOfMonth","addMonths","subMonths","date","lang","monthName","year","start","startOfWeek","end","addDays","days","eachDayOfInterval","now","isPastMonth","canGoPrev","_","i","y","day","dateStr","format","isCurrentMonth","isSameMonth","isPast","startOfDay","isSelected","isInRange","isSameDay","isAvailable","isUnavailable","classes","e","yearSelect","selectedYear","el","m","d","mode","disablePast","availability","onDateSelect","onRangeSelect","initialDate","className","containerRef","useRef","calendarInstance","useEffect","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export const fr = {\n\tmonths: [\n\t\t'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',\n\t\t'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'\n\t],\n\tdays: ['lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'],\n\treservation: {\n\t\tselectSlot: 'Sélectionner un horaire pour le',\n\t\tnoSlots: 'Pas de créneaux disponibles pour cette date.'\n\t}\n};\n\nexport const en = {\n\tmonths: [\n\t\t'January', 'February', 'March', 'April', 'May', 'June',\n\t\t'July', 'August', 'September', 'October', 'November', 'December'\n\t],\n\tdays: ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],\n\treservation: {\n\t\tselectSlot: 'Select a time slot for',\n\t\tnoSlots: 'No slots available for this date.'\n\t}\n};\n","import Choices from 'choices.js';\nimport 'flag-icons/css/flag-icons.min.css';\n\n/**\n * Initialise un sélecteur Choices.js générique.\n *\n * @param {HTMLSelectElement} element - L'élément select à transformer.\n * @param {any} config - Options de configuration de Choices.js.\n * @param {(value: string | string[]) => void} onChange - Callback lors du changement.\n * @returns {Choices} L'instance Choices.js.\n */\nexport const initSelect = (\n\telement: HTMLSelectElement,\n\tconfig: any = {},\n\tonChange?: (value: string | string[]) => void\n): Choices => {\n\tconst selectOptions: any = {\n\t\titemSelectText: '',\n\t\tremoveItemButton: config.removeItemButton || false,\n\t\tsearchEnabled: config.searchEnabled !== undefined ? config.searchEnabled : true,\n\t\tshouldSort: false,\n\t\tplaceholder: true,\n\t\tplaceholderValue: config.placeholderValue || 'Sélectionnez une option',\n\t\t...config\n\t};\n\n\t// Gestion du rendu des drapeaux pour la variante 'country'\n\tif (config.variant === 'country') {\n\t\tselectOptions.callbackOnCreateTemplates = (template: any) => {\n\t\t\tconst renderContent = (data: any) => {\n\t\t\t\tif (data.placeholder || !data.customProperties?.flag) return `<span>${data.label}</span>`;\n\t\t\t\treturn `<span class=\"fi fi-${data.customProperties.flag} select__flag\"></span> <span>${data.label}</span>`;\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\titem: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, highlightedState, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.highlighted ? highlightedState : itemSelectable;\n\t\t\t\t\tconst activeAttr = data.active ? 'aria-selected=\"true\"' : '';\n\t\t\t\t\tconst disabledAttr = data.disabled ? 'aria-disabled=\"true\"' : '';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${stateClass} ${placeholderClass}\" data-item data-id=\"${data.id}\" data-value=\"${data.value}\" ${activeAttr} ${disabledAttr}>\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t\tchoice: (conf: any, data: any) => {\n\t\t\t\t\tconst { item, itemChoice, itemDisabled, itemSelectable, placeholder } = conf.classNames;\n\t\t\t\t\tconst stateClass = data.disabled ? itemDisabled : itemSelectable;\n\t\t\t\t\tconst choiceAttr = data.disabled ? 'data-choice-disabled aria-disabled=\"true\"' : 'data-choice-selectable';\n\t\t\t\t\tconst placeholderClass = data.placeholder ? placeholder : '';\n\n\t\t\t\t\treturn template(`\n\t\t\t\t\t\t<div class=\"${item} ${itemChoice} ${stateClass} ${placeholderClass}\" data-select-text=\"${conf.itemSelectText}\" data-choice ${choiceAttr} data-id=\"${data.id}\" data-value=\"${data.value}\" role=\"option\">\n\t\t\t\t\t\t\t${renderContent(data)}\n\t\t\t\t\t\t</div>`.trim()) as any;\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t}\n\n\tconst choices = new Choices(element, selectOptions);\n\n\tif (onChange) {\n\t\telement.addEventListener('change', () => {\n\t\t\tconst value = choices.getValue(true);\n\t\t\tonChange(value);\n\t\t});\n\t}\n\n\treturn choices;\n};\n","import {\n\tformat,\n\taddMonths,\n\tsubMonths,\n\tstartOfMonth,\n\tstartOfWeek,\n\teachDayOfInterval,\n\tisSameMonth,\n\tisSameDay,\n\tstartOfDay,\n\taddDays,\n} from 'date-fns';\nimport { fr, en } from '../trads/i18n';\nimport { initSelect } from '../../../../src/components/Form/js/select';\n\nexport interface CalendarOptions {\n\tlang?: 'fr' | 'en';\n\tmode?: 'single' | 'range';\n\tdisablePast?: boolean;\n\tavailability?: Record<string, string[]>;\n\tonDateSelect?: (date: Date) => void;\n\tonRangeSelect?: (start: Date, end: Date) => void;\n\tinitialDate?: Date;\n}\n\n/**\n * Composant Calendrier Vanilla JS.\n */\nexport class Calendar {\n\tprivate container: HTMLElement;\n\tprivate currentMonth: Date;\n\tprivate selectedDate: Date | null = null;\n\tprivate startDate: Date | null = null;\n\tprivate endDate: Date | null = null;\n\tprivate options: Required<CalendarOptions>;\n\tprivate trads: any;\n\n\t/**\n\t * @param {HTMLElement} container - Élément DOM où injecter le calendrier.\n\t * @param {CalendarOptions} options - Options de configuration.\n\t */\n\tconstructor(container: HTMLElement, options: CalendarOptions = {}) {\n\t\tthis.container = container;\n\t\tthis.options = {\n\t\t\tlang: 'fr',\n\t\t\tmode: 'single',\n\t\t\tdisablePast: false,\n\t\t\tavailability: {},\n\t\t\tonDateSelect: () => {},\n\t\t\tonRangeSelect: () => {},\n\t\t\tinitialDate: new Date(),\n\t\t\t...(options as any)\n\t\t};\n\t\t// On s'assure d'être au début du mois pour les calculs\n\t\tthis.currentMonth = startOfMonth(this.options.initialDate);\n\t\tthis.trads = this.options.lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois suivant.\n\t */\n\tpublic nextMonth(): void {\n\t\tthis.currentMonth = addMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Passe au mois précédent.\n\t */\n\tpublic prevMonth(): void {\n\t\tthis.currentMonth = subMonths(this.currentMonth, 1);\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Sélectionne une date ou gère la plage.\n\t * @param {Date} date - La date à sélectionner.\n\t */\n\tpublic selectDate(date: Date): void {\n\t\tif (this.options.mode === 'single') {\n\t\t\tthis.selectedDate = date;\n\t\t\tthis.options.onDateSelect(date);\n\t\t} else {\n\t\t\t// Mode Range\n\t\t\tif (!this.startDate || (this.startDate && this.endDate)) {\n\t\t\t\tthis.startDate = date;\n\t\t\t\tthis.endDate = null;\n\t\t\t} else {\n\t\t\t\t// Assurer que startDate < endDate\n\t\t\t\tif (date < this.startDate) {\n\t\t\t\t\tthis.endDate = this.startDate;\n\t\t\t\t\tthis.startDate = date;\n\t\t\t\t} else {\n\t\t\t\t\tthis.endDate = date;\n\t\t\t\t}\n\t\t\t\tthis.options.onRangeSelect(this.startDate, this.endDate);\n\t\t\t}\n\t\t}\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Change la langue du calendrier.\n\t * @param {string} lang - 'fr' ou 'en'.\n\t */\n\tpublic setLanguage(lang: 'fr' | 'en'): void {\n\t\tthis.options.lang = lang;\n\t\tthis.trads = lang === 'fr' ? fr : en;\n\t\tthis.render();\n\t}\n\n\t/**\n\t * Rendu HTML du calendrier.\n\t */\n\tprivate render(): void {\n\t\tconst monthName = this.trads.months[this.currentMonth.getMonth()];\n\t\tconst year = this.currentMonth.getFullYear();\n\n\t\t// Intervalle de 42 jours (6 semaines fixes) pour garantir une hauteur identique mois après mois\n\t\tconst start = startOfWeek(startOfMonth(this.currentMonth), { weekStartsOn: 1 });\n\t\tconst end = addDays(start, 41);\n\t\tconst days = eachDayOfInterval({ start, end });\n\t\tconst now = new Date();\n\t\tconst isPastMonth = startOfMonth(this.currentMonth) <= startOfMonth(now);\n\t\tconst canGoPrev = !this.options.disablePast || !isPastMonth;\n\n\t\tthis.container.innerHTML = `\n\t\t\t<div class=\"calendar\">\n\t\t\t\t<div class=\"calendar__header\">\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"prev\" aria-label=\"Mois précédent\" ${!canGoPrev ? 'disabled style=\"opacity: 0.3; cursor: default;\"' : ''}>\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<span class=\"calendar__header--month\">${monthName}</span>\n\t\t\t\t\t<div class=\"calendar__header--year-wrapper\">\n\t\t\t\t\t\t<select class=\"calendar__header--year-select\">\n\t\t\t\t\t\t\t${Array.from({ length: 71 }, (_, i) => year - 50 + i)\n\t\t\t\t\t\t\t\t.filter(y => !this.options.disablePast || y >= now.getFullYear())\n\t\t\t\t\t\t\t\t.map(y => `\n\t\t\t\t\t\t\t\t\t<option value=\"${y}\" ${y === year ? 'selected' : ''}>${y}</option>\n\t\t\t\t\t\t\t\t`).join('')}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"calendar__header-btn\" data-action=\"next\" aria-label=\"Mois suivant\">\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__body\">\n\t\t\t\t<div class=\"calendar__weekdays\">\n\t\t\t\t\t${this.trads.days.map((day: string) => `<span>${day}</span>`).join('')}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"calendar__days\">\n\t\t\t\t\t${days.map((day: Date) => {\n\t\t\t\t\t\tconst dateStr = format(day, 'yyyy-MM-dd');\n\t\t\t\t\t\tconst isCurrentMonth = isSameMonth(day, this.currentMonth);\n\t\t\t\t\t\tconst isPast = day < startOfDay(now);\n\t\t\t\t\t\tlet isSelected = false;\n\t\t\t\t\t\tlet isInRange = false;\n\n\t\t\t\t\t\tif (this.options.mode === 'single') {\n\t\t\t\t\t\t\tisSelected = !!(this.selectedDate && isSameDay(day, this.selectedDate));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tisSelected = !!((this.startDate && isSameDay(day, this.startDate)) || (this.endDate && isSameDay(day, this.endDate)));\n\t\t\t\t\t\t\tif (this.startDate && this.endDate) {\n\t\t\t\t\t\t\t\tisInRange = day > this.startDate && day < this.endDate;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAvailable = !!this.options.availability[dateStr];\n\t\t\t\t\t\t// Si des disponibilités sont définies, les jours sans créneau sont désactivés\n\t\t\t\t\t\tconst hasAvailabilityDefined = Object.keys(this.options.availability).length > 0;\n\t\t\t\t\t\tconst isUnavailable = hasAvailabilityDefined && !isAvailable;\n\n\t\t\t\t\t\tlet classes = ['calendar__day'];\n\t\t\t\t\t\tif (isCurrentMonth) classes.push('calendar__day--current-month');\n\t\t\t\t\t\telse classes.push('calendar__day--other-month');\n\n\t\t\t\t\t\tif (isPast) classes.push('calendar__day--past');\n\t\t\t\t\t\tif (isSelected) classes.push('calendar__day--selected');\n\t\t\t\t\t\tif (isInRange) classes.push('calendar__day--range');\n\t\t\t\t\t\tif (isAvailable) classes.push('calendar__day--available');\n\n\t\t\t\t\t\t// Désactiver : hors mois courant, passé, ou non disponible\n\t\t\t\t\t\tif (!isCurrentMonth || isPast || isUnavailable) classes.push('calendar__day--disabled');\n\n\t\t\t\t\t\treturn `<div class=\"${classes.join(' ')}\" data-date=\"${dateStr}\" role=\"button\" tabindex=\"0\">${day.getDate()}</div>`;\n\t\t\t\t\t}).join('')}\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.bindEvents();\n\t}\n\n\t/**\n\t * Attache les événements DOM.\n\t */\n\tprivate bindEvents(): void {\n\t\tconst prevBtn = this.container.querySelector('[data-action=\"prev\"]');\n\t\tprevBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.prevMonth();\n\t\t});\n\n\t\tconst nextBtn = this.container.querySelector('[data-action=\"next\"]');\n\t\tnextBtn?.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.nextMonth();\n\t\t});\n\n\t\tconst yearSelect = this.container.querySelector('.calendar__header--year-select') as HTMLSelectElement;\n\t\tif (yearSelect) {\n\t\t\tinitSelect(yearSelect, {\n\t\t\t\tsearchEnabled: false,\n\t\t\t\titemSelectText: ''\n\t\t\t}, (value) => {\n\t\t\t\tconst selectedYear = parseInt(value as string, 10);\n\t\t\t\tthis.currentMonth = new Date(selectedYear, this.currentMonth.getMonth(), 1);\n\t\t\t\tthis.render();\n\t\t\t});\n\t\t}\n\n\t\tconst dayEls = this.container.querySelectorAll('.calendar__day:not(.calendar__day--disabled)');\n\t\tdayEls.forEach(el => {\n\t\t\tel.addEventListener('click', () => {\n\t\t\t\tconst dateStr = el.getAttribute('data-date');\n\t\t\t\tif (dateStr) {\n\t\t\t\t\t// Splitting to avoid TZ issues with new Date(string)\n\t\t\t\t\tconst [y, m, d] = dateStr.split('-').map(Number);\n\t\t\t\t\tthis.selectDate(new Date(y, m - 1, d));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n","import { useEffect, useRef } from 'react';\nimport { Calendar as VanillaCalendar } from '../js/Calendar';\n\nexport interface CalendarProps {\n\tlang?: 'fr' | 'en';\n\tmode?: 'single' | 'range';\n\tdisablePast?: boolean;\n\tavailability?: Record<string, string[]>;\n\tonDateSelect?: (date: Date) => void;\n\tonRangeSelect?: (start: Date, end: Date) => void;\n\tinitialDate?: Date;\n\tclassName?: string;\n}\n\n/**\n * Wrapper React pour le composant Calendar.\n * @param {CalendarProps} props - Les propriétés du calendrier.\n * @returns {JSX.Element}\n */\nexport const Calendar = ({\n\tlang = 'fr',\n\tmode = 'single',\n\tdisablePast = false,\n\tavailability = {},\n\tonDateSelect,\n\tonRangeSelect,\n\tinitialDate,\n\tclassName = '',\n}: CalendarProps) => {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst calendarInstance = useRef<VanillaCalendar | null>(null);\n\n\tuseEffect(() => {\n\t\tif (containerRef.current && !calendarInstance.current) {\n\t\t\tcalendarInstance.current = new VanillaCalendar(containerRef.current, {\n\t\t\t\tlang,\n\t\t\t\tmode,\n\t\t\t\tdisablePast,\n\t\t\t\tavailability,\n\t\t\t\tonDateSelect,\n\t\t\t\tonRangeSelect,\n\t\t\t\tinitialDate,\n\t\t\t});\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (calendarInstance.current) {\n\t\t\tcalendarInstance.current.setLanguage(lang);\n\t\t}\n\t}, [lang]);\n\n\treturn <div ref={containerRef} className={`calendar-wrapper ${className}`} />;\n};\n"]}
@@ -48,6 +48,9 @@
48
48
  .calendar__header--year-wrapper .choices::after {
49
49
  border-color: #fff transparent transparent transparent;
50
50
  }
51
+ .calendar__header--year-wrapper .choices[data-type*=select-one].is-open::after {
52
+ margin-top: -2.5px;
53
+ }
51
54
  .calendar__header--year-wrapper .choices__inner {
52
55
  border: none;
53
56
  font-size: var(--calendar-font-size);
@@ -85,6 +88,13 @@
85
88
  height: 24px;
86
89
  }
87
90
 
91
+ .calendar__header--year-wrapper .choices__inner {
92
+ padding: 0;
93
+ }
94
+ .calendar__header--year-wrapper .choices__inner .choices__list {
95
+ padding: 0 1.5rem;
96
+ }
97
+
88
98
  .calendar__weekdays {
89
99
  display: grid;
90
100
  grid-template-columns: repeat(7, 1fr);
@@ -111,6 +121,7 @@
111
121
  border: 1px solid transparent;
112
122
  position: relative;
113
123
  padding: 0.3rem;
124
+ line-height: 1;
114
125
  }
115
126
  .calendar__day:hover:not(.calendar__day--disabled):not(.calendar__day--selected) {
116
127
  background: var(--calendar-bg-hover);
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../src/style/_calendar.scss","../../src/style/_calendar-header.scss","../../src/style/_calendar-weekdays.scss","../../src/style/_calendar-days.scss","../../src/style/_calendar-day.scss"],"names":[],"mappings":"AAAA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;;AAGD;EACC;;;ACvBD;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIA;EACC;;AAEA;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;;;AAIF;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;EACA;;;ACjEF;EACC;EACA;EACA;EACA;EACA;EACA;;;ACND;EACC;EACA;EACA;;;ACHD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;;;AAIF;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA","file":"calendar.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../src/style/_calendar.scss","../../src/style/_calendar-header.scss","../../src/style/_calendar-weekdays.scss","../../src/style/_calendar-days.scss","../../src/style/_calendar-day.scss"],"names":[],"mappings":"AAAA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;;AAGD;EACC;;;ACvBD;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIA;EACC;;AAEA;EACC;;AAGD;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;;;AAIF;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;EACA;;;AAIF;EACC;;AAEA;EACC;;;AC7EF;EACC;EACA;EACA;EACA;EACA;EACA;;;ACND;EACC;EACA;EACA;;;ACHD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;;;AAIF;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA","file":"calendar.css"}
@@ -1 +1 @@
1
- .calendar{--calendar-light: var(--white);--calendar-bg: var(--calendar-light);--calendar-bg-hover: var(--accent);--calendar-header-bg: var(--primary);--calendar-header-text: var(--calendar-light);--calendar-border: transparent;--calendar-text: var(--primary);--calendar-text-hover: var(--calendar-light);--calendar-selected-bg: var(--accent);--calendar-selected-text: var(--calendar-light);--calendar-disabled-text: color-mix(in srgb, var(--calendar-text), transparent 25%);--calendar-available-border: var(--accent);--calendar-font-size: 1.2rem;--calendar-radius: var(--radius-base);font-family:var(--calendar-font);width:100%;background:var(--calendar-bg);user-select:none}.calendar__body{padding:1rem 1.5rem}.calendar__header{background:var(--calendar-header-bg);color:var(--calendar-header-text);padding:10px;display:flex;justify-content:space-between;align-items:center}.calendar__header--month{flex:1;text-align:center;display:flex;justify-content:center;align-items:center;width:90px;font-size:var(--calendar-font-size)}.calendar__header--year-wrapper .choices{margin-bottom:0}.calendar__header--year-wrapper .choices::after{border-color:#fff rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.calendar__header--year-wrapper .choices__inner{border:none;font-size:var(--calendar-font-size);border-radius:4px;min-height:auto;padding-top:5px;padding-bottom:5px}.calendar__header--year-wrapper .choices__list--dropdown{color:var(--calendar-text)}.calendar__header--year{font-weight:400;margin-left:8px;opacity:.8}.calendar__header-btn{background:none;border:none;color:inherit;cursor:pointer;padding:8px;display:flex;align-items:center;transition:all .2s;border-radius:50%}.calendar__header-btn:hover{background:hsla(0,0%,100%,.1)}.calendar__header-btn svg{width:24px;height:24px}.calendar__weekdays{display:grid;grid-template-columns:repeat(7, 1fr);text-align:center;padding-bottom:15px;color:#b0b0b0;font-size:16px}.calendar__days{display:grid;grid-template-columns:repeat(7, 1fr);gap:8px}.calendar__day{display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:var(--calendar-radius);color:var(--calendar-text);transition:all .3s cubic-bezier(0.4, 0, 0.2, 1);border:1px solid rgba(0,0,0,0);position:relative;padding:.3rem}.calendar__day:hover:not(.calendar__day--disabled):not(.calendar__day--selected){background:var(--calendar-bg-hover);color:var(--calendar-text-hover);transform:translateY(-2px)}.calendar__day--available{border:1px solid var(--calendar-available-border)}.calendar__day--selected{background:var(--calendar-selected-bg);color:var(--calendar-selected-text);border-color:var(--calendar-selected-bg);box-shadow:0 4px 10px rgba(76,175,80,.3);transform:scale(1.05);z-index:2}.calendar__day--range{background:color-mix(in srgb, var(--calendar-selected-bg), transparent 85%);color:var(--calendar-selected-bg);border-radius:0}.calendar__day--disabled{cursor:default;pointer-events:none;opacity:.3}.calendar__day--past{color:var(--calendar-disabled-text);text-decoration:line-through;opacity:.5;pointer-events:none;cursor:default}/*# sourceMappingURL=calendar.min.css.map */
1
+ .calendar{--calendar-light: var(--white);--calendar-bg: var(--calendar-light);--calendar-bg-hover: var(--accent);--calendar-header-bg: var(--primary);--calendar-header-text: var(--calendar-light);--calendar-border: transparent;--calendar-text: var(--primary);--calendar-text-hover: var(--calendar-light);--calendar-selected-bg: var(--accent);--calendar-selected-text: var(--calendar-light);--calendar-disabled-text: color-mix(in srgb, var(--calendar-text), transparent 25%);--calendar-available-border: var(--accent);--calendar-font-size: 1.2rem;--calendar-radius: var(--radius-base);font-family:var(--calendar-font);width:100%;background:var(--calendar-bg);user-select:none}.calendar__body{padding:1rem 1.5rem}.calendar__header{background:var(--calendar-header-bg);color:var(--calendar-header-text);padding:10px;display:flex;justify-content:space-between;align-items:center}.calendar__header--month{flex:1;text-align:center;display:flex;justify-content:center;align-items:center;width:90px;font-size:var(--calendar-font-size)}.calendar__header--year-wrapper .choices{margin-bottom:0}.calendar__header--year-wrapper .choices::after{border-color:#fff rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.calendar__header--year-wrapper .choices[data-type*=select-one].is-open::after{margin-top:-2.5px}.calendar__header--year-wrapper .choices__inner{border:none;font-size:var(--calendar-font-size);border-radius:4px;min-height:auto;padding-top:5px;padding-bottom:5px}.calendar__header--year-wrapper .choices__list--dropdown{color:var(--calendar-text)}.calendar__header--year{font-weight:400;margin-left:8px;opacity:.8}.calendar__header-btn{background:none;border:none;color:inherit;cursor:pointer;padding:8px;display:flex;align-items:center;transition:all .2s;border-radius:50%}.calendar__header-btn:hover{background:hsla(0,0%,100%,.1)}.calendar__header-btn svg{width:24px;height:24px}.calendar__header--year-wrapper .choices__inner{padding:0}.calendar__header--year-wrapper .choices__inner .choices__list{padding:0 1.5rem}.calendar__weekdays{display:grid;grid-template-columns:repeat(7, 1fr);text-align:center;padding-bottom:15px;color:#b0b0b0;font-size:16px}.calendar__days{display:grid;grid-template-columns:repeat(7, 1fr);gap:8px}.calendar__day{display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:var(--calendar-radius);color:var(--calendar-text);transition:all .3s cubic-bezier(0.4, 0, 0.2, 1);border:1px solid rgba(0,0,0,0);position:relative;padding:.3rem;line-height:1}.calendar__day:hover:not(.calendar__day--disabled):not(.calendar__day--selected){background:var(--calendar-bg-hover);color:var(--calendar-text-hover);transform:translateY(-2px)}.calendar__day--available{border:1px solid var(--calendar-available-border)}.calendar__day--selected{background:var(--calendar-selected-bg);color:var(--calendar-selected-text);border-color:var(--calendar-selected-bg);box-shadow:0 4px 10px rgba(76,175,80,.3);transform:scale(1.05);z-index:2}.calendar__day--range{background:color-mix(in srgb, var(--calendar-selected-bg), transparent 85%);color:var(--calendar-selected-bg);border-radius:0}.calendar__day--disabled{cursor:default;pointer-events:none;opacity:.3}.calendar__day--past{color:var(--calendar-disabled-text);text-decoration:line-through;opacity:.5;pointer-events:none;cursor:default}/*# sourceMappingURL=calendar.min.css.map */
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../src/style/_calendar.scss","../../src/style/_calendar-header.scss","../../src/style/_calendar-weekdays.scss","../../src/style/_calendar-days.scss","../../src/style/_calendar-day.scss"],"names":[],"mappings":"AAAA,UACC,+BACA,qCACA,mCACA,qCACA,8CACA,+BACA,gCACA,6CACA,sCACA,gDACA,oFACA,2CACA,6BACA,sCAEA,iCACA,WACA,8BACA,iBAGD,gBACC,oBCvBD,kBACC,qCACA,kCACA,aACA,aACA,8BACA,mBAGD,yBACC,OACA,kBACA,aACA,uBACA,mBACA,WACA,oCAIA,yCACC,gBAEA,gDACC,4DAIF,gDACC,YACA,oCACA,kBACA,gBACA,gBACA,mBAGD,yDACC,2BAIF,wBACC,gBACA,gBACA,WAGD,sBACC,gBACA,YACA,cACA,eACA,YACA,aACA,mBACA,mBACA,kBAEA,4BACC,8BAGD,0BACC,WACA,YCjEF,oBACC,aACA,qCACA,kBACA,oBACA,cACA,eCND,gBACC,aACA,qCACA,QCHD,eACC,aACA,uBACA,mBACA,eACA,qCACA,2BACA,gDACA,+BACA,kBACA,cAEA,iFACC,oCACA,iCACA,2BAIF,0BACC,kDAGD,yBACC,uCACA,oCACA,yCACA,yCACA,sBACA,UAGD,sBACC,4EACA,kCACA,gBAGD,yBACC,eACA,oBACA,WAGD,qBACC,oCACA,6BACA,WACA,oBACA","file":"calendar.min.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../src/style/_calendar.scss","../../src/style/_calendar-header.scss","../../src/style/_calendar-weekdays.scss","../../src/style/_calendar-days.scss","../../src/style/_calendar-day.scss"],"names":[],"mappings":"AAAA,UACC,+BACA,qCACA,mCACA,qCACA,8CACA,+BACA,gCACA,6CACA,sCACA,gDACA,oFACA,2CACA,6BACA,sCAEA,iCACA,WACA,8BACA,iBAGD,gBACC,oBCvBD,kBACC,qCACA,kCACA,aACA,aACA,8BACA,mBAGD,yBACC,OACA,kBACA,aACA,uBACA,mBACA,WACA,oCAIA,yCACC,gBAEA,gDACC,4DAGD,+EACC,kBAIF,gDACC,YACA,oCACA,kBACA,gBACA,gBACA,mBAGD,yDACC,2BAIF,wBACC,gBACA,gBACA,WAGD,sBACC,gBACA,YACA,cACA,eACA,YACA,aACA,mBACA,mBACA,kBAEA,4BACC,8BAGD,0BACC,WACA,YAIF,gDACC,UAEA,+DACC,iBC7EF,oBACC,aACA,qCACA,kBACA,oBACA,cACA,eCND,gBACC,aACA,qCACA,QCHD,eACC,aACA,uBACA,mBACA,eACA,qCACA,2BACA,gDACA,+BACA,kBACA,cACA,cAEA,iFACC,oCACA,iCACA,2BAIF,0BACC,kDAGD,yBACC,uCACA,oCACA,yCACA,yCACA,sBACA,UAGD,sBACC,4EACA,kCACA,gBAGD,yBACC,eACA,oBACA,WAGD,qBACC,oCACA,6BACA,WACA,oBACA","file":"calendar.min.css"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zuii/calendar",
3
- "version": "0.1.1",
3
+ "version": "1.0.0",
4
4
  "type": "module",
5
5
  "description": "Composants Calendar et Reservation pour zuii",
6
6
  "main": "./dist/index.cjs",
@@ -8,7 +8,7 @@
8
8
  "types": "./dist/index.d.ts",
9
9
  "files": [
10
10
  "dist",
11
- "src/symfony"
11
+ "src"
12
12
  ],
13
13
  "exports": {
14
14
  ".": {
@@ -30,7 +30,7 @@
30
30
  },
31
31
  "peerDependencies": {
32
32
  "react": ">=16.8.0",
33
- "@zuii/core": "1.0.0"
33
+ "@zuii/core": "1.2.0"
34
34
  },
35
35
  "keywords": [
36
36
  "zuii",
@@ -0,0 +1,236 @@
1
+ import {
2
+ format,
3
+ addMonths,
4
+ subMonths,
5
+ startOfMonth,
6
+ startOfWeek,
7
+ eachDayOfInterval,
8
+ isSameMonth,
9
+ isSameDay,
10
+ startOfDay,
11
+ addDays,
12
+ } from 'date-fns';
13
+ import { fr, en } from '../trads/i18n';
14
+ import { initSelect } from '../../../../src/components/Form/js/select';
15
+
16
+ export interface CalendarOptions {
17
+ lang?: 'fr' | 'en';
18
+ mode?: 'single' | 'range';
19
+ disablePast?: boolean;
20
+ availability?: Record<string, string[]>;
21
+ onDateSelect?: (date: Date) => void;
22
+ onRangeSelect?: (start: Date, end: Date) => void;
23
+ initialDate?: Date;
24
+ }
25
+
26
+ /**
27
+ * Composant Calendrier Vanilla JS.
28
+ */
29
+ export class Calendar {
30
+ private container: HTMLElement;
31
+ private currentMonth: Date;
32
+ private selectedDate: Date | null = null;
33
+ private startDate: Date | null = null;
34
+ private endDate: Date | null = null;
35
+ private options: Required<CalendarOptions>;
36
+ private trads: any;
37
+
38
+ /**
39
+ * @param {HTMLElement} container - Élément DOM où injecter le calendrier.
40
+ * @param {CalendarOptions} options - Options de configuration.
41
+ */
42
+ constructor(container: HTMLElement, options: CalendarOptions = {}) {
43
+ this.container = container;
44
+ this.options = {
45
+ lang: 'fr',
46
+ mode: 'single',
47
+ disablePast: false,
48
+ availability: {},
49
+ onDateSelect: () => {},
50
+ onRangeSelect: () => {},
51
+ initialDate: new Date(),
52
+ ...(options as any)
53
+ };
54
+ // On s'assure d'être au début du mois pour les calculs
55
+ this.currentMonth = startOfMonth(this.options.initialDate);
56
+ this.trads = this.options.lang === 'fr' ? fr : en;
57
+ this.render();
58
+ }
59
+
60
+ /**
61
+ * Passe au mois suivant.
62
+ */
63
+ public nextMonth(): void {
64
+ this.currentMonth = addMonths(this.currentMonth, 1);
65
+ this.render();
66
+ }
67
+
68
+ /**
69
+ * Passe au mois précédent.
70
+ */
71
+ public prevMonth(): void {
72
+ this.currentMonth = subMonths(this.currentMonth, 1);
73
+ this.render();
74
+ }
75
+
76
+ /**
77
+ * Sélectionne une date ou gère la plage.
78
+ * @param {Date} date - La date à sélectionner.
79
+ */
80
+ public selectDate(date: Date): void {
81
+ if (this.options.mode === 'single') {
82
+ this.selectedDate = date;
83
+ this.options.onDateSelect(date);
84
+ } else {
85
+ // Mode Range
86
+ if (!this.startDate || (this.startDate && this.endDate)) {
87
+ this.startDate = date;
88
+ this.endDate = null;
89
+ } else {
90
+ // Assurer que startDate < endDate
91
+ if (date < this.startDate) {
92
+ this.endDate = this.startDate;
93
+ this.startDate = date;
94
+ } else {
95
+ this.endDate = date;
96
+ }
97
+ this.options.onRangeSelect(this.startDate, this.endDate);
98
+ }
99
+ }
100
+ this.render();
101
+ }
102
+
103
+ /**
104
+ * Change la langue du calendrier.
105
+ * @param {string} lang - 'fr' ou 'en'.
106
+ */
107
+ public setLanguage(lang: 'fr' | 'en'): void {
108
+ this.options.lang = lang;
109
+ this.trads = lang === 'fr' ? fr : en;
110
+ this.render();
111
+ }
112
+
113
+ /**
114
+ * Rendu HTML du calendrier.
115
+ */
116
+ private render(): void {
117
+ const monthName = this.trads.months[this.currentMonth.getMonth()];
118
+ const year = this.currentMonth.getFullYear();
119
+
120
+ // Intervalle de 42 jours (6 semaines fixes) pour garantir une hauteur identique mois après mois
121
+ const start = startOfWeek(startOfMonth(this.currentMonth), { weekStartsOn: 1 });
122
+ const end = addDays(start, 41);
123
+ const days = eachDayOfInterval({ start, end });
124
+ const now = new Date();
125
+ const isPastMonth = startOfMonth(this.currentMonth) <= startOfMonth(now);
126
+ const canGoPrev = !this.options.disablePast || !isPastMonth;
127
+
128
+ this.container.innerHTML = `
129
+ <div class="calendar">
130
+ <div class="calendar__header">
131
+ <button class="calendar__header-btn" data-action="prev" aria-label="Mois précédent" ${!canGoPrev ? 'disabled style="opacity: 0.3; cursor: default;"' : ''}>
132
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="m15 18-6-6 6-6"/></svg>
133
+ </button>
134
+ <span class="calendar__header--month">${monthName}</span>
135
+ <div class="calendar__header--year-wrapper">
136
+ <select class="calendar__header--year-select">
137
+ ${Array.from({ length: 71 }, (_, i) => year - 50 + i)
138
+ .filter(y => !this.options.disablePast || y >= now.getFullYear())
139
+ .map(y => `
140
+ <option value="${y}" ${y === year ? 'selected' : ''}>${y}</option>
141
+ `).join('')}
142
+ </select>
143
+ </div>
144
+ <button class="calendar__header-btn" data-action="next" aria-label="Mois suivant">
145
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6"/></svg>
146
+ </button>
147
+ </div>
148
+ <div class="calendar__body">
149
+ <div class="calendar__weekdays">
150
+ ${this.trads.days.map((day: string) => `<span>${day}</span>`).join('')}
151
+ </div>
152
+ <div class="calendar__days">
153
+ ${days.map((day: Date) => {
154
+ const dateStr = format(day, 'yyyy-MM-dd');
155
+ const isCurrentMonth = isSameMonth(day, this.currentMonth);
156
+ const isPast = day < startOfDay(now);
157
+ let isSelected = false;
158
+ let isInRange = false;
159
+
160
+ if (this.options.mode === 'single') {
161
+ isSelected = !!(this.selectedDate && isSameDay(day, this.selectedDate));
162
+ } else {
163
+ isSelected = !!((this.startDate && isSameDay(day, this.startDate)) || (this.endDate && isSameDay(day, this.endDate)));
164
+ if (this.startDate && this.endDate) {
165
+ isInRange = day > this.startDate && day < this.endDate;
166
+ }
167
+ }
168
+
169
+ const isAvailable = !!this.options.availability[dateStr];
170
+ // Si des disponibilités sont définies, les jours sans créneau sont désactivés
171
+ const hasAvailabilityDefined = Object.keys(this.options.availability).length > 0;
172
+ const isUnavailable = hasAvailabilityDefined && !isAvailable;
173
+
174
+ let classes = ['calendar__day'];
175
+ if (isCurrentMonth) classes.push('calendar__day--current-month');
176
+ else classes.push('calendar__day--other-month');
177
+
178
+ if (isPast) classes.push('calendar__day--past');
179
+ if (isSelected) classes.push('calendar__day--selected');
180
+ if (isInRange) classes.push('calendar__day--range');
181
+ if (isAvailable) classes.push('calendar__day--available');
182
+
183
+ // Désactiver : hors mois courant, passé, ou non disponible
184
+ if (!isCurrentMonth || isPast || isUnavailable) classes.push('calendar__day--disabled');
185
+
186
+ return `<div class="${classes.join(' ')}" data-date="${dateStr}" role="button" tabindex="0">${day.getDate()}</div>`;
187
+ }).join('')}
188
+ </div>
189
+ </div>
190
+ </div>
191
+ `;
192
+
193
+ this.bindEvents();
194
+ }
195
+
196
+ /**
197
+ * Attache les événements DOM.
198
+ */
199
+ private bindEvents(): void {
200
+ const prevBtn = this.container.querySelector('[data-action="prev"]');
201
+ prevBtn?.addEventListener('click', (e) => {
202
+ e.preventDefault();
203
+ this.prevMonth();
204
+ });
205
+
206
+ const nextBtn = this.container.querySelector('[data-action="next"]');
207
+ nextBtn?.addEventListener('click', (e) => {
208
+ e.preventDefault();
209
+ this.nextMonth();
210
+ });
211
+
212
+ const yearSelect = this.container.querySelector('.calendar__header--year-select') as HTMLSelectElement;
213
+ if (yearSelect) {
214
+ initSelect(yearSelect, {
215
+ searchEnabled: false,
216
+ itemSelectText: ''
217
+ }, (value) => {
218
+ const selectedYear = parseInt(value as string, 10);
219
+ this.currentMonth = new Date(selectedYear, this.currentMonth.getMonth(), 1);
220
+ this.render();
221
+ });
222
+ }
223
+
224
+ const dayEls = this.container.querySelectorAll('.calendar__day:not(.calendar__day--disabled)');
225
+ dayEls.forEach(el => {
226
+ el.addEventListener('click', () => {
227
+ const dateStr = el.getAttribute('data-date');
228
+ if (dateStr) {
229
+ // Splitting to avoid TZ issues with new Date(string)
230
+ const [y, m, d] = dateStr.split('-').map(Number);
231
+ this.selectDate(new Date(y, m - 1, d));
232
+ }
233
+ });
234
+ });
235
+ }
236
+ }
@@ -0,0 +1,3 @@
1
+ export * from './Calendar';
2
+ export * from './mockData';
3
+ export * from '../trads/i18n';
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Données factices pour les disponibilités.
3
+ */
4
+ export const MOCK_AVAILABILITY = {
5
+ "2026-04-02": ["10:00", "12:00", "13:30", "15:00", "19:00"],
6
+ "2026-04-03": ["08:00", "09:00", "11:30", "14:00"],
7
+ "2026-04-08": ["09:00", "10:00", "11:00", "15:00", "17:00"],
8
+ "2026-04-09": ["14:00", "15:00", "16:30"],
9
+ "2026-04-13": ["09:00", "10:30", "12:00"],
10
+ "2026-04-14": ["11:00", "12:30", "14:00", "15:30"],
11
+ "2026-04-15": ["10:00", "13:00", "15:00"],
12
+ "2026-04-17": ["11:00", "13:00", "15:00", "17:00"],
13
+ "2026-04-21": ["09:00", "11:00", "13:00"],
14
+ "2026-04-22": ["14:00", "16:00"],
15
+ "2026-04-23": ["10:00", "12:00", "14:00"],
16
+ "2026-04-24": ["11:00", "13:00", "15:00"],
17
+ "2026-04-27": ["10:00"],
18
+ "2026-04-28": ["09:00", "11:30"],
19
+ "2026-04-30": ["10:00", "15:00"],
20
+ "2026-05-04": ["08:00"],
21
+ "2026-05-05": ["10:00"],
22
+ "2026-05-06": ["12:00"],
23
+ "2026-05-07": ["matin", "après-midi"]
24
+ };
@@ -0,0 +1,54 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { Calendar as VanillaCalendar } from '../js/Calendar';
3
+
4
+ export interface CalendarProps {
5
+ lang?: 'fr' | 'en';
6
+ mode?: 'single' | 'range';
7
+ disablePast?: boolean;
8
+ availability?: Record<string, string[]>;
9
+ onDateSelect?: (date: Date) => void;
10
+ onRangeSelect?: (start: Date, end: Date) => void;
11
+ initialDate?: Date;
12
+ className?: string;
13
+ }
14
+
15
+ /**
16
+ * Wrapper React pour le composant Calendar.
17
+ * @param {CalendarProps} props - Les propriétés du calendrier.
18
+ * @returns {JSX.Element}
19
+ */
20
+ export const Calendar = ({
21
+ lang = 'fr',
22
+ mode = 'single',
23
+ disablePast = false,
24
+ availability = {},
25
+ onDateSelect,
26
+ onRangeSelect,
27
+ initialDate,
28
+ className = '',
29
+ }: CalendarProps) => {
30
+ const containerRef = useRef<HTMLDivElement>(null);
31
+ const calendarInstance = useRef<VanillaCalendar | null>(null);
32
+
33
+ useEffect(() => {
34
+ if (containerRef.current && !calendarInstance.current) {
35
+ calendarInstance.current = new VanillaCalendar(containerRef.current, {
36
+ lang,
37
+ mode,
38
+ disablePast,
39
+ availability,
40
+ onDateSelect,
41
+ onRangeSelect,
42
+ initialDate,
43
+ });
44
+ }
45
+ }, []);
46
+
47
+ useEffect(() => {
48
+ if (calendarInstance.current) {
49
+ calendarInstance.current.setLanguage(lang);
50
+ }
51
+ }, [lang]);
52
+
53
+ return <div ref={containerRef} className={`calendar-wrapper ${className}`} />;
54
+ };
@@ -0,0 +1 @@
1
+ export * from './Calendar';
@@ -0,0 +1,52 @@
1
+ .calendar__day {
2
+ display: flex;
3
+ justify-content: center;
4
+ align-items: center;
5
+ cursor: pointer;
6
+ border-radius: var(--calendar-radius);
7
+ color: var(--calendar-text);
8
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
9
+ border: 1px solid transparent;
10
+ position: relative;
11
+ padding: .3rem;
12
+ line-height: 1;
13
+
14
+ &:hover:not(.calendar__day--disabled):not(.calendar__day--selected) {
15
+ background: var(--calendar-bg-hover);
16
+ color: var(--calendar-text-hover);
17
+ transform: translateY(-2px);
18
+ }
19
+ }
20
+
21
+ .calendar__day--available {
22
+ border: 1px solid var(--calendar-available-border);
23
+ }
24
+
25
+ .calendar__day--selected {
26
+ background: var(--calendar-selected-bg);
27
+ color: var(--calendar-selected-text);
28
+ border-color: var(--calendar-selected-bg);
29
+ box-shadow: 0 4px 10px rgba(76, 175, 80, 0.3);
30
+ transform: scale(1.05);
31
+ z-index: 2;
32
+ }
33
+
34
+ .calendar__day--range {
35
+ background: color-mix(in srgb, var(--calendar-selected-bg), transparent 85%);
36
+ color: var(--calendar-selected-bg);
37
+ border-radius: 0;
38
+ }
39
+
40
+ .calendar__day--disabled {
41
+ cursor: default;
42
+ pointer-events: none;
43
+ opacity: 0.3;
44
+ }
45
+
46
+ .calendar__day--past {
47
+ color: var(--calendar-disabled-text);
48
+ text-decoration: line-through;
49
+ opacity: 0.5;
50
+ pointer-events: none;
51
+ cursor: default;
52
+ }
@@ -0,0 +1,5 @@
1
+ .calendar__days {
2
+ display: grid;
3
+ grid-template-columns: repeat(7, 1fr);
4
+ gap: 8px;
5
+ }
@@ -0,0 +1,80 @@
1
+ .calendar__header {
2
+ background: var(--calendar-header-bg);
3
+ color: var(--calendar-header-text);
4
+ padding: 10px;
5
+ display: flex;
6
+ justify-content: space-between;
7
+ align-items: center;
8
+ }
9
+
10
+ .calendar__header--month {
11
+ flex: 1;
12
+ text-align: center;
13
+ display: flex;
14
+ justify-content: center;
15
+ align-items: center;
16
+ width: 90px;
17
+ font-size: var(--calendar-font-size);
18
+ }
19
+
20
+ .calendar__header--year-wrapper {
21
+ .choices {
22
+ margin-bottom: 0;
23
+
24
+ &::after {
25
+ border-color: #fff transparent transparent transparent;
26
+ }
27
+
28
+ &[data-type*=select-one].is-open::after {
29
+ margin-top: -2.5px;
30
+ }
31
+ }
32
+
33
+ .choices__inner {
34
+ border: none;
35
+ font-size: var(--calendar-font-size);
36
+ border-radius: 4px;
37
+ min-height: auto;
38
+ padding-top: 5px;
39
+ padding-bottom: 5px;
40
+ }
41
+
42
+ .choices__list--dropdown {
43
+ color: var(--calendar-text);
44
+ }
45
+ }
46
+
47
+ .calendar__header--year {
48
+ font-weight: 400;
49
+ margin-left: 8px;
50
+ opacity: 0.8;
51
+ }
52
+
53
+ .calendar__header-btn {
54
+ background: none;
55
+ border: none;
56
+ color: inherit;
57
+ cursor: pointer;
58
+ padding: 8px;
59
+ display: flex;
60
+ align-items: center;
61
+ transition: all 0.2s;
62
+ border-radius: 50%;
63
+
64
+ &:hover {
65
+ background: rgba(255, 255, 255, 0.1);
66
+ }
67
+
68
+ svg {
69
+ width: 24px;
70
+ height: 24px;
71
+ }
72
+ }
73
+
74
+ .calendar__header--year-wrapper .choices__inner {
75
+ padding: 0;
76
+
77
+ .choices__list {
78
+ padding: 0 1.5rem;
79
+ }
80
+ }
@@ -0,0 +1,8 @@
1
+ .calendar__weekdays {
2
+ display: grid;
3
+ grid-template-columns: repeat(7, 1fr);
4
+ text-align: center;
5
+ padding-bottom: 15px;
6
+ color: #b0b0b0;
7
+ font-size: 16px;
8
+ }
@@ -0,0 +1,25 @@
1
+ .calendar {
2
+ --calendar-light: var(--white);
3
+ --calendar-bg: var(--calendar-light);
4
+ --calendar-bg-hover: var(--accent);
5
+ --calendar-header-bg: var(--primary);
6
+ --calendar-header-text: var(--calendar-light);
7
+ --calendar-border: transparent;
8
+ --calendar-text: var(--primary);
9
+ --calendar-text-hover: var(--calendar-light);
10
+ --calendar-selected-bg: var(--accent);
11
+ --calendar-selected-text: var(--calendar-light);
12
+ --calendar-disabled-text: color-mix(in srgb, var(--calendar-text), transparent 25%);
13
+ --calendar-available-border: var(--accent);
14
+ --calendar-font-size: 1.2rem;
15
+ --calendar-radius: var(--radius-base);
16
+
17
+ font-family: var(--calendar-font);
18
+ width: 100%;
19
+ background: var(--calendar-bg);
20
+ user-select: none;
21
+ }
22
+
23
+ .calendar__body {
24
+ padding: 1rem 1.5rem;
25
+ }
@@ -0,0 +1,5 @@
1
+ @use 'calendar';
2
+ @use 'calendar-header';
3
+ @use 'calendar-weekdays';
4
+ @use 'calendar-days';
5
+ @use 'calendar-day';
@@ -0,0 +1,23 @@
1
+ export const fr = {
2
+ months: [
3
+ 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',
4
+ 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'
5
+ ],
6
+ days: ['lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'],
7
+ reservation: {
8
+ selectSlot: 'Sélectionner un horaire pour le',
9
+ noSlots: 'Pas de créneaux disponibles pour cette date.'
10
+ }
11
+ };
12
+
13
+ export const en = {
14
+ months: [
15
+ 'January', 'February', 'March', 'April', 'May', 'June',
16
+ 'July', 'August', 'September', 'October', 'November', 'December'
17
+ ],
18
+ days: ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],
19
+ reservation: {
20
+ selectSlot: 'Select a time slot for',
21
+ noSlots: 'No slots available for this date.'
22
+ }
23
+ };