@ds-mo/ui 15.0.0 → 15.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +6 -0
- package/README.md +7 -0
- package/dist/.package-ready.json +1 -1
- package/dist/agent-patterns.json +1 -1
- package/dist/agent.json +2320 -90
- package/dist/components/ds-agent-questionnaire.js +1 -1
- package/dist/components/ds-agent-response.js +1 -1
- package/dist/components/ds-banner.js +1 -1
- package/dist/components/ds-banner.js.map +1 -1
- package/dist/components/ds-card-chart.js +1 -1
- package/dist/components/ds-card-chart.js.map +1 -1
- package/dist/components/ds-card-overview.js +1 -1
- package/dist/components/ds-card-overview.js.map +1 -1
- package/dist/components/ds-card-setting.js +1 -1
- package/dist/components/ds-card-setting.js.map +1 -1
- package/dist/components/ds-chart.js +1 -1
- package/dist/components/ds-chart.js.map +1 -1
- package/dist/components/ds-checkbox.js +1 -1
- package/dist/components/ds-conversation-list-item.js +1 -1
- package/dist/components/ds-conversation-list-item.js.map +1 -1
- package/dist/components/ds-data-filter.js +1 -1
- package/dist/components/ds-data-preferences.js +1 -1
- package/dist/components/ds-data-saved-views.js +1 -1
- package/dist/components/ds-data-search.js +1 -1
- package/dist/components/ds-data-search.js.map +1 -1
- package/dist/components/ds-filter-menu.js +1 -1
- package/dist/components/ds-message-scroller.js.map +1 -1
- package/dist/components/ds-mobile-sheet-nav.js +1 -1
- package/dist/components/ds-pagination.js +1 -1
- package/dist/components/ds-scroll-overlay.js.map +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-shell-app.js +1 -1
- package/dist/components/ds-table.js +1 -1
- package/dist/components/p-0FYD2bev.js.map +1 -1
- package/dist/components/{p-Dpr2y6_S.js → p-B_jdoM7e.js} +2 -2
- package/dist/components/{p-CElUM-xU.js → p-C6xVxqOn.js} +2 -2
- package/dist/components/{p-MG4lcN0D.js → p-CdGXzRP8.js} +2 -2
- package/dist/components/{p-D6Wl3dRO.js → p-Cqc2U1ZQ.js} +2 -2
- package/dist/components/{p-D6Wl3dRO.js.map → p-Cqc2U1ZQ.js.map} +1 -1
- package/dist/components/{p-Nc76seSq.js → p-DEW7r0U9.js} +2 -2
- package/dist/components/{p-IEq_06J0.js → p-Dfs98tpL.js} +2 -2
- package/dist/components/{p-IEq_06J0.js.map → p-Dfs98tpL.js.map} +1 -1
- package/dist/components/p-ZhP2tVmM.js.map +1 -1
- package/dist/components/p-etifxiDc.js.map +1 -1
- package/dist/docs/components.json +1 -1
- package/dist/lint/STYLELINT-LICENSE +20 -0
- package/dist/lint/THIRD-PARTY-NOTICES +553 -0
- package/dist/lint/index.d.ts +7 -0
- package/dist/lint/index.js +51385 -0
- package/dist/lint/types.d.ts +13 -0
- package/dist/mcp-data/registry/agent-activity.json +6 -1
- package/dist/mcp-data/registry/agent-questionnaire.json +6 -1
- package/dist/mcp-data/registry/agent-response.json +12 -1
- package/dist/mcp-data/registry/agent-source-list.json +6 -1
- package/dist/mcp-data/registry/agent-tool-call.json +6 -1
- package/dist/mcp-data/registry/attachment-list.json +6 -1
- package/dist/mcp-data/registry/avatar.json +21 -1
- package/dist/mcp-data/registry/badge.json +30 -2
- package/dist/mcp-data/registry/banner.json +28 -2
- package/dist/mcp-data/registry/bar-action.json +24 -1
- package/dist/mcp-data/registry/bar-nav.json +6 -1
- package/dist/mcp-data/registry/bar-page-title.json +24 -1
- package/dist/mcp-data/registry/bar-title.json +26 -1
- package/dist/mcp-data/registry/bar-workflow.json +24 -1
- package/dist/mcp-data/registry/breadcrumb.json +6 -1
- package/dist/mcp-data/registry/button-filled.json +68 -1
- package/dist/mcp-data/registry/button-inverted.json +64 -1
- package/dist/mcp-data/registry/button-unfilled.json +66 -1
- package/dist/mcp-data/registry/calendar.json +15 -2
- package/dist/mcp-data/registry/card-action-center.json +24 -1
- package/dist/mcp-data/registry/card-chart.json +37 -2
- package/dist/mcp-data/registry/card-navigation.json +36 -1
- package/dist/mcp-data/registry/card-overview.json +27 -2
- package/dist/mcp-data/registry/card-setting.json +35 -2
- package/dist/mcp-data/registry/card-settings-scope.json +24 -1
- package/dist/mcp-data/registry/chart-legend.json +6 -1
- package/dist/mcp-data/registry/chart.json +7 -2
- package/dist/mcp-data/registry/checkbox.json +38 -2
- package/dist/mcp-data/registry/chip.json +50 -1
- package/dist/mcp-data/registry/code-block.json +30 -1
- package/dist/mcp-data/registry/conversation-list-item.json +25 -2
- package/dist/mcp-data/registry/conversation-list-section.json +14 -1
- package/dist/mcp-data/registry/conversation-list.json +6 -1
- package/dist/mcp-data/registry/data-customize.json +26 -1
- package/dist/mcp-data/registry/data-filter.json +26 -1
- package/dist/mcp-data/registry/data-group.json +26 -1
- package/dist/mcp-data/registry/data-preferences.json +26 -1
- package/dist/mcp-data/registry/data-saved-views.json +26 -1
- package/dist/mcp-data/registry/data-search.json +27 -2
- package/dist/mcp-data/registry/data-sort.json +26 -1
- package/dist/mcp-data/registry/data-toolbar.json +14 -1
- package/dist/mcp-data/registry/divider.json +6 -1
- package/dist/mcp-data/registry/empty-state.json +6 -1
- package/dist/mcp-data/registry/field.json +14 -1
- package/dist/mcp-data/registry/filter-menu.json +48 -1
- package/dist/mcp-data/registry/icon.json +21 -1
- package/dist/mcp-data/registry/input-date.json +48 -1
- package/dist/mcp-data/registry/input-time.json +48 -1
- package/dist/mcp-data/registry/input.json +48 -1
- package/dist/mcp-data/registry/loader.json +21 -1
- package/dist/mcp-data/registry/markdown.json +17 -1
- package/dist/mcp-data/registry/menu.json +26 -1
- package/dist/mcp-data/registry/message-actions.json +6 -1
- package/dist/mcp-data/registry/message-bubble.json +26 -1
- package/dist/mcp-data/registry/message-composer.json +24 -1
- package/dist/mcp-data/registry/message-scroller.json +12 -1
- package/dist/mcp-data/registry/message.json +6 -1
- package/dist/mcp-data/registry/mobile-bar-nav.json +24 -1
- package/dist/mcp-data/registry/mobile-header.json +26 -1
- package/dist/mcp-data/registry/mobile-section-switcher.json +26 -1
- package/dist/mcp-data/registry/mobile-sheet-nav.json +27 -2
- package/dist/mcp-data/registry/modal.json +24 -1
- package/dist/mcp-data/registry/pagination.json +6 -1
- package/dist/mcp-data/registry/panel-nav.json +28 -2
- package/dist/mcp-data/registry/panel-sub-nav.json +25 -0
- package/dist/mcp-data/registry/panel-tool-header.json +24 -1
- package/dist/mcp-data/registry/panel-tool-search.json +24 -1
- package/dist/mcp-data/registry/panel-tools.json +25 -1
- package/dist/mcp-data/registry/paper-texture.json +6 -1
- package/dist/mcp-data/registry/radio.json +35 -1
- package/dist/mcp-data/registry/registry.json +2319 -89
- package/dist/mcp-data/registry/score.json +38 -1
- package/dist/mcp-data/registry/scroll-overlay.json +6 -1
- package/dist/mcp-data/registry/select.json +52 -1
- package/dist/mcp-data/registry/shell-app.json +26 -1
- package/dist/mcp-data/registry/shell-page.json +6 -1
- package/dist/mcp-data/registry/shell-tools.json +25 -1
- package/dist/mcp-data/registry/skeleton.json +41 -1
- package/dist/mcp-data/registry/slider.json +42 -1
- package/dist/mcp-data/registry/swatch-picker.json +24 -1
- package/dist/mcp-data/registry/switch.json +37 -1
- package/dist/mcp-data/registry/tab-group.json +49 -1
- package/dist/mcp-data/registry/table.json +102 -1
- package/dist/mcp-data/registry/tag.json +52 -1
- package/dist/mcp-data/registry/text.json +22 -1
- package/dist/mcp-data/registry/textarea.json +38 -1
- package/dist/mcp-data/registry/time-picker.json +14 -1
- package/dist/mcp-data/registry/toast.json +24 -1
- package/dist/mcp-data/registry/tooltip-chart.json +24 -1
- package/dist/mcp-data/registry/tooltip.json +26 -1
- package/dist/mcp-data/registry/typing-indicator.json +6 -1
- package/package.json +32 -7
- /package/dist/components/{p-Dpr2y6_S.js.map → p-B_jdoM7e.js.map} +0 -0
- /package/dist/components/{p-CElUM-xU.js.map → p-C6xVxqOn.js.map} +0 -0
- /package/dist/components/{p-MG4lcN0D.js.map → p-CdGXzRP8.js.map} +0 -0
- /package/dist/components/{p-Nc76seSq.js.map → p-DEW7r0U9.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DATE_FILTER_RELATIVE_PRESETS","label","value","days","offset","ISO_DATE_PATTERN","ISO_CALENDAR_DATE_LABEL","Intl","DateTimeFormat","month","day","year","timeZone","isIsoCalendarDate","test","split","map","Number","date","Date","UTC","getUTCFullYear","getUTCMonth","getUTCDate","formatIsoCalendarDateLabel","format","MONTH_LABELS","parseLooseCalendarDate","trimmed","trim","numeric","match","iso","padStart","labelled","monthIndex","indexOf","toLowerCase","String","shiftIsoCalendarDate","toISOString","slice","dateFilterRelativeValue","preset","dateFilterRangeValue","start","end","ordered","parseDateFilterValue","startsWith","length","some","candidate","kind","rest","CALENDAR_WEEKDAYS","MONTH_FORMATTER","DATE_FORMATTER","weekday","calendarToday","today","getFullYear","getMonth","getDate","calendarMonth","shiftCalendarMonth","calendarMonthLabel","calendarDays","firstOfMonth","firstWeekday","getUTCDay","gridStart","Array","from","_","index","dateValue","inMonth","calendarPaintedRange","pendingStart","heldRange","valueRange","calendarCss","Calendar","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","selectionMode","isInactive","autoFocus","previewEnd","moveMonth","selectDate","isDisabled","dsChange","emit","pending","current","previewRange","clearPreview","handleDayKeyDown","event","key","preventDefault","focusDate","componentWillLoad","anchorDate","componentDidLoad","setFocus","onValueChange","el","querySelector","focus","parsed","min","max","targetMonth","requestAnimationFrame","render","liveRange","liveRangeValue","rangeValue","weeks","previewStart","sort","previewFinish","selectedSingle","preferredFocus","find","h","Host","class","variant","icon","size","hasBorder","ariaLabel","onDsClick","as","emphasis","color","role","onMouseLeave","week","weekIndex","selectedInRange","Boolean","paintedInRange","pendingStartDay","previewInRange","inRange","rangeEdge","selected","textColor","type","disabled","tabIndex","onMouseEnter","onFocus","onClick","onKeyDown"],"sources":["src/wc/utils/date-filter-value.ts","src/wc/components/Calendar/calendar-grid.ts","src/wc/components/Calendar/Calendar.css?tag=ds-calendar&encapsulation=scoped","src/wc/components/Calendar/Calendar.tsx"],"sourcesContent":["export const DATE_FILTER_RELATIVE_PRESETS = [\n { label: 'Today', value: 'today', days: 1, offset: 0 },\n { label: 'Yesterday', value: 'yesterday', days: 1, offset: -1 },\n { label: 'Last 7 days', value: 'last-7-days', days: 7, offset: 0 },\n { label: 'Last 14 days', value: 'last-14-days', days: 14, offset: 0 },\n { label: 'Last 30 days', value: 'last-30-days', days: 30, offset: 0 },\n { label: 'Last 60 days', value: 'last-60-days', days: 60, offset: 0 },\n { label: 'Last 90 days', value: 'last-90-days', days: 90, offset: 0 },\n] as const;\n\nexport type DateFilterRelativePreset = (typeof DATE_FILTER_RELATIVE_PRESETS)[number]['value'];\nexport type DateFilterRelativeValue = `relative:${DateFilterRelativePreset}`;\nexport type DateFilterRangeValue = `range:${string}/${string}`;\nexport type DateFilterValue = DateFilterRelativeValue | DateFilterRangeValue;\n\nexport interface DateFilterRange {\n start: string;\n end: string;\n}\n\nexport type ParsedDateFilterValue =\n | { kind: 'relative'; preset: DateFilterRelativePreset }\n | ({ kind: 'range' } & DateFilterRange);\n\nconst ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst ISO_CALENDAR_DATE_LABEL = new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n timeZone: 'UTC',\n});\n\nexport function isIsoCalendarDate(value: string): boolean {\n if (!ISO_DATE_PATTERN.test(value)) return false;\n const [year, month, day] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1, day));\n return (\n date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day\n );\n}\n\n/** Readable calendar date for filled ISO values such as `2026-09-10` → `Sep 10, 2026`. */\nexport function formatIsoCalendarDateLabel(value: string): string {\n if (!isIsoCalendarDate(value)) return '';\n return ISO_CALENDAR_DATE_LABEL.format(new Date(`${value}T00:00:00Z`));\n}\n\nconst MONTH_LABELS = [\n 'jan',\n 'feb',\n 'mar',\n 'apr',\n 'may',\n 'jun',\n 'jul',\n 'aug',\n 'sep',\n 'oct',\n 'nov',\n 'dec',\n];\n\n/** Parse a typed calendar date: ISO, `M/D/YYYY`, or a short-month label such as `Sep 10, 2026`. */\nexport function parseLooseCalendarDate(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return '';\n if (isIsoCalendarDate(trimmed)) return trimmed;\n\n const numeric = trimmed.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n if (numeric) {\n const iso = `${numeric[3]}-${numeric[1].padStart(2, '0')}-${numeric[2].padStart(2, '0')}`;\n return isIsoCalendarDate(iso) ? iso : '';\n }\n\n const labelled = trimmed.match(/^([A-Za-z]{3})\\s+(\\d{1,2}),\\s+(\\d{4})$/);\n if (!labelled) return '';\n const monthIndex = MONTH_LABELS.indexOf(labelled[1].toLowerCase());\n if (monthIndex < 0) return '';\n const iso = `${labelled[3]}-${String(monthIndex + 1).padStart(2, '0')}-${labelled[2].padStart(2, '0')}`;\n return isIsoCalendarDate(iso) ? iso : '';\n}\n\nexport function shiftIsoCalendarDate(value: string, days: number): string {\n if (!isIsoCalendarDate(value)) return '';\n const [year, month, day] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1, day + days));\n return date.toISOString().slice(0, 10);\n}\n\nexport function dateFilterRelativeValue(preset: DateFilterRelativePreset): DateFilterRelativeValue {\n return `relative:${preset}`;\n}\n\nexport function dateFilterRangeValue(start: string, end: string = start): DateFilterRangeValue {\n const ordered = start <= end ? [start, end] : [end, start];\n return `range:${ordered[0]}/${ordered[1]}`;\n}\n\nexport function parseDateFilterValue(value: unknown): ParsedDateFilterValue | null {\n if (typeof value !== 'string' || !value) return null;\n\n if (value.startsWith('relative:')) {\n const preset = value.slice('relative:'.length) as DateFilterRelativePreset;\n return DATE_FILTER_RELATIVE_PRESETS.some(candidate => candidate.value === preset)\n ? { kind: 'relative', preset }\n : null;\n }\n\n if (value.startsWith('range:')) {\n const [start, end, ...rest] = value.slice('range:'.length).split('/');\n if (rest.length || !isIsoCalendarDate(start) || !isIsoCalendarDate(end)) return null;\n return start <= end ? { kind: 'range', start, end } : { kind: 'range', start: end, end: start };\n }\n\n // Preserve the previous single-date contract as a one-day range.\n return isIsoCalendarDate(value) ? { kind: 'range', start: value, end: value } : null;\n}\n\nexport function normalizeDateFilterValue(value: unknown): DateFilterValue | '' {\n const parsed = parseDateFilterValue(value);\n if (!parsed) return '';\n return parsed.kind === 'relative'\n ? dateFilterRelativeValue(parsed.preset)\n : dateFilterRangeValue(parsed.start, parsed.end);\n}\n\nexport function resolveDateFilterRange(\n value: unknown,\n referenceDate: string\n): DateFilterRange | null {\n if (!isIsoCalendarDate(referenceDate)) return null;\n const parsed = parseDateFilterValue(value);\n if (!parsed) return null;\n if (parsed.kind === 'range') return { start: parsed.start, end: parsed.end };\n\n const preset = DATE_FILTER_RELATIVE_PRESETS.find(candidate => candidate.value === parsed.preset);\n if (!preset) return null;\n const end = shiftIsoCalendarDate(referenceDate, preset.offset);\n return { start: shiftIsoCalendarDate(end, -(preset.days - 1)), end };\n}\n","import { isIsoCalendarDate, shiftIsoCalendarDate } from '../../utils';\n\nexport interface CalendarDateRange {\n start: string;\n end: string;\n}\n\nexport interface CalendarDay {\n value: string;\n day: number;\n inMonth: boolean;\n label: string;\n}\n\nexport const CALENDAR_WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nconst MONTH_FORMATTER = new Intl.DateTimeFormat('en-US', {\n month: 'long',\n year: 'numeric',\n timeZone: 'UTC',\n});\nconst DATE_FORMATTER = new Intl.DateTimeFormat('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n timeZone: 'UTC',\n});\n\nexport function calendarToday(): string {\n const today = new Date();\n const year = today.getFullYear();\n const month = String(today.getMonth() + 1).padStart(2, '0');\n const day = String(today.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\nexport function calendarMonth(value: string): string {\n return isIsoCalendarDate(value) ? value.slice(0, 7) : calendarToday().slice(0, 7);\n}\n\nexport function shiftCalendarMonth(value: string, offset: number): string {\n const [year, month] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1 + offset, 1));\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`;\n}\n\nexport function calendarMonthLabel(value: string): string {\n const [year, month] = value.split('-').map(Number);\n return MONTH_FORMATTER.format(new Date(Date.UTC(year, month - 1, 1)));\n}\n\nexport function calendarDays(value: string): CalendarDay[] {\n const [year, month] = value.split('-').map(Number);\n const firstOfMonth = `${year}-${String(month).padStart(2, '0')}-01`;\n const firstWeekday = new Date(`${firstOfMonth}T00:00:00Z`).getUTCDay();\n const gridStart = shiftIsoCalendarDate(firstOfMonth, -firstWeekday);\n return Array.from({ length: 42 }, (_, index) => {\n const dateValue = shiftIsoCalendarDate(gridStart, index);\n const date = new Date(`${dateValue}T00:00:00Z`);\n return {\n value: dateValue,\n day: date.getUTCDate(),\n inMonth: dateValue.startsWith(`${value}-`),\n label: DATE_FORMATTER.format(date),\n };\n });\n}\n\n/** Keep the previous committed range visible while a replacement range is being chosen. */\nexport function calendarPaintedRange(\n pendingStart: string,\n heldRange: CalendarDateRange | null,\n valueRange: CalendarDateRange | null\n): CalendarDateRange | null {\n return pendingStart ? heldRange : valueRange;\n}\n","@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n display: flex;\n min-height: 0;\n flex-direction: column;\n}\n\n.calendar {\n display: flex;\n min-height: 0;\n flex-direction: column;\n min-width: calc(\n (var(--dimension-size-400) * 7) + (var(--dimension-space-050) * 6) +\n (var(--dimension-space-100) * 2)\n );\n padding: var(--ds-calendar-padding, var(--dimension-space-100));\n}\n\n.calendar-heading {\n display: grid;\n grid-template-columns: var(--dimension-size-400) minmax(0, 1fr) var(--dimension-size-400);\n align-items: center;\n text-align: center;\n}\n\n.calendar-nav--previous {\n justify-self: start;\n}\n\n.calendar-nav--next {\n justify-self: end;\n}\n\n.calendar-weekdays,\n.calendar-grid__row {\n display: grid;\n grid-template-columns: repeat(7, minmax(0, 1fr));\n column-gap: var(--dimension-space-050);\n}\n\n.calendar-grid {\n display: flex;\n flex-direction: column;\n row-gap: var(--dimension-space-050);\n}\n\n.calendar-weekdays {\n align-items: center;\n min-height: var(--dimension-size-400);\n margin-block-start: var(--dimension-space-050);\n color: var(--color-foreground-secondary);\n text-align: center;\n}\n\n.calendar-day {\n appearance: none;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 0;\n width: 100%;\n height: var(--dimension-size-400);\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n color: var(--color-foreground-primary);\n cursor: default;\n}\n\n.calendar-day:disabled {\n cursor: not-allowed;\n}\n\n.calendar-day--outside {\n color: var(--color-foreground-tertiary);\n}\n\n.calendar-day--in-range {\n background: var(--color-background-faint-brand);\n color: var(--color-foreground-primary);\n}\n\n/* In-progress span uses the shared hover overlay; the first day keeps pressed via --surface-open. */\n.calendar-day.ds-interaction-fill.calendar-day--range-preview:not(:disabled)::after {\n background: var(--ds-interaction-hover);\n}\n\n.calendar-day.ds-interaction-fill.calendar-day--range-preview:active:not(:disabled)::after {\n background: var(--ds-interaction-pressed);\n}\n\n.calendar-day--today {\n color: var(--color-foreground-primary);\n}\n\n.calendar-day--range-edge {\n background: var(--color-background-bold-brand);\n color: var(--color-foreground-on-bold-background-primary);\n}\n\n@media (forced-colors: active) {\n .calendar-day--range-edge {\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n }\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n Method,\n Prop,\n State,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport {\n dateFilterRangeValue,\n isIsoCalendarDate,\n parseDateFilterValue,\n shiftIsoCalendarDate,\n} from '../../utils';\nimport {\n CALENDAR_WEEKDAYS,\n calendarDays,\n calendarMonth,\n calendarMonthLabel,\n calendarPaintedRange,\n calendarToday,\n shiftCalendarMonth,\n type CalendarDateRange,\n} from './calendar-grid';\n\nexport type CalendarSelectionMode = 'single' | 'range';\n\n@Component({\n tag: 'ds-calendar',\n styleUrl: 'Calendar.css',\n scoped: true,\n})\nexport class Calendar {\n @Element() el!: HTMLElement;\n\n /** Single date emits YYYY-MM-DD. Range emits the shared `range:start/end` string. */\n @Prop() selectionMode: CalendarSelectionMode = 'single';\n @Prop() value: string = '';\n @Prop() min: string | undefined;\n @Prop() max: string | undefined;\n @Prop() isInactive: boolean = false;\n /** Move keyboard focus into the grid after the calendar is rendered. */\n @Prop() autoFocus: boolean = false;\n\n @Event() dsChange!: EventEmitter<string>;\n\n @State() private month = calendarMonth(calendarToday());\n @State() private pendingStart = '';\n @State() private previewEnd = '';\n @State() private heldRange: CalendarDateRange | null = null;\n\n componentWillLoad() {\n this.month = calendarMonth(this.anchorDate());\n }\n\n componentDidLoad() {\n if (this.autoFocus) void this.setFocus();\n }\n\n @Watch('value')\n onValueChange() {\n this.month = calendarMonth(this.anchorDate());\n }\n\n @Method()\n async setFocus() {\n this.el.querySelector<HTMLElement>('.calendar-day[tabindex=\"0\"]')?.focus();\n }\n\n private anchorDate(): string {\n if (this.selectionMode === 'range') {\n const parsed = parseDateFilterValue(this.value);\n if (parsed?.kind === 'range') return parsed.start;\n return calendarToday();\n }\n return isIsoCalendarDate(this.value) ? this.value : calendarToday();\n }\n\n private isDisabled(day: string): boolean {\n if (this.isInactive) return true;\n if (this.min && isIsoCalendarDate(this.min) && day < this.min) return true;\n if (this.max && isIsoCalendarDate(this.max) && day > this.max) return true;\n return false;\n }\n\n private moveMonth = (offset: number) => {\n this.previewEnd = '';\n this.month = shiftCalendarMonth(this.month, offset);\n };\n\n private selectDate = (day: string) => {\n if (this.isDisabled(day)) return;\n this.previewEnd = '';\n if (this.selectionMode === 'single') {\n this.pendingStart = '';\n this.heldRange = null;\n this.dsChange.emit(day);\n return;\n }\n const pending = this.pendingStart;\n if (pending) {\n this.pendingStart = '';\n this.heldRange = null;\n this.dsChange.emit(dateFilterRangeValue(pending, day));\n return;\n }\n const current = parseDateFilterValue(this.value);\n this.heldRange = current?.kind === 'range' ? { start: current.start, end: current.end } : null;\n this.pendingStart = day;\n this.dsChange.emit(dateFilterRangeValue(day, day));\n };\n\n private previewRange = (day: string) => {\n if (!this.pendingStart || this.previewEnd === day) return;\n this.previewEnd = day;\n };\n\n private clearPreview = () => {\n if (!this.previewEnd) return;\n this.previewEnd = '';\n };\n\n private focusDate(day: string) {\n this.previewRange(day);\n const targetMonth = calendarMonth(day);\n if (this.month !== targetMonth) this.month = targetMonth;\n requestAnimationFrame(() => {\n this.el.querySelector<HTMLElement>(`[data-date-option=\"${day}\"]`)?.focus();\n });\n }\n\n private handleDayKeyDown = (event: KeyboardEvent, day: string) => {\n let offset: number | null = null;\n if (event.key === 'ArrowLeft') offset = -1;\n else if (event.key === 'ArrowRight') offset = 1;\n else if (event.key === 'ArrowUp') offset = -7;\n else if (event.key === 'ArrowDown') offset = 7;\n else if (event.key === 'Home') {\n offset = -new Date(`${day}T00:00:00Z`).getUTCDay();\n } else if (event.key === 'End') {\n offset = 6 - new Date(`${day}T00:00:00Z`).getUTCDay();\n } else if (event.key === 'PageUp' || event.key === 'PageDown') {\n const month = shiftCalendarMonth(calendarMonth(day), event.key === 'PageUp' ? -1 : 1);\n const candidate = `${month}-${day.slice(8, 10)}`;\n event.preventDefault();\n this.focusDate(isIsoCalendarDate(candidate) ? candidate : `${month}-01`);\n return;\n }\n if (offset === null) return;\n event.preventDefault();\n this.focusDate(shiftIsoCalendarDate(day, offset));\n };\n\n render() {\n const liveRange = this.selectionMode === 'range' ? parseDateFilterValue(this.value) : null;\n const liveRangeValue = liveRange?.kind === 'range' ? liveRange : null;\n const rangeValue = calendarPaintedRange(this.pendingStart, this.heldRange, liveRangeValue);\n const days = calendarDays(this.month);\n const weeks = Array.from({ length: 6 }, (_, index) => days.slice(index * 7, index * 7 + 7));\n const today = calendarToday();\n const previewStart =\n this.pendingStart && this.previewEnd ? [this.pendingStart, this.previewEnd].sort()[0] : null;\n const previewFinish =\n this.pendingStart && this.previewEnd ? [this.pendingStart, this.previewEnd].sort()[1] : null;\n const selectedSingle =\n this.selectionMode === 'single' && isIsoCalendarDate(this.value) ? this.value : '';\n const preferredFocus =\n this.pendingStart ||\n selectedSingle ||\n rangeValue?.end ||\n (this.month === today.slice(0, 7) ? today : '');\n const focusDate = days.some(day => day.value === preferredFocus)\n ? preferredFocus\n : (days.find(day => day.inMonth)?.value ?? days[0]?.value);\n\n return (\n <Host>\n <div class=\"calendar\">\n <div class=\"calendar-heading ds-control--md\">\n <ds-button-unfilled\n class=\"calendar-nav calendar-nav--previous\"\n variant=\"icon\"\n icon=\"ChevronLeft\"\n size=\"md\"\n hasBorder={false}\n isInactive={this.isInactive}\n ariaLabel=\"Previous month\"\n onDsClick={() => this.moveMonth(-1)}\n />\n <ds-text as=\"span\" variant=\"text-body-medium\" emphasis color=\"primary\">\n {calendarMonthLabel(this.month)}\n </ds-text>\n <ds-button-unfilled\n class=\"calendar-nav calendar-nav--next\"\n variant=\"icon\"\n icon=\"ChevronRight\"\n size=\"md\"\n hasBorder={false}\n isInactive={this.isInactive}\n ariaLabel=\"Next month\"\n onDsClick={() => this.moveMonth(1)}\n />\n </div>\n <div class=\"calendar-weekdays\" aria-hidden=\"true\">\n {CALENDAR_WEEKDAYS.map(day => (\n <ds-text as=\"span\" variant=\"text-body-small\" color=\"secondary\">\n {day}\n </ds-text>\n ))}\n </div>\n <div\n class=\"calendar-grid\"\n role=\"grid\"\n aria-label={calendarMonthLabel(this.month)}\n onMouseLeave={this.clearPreview}\n >\n {weeks.map((week, weekIndex) => (\n <div class=\"calendar-grid__row\" role=\"row\" key={`week-${weekIndex}`}>\n {week.map(day => {\n const selectedInRange = Boolean(\n liveRangeValue &&\n day.value >= liveRangeValue.start &&\n day.value <= liveRangeValue.end\n );\n const paintedInRange = Boolean(\n rangeValue && day.value >= rangeValue.start && day.value <= rangeValue.end\n );\n const pendingStartDay =\n this.selectionMode === 'range' &&\n Boolean(this.pendingStart) &&\n day.value === this.pendingStart;\n const previewInRange = Boolean(\n this.pendingStart &&\n previewStart &&\n previewFinish &&\n day.value >= previewStart &&\n day.value <= previewFinish &&\n day.value !== this.pendingStart\n );\n const inRange = this.selectionMode === 'range' && paintedInRange;\n const rangeEdge = Boolean(\n this.selectionMode === 'range' &&\n rangeValue &&\n (day.value === rangeValue.start || day.value === rangeValue.end)\n );\n const selected = this.selectionMode === 'single' && day.value === selectedSingle;\n const textColor = rangeEdge\n ? 'on-bold'\n : selected ||\n inRange ||\n pendingStartDay ||\n previewInRange ||\n day.value === today\n ? 'primary'\n : day.inMonth\n ? 'secondary'\n : 'tertiary';\n return (\n <button\n type=\"button\"\n role=\"gridcell\"\n data-date-option={day.value}\n class={{\n 'calendar-day': true,\n 'calendar-day--outside': !day.inMonth,\n 'calendar-day--today': day.value === today,\n 'calendar-day--in-range': inRange,\n 'calendar-day--range-preview': previewInRange,\n 'calendar-day--range-edge': rangeEdge,\n 'calendar-day--selected': selected,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--on-bold': rangeEdge,\n 'ds-interaction-fill--surface-open':\n pendingStartDay && !this.isDisabled(day.value),\n 'ds-interaction-fill--selected': selected && !this.isDisabled(day.value),\n }}\n disabled={this.isDisabled(day.value)}\n aria-label={day.label}\n aria-selected={selectedInRange || selected ? 'true' : 'false'}\n tabIndex={day.value === focusDate ? 0 : -1}\n onMouseEnter={() => this.previewRange(day.value)}\n onFocus={() => this.previewRange(day.value)}\n onClick={() => this.selectDate(day.value)}\n onKeyDown={event => this.handleDayKeyDown(event, day.value)}\n >\n <ds-text\n class=\"ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-body-medium\"\n color={textColor}\n emphasis={day.value === today}\n >\n {day.day}\n </ds-text>\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["DATE_FILTER_RELATIVE_PRESETS","label","value","days","offset","ISO_DATE_PATTERN","ISO_CALENDAR_DATE_LABEL","Intl","DateTimeFormat","month","day","year","timeZone","isIsoCalendarDate","test","split","map","Number","date","Date","UTC","getUTCFullYear","getUTCMonth","getUTCDate","formatIsoCalendarDateLabel","format","MONTH_LABELS","parseLooseCalendarDate","trimmed","trim","numeric","match","iso","padStart","labelled","monthIndex","indexOf","toLowerCase","String","shiftIsoCalendarDate","toISOString","slice","dateFilterRelativeValue","preset","dateFilterRangeValue","start","end","ordered","parseDateFilterValue","startsWith","length","some","candidate","kind","rest","CALENDAR_WEEKDAYS","MONTH_FORMATTER","DATE_FORMATTER","weekday","calendarToday","today","getFullYear","getMonth","getDate","calendarMonth","shiftCalendarMonth","calendarMonthLabel","calendarDays","firstOfMonth","firstWeekday","getUTCDay","gridStart","Array","from","_","index","dateValue","inMonth","calendarPaintedRange","pendingStart","heldRange","valueRange","calendarCss","Calendar","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","selectionMode","isInactive","autoFocus","previewEnd","moveMonth","selectDate","isDisabled","dsChange","emit","pending","current","previewRange","clearPreview","handleDayKeyDown","event","key","preventDefault","focusDate","componentWillLoad","anchorDate","componentDidLoad","setFocus","onValueChange","el","querySelector","focus","parsed","min","max","targetMonth","requestAnimationFrame","render","liveRange","liveRangeValue","rangeValue","weeks","previewStart","sort","previewFinish","selectedSingle","preferredFocus","find","h","Host","class","variant","icon","size","hasBorder","ariaLabel","onDsClick","as","emphasis","color","role","onMouseLeave","week","weekIndex","selectedInRange","Boolean","paintedInRange","pendingStartDay","previewInRange","inRange","rangeEdge","selected","textColor","type","disabled","tabIndex","onMouseEnter","onFocus","onClick","onKeyDown"],"sources":["src/wc/utils/date-filter-value.ts","src/wc/components/Calendar/calendar-grid.ts","src/wc/components/Calendar/Calendar.css?tag=ds-calendar&encapsulation=scoped","src/wc/components/Calendar/Calendar.tsx"],"sourcesContent":["export const DATE_FILTER_RELATIVE_PRESETS = [\n { label: 'Today', value: 'today', days: 1, offset: 0 },\n { label: 'Yesterday', value: 'yesterday', days: 1, offset: -1 },\n { label: 'Last 7 days', value: 'last-7-days', days: 7, offset: 0 },\n { label: 'Last 14 days', value: 'last-14-days', days: 14, offset: 0 },\n { label: 'Last 30 days', value: 'last-30-days', days: 30, offset: 0 },\n { label: 'Last 60 days', value: 'last-60-days', days: 60, offset: 0 },\n { label: 'Last 90 days', value: 'last-90-days', days: 90, offset: 0 },\n] as const;\n\nexport type DateFilterRelativePreset = (typeof DATE_FILTER_RELATIVE_PRESETS)[number]['value'];\nexport type DateFilterRelativeValue = `relative:${DateFilterRelativePreset}`;\nexport type DateFilterRangeValue = `range:${string}/${string}`;\nexport type DateFilterValue = DateFilterRelativeValue | DateFilterRangeValue;\n\nexport interface DateFilterRange {\n start: string;\n end: string;\n}\n\nexport type ParsedDateFilterValue =\n | { kind: 'relative'; preset: DateFilterRelativePreset }\n | ({ kind: 'range' } & DateFilterRange);\n\nconst ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst ISO_CALENDAR_DATE_LABEL = new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n timeZone: 'UTC',\n});\n\nexport function isIsoCalendarDate(value: string): boolean {\n if (!ISO_DATE_PATTERN.test(value)) return false;\n const [year, month, day] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1, day));\n return (\n date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day\n );\n}\n\n/** Readable calendar date for filled ISO values such as `2026-09-10` → `Sep 10, 2026`. */\nexport function formatIsoCalendarDateLabel(value: string): string {\n if (!isIsoCalendarDate(value)) return '';\n return ISO_CALENDAR_DATE_LABEL.format(new Date(`${value}T00:00:00Z`));\n}\n\nconst MONTH_LABELS = [\n 'jan',\n 'feb',\n 'mar',\n 'apr',\n 'may',\n 'jun',\n 'jul',\n 'aug',\n 'sep',\n 'oct',\n 'nov',\n 'dec',\n];\n\n/** Parse a typed calendar date: ISO, `M/D/YYYY`, or a short-month label such as `Sep 10, 2026`. */\nexport function parseLooseCalendarDate(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return '';\n if (isIsoCalendarDate(trimmed)) return trimmed;\n\n const numeric = trimmed.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n if (numeric) {\n const iso = `${numeric[3]}-${numeric[1].padStart(2, '0')}-${numeric[2].padStart(2, '0')}`;\n return isIsoCalendarDate(iso) ? iso : '';\n }\n\n const labelled = trimmed.match(/^([A-Za-z]{3})\\s+(\\d{1,2}),\\s+(\\d{4})$/);\n if (!labelled) return '';\n const monthIndex = MONTH_LABELS.indexOf(labelled[1].toLowerCase());\n if (monthIndex < 0) return '';\n const iso = `${labelled[3]}-${String(monthIndex + 1).padStart(2, '0')}-${labelled[2].padStart(2, '0')}`;\n return isIsoCalendarDate(iso) ? iso : '';\n}\n\nexport function shiftIsoCalendarDate(value: string, days: number): string {\n if (!isIsoCalendarDate(value)) return '';\n const [year, month, day] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1, day + days));\n return date.toISOString().slice(0, 10);\n}\n\nexport function dateFilterRelativeValue(preset: DateFilterRelativePreset): DateFilterRelativeValue {\n return `relative:${preset}`;\n}\n\nexport function dateFilterRangeValue(start: string, end: string = start): DateFilterRangeValue {\n const ordered = start <= end ? [start, end] : [end, start];\n return `range:${ordered[0]}/${ordered[1]}`;\n}\n\nexport function parseDateFilterValue(value: unknown): ParsedDateFilterValue | null {\n if (typeof value !== 'string' || !value) return null;\n\n if (value.startsWith('relative:')) {\n const preset = value.slice('relative:'.length) as DateFilterRelativePreset;\n return DATE_FILTER_RELATIVE_PRESETS.some(candidate => candidate.value === preset)\n ? { kind: 'relative', preset }\n : null;\n }\n\n if (value.startsWith('range:')) {\n const [start, end, ...rest] = value.slice('range:'.length).split('/');\n if (rest.length || !isIsoCalendarDate(start) || !isIsoCalendarDate(end)) return null;\n return start <= end ? { kind: 'range', start, end } : { kind: 'range', start: end, end: start };\n }\n\n // Preserve the previous single-date contract as a one-day range.\n return isIsoCalendarDate(value) ? { kind: 'range', start: value, end: value } : null;\n}\n\nexport function normalizeDateFilterValue(value: unknown): DateFilterValue | '' {\n const parsed = parseDateFilterValue(value);\n if (!parsed) return '';\n return parsed.kind === 'relative'\n ? dateFilterRelativeValue(parsed.preset)\n : dateFilterRangeValue(parsed.start, parsed.end);\n}\n\nexport function resolveDateFilterRange(\n value: unknown,\n referenceDate: string\n): DateFilterRange | null {\n if (!isIsoCalendarDate(referenceDate)) return null;\n const parsed = parseDateFilterValue(value);\n if (!parsed) return null;\n if (parsed.kind === 'range') return { start: parsed.start, end: parsed.end };\n\n const preset = DATE_FILTER_RELATIVE_PRESETS.find(candidate => candidate.value === parsed.preset);\n if (!preset) return null;\n const end = shiftIsoCalendarDate(referenceDate, preset.offset);\n return { start: shiftIsoCalendarDate(end, -(preset.days - 1)), end };\n}\n","import { isIsoCalendarDate, shiftIsoCalendarDate } from '../../utils';\n\nexport interface CalendarDateRange {\n start: string;\n end: string;\n}\n\nexport interface CalendarDay {\n value: string;\n day: number;\n inMonth: boolean;\n label: string;\n}\n\nexport const CALENDAR_WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nconst MONTH_FORMATTER = new Intl.DateTimeFormat('en-US', {\n month: 'long',\n year: 'numeric',\n timeZone: 'UTC',\n});\nconst DATE_FORMATTER = new Intl.DateTimeFormat('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n timeZone: 'UTC',\n});\n\nexport function calendarToday(): string {\n const today = new Date();\n const year = today.getFullYear();\n const month = String(today.getMonth() + 1).padStart(2, '0');\n const day = String(today.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\nexport function calendarMonth(value: string): string {\n return isIsoCalendarDate(value) ? value.slice(0, 7) : calendarToday().slice(0, 7);\n}\n\nexport function shiftCalendarMonth(value: string, offset: number): string {\n const [year, month] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1 + offset, 1));\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`;\n}\n\nexport function calendarMonthLabel(value: string): string {\n const [year, month] = value.split('-').map(Number);\n return MONTH_FORMATTER.format(new Date(Date.UTC(year, month - 1, 1)));\n}\n\nexport function calendarDays(value: string): CalendarDay[] {\n const [year, month] = value.split('-').map(Number);\n const firstOfMonth = `${year}-${String(month).padStart(2, '0')}-01`;\n const firstWeekday = new Date(`${firstOfMonth}T00:00:00Z`).getUTCDay();\n const gridStart = shiftIsoCalendarDate(firstOfMonth, -firstWeekday);\n return Array.from({ length: 42 }, (_, index) => {\n const dateValue = shiftIsoCalendarDate(gridStart, index);\n const date = new Date(`${dateValue}T00:00:00Z`);\n return {\n value: dateValue,\n day: date.getUTCDate(),\n inMonth: dateValue.startsWith(`${value}-`),\n label: DATE_FORMATTER.format(date),\n };\n });\n}\n\n/** Keep the previous committed range visible while a replacement range is being chosen. */\nexport function calendarPaintedRange(\n pendingStart: string,\n heldRange: CalendarDateRange | null,\n valueRange: CalendarDateRange | null\n): CalendarDateRange | null {\n return pendingStart ? heldRange : valueRange;\n}\n","@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n display: flex;\n min-height: 0;\n flex-direction: column;\n}\n\n.calendar {\n display: flex;\n min-height: 0;\n flex-direction: column;\n min-width: calc(\n (var(--dimension-size-400) * 7) + (var(--dimension-space-050) * 6) +\n (var(--dimension-space-100) * 2)\n );\n padding: var(--ds-calendar-padding, var(--dimension-space-100));\n}\n\n.calendar-heading {\n display: grid;\n grid-template-columns: var(--dimension-size-400) minmax(0, 1fr) var(--dimension-size-400);\n align-items: center;\n text-align: center;\n}\n\n.calendar-nav--previous {\n justify-self: start;\n}\n\n.calendar-nav--next {\n justify-self: end;\n}\n\n.calendar-weekdays,\n.calendar-grid__row {\n display: grid;\n grid-template-columns: repeat(7, minmax(0, 1fr));\n column-gap: var(--dimension-space-050);\n}\n\n.calendar-grid {\n display: flex;\n flex-direction: column;\n row-gap: var(--dimension-space-050);\n}\n\n.calendar-weekdays {\n align-items: center;\n min-height: var(--dimension-size-400);\n margin-block-start: var(--dimension-space-050);\n color: var(--color-foreground-secondary);\n text-align: center;\n}\n\n.calendar-day {\n appearance: none;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 0;\n width: 100%;\n height: var(--dimension-size-400);\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n color: var(--color-foreground-primary);\n cursor: default;\n}\n\n.calendar-day:disabled {\n cursor: not-allowed;\n}\n\n.calendar-day--outside {\n color: var(--color-foreground-tertiary);\n}\n\n.calendar-day--in-range {\n background: var(--color-background-faint-brand);\n color: var(--color-foreground-primary);\n}\n\n/* In-progress span uses the shared hover overlay; the first day keeps pressed via --surface-open. */\n.calendar-day.ds-interaction-fill.calendar-day--range-preview:not(:disabled)::after {\n background: var(--ds-interaction-hover);\n}\n\n.calendar-day.ds-interaction-fill.calendar-day--range-preview:active:not(:disabled)::after {\n background: var(--ds-interaction-pressed);\n}\n\n.calendar-day--today {\n color: var(--color-foreground-primary);\n}\n\n.calendar-day--range-edge {\n background: var(--color-background-bold-brand);\n color: var(--color-foreground-on-bold-background-primary);\n}\n\n@media (forced-colors: active) {\n .calendar-day--range-edge {\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n }\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n Method,\n Prop,\n State,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport {\n dateFilterRangeValue,\n isIsoCalendarDate,\n parseDateFilterValue,\n shiftIsoCalendarDate,\n} from '../../utils';\nimport {\n CALENDAR_WEEKDAYS,\n calendarDays,\n calendarMonth,\n calendarMonthLabel,\n calendarPaintedRange,\n calendarToday,\n shiftCalendarMonth,\n type CalendarDateRange,\n} from './calendar-grid';\n\nexport type CalendarSelectionMode = 'single' | 'range';\n\n@Component({\n tag: 'ds-calendar',\n styleUrl: 'Calendar.css',\n scoped: true,\n})\nexport class Calendar {\n @Element() el!: HTMLElement;\n\n /** Single date emits YYYY-MM-DD. Range emits the shared `range:start/end` string. */\n @Prop() selectionMode: CalendarSelectionMode = 'single';\n @Prop() value: string = '';\n @Prop() min: string | undefined;\n @Prop() max: string | undefined;\n @Prop() isInactive: boolean = false;\n /** Move keyboard focus into the grid after the calendar is rendered. */\n @Prop() autoFocus: boolean = false;\n\n @Event() dsChange!: EventEmitter<string>;\n\n @State() private month = calendarMonth(calendarToday());\n @State() private pendingStart = '';\n @State() private previewEnd = '';\n @State() private heldRange: CalendarDateRange | null = null;\n\n componentWillLoad() {\n this.month = calendarMonth(this.anchorDate());\n }\n\n componentDidLoad() {\n if (this.autoFocus) void this.setFocus();\n }\n\n @Watch('value')\n onValueChange() {\n this.month = calendarMonth(this.anchorDate());\n }\n\n @Method()\n async setFocus() {\n this.el.querySelector<HTMLElement>('.calendar-day[tabindex=\"0\"]')?.focus();\n }\n\n private anchorDate(): string {\n if (this.selectionMode === 'range') {\n const parsed = parseDateFilterValue(this.value);\n if (parsed?.kind === 'range') return parsed.start;\n return calendarToday();\n }\n return isIsoCalendarDate(this.value) ? this.value : calendarToday();\n }\n\n private isDisabled(day: string): boolean {\n if (this.isInactive) return true;\n if (this.min && isIsoCalendarDate(this.min) && day < this.min) return true;\n if (this.max && isIsoCalendarDate(this.max) && day > this.max) return true;\n return false;\n }\n\n private moveMonth = (offset: number) => {\n this.previewEnd = '';\n this.month = shiftCalendarMonth(this.month, offset);\n };\n\n private selectDate = (day: string) => {\n if (this.isDisabled(day)) return;\n this.previewEnd = '';\n if (this.selectionMode === 'single') {\n this.pendingStart = '';\n this.heldRange = null;\n this.dsChange.emit(day);\n return;\n }\n const pending = this.pendingStart;\n if (pending) {\n this.pendingStart = '';\n this.heldRange = null;\n this.dsChange.emit(dateFilterRangeValue(pending, day));\n return;\n }\n const current = parseDateFilterValue(this.value);\n this.heldRange = current?.kind === 'range' ? { start: current.start, end: current.end } : null;\n this.pendingStart = day;\n this.dsChange.emit(dateFilterRangeValue(day, day));\n };\n\n private previewRange = (day: string) => {\n if (!this.pendingStart || this.previewEnd === day) return;\n this.previewEnd = day;\n };\n\n private clearPreview = () => {\n if (!this.previewEnd) return;\n this.previewEnd = '';\n };\n\n private focusDate(day: string) {\n this.previewRange(day);\n const targetMonth = calendarMonth(day);\n if (this.month !== targetMonth) this.month = targetMonth;\n requestAnimationFrame(() => {\n this.el.querySelector<HTMLElement>(`[data-date-option=\"${day}\"]`)?.focus();\n });\n }\n\n private handleDayKeyDown = (event: KeyboardEvent, day: string) => {\n let offset: number | null = null;\n if (event.key === 'ArrowLeft') offset = -1;\n else if (event.key === 'ArrowRight') offset = 1;\n else if (event.key === 'ArrowUp') offset = -7;\n else if (event.key === 'ArrowDown') offset = 7;\n else if (event.key === 'Home') {\n offset = -new Date(`${day}T00:00:00Z`).getUTCDay();\n } else if (event.key === 'End') {\n offset = 6 - new Date(`${day}T00:00:00Z`).getUTCDay();\n } else if (event.key === 'PageUp' || event.key === 'PageDown') {\n const month = shiftCalendarMonth(calendarMonth(day), event.key === 'PageUp' ? -1 : 1);\n const candidate = `${month}-${day.slice(8, 10)}`;\n event.preventDefault();\n this.focusDate(isIsoCalendarDate(candidate) ? candidate : `${month}-01`);\n return;\n }\n if (offset === null) return;\n event.preventDefault();\n this.focusDate(shiftIsoCalendarDate(day, offset));\n };\n\n render() {\n const liveRange = this.selectionMode === 'range' ? parseDateFilterValue(this.value) : null;\n const liveRangeValue = liveRange?.kind === 'range' ? liveRange : null;\n const rangeValue = calendarPaintedRange(this.pendingStart, this.heldRange, liveRangeValue);\n const days = calendarDays(this.month);\n const weeks = Array.from({ length: 6 }, (_, index) => days.slice(index * 7, index * 7 + 7));\n const today = calendarToday();\n const previewStart =\n this.pendingStart && this.previewEnd ? [this.pendingStart, this.previewEnd].sort()[0] : null;\n const previewFinish =\n this.pendingStart && this.previewEnd ? [this.pendingStart, this.previewEnd].sort()[1] : null;\n const selectedSingle =\n this.selectionMode === 'single' && isIsoCalendarDate(this.value) ? this.value : '';\n const preferredFocus =\n this.pendingStart ||\n selectedSingle ||\n rangeValue?.end ||\n (this.month === today.slice(0, 7) ? today : '');\n const focusDate = days.some(day => day.value === preferredFocus)\n ? preferredFocus\n : (days.find(day => day.inMonth)?.value ?? days[0]?.value);\n\n return (\n <Host>\n <div class=\"calendar\">\n <div class=\"calendar-heading ds-control--md\">\n <ds-button-unfilled\n class=\"calendar-nav calendar-nav--previous\"\n variant=\"icon\"\n icon=\"ChevronLeft\"\n size=\"md\"\n hasBorder={false}\n isInactive={this.isInactive}\n ariaLabel=\"Previous month\"\n onDsClick={() => this.moveMonth(-1)}\n />\n <ds-text as=\"span\" variant=\"text-body-medium\" emphasis color=\"primary\">\n {calendarMonthLabel(this.month)}\n </ds-text>\n <ds-button-unfilled\n class=\"calendar-nav calendar-nav--next\"\n variant=\"icon\"\n icon=\"ChevronRight\"\n size=\"md\"\n hasBorder={false}\n isInactive={this.isInactive}\n ariaLabel=\"Next month\"\n onDsClick={() => this.moveMonth(1)}\n />\n </div>\n <div class=\"calendar-weekdays\" aria-hidden=\"true\">\n {CALENDAR_WEEKDAYS.map(day => (\n <ds-text as=\"span\" variant=\"text-body-small\" color=\"secondary\">\n {day}\n </ds-text>\n ))}\n </div>\n <div\n class=\"calendar-grid\"\n role=\"grid\"\n aria-label={calendarMonthLabel(this.month)}\n onMouseLeave={this.clearPreview}\n >\n {weeks.map((week, weekIndex) => (\n <div class=\"calendar-grid__row\" role=\"row\" key={`week-${weekIndex}`}>\n {week.map(day => {\n const selectedInRange = Boolean(\n liveRangeValue &&\n day.value >= liveRangeValue.start &&\n day.value <= liveRangeValue.end\n );\n const paintedInRange = Boolean(\n rangeValue && day.value >= rangeValue.start && day.value <= rangeValue.end\n );\n const pendingStartDay =\n this.selectionMode === 'range' &&\n Boolean(this.pendingStart) &&\n day.value === this.pendingStart;\n const previewInRange = Boolean(\n this.pendingStart &&\n previewStart &&\n previewFinish &&\n day.value >= previewStart &&\n day.value <= previewFinish &&\n day.value !== this.pendingStart\n );\n const inRange = this.selectionMode === 'range' && paintedInRange;\n const rangeEdge = Boolean(\n this.selectionMode === 'range' &&\n rangeValue &&\n (day.value === rangeValue.start || day.value === rangeValue.end)\n );\n const selected = this.selectionMode === 'single' && day.value === selectedSingle;\n const textColor = rangeEdge\n ? 'on-bold'\n : selected ||\n inRange ||\n pendingStartDay ||\n previewInRange ||\n day.value === today\n ? 'primary'\n : day.inMonth\n ? 'secondary'\n : 'tertiary';\n return (\n <button\n type=\"button\"\n role=\"gridcell\"\n data-date-option={day.value}\n class={{\n 'calendar-day': true,\n 'calendar-day--outside': !day.inMonth,\n 'calendar-day--today': day.value === today,\n 'calendar-day--in-range': inRange,\n 'calendar-day--range-preview': previewInRange,\n 'calendar-day--range-edge': rangeEdge,\n 'calendar-day--selected': selected,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--on-bold': rangeEdge,\n 'ds-interaction-fill--surface-open':\n pendingStartDay && !this.isDisabled(day.value),\n 'ds-interaction-fill--selected': selected && !this.isDisabled(day.value),\n }}\n disabled={this.isDisabled(day.value)}\n aria-label={day.label}\n aria-selected={selectedInRange || selected ? 'true' : 'false'}\n tabIndex={day.value === focusDate ? 0 : -1}\n onMouseEnter={() => this.previewRange(day.value)}\n onFocus={() => this.previewRange(day.value)}\n onClick={() => this.selectDate(day.value)}\n onKeyDown={event => this.handleDayKeyDown(event, day.value)}\n >\n {/* eslint-disable compomo/no-selected-fill-emphasis-change -- Today emphasis is date-driven and remains unchanged when selection changes. */}\n <ds-text\n class=\"ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-body-medium\"\n color={textColor}\n emphasis={day.value === today}\n >\n {day.day}\n </ds-text>\n {/* eslint-enable compomo/no-selected-fill-emphasis-change */}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{p as e,H as t,c as i,h as s,a as n,t as a}from"./index.js";import{d as r}from"./p-ZhP2tVmM.js";import{d as o}from"./p-CiH4GG6r.js";import{d}from"./p-Dzndkdx5.js";import{d as u}from"./p-D6Wl3dRO.js";import{d as c}from"./p-DjkUFlDW.js";import{d as l}from"./p-0XTyQNRG.js";import{d as h}from"./p-DOAybCp0.js";import{d as g}from"./p-DwbcNDJF.js";import{d as q}from"./p-CYzFfFcH.js";function p(e,t){return e.find((e=>e.questionId===t))}function m(e,t){return Object.fromEntries(e.map((e=>{const i=p(t,e.id);const s=new Set(e.choices?.map((e=>e.value))??[]);if(e.type==="multiple"){const t=Array.isArray(i?.value)?i.value:[];const n=t.filter((e=>s.has(e)));const a=t.find((e=>!s.has(e)))??"";return[e.id,{value:n,otherSelected:Boolean(e.allowOther&&a),otherText:e.allowOther?a:"",skipped:i?.value===null}]}const n=typeof i?.value==="string"?i.value:"";const a=e.type==="single"&&s.has(n);return[e.id,{value:e.type==="single"&&!a?"":n,otherSelected:Boolean(e.type==="single"&&e.allowOther&&n&&!a),otherText:e.type==="single"&&e.allowOther&&n&&!a?n:"",skipped:i?.value===null}]})))}function f(e,t){if(t.skipped)return{questionId:e.id,value:null};if(e.type==="multiple"){const i=Array.isArray(t.value)?[...t.value]:[];if(t.otherSelected&&t.otherText.trim())i.push(t.otherText.trim());return{questionId:e.id,value:i.length||e.required?i:null}}if(t.otherSelected){const i=t.otherText.trim();return{questionId:e.id,value:i||null}}const i=typeof t.value==="string"?t.value.trim():"";return{questionId:e.id,value:i||null}}function b(e,t){if((e.type==="single"||e.type==="multiple")&&!e.choices?.length){return"This question has no available choices."}if(t.otherSelected&&!t.otherText.trim()){return"Enter a response for Other."}if(!e.required||t.skipped)return undefined;const i=f(e,t).value;const s=i===null||Array.isArray(i)&&i.length===0;if(!s)return undefined;return e.type==="text"?"Enter an answer before continuing.":"Choose an answer before continuing."}function _(e,t){if(!t||t.value===null)return"Skipped";const i=Array.isArray(t.value)?t.value:[t.value];const s=new Map(e.choices?.map((e=>[e.value,e.label]))??[]);return i.map((e=>s.get(e)??e)).join(", ")}const v=()=>`@media (forced-colors: active){.sc-ds-agent-questionnaire:root,.sc-ds-agent-questionnaire-h,.ds-forced-colors-scope.sc-ds-agent-questionnaire{--ds-forced-color-surface:Canvas;--ds-forced-color-content:CanvasText;--ds-forced-color-control-boundary:ButtonText;--ds-forced-color-selected:Highlight;--ds-forced-color-on-selected:HighlightText;--ds-forced-color-disabled:GrayText}}.ds-visually-hidden.sc-ds-agent-questionnaire-h,.ds-visually-hidden.sc-ds-agent-questionnaire{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sc-ds-agent-questionnaire-h{display:block;width:100%;min-width:0;box-sizing:border-box;-webkit-user-select:none;user-select:none}.questionnaire.sc-ds-agent-questionnaire{display:grid;gap:var(--dimension-space-150);width:100%;padding:var(--dimension-space-200);border-radius:var(--dimension-radius-125);background:var(--color-background-primary);box-shadow:var(--effect-elevation-elevated-md);box-sizing:border-box}.questionnaire--answered.sc-ds-agent-questionnaire{gap:var(--dimension-space-100);padding:var(--dimension-space-150);background:var(--color-background-secondary);box-shadow:none}.questionnaire--preparing.sc-ds-agent-questionnaire{align-items:center;grid-template-columns:auto minmax(0, 1fr)}.questionnaire__header.sc-ds-agent-questionnaire,.questionnaire__actions.sc-ds-agent-questionnaire,.questionnaire__actions-leading.sc-ds-agent-questionnaire,.questionnaire__error.sc-ds-agent-questionnaire,.questionnaire__submission-error.sc-ds-agent-questionnaire{display:flex;align-items:center}.questionnaire__header.sc-ds-agent-questionnaire,.questionnaire__actions.sc-ds-agent-questionnaire{justify-content:space-between;gap:var(--dimension-space-100)}.questionnaire__body.sc-ds-agent-questionnaire,.questionnaire__prompt.sc-ds-agent-questionnaire,.questionnaire__choices.sc-ds-agent-questionnaire,.questionnaire__single-choice.sc-ds-agent-questionnaire,.questionnaire__multiple-choice.sc-ds-agent-questionnaire,.questionnaire__other-choice.sc-ds-agent-questionnaire,.questionnaire__summary.sc-ds-agent-questionnaire,.questionnaire__summary.sc-ds-agent-questionnaire li.sc-ds-agent-questionnaire{display:grid}.questionnaire__body.sc-ds-agent-questionnaire,.questionnaire__prompt.sc-ds-agent-questionnaire,.questionnaire__choices.sc-ds-agent-questionnaire,.questionnaire__single-choice.sc-ds-agent-questionnaire,.questionnaire__multiple-choice.sc-ds-agent-questionnaire,.questionnaire__other-choice.sc-ds-agent-questionnaire{gap:var(--dimension-space-100)}.questionnaire__choices.sc-ds-agent-questionnaire{min-width:0;margin:0;padding:0;border:0}ds-radio.sc-ds-agent-questionnaire,ds-checkbox.sc-ds-agent-questionnaire{width:100%;min-width:0}.questionnaire__other-input.sc-ds-agent-questionnaire,.questionnaire__text-input.sc-ds-agent-questionnaire{width:100%;padding:var(--dimension-space-100);border:var(--dimension-stroke-width-012) solid var(--color-border-secondary);border-radius:var(--dimension-radius-050);outline:none;background:var(--color-background-primary);color:var(--color-foreground-primary);font-family:var(--typography-font-family-ui);font-size:var(--typography-fontsize-md);font-weight:var(--typography-weight-regular);line-height:var(--typography-lineheight-md);letter-spacing:var(--typography-letterspacing-negative-half);box-sizing:border-box;-webkit-user-select:text;user-select:text}.questionnaire__other-input.sc-ds-agent-questionnaire{width:calc(100% - var(--dimension-size-500));margin-inline-start:var(--dimension-size-500)}.questionnaire__text-input.sc-ds-agent-questionnaire{min-height:calc(var(--typography-lineheight-md) * 4 + var(--dimension-space-200));resize:vertical}.questionnaire__other-input.sc-ds-agent-questionnaire:focus,.questionnaire__text-input.sc-ds-agent-questionnaire:focus{border-color:var(--color-border-bold-brand);box-shadow:inset 0 0 0 var(--dimension-stroke-width-018) var(--color-border-bold-brand)}.questionnaire__other-input[aria-invalid='true'].sc-ds-agent-questionnaire,.questionnaire__text-input[aria-invalid='true'].sc-ds-agent-questionnaire{border-color:var(--color-border-bold-negative)}.questionnaire__error.sc-ds-agent-questionnaire,.questionnaire__submission-error.sc-ds-agent-questionnaire{gap:var(--dimension-space-050);color:var(--color-foreground-bold-negative)}.questionnaire__submission-error.sc-ds-agent-questionnaire{padding:var(--dimension-space-075);border-radius:var(--dimension-radius-050);background:var(--color-background-faint-negative)}.questionnaire__actions-leading.sc-ds-agent-questionnaire{flex-wrap:wrap;gap:var(--dimension-space-075)}.questionnaire__action-item.sc-ds-agent-questionnaire{width:fit-content;max-width:100%}.questionnaire.sc-ds-agent-questionnaire textarea.sc-ds-agent-questionnaire:disabled{color:var(--color-foreground-tertiary);cursor:default;opacity:1}.questionnaire__summary.sc-ds-agent-questionnaire{gap:var(--dimension-space-100);margin:0;padding:0;list-style:none}.questionnaire__summary.sc-ds-agent-questionnaire li.sc-ds-agent-questionnaire{gap:var(--dimension-space-025)}@media (max-width: 480px){.questionnaire.sc-ds-agent-questionnaire{padding:var(--dimension-space-150)}.questionnaire__actions.sc-ds-agent-questionnaire{align-items:stretch;flex-direction:column}.questionnaire__actions-leading.sc-ds-agent-questionnaire{display:grid;grid-template-columns:minmax(0, 1fr);width:100%}.questionnaire__action-item.sc-ds-agent-questionnaire,.questionnaire__action-item--primary.sc-ds-agent-questionnaire{width:100%}}@media (forced-colors: active){.questionnaire.sc-ds-agent-questionnaire{border:var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);box-shadow:none}.questionnaire__other-input[aria-invalid='true'].sc-ds-agent-questionnaire,.questionnaire__text-input[aria-invalid='true'].sc-ds-agent-questionnaire{outline:var(--dimension-stroke-width-025) dashed var(--ds-forced-color-content)}.questionnaire__submission-error.sc-ds-agent-questionnaire{border:var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);background:var(--ds-forced-color-surface)}.questionnaire.sc-ds-agent-questionnaire input.sc-ds-agent-questionnaire:disabled,.questionnaire.sc-ds-agent-questionnaire textarea.sc-ds-agent-questionnaire:disabled{color:var(--ds-forced-color-disabled)}}`;const x={progress:"Question {current} of {total}",previous:"Previous",next:"Next",answer:"Answer",skip:"Skip",cancel:"Cancel",other:"Other",otherPlaceholder:"Enter another answer",preparing:"Preparing questions…"};let y=0;const w=e(class e extends t{constructor(e){super();if(e!==false){this.__registerHost()}this.dsAnswer=i(this,"dsAnswer",7);this.dsCancel=i(this,"dsCancel",7);this.answers=[];this.status="ready";this.allowCancel=false;this.currentStep=0;this.drafts={};this.validation={};this.instanceId=++y;this.otherValue=`__ds-agent-questionnaire-other-${this.instanceId}`;this.answerPending=false;this.resetScheduled=false;this.answersSnapshot=[];this.waitingForRequestAnswers=false}componentWillLoad(){this.draftRequestId=this.requestId;this.answersSnapshot=this.answers;this.resetDraft()}handleQuestionnaireInputChange(){this.scheduleDraftReset()}handleStatusChange(e){if(e!=="submitting")this.answerPending=false}async setFocus(){this.focusCurrentControl()}get copy(){return{...x,...this.labels}}get disabled(){return this.status==="submitting"}resetDraft(e=this.answers){this.currentStep=0;this.drafts=m(this.questions??[],e??[]);this.validation={};this.answerPending=false}scheduleDraftReset(){if(this.resetScheduled)return;this.resetScheduled=true;queueMicrotask((()=>{this.resetScheduled=false;const e=this.requestId!==this.draftRequestId;const t=this.answers!==this.answersSnapshot;if(e&&!t){this.waitingForRequestAnswers=true}else if(t){this.waitingForRequestAnswers=false}this.resetDraft(this.waitingForRequestAnswers?[]:this.answers);this.draftRequestId=this.requestId;this.answersSnapshot=this.answers}))}focusCurrentControl(e=false){const t=()=>{const t=e?this.el.querySelector('[data-question-control][aria-invalid="true"]:not([disabled])'):null;const i=t??this.el.querySelector("[data-question-control]:not([disabled]):not([is-inactive])");const s=this.el.querySelector("[data-question-action]:not([is-inactive]):not([is-loading])");const n=i??s;if(n?.setFocus)void n.setFocus();else n?.focus()};t();requestAnimationFrame(t);setTimeout(t,0)}updateDraft(e,t){const i=this.drafts[e]??{value:"",otherSelected:false,otherText:"",skipped:false};this.drafts={...this.drafts,[e]:{...i,...t,skipped:false}};if(this.validation[e]){const{[e]:t,...i}=this.validation;this.validation=i}}validate(e){const t=b(e,this.drafts[e.id]);if(!t)return true;this.validation={...this.validation,[e.id]:t};this.focusCurrentControl(true);return false}move(e){this.currentStep=Math.min(Math.max(e,0),this.questions.length-1);this.focusCurrentControl()}next(e){if(!this.validate(e))return;this.move(this.currentStep+1)}skip(e){if(e.required)return;this.drafts={...this.drafts,[e.id]:{...this.drafts[e.id]??{value:"",otherSelected:false,otherText:""},skipped:true}};if(this.currentStep<this.questions.length-1)this.move(this.currentStep+1);else this.submit()}submit(){if(this.disabled||this.answerPending)return;const e=this.questions.findIndex((e=>!this.validateWithoutFocus(e)));if(e>=0){this.currentStep=e;this.focusCurrentControl(true);return}this.answerPending=true;this.dsAnswer.emit({requestId:this.requestId,answers:this.questions.map((e=>f(e,this.drafts[e.id])))})}validateWithoutFocus(e){const t=b(e,this.drafts[e.id]);if(!t)return true;this.validation={...this.validation,[e.id]:t};return false}progressLabel(){return this.copy.progress.split("{current}").join(String(this.currentStep+1)).split("{total}").join(String(this.questions.length))}selectSingle(e,t){const i=t===this.otherValue;this.updateDraft(e.id,{value:i?"":t,otherSelected:i});if(i){requestAnimationFrame((()=>this.el.querySelector("[data-question-other-input]")?.focus()))}}renderSingleChoice(e,t,i){const n=this.drafts[e.id];const a=n.otherSelected?this.otherValue:typeof n.value==="string"?n.value:"";const r=[...e.choices??[],...e.allowOther?[{value:this.otherValue,label:this.copy.other}]:[]];return s("div",{class:"questionnaire__single-choice"},s("ds-radio",{"data-question-control":true,size:"lg",options:r,value:a,disabled:this.disabled,form:`ds-agent-questionnaire-detached-${this.instanceId}`,ariaLabelledby:t,"aria-describedby":this.validation[e.id]?i:undefined,onDsChange:t=>this.selectSingle(e,t.detail)}),n.otherSelected?this.renderOtherInput(e,i):null)}renderMultipleChoice(e,t){const i=this.drafts[e.id];const n=Array.isArray(i.value)?i.value:[];const a=`ds-agent-questionnaire-detached-${this.instanceId}`;return s("div",{class:"questionnaire__multiple-choice"},e.choices?.map((t=>s("ds-checkbox",{key:t.value,"data-question-control":true,size:"lg",label:t.label,description:t.description,value:t.value,checked:n.includes(t.value),disabled:this.disabled,form:a,onDsChange:i=>{this.updateDraft(e.id,{value:i.detail?[...n,t.value]:n.filter((e=>e!==t.value))})}}))),e.allowOther?s("div",{class:"questionnaire__other-choice"},s("ds-checkbox",{"data-question-control":true,size:"lg",label:this.copy.other,checked:i.otherSelected,disabled:this.disabled,form:a,onDsChange:t=>{this.updateDraft(e.id,{otherSelected:t.detail});if(t.detail){requestAnimationFrame((()=>this.el.querySelector("[data-question-other-input]")?.focus()))}}}),i.otherSelected?this.renderOtherInput(e,t):null):null)}renderOtherInput(e,t){const i=this.drafts[e.id];return s("input",{class:"questionnaire__other-input","data-question-control":true,"data-question-other-input":true,type:"text",form:`ds-agent-questionnaire-detached-${this.instanceId}`,value:i.otherText,placeholder:this.copy.otherPlaceholder,"aria-label":this.copy.other,"aria-invalid":this.validation[e.id]?"true":undefined,"aria-describedby":this.validation[e.id]?t:undefined,disabled:this.disabled,onInput:t=>this.updateDraft(e.id,{otherText:t.target.value})})}renderQuestion(e){const t=this.drafts[e.id];const i=`ds-agent-questionnaire-${this.instanceId}-${this.currentStep}-error`;const n=`ds-agent-questionnaire-${this.instanceId}-${this.currentStep}-prompt`;return s("div",{class:"questionnaire__body"},s("div",{class:"questionnaire__prompt"},s("ds-text",{as:"h2",variant:"text-title-small",textId:n},e.question),e.description?s("ds-text",{variant:"text-body-small",color:"secondary"},e.description):null),e.type==="text"?s("textarea",{class:"questionnaire__text-input","data-question-control":true,value:typeof t.value==="string"?t.value:"",form:`ds-agent-questionnaire-detached-${this.instanceId}`,placeholder:e.placeholder,"aria-label":e.question,"aria-invalid":this.validation[e.id]?"true":undefined,"aria-describedby":this.validation[e.id]?i:undefined,disabled:this.disabled,rows:4,onInput:t=>this.updateDraft(e.id,{value:t.target.value})}):s("fieldset",{class:"questionnaire__choices","aria-describedby":this.validation[e.id]?i:undefined},s("legend",{class:"ds-visually-hidden"},e.question),e.type==="single"?this.renderSingleChoice(e,n,i):this.renderMultipleChoice(e,i)),this.validation[e.id]?s("div",{id:i,class:"questionnaire__error",role:"alert"},s("ds-icon",{name:"ExclamationTriangle",size:"xs",color:"inherit"}),s("ds-text",{variant:"text-body-small",color:"negative"},this.validation[e.id])):null)}renderAnswered(){return s("div",{class:"questionnaire questionnaire--answered"},s("ol",{class:"questionnaire__summary"},this.questions.map((e=>s("li",null,s("ds-text",{variant:"text-body-small",emphasis:true},e.question),s("ds-text",{variant:"text-body-small",color:"secondary"},_(e,this.answers.find((t=>t.questionId===e.id)))))))))}render(){if(this.status==="preparing"){return s(n,null,s("div",{class:"questionnaire questionnaire--preparing",role:"status"},s("ds-loader",{size:"sm"}),s("ds-text",{variant:"text-body-medium"},this.copy.preparing)))}if(!this.questions?.length)return null;if(this.status==="answered")return s(n,null,this.renderAnswered());const e=this.questions[this.currentStep];const t=this.currentStep===this.questions.length-1;const i=Boolean(e.skippable&&!e.required);return s(n,null,s("section",{class:{questionnaire:true,"questionnaire--submitting":this.disabled,"questionnaire--error":this.status==="error"},"aria-busy":this.disabled?"true":undefined,"aria-label":e.question},s("header",{class:"questionnaire__header"},s("ds-text",{variant:"text-caption",color:"secondary"},this.progressLabel()),this.allowCancel?s("ds-tooltip",{label:this.copy.cancel,side:"top",size:"sm"},s("ds-button-unfilled",{"data-question-action":true,variant:"icon",icon:"Cross",size:"sm","aria-label":this.copy.cancel,hasBorder:false,isInactive:this.disabled,onDsClick:()=>this.dsCancel.emit({requestId:this.requestId})})):null),this.renderQuestion(e),this.status==="error"&&this.errorMessage?s("div",{class:"questionnaire__submission-error",role:"alert"},s("ds-icon",{name:"ExclamationTriangle",size:"xs",color:"inherit"}),s("ds-text",{variant:"text-body-small",color:"negative"},this.errorMessage)):null,s("footer",{class:"questionnaire__actions"},s("div",{class:"questionnaire__actions-leading"},this.currentStep>0?s("div",{class:"questionnaire__action-item"},s("ds-button-unfilled",{"data-question-action":true,label:this.copy.previous,size:"sm",width:"fill",isInactive:this.disabled,onDsClick:()=>this.move(this.currentStep-1)})):null,i?s("div",{class:"questionnaire__action-item"},s("ds-button-unfilled",{"data-question-action":true,label:this.copy.skip,size:"sm",width:"fill",hasBorder:false,isInactive:this.disabled,onDsClick:()=>this.skip(e)})):null),s("div",{class:"questionnaire__action-item questionnaire__action-item--primary"},s("ds-button-filled",{"data-question-action":true,label:t?this.copy.answer:this.copy.next,size:"sm",width:"fill",isLoading:this.disabled,onDsClick:()=>t?this.submit():this.next(e)})))))}get el(){return this}static get watchers(){return{requestId:[{handleQuestionnaireInputChange:0}],questions:[{handleQuestionnaireInputChange:0}],answers:[{handleQuestionnaireInputChange:0}],status:[{handleStatusChange:0}]}}static get style(){return v()}},[2,"ds-agent-questionnaire",{requestId:[1,"request-id"],questions:[16],answers:[16],status:[1],errorMessage:[1,"error-message"],allowCancel:[4,"allow-cancel"],labels:[16],currentStep:[32],drafts:[32],validation:[32],setFocus:[64]},undefined,{requestId:[{handleQuestionnaireInputChange:0}],questions:[{handleQuestionnaireInputChange:0}],answers:[{handleQuestionnaireInputChange:0}],status:[{handleStatusChange:0}]}]);function k(){if(typeof customElements==="undefined"){return}const e=["ds-agent-questionnaire","ds-badge","ds-button-filled","ds-button-unfilled","ds-checkbox","ds-icon","ds-loader","ds-radio","ds-text","ds-tooltip"];e.forEach((e=>{switch(e){case"ds-agent-questionnaire":if(!customElements.get(a(e))){customElements.define(a(e),w)}break;case"ds-badge":if(!customElements.get(a(e))){r()}break;case"ds-button-filled":if(!customElements.get(a(e))){o()}break;case"ds-button-unfilled":if(!customElements.get(a(e))){d()}break;case"ds-checkbox":if(!customElements.get(a(e))){u()}break;case"ds-icon":if(!customElements.get(a(e))){c()}break;case"ds-loader":if(!customElements.get(a(e))){l()}break;case"ds-radio":if(!customElements.get(a(e))){h()}break;case"ds-text":if(!customElements.get(a(e))){g()}break;case"ds-tooltip":if(!customElements.get(a(e))){q()}break}}))}k();export{w as A,k as d};
|
|
2
|
-
//# sourceMappingURL=p-
|
|
1
|
+
import{p as e,H as t,c as i,h as s,a as n,t as a}from"./index.js";import{d as r}from"./p-ZhP2tVmM.js";import{d as o}from"./p-CiH4GG6r.js";import{d}from"./p-Dzndkdx5.js";import{d as u}from"./p-Cqc2U1ZQ.js";import{d as c}from"./p-DjkUFlDW.js";import{d as l}from"./p-0XTyQNRG.js";import{d as h}from"./p-DOAybCp0.js";import{d as g}from"./p-DwbcNDJF.js";import{d as q}from"./p-CYzFfFcH.js";function p(e,t){return e.find((e=>e.questionId===t))}function m(e,t){return Object.fromEntries(e.map((e=>{const i=p(t,e.id);const s=new Set(e.choices?.map((e=>e.value))??[]);if(e.type==="multiple"){const t=Array.isArray(i?.value)?i.value:[];const n=t.filter((e=>s.has(e)));const a=t.find((e=>!s.has(e)))??"";return[e.id,{value:n,otherSelected:Boolean(e.allowOther&&a),otherText:e.allowOther?a:"",skipped:i?.value===null}]}const n=typeof i?.value==="string"?i.value:"";const a=e.type==="single"&&s.has(n);return[e.id,{value:e.type==="single"&&!a?"":n,otherSelected:Boolean(e.type==="single"&&e.allowOther&&n&&!a),otherText:e.type==="single"&&e.allowOther&&n&&!a?n:"",skipped:i?.value===null}]})))}function f(e,t){if(t.skipped)return{questionId:e.id,value:null};if(e.type==="multiple"){const i=Array.isArray(t.value)?[...t.value]:[];if(t.otherSelected&&t.otherText.trim())i.push(t.otherText.trim());return{questionId:e.id,value:i.length||e.required?i:null}}if(t.otherSelected){const i=t.otherText.trim();return{questionId:e.id,value:i||null}}const i=typeof t.value==="string"?t.value.trim():"";return{questionId:e.id,value:i||null}}function b(e,t){if((e.type==="single"||e.type==="multiple")&&!e.choices?.length){return"This question has no available choices."}if(t.otherSelected&&!t.otherText.trim()){return"Enter a response for Other."}if(!e.required||t.skipped)return undefined;const i=f(e,t).value;const s=i===null||Array.isArray(i)&&i.length===0;if(!s)return undefined;return e.type==="text"?"Enter an answer before continuing.":"Choose an answer before continuing."}function _(e,t){if(!t||t.value===null)return"Skipped";const i=Array.isArray(t.value)?t.value:[t.value];const s=new Map(e.choices?.map((e=>[e.value,e.label]))??[]);return i.map((e=>s.get(e)??e)).join(", ")}const v=()=>`@media (forced-colors: active){.sc-ds-agent-questionnaire:root,.sc-ds-agent-questionnaire-h,.ds-forced-colors-scope.sc-ds-agent-questionnaire{--ds-forced-color-surface:Canvas;--ds-forced-color-content:CanvasText;--ds-forced-color-control-boundary:ButtonText;--ds-forced-color-selected:Highlight;--ds-forced-color-on-selected:HighlightText;--ds-forced-color-disabled:GrayText}}.ds-visually-hidden.sc-ds-agent-questionnaire-h,.ds-visually-hidden.sc-ds-agent-questionnaire{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sc-ds-agent-questionnaire-h{display:block;width:100%;min-width:0;box-sizing:border-box;-webkit-user-select:none;user-select:none}.questionnaire.sc-ds-agent-questionnaire{display:grid;gap:var(--dimension-space-150);width:100%;padding:var(--dimension-space-200);border-radius:var(--dimension-radius-125);background:var(--color-background-primary);box-shadow:var(--effect-elevation-elevated-md);box-sizing:border-box}.questionnaire--answered.sc-ds-agent-questionnaire{gap:var(--dimension-space-100);padding:var(--dimension-space-150);background:var(--color-background-secondary);box-shadow:none}.questionnaire--preparing.sc-ds-agent-questionnaire{align-items:center;grid-template-columns:auto minmax(0, 1fr)}.questionnaire__header.sc-ds-agent-questionnaire,.questionnaire__actions.sc-ds-agent-questionnaire,.questionnaire__actions-leading.sc-ds-agent-questionnaire,.questionnaire__error.sc-ds-agent-questionnaire,.questionnaire__submission-error.sc-ds-agent-questionnaire{display:flex;align-items:center}.questionnaire__header.sc-ds-agent-questionnaire,.questionnaire__actions.sc-ds-agent-questionnaire{justify-content:space-between;gap:var(--dimension-space-100)}.questionnaire__body.sc-ds-agent-questionnaire,.questionnaire__prompt.sc-ds-agent-questionnaire,.questionnaire__choices.sc-ds-agent-questionnaire,.questionnaire__single-choice.sc-ds-agent-questionnaire,.questionnaire__multiple-choice.sc-ds-agent-questionnaire,.questionnaire__other-choice.sc-ds-agent-questionnaire,.questionnaire__summary.sc-ds-agent-questionnaire,.questionnaire__summary.sc-ds-agent-questionnaire li.sc-ds-agent-questionnaire{display:grid}.questionnaire__body.sc-ds-agent-questionnaire,.questionnaire__prompt.sc-ds-agent-questionnaire,.questionnaire__choices.sc-ds-agent-questionnaire,.questionnaire__single-choice.sc-ds-agent-questionnaire,.questionnaire__multiple-choice.sc-ds-agent-questionnaire,.questionnaire__other-choice.sc-ds-agent-questionnaire{gap:var(--dimension-space-100)}.questionnaire__choices.sc-ds-agent-questionnaire{min-width:0;margin:0;padding:0;border:0}ds-radio.sc-ds-agent-questionnaire,ds-checkbox.sc-ds-agent-questionnaire{width:100%;min-width:0}.questionnaire__other-input.sc-ds-agent-questionnaire,.questionnaire__text-input.sc-ds-agent-questionnaire{width:100%;padding:var(--dimension-space-100);border:var(--dimension-stroke-width-012) solid var(--color-border-secondary);border-radius:var(--dimension-radius-050);outline:none;background:var(--color-background-primary);color:var(--color-foreground-primary);font-family:var(--typography-font-family-ui);font-size:var(--typography-fontsize-md);font-weight:var(--typography-weight-regular);line-height:var(--typography-lineheight-md);letter-spacing:var(--typography-letterspacing-negative-half);box-sizing:border-box;-webkit-user-select:text;user-select:text}.questionnaire__other-input.sc-ds-agent-questionnaire{width:calc(100% - var(--dimension-size-500));margin-inline-start:var(--dimension-size-500)}.questionnaire__text-input.sc-ds-agent-questionnaire{min-height:calc(var(--typography-lineheight-md) * 4 + var(--dimension-space-200));resize:vertical}.questionnaire__other-input.sc-ds-agent-questionnaire:focus,.questionnaire__text-input.sc-ds-agent-questionnaire:focus{border-color:var(--color-border-bold-brand);box-shadow:inset 0 0 0 var(--dimension-stroke-width-018) var(--color-border-bold-brand)}.questionnaire__other-input[aria-invalid='true'].sc-ds-agent-questionnaire,.questionnaire__text-input[aria-invalid='true'].sc-ds-agent-questionnaire{border-color:var(--color-border-bold-negative)}.questionnaire__error.sc-ds-agent-questionnaire,.questionnaire__submission-error.sc-ds-agent-questionnaire{gap:var(--dimension-space-050);color:var(--color-foreground-bold-negative)}.questionnaire__submission-error.sc-ds-agent-questionnaire{padding:var(--dimension-space-075);border-radius:var(--dimension-radius-050);background:var(--color-background-faint-negative)}.questionnaire__actions-leading.sc-ds-agent-questionnaire{flex-wrap:wrap;gap:var(--dimension-space-075)}.questionnaire__action-item.sc-ds-agent-questionnaire{width:fit-content;max-width:100%}.questionnaire.sc-ds-agent-questionnaire textarea.sc-ds-agent-questionnaire:disabled{color:var(--color-foreground-tertiary);cursor:default;opacity:1}.questionnaire__summary.sc-ds-agent-questionnaire{gap:var(--dimension-space-100);margin:0;padding:0;list-style:none}.questionnaire__summary.sc-ds-agent-questionnaire li.sc-ds-agent-questionnaire{gap:var(--dimension-space-025)}@media (max-width: 480px){.questionnaire.sc-ds-agent-questionnaire{padding:var(--dimension-space-150)}.questionnaire__actions.sc-ds-agent-questionnaire{align-items:stretch;flex-direction:column}.questionnaire__actions-leading.sc-ds-agent-questionnaire{display:grid;grid-template-columns:minmax(0, 1fr);width:100%}.questionnaire__action-item.sc-ds-agent-questionnaire,.questionnaire__action-item--primary.sc-ds-agent-questionnaire{width:100%}}@media (forced-colors: active){.questionnaire.sc-ds-agent-questionnaire{border:var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);box-shadow:none}.questionnaire__other-input[aria-invalid='true'].sc-ds-agent-questionnaire,.questionnaire__text-input[aria-invalid='true'].sc-ds-agent-questionnaire{outline:var(--dimension-stroke-width-025) dashed var(--ds-forced-color-content)}.questionnaire__submission-error.sc-ds-agent-questionnaire{border:var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);background:var(--ds-forced-color-surface)}.questionnaire.sc-ds-agent-questionnaire input.sc-ds-agent-questionnaire:disabled,.questionnaire.sc-ds-agent-questionnaire textarea.sc-ds-agent-questionnaire:disabled{color:var(--ds-forced-color-disabled)}}`;const x={progress:"Question {current} of {total}",previous:"Previous",next:"Next",answer:"Answer",skip:"Skip",cancel:"Cancel",other:"Other",otherPlaceholder:"Enter another answer",preparing:"Preparing questions…"};let y=0;const w=e(class e extends t{constructor(e){super();if(e!==false){this.__registerHost()}this.dsAnswer=i(this,"dsAnswer",7);this.dsCancel=i(this,"dsCancel",7);this.answers=[];this.status="ready";this.allowCancel=false;this.currentStep=0;this.drafts={};this.validation={};this.instanceId=++y;this.otherValue=`__ds-agent-questionnaire-other-${this.instanceId}`;this.answerPending=false;this.resetScheduled=false;this.answersSnapshot=[];this.waitingForRequestAnswers=false}componentWillLoad(){this.draftRequestId=this.requestId;this.answersSnapshot=this.answers;this.resetDraft()}handleQuestionnaireInputChange(){this.scheduleDraftReset()}handleStatusChange(e){if(e!=="submitting")this.answerPending=false}async setFocus(){this.focusCurrentControl()}get copy(){return{...x,...this.labels}}get disabled(){return this.status==="submitting"}resetDraft(e=this.answers){this.currentStep=0;this.drafts=m(this.questions??[],e??[]);this.validation={};this.answerPending=false}scheduleDraftReset(){if(this.resetScheduled)return;this.resetScheduled=true;queueMicrotask((()=>{this.resetScheduled=false;const e=this.requestId!==this.draftRequestId;const t=this.answers!==this.answersSnapshot;if(e&&!t){this.waitingForRequestAnswers=true}else if(t){this.waitingForRequestAnswers=false}this.resetDraft(this.waitingForRequestAnswers?[]:this.answers);this.draftRequestId=this.requestId;this.answersSnapshot=this.answers}))}focusCurrentControl(e=false){const t=()=>{const t=e?this.el.querySelector('[data-question-control][aria-invalid="true"]:not([disabled])'):null;const i=t??this.el.querySelector("[data-question-control]:not([disabled]):not([is-inactive])");const s=this.el.querySelector("[data-question-action]:not([is-inactive]):not([is-loading])");const n=i??s;if(n?.setFocus)void n.setFocus();else n?.focus()};t();requestAnimationFrame(t);setTimeout(t,0)}updateDraft(e,t){const i=this.drafts[e]??{value:"",otherSelected:false,otherText:"",skipped:false};this.drafts={...this.drafts,[e]:{...i,...t,skipped:false}};if(this.validation[e]){const{[e]:t,...i}=this.validation;this.validation=i}}validate(e){const t=b(e,this.drafts[e.id]);if(!t)return true;this.validation={...this.validation,[e.id]:t};this.focusCurrentControl(true);return false}move(e){this.currentStep=Math.min(Math.max(e,0),this.questions.length-1);this.focusCurrentControl()}next(e){if(!this.validate(e))return;this.move(this.currentStep+1)}skip(e){if(e.required)return;this.drafts={...this.drafts,[e.id]:{...this.drafts[e.id]??{value:"",otherSelected:false,otherText:""},skipped:true}};if(this.currentStep<this.questions.length-1)this.move(this.currentStep+1);else this.submit()}submit(){if(this.disabled||this.answerPending)return;const e=this.questions.findIndex((e=>!this.validateWithoutFocus(e)));if(e>=0){this.currentStep=e;this.focusCurrentControl(true);return}this.answerPending=true;this.dsAnswer.emit({requestId:this.requestId,answers:this.questions.map((e=>f(e,this.drafts[e.id])))})}validateWithoutFocus(e){const t=b(e,this.drafts[e.id]);if(!t)return true;this.validation={...this.validation,[e.id]:t};return false}progressLabel(){return this.copy.progress.split("{current}").join(String(this.currentStep+1)).split("{total}").join(String(this.questions.length))}selectSingle(e,t){const i=t===this.otherValue;this.updateDraft(e.id,{value:i?"":t,otherSelected:i});if(i){requestAnimationFrame((()=>this.el.querySelector("[data-question-other-input]")?.focus()))}}renderSingleChoice(e,t,i){const n=this.drafts[e.id];const a=n.otherSelected?this.otherValue:typeof n.value==="string"?n.value:"";const r=[...e.choices??[],...e.allowOther?[{value:this.otherValue,label:this.copy.other}]:[]];return s("div",{class:"questionnaire__single-choice"},s("ds-radio",{"data-question-control":true,size:"lg",options:r,value:a,disabled:this.disabled,form:`ds-agent-questionnaire-detached-${this.instanceId}`,ariaLabelledby:t,"aria-describedby":this.validation[e.id]?i:undefined,onDsChange:t=>this.selectSingle(e,t.detail)}),n.otherSelected?this.renderOtherInput(e,i):null)}renderMultipleChoice(e,t){const i=this.drafts[e.id];const n=Array.isArray(i.value)?i.value:[];const a=`ds-agent-questionnaire-detached-${this.instanceId}`;return s("div",{class:"questionnaire__multiple-choice"},e.choices?.map((t=>s("ds-checkbox",{key:t.value,"data-question-control":true,size:"lg",label:t.label,description:t.description,value:t.value,checked:n.includes(t.value),disabled:this.disabled,form:a,onDsChange:i=>{this.updateDraft(e.id,{value:i.detail?[...n,t.value]:n.filter((e=>e!==t.value))})}}))),e.allowOther?s("div",{class:"questionnaire__other-choice"},s("ds-checkbox",{"data-question-control":true,size:"lg",label:this.copy.other,checked:i.otherSelected,disabled:this.disabled,form:a,onDsChange:t=>{this.updateDraft(e.id,{otherSelected:t.detail});if(t.detail){requestAnimationFrame((()=>this.el.querySelector("[data-question-other-input]")?.focus()))}}}),i.otherSelected?this.renderOtherInput(e,t):null):null)}renderOtherInput(e,t){const i=this.drafts[e.id];return s("input",{class:"questionnaire__other-input","data-question-control":true,"data-question-other-input":true,type:"text",form:`ds-agent-questionnaire-detached-${this.instanceId}`,value:i.otherText,placeholder:this.copy.otherPlaceholder,"aria-label":this.copy.other,"aria-invalid":this.validation[e.id]?"true":undefined,"aria-describedby":this.validation[e.id]?t:undefined,disabled:this.disabled,onInput:t=>this.updateDraft(e.id,{otherText:t.target.value})})}renderQuestion(e){const t=this.drafts[e.id];const i=`ds-agent-questionnaire-${this.instanceId}-${this.currentStep}-error`;const n=`ds-agent-questionnaire-${this.instanceId}-${this.currentStep}-prompt`;return s("div",{class:"questionnaire__body"},s("div",{class:"questionnaire__prompt"},s("ds-text",{as:"h2",variant:"text-title-small",textId:n},e.question),e.description?s("ds-text",{variant:"text-body-small",color:"secondary"},e.description):null),e.type==="text"?s("textarea",{class:"questionnaire__text-input","data-question-control":true,value:typeof t.value==="string"?t.value:"",form:`ds-agent-questionnaire-detached-${this.instanceId}`,placeholder:e.placeholder,"aria-label":e.question,"aria-invalid":this.validation[e.id]?"true":undefined,"aria-describedby":this.validation[e.id]?i:undefined,disabled:this.disabled,rows:4,onInput:t=>this.updateDraft(e.id,{value:t.target.value})}):s("fieldset",{class:"questionnaire__choices","aria-describedby":this.validation[e.id]?i:undefined},s("legend",{class:"ds-visually-hidden"},e.question),e.type==="single"?this.renderSingleChoice(e,n,i):this.renderMultipleChoice(e,i)),this.validation[e.id]?s("div",{id:i,class:"questionnaire__error",role:"alert"},s("ds-icon",{name:"ExclamationTriangle",size:"xs",color:"inherit"}),s("ds-text",{variant:"text-body-small",color:"negative"},this.validation[e.id])):null)}renderAnswered(){return s("div",{class:"questionnaire questionnaire--answered"},s("ol",{class:"questionnaire__summary"},this.questions.map((e=>s("li",null,s("ds-text",{variant:"text-body-small",emphasis:true},e.question),s("ds-text",{variant:"text-body-small",color:"secondary"},_(e,this.answers.find((t=>t.questionId===e.id)))))))))}render(){if(this.status==="preparing"){return s(n,null,s("div",{class:"questionnaire questionnaire--preparing",role:"status"},s("ds-loader",{size:"sm"}),s("ds-text",{variant:"text-body-medium"},this.copy.preparing)))}if(!this.questions?.length)return null;if(this.status==="answered")return s(n,null,this.renderAnswered());const e=this.questions[this.currentStep];const t=this.currentStep===this.questions.length-1;const i=Boolean(e.skippable&&!e.required);return s(n,null,s("section",{class:{questionnaire:true,"questionnaire--submitting":this.disabled,"questionnaire--error":this.status==="error"},"aria-busy":this.disabled?"true":undefined,"aria-label":e.question},s("header",{class:"questionnaire__header"},s("ds-text",{variant:"text-caption",color:"secondary"},this.progressLabel()),this.allowCancel?s("ds-tooltip",{label:this.copy.cancel,side:"top",size:"sm"},s("ds-button-unfilled",{"data-question-action":true,variant:"icon",icon:"Cross",size:"sm","aria-label":this.copy.cancel,hasBorder:false,isInactive:this.disabled,onDsClick:()=>this.dsCancel.emit({requestId:this.requestId})})):null),this.renderQuestion(e),this.status==="error"&&this.errorMessage?s("div",{class:"questionnaire__submission-error",role:"alert"},s("ds-icon",{name:"ExclamationTriangle",size:"xs",color:"inherit"}),s("ds-text",{variant:"text-body-small",color:"negative"},this.errorMessage)):null,s("footer",{class:"questionnaire__actions"},s("div",{class:"questionnaire__actions-leading"},this.currentStep>0?s("div",{class:"questionnaire__action-item"},s("ds-button-unfilled",{"data-question-action":true,label:this.copy.previous,size:"sm",width:"fill",isInactive:this.disabled,onDsClick:()=>this.move(this.currentStep-1)})):null,i?s("div",{class:"questionnaire__action-item"},s("ds-button-unfilled",{"data-question-action":true,label:this.copy.skip,size:"sm",width:"fill",hasBorder:false,isInactive:this.disabled,onDsClick:()=>this.skip(e)})):null),s("div",{class:"questionnaire__action-item questionnaire__action-item--primary"},s("ds-button-filled",{"data-question-action":true,label:t?this.copy.answer:this.copy.next,size:"sm",width:"fill",isLoading:this.disabled,onDsClick:()=>t?this.submit():this.next(e)})))))}get el(){return this}static get watchers(){return{requestId:[{handleQuestionnaireInputChange:0}],questions:[{handleQuestionnaireInputChange:0}],answers:[{handleQuestionnaireInputChange:0}],status:[{handleStatusChange:0}]}}static get style(){return v()}},[2,"ds-agent-questionnaire",{requestId:[1,"request-id"],questions:[16],answers:[16],status:[1],errorMessage:[1,"error-message"],allowCancel:[4,"allow-cancel"],labels:[16],currentStep:[32],drafts:[32],validation:[32],setFocus:[64]},undefined,{requestId:[{handleQuestionnaireInputChange:0}],questions:[{handleQuestionnaireInputChange:0}],answers:[{handleQuestionnaireInputChange:0}],status:[{handleStatusChange:0}]}]);function k(){if(typeof customElements==="undefined"){return}const e=["ds-agent-questionnaire","ds-badge","ds-button-filled","ds-button-unfilled","ds-checkbox","ds-icon","ds-loader","ds-radio","ds-text","ds-tooltip"];e.forEach((e=>{switch(e){case"ds-agent-questionnaire":if(!customElements.get(a(e))){customElements.define(a(e),w)}break;case"ds-badge":if(!customElements.get(a(e))){r()}break;case"ds-button-filled":if(!customElements.get(a(e))){o()}break;case"ds-button-unfilled":if(!customElements.get(a(e))){d()}break;case"ds-checkbox":if(!customElements.get(a(e))){u()}break;case"ds-icon":if(!customElements.get(a(e))){c()}break;case"ds-loader":if(!customElements.get(a(e))){l()}break;case"ds-radio":if(!customElements.get(a(e))){h()}break;case"ds-text":if(!customElements.get(a(e))){g()}break;case"ds-tooltip":if(!customElements.get(a(e))){q()}break}}))}k();export{w as A,k as d};
|
|
2
|
+
//# sourceMappingURL=p-B_jdoM7e.js.map
|