@neut/ui 0.0.13 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/calendar/Calendar/Calendar.js +11 -8
- package/dist/components/calendar/Calendar/Calendar.js.map +1 -1
- package/dist/components/combobox/ComboboxInput/ComboboxInput.js +1 -1
- package/dist/components/combobox/ComboboxInput/ComboboxInput.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.d.ts +41 -3
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.js +35 -7
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.d.ts +23 -2
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js +53 -33
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.styles.d.ts +8 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.styles.js +7 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.styles.js.map +1 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.types.d.ts +125 -19
- package/dist/components/toggle-group/ToggleGroup/create-change-event-details.d.ts +8 -0
- package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js +25 -0
- package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js.map +1 -0
- package/dist/components/toggle-group/ToggleGroup/index.d.ts +1 -1
- package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.d.ts +17 -0
- package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js +47 -0
- package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js.map +1 -0
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.d.ts +9 -1
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js +58 -42
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.d.ts +12 -0
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.js +7 -0
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.js.map +1 -0
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.types.d.ts +21 -7
- package/dist/components/toggle-group/call-event-handler.d.ts +5 -0
- package/dist/components/toggle-group/call-event-handler.js +9 -0
- package/dist/components/toggle-group/call-event-handler.js.map +1 -0
- package/dist/components/toggle-group/index.d.ts +1 -1
- package/dist/ui.css +1 -1
- package/package.json +1 -1
|
@@ -79,15 +79,18 @@ function V(p) {
|
|
|
79
79
|
}, K = (e) => G(c(W(), e)), ue = () => !T.min || h(x(W()), x(T.min)), de = () => !T.max || _(x(W()), x(T.max)), fe = N(() => {
|
|
80
80
|
let e = Math.max(1, T.numberOfMonths ?? 1);
|
|
81
81
|
return Array.from({ length: e }, (e, t) => c(W(), t));
|
|
82
|
-
}), q = N(() => b(T.locale)), pe =
|
|
83
|
-
let n =
|
|
82
|
+
}), q = N(() => b(T.locale)), pe = (e) => Array.from({ length: 12 }, (e, t) => t).filter((t) => {
|
|
83
|
+
let n = !!T.min && (e < T.min.getFullYear() || e === T.min.getFullYear() && t < T.min.getMonth()), r = !!T.max && (e > T.max.getFullYear() || e === T.max.getFullYear() && t > T.max.getMonth());
|
|
84
|
+
return !n && !r;
|
|
85
|
+
}).map((e) => {
|
|
86
|
+
let t = new Date(2024, e, 1);
|
|
84
87
|
return {
|
|
85
|
-
value: String(
|
|
86
|
-
label: new Intl.DateTimeFormat(q(), { month: "long" }).format(
|
|
88
|
+
value: String(e),
|
|
89
|
+
label: new Intl.DateTimeFormat(q(), { month: "long" }).format(t)
|
|
87
90
|
};
|
|
88
|
-
})
|
|
89
|
-
let e = (/* @__PURE__ */ new Date()).getFullYear();
|
|
90
|
-
return Array.from({ length:
|
|
91
|
+
}), me = N(() => {
|
|
92
|
+
let e = (/* @__PURE__ */ new Date()).getFullYear(), t = T.min ? T.min.getFullYear() : e - 100, n = T.max ? T.max.getFullYear() : e + 100;
|
|
93
|
+
return Array.from({ length: Math.max(0, n - t + 1) }, (e, n) => t + n);
|
|
91
94
|
}), J = (t) => e(z[t], T.classNames?.[t]), Y = (e) => T.disabled === !0 ? !0 : typeof T.disabled == "function" ? T.disabled(e) : !!(T.min && _(e, T.min) || T.max && h(e, T.max)), X = (e) => {
|
|
92
95
|
let t = H();
|
|
93
96
|
return !!t?.from && y(e, t.from);
|
|
@@ -183,7 +186,7 @@ function V(p) {
|
|
|
183
186
|
get children() {
|
|
184
187
|
return w(j, {
|
|
185
188
|
get each() {
|
|
186
|
-
return pe();
|
|
189
|
+
return pe(p.getFullYear());
|
|
187
190
|
},
|
|
188
191
|
children: (e) => w(o, {
|
|
189
192
|
get value() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.js","names":["For","Show","createMemo","createSignal","mergeProps","splitProps","JSX","ChevronLeft","ChevronRight","buttonVariants","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","clsx","CalendarClassNames","CalendarMode","CalendarProps","CalendarSelected","DateRange","addDays","addMonths","eachDayOfInterval","endOfWeek","formatMonthYear","formatWeekday","getFirstDate","getISOWeekNumber","isAfter","isAfterOrSame","isBefore","isBeforeOrSame","isSameDay","resolveLocaleCode","startOfMonth","startOfWeek","defaultClassNames","Record","root","months","month","nav","button_previous","button_next","month_caption","dropdowns","dropdown_root","dropdown","caption_label","month_grid","weekdays","weekday","week","week_number_header","week_number","day","outside","disabled","hidden","today","range_start","range_middle","range_end","resolveInitialMonth","props","Date","defaultMonth","selected","defaultSelected","Calendar","Element","merged","mode","showOutsideDays","captionLayout","buttonVariant","weekStartsOn","numberOfMonths","local","rest","internalSelected","setInternalSelected","undefined","commitSelected","next","onSelect","internalMonth","setInternalMonth","currentMonth","setMonth","value","onMonthChange","moveMonth","delta","canPrev","min","canNext","max","monthList","count","Math","Array","from","length","_","i","localeCode","locale","monthOptions","monthDate","String","label","Intl","DateTimeFormat","format","yearOptions","currentYear","getFullYear","slotClass","key","classNames","isDisabledDay","isRangeStart","range","isRangeEnd","to","isRangeMiddle","isDateSelected","isArray","some","d","selectDay","current","list","index","findIndex","splice","push","renderDay","_el$","_tmpl$","_el$2","firstChild","$$click","_$insert","getDate","_$effect","_p$","_v$","_v$2","_v$3","getMonth","_v$4","_v$5","_v$6","toLocaleDateString","_v$7","_v$8","_v$9","_v$0","_v$1","variant","e","_$setAttribute","t","a","_$className","o","n","s","h","r","l","renderMonth","firstDay","lastDay","gridStart","gridEnd","days","weeks","slice","weekdayLabels","_el$3","_tmpl$3","_el$4","_el$5","_el$6","nextSibling","_el$7","_el$9","_el$0","_$createComponent","when","fallback","_el$10","_tmpl$4","children","_el$8","_tmpl$2","onValueChange","Number","class","each","option","year","showWeekNumber","_el$1","_el$11","_el$12","_el$13","_v$10","_v$11","_v$12","_v$13","_v$14","_v$15","_v$16","_v$17","_v$18","_el$14","_tmpl$5","_el$15","_$spread","_$mergeProps","style","dir","calendarClassNames","_$delegateEvents"],"sources":["../../../../src/components/calendar/Calendar/Calendar.tsx"],"sourcesContent":["import {\n For,\n Show,\n createMemo,\n createSignal,\n mergeProps,\n splitProps,\n type JSX,\n} from \"solid-js\";\nimport { ChevronLeft, ChevronRight } from \"lucide-solid\";\nimport buttonVariants from \"~/components/button/Button.styles\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"~/components/select\";\nimport { clsx } from \"~/utils\";\nimport type {\n CalendarClassNames,\n CalendarMode,\n CalendarProps,\n CalendarSelected,\n DateRange,\n} from \"./Calendar.types\";\nimport {\n addDays,\n addMonths,\n eachDayOfInterval,\n endOfWeek,\n formatMonthYear,\n formatWeekday,\n getFirstDate,\n getISOWeekNumber,\n isAfter,\n isAfterOrSame,\n isBefore,\n isBeforeOrSame,\n isSameDay,\n resolveLocaleCode,\n startOfMonth,\n startOfWeek,\n} from \"./Calendar.utils\";\n\nconst defaultClassNames: Record<keyof CalendarClassNames, string> = {\n root: \"group/calendar w-fit bg-background p-2 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(7)] in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent\",\n months: \"relative flex flex-row gap-4\",\n month: \"relative flex w-full flex-col gap-4\",\n nav: \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n button_previous:\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n button_next: \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n month_caption:\n \"flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)\",\n dropdowns:\n \"flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium\",\n dropdown_root: \"relative rounded-(--cell-radius)\",\n dropdown: \"absolute inset-0 bg-popover opacity-0\",\n caption_label: \"font-medium select-none text-sm\",\n month_grid: \"w-full border-collapse\",\n weekdays: \"flex\",\n weekday:\n \"flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal text-muted-foreground select-none\",\n week: \"mt-2 flex w-full\",\n week_number_header: \"w-(--cell-size) select-none\",\n week_number: \"text-[0.8rem] text-muted-foreground select-none\",\n day: \"relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius) [&:first-child[data-selected=true]_button]:rounded-l-(--cell-radius)\",\n outside: \"text-muted-foreground aria-selected:text-muted-foreground\",\n disabled: \"text-muted-foreground opacity-50\",\n hidden: \"invisible\",\n today:\n \"rounded-(--cell-radius) bg-muted text-foreground data-[selected=true]:rounded-none\",\n range_start:\n \"relative isolate z-0 rounded-l-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:right-0 after:w-4 after:bg-muted\",\n range_middle: \"rounded-none\",\n range_end:\n \"relative isolate z-0 rounded-r-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:left-0 after:w-4 after:bg-muted\",\n};\n\nfunction resolveInitialMonth(props: CalendarProps): Date {\n return (\n props.month ??\n props.defaultMonth ??\n getFirstDate(props.selected ?? props.defaultSelected) ??\n new Date()\n );\n}\n\n/**\n * 日历组件:react-day-picker 的 SolidJS 移植,覆盖 shadcn Base UI 版本\n * Calendar 中使用到的核心 props(mode/selected/onSelect/month/classNames 等)。\n * 支持 single、multiple、range 三种模式,以及 label/dropdown 两种标题布局。\n */\nexport function Calendar(props: CalendarProps): JSX.Element {\n const merged = mergeProps(\n {\n mode: \"single\" as CalendarMode,\n showOutsideDays: true,\n captionLayout: \"label\" as CalendarProps[\"captionLayout\"],\n buttonVariant: \"ghost\" as CalendarProps[\"buttonVariant\"],\n weekStartsOn: 0 as 0 | 1 | 2 | 3 | 4 | 5 | 6,\n numberOfMonths: 1,\n },\n props,\n );\n\n const [local, rest] = splitProps(merged, [\n \"mode\",\n \"selected\",\n \"defaultSelected\",\n \"onSelect\",\n \"month\",\n \"defaultMonth\",\n \"onMonthChange\",\n \"numberOfMonths\",\n \"showOutsideDays\",\n \"showWeekNumber\",\n \"weekStartsOn\",\n \"captionLayout\",\n \"locale\",\n \"buttonVariant\",\n \"classNames\",\n \"disabled\",\n \"min\",\n \"max\",\n \"class\",\n \"classList\",\n \"style\",\n \"dir\",\n ]);\n\n const [internalSelected, setInternalSelected] =\n createSignal<CalendarSelected>(merged.defaultSelected);\n const selected = createMemo(() =>\n merged.selected !== undefined ? merged.selected : internalSelected(),\n );\n\n const commitSelected = (next: CalendarSelected) => {\n if (merged.selected === undefined) setInternalSelected(next);\n merged.onSelect?.(next);\n };\n\n const [internalMonth, setInternalMonth] = createSignal<Date>(\n startOfMonth(resolveInitialMonth(merged)),\n );\n const currentMonth = createMemo(() =>\n startOfMonth(merged.month ?? internalMonth()),\n );\n\n const setMonth = (next: Date) => {\n const value = startOfMonth(next);\n if (merged.month === undefined) setInternalMonth(value);\n merged.onMonthChange?.(value);\n };\n\n const moveMonth = (delta: number) =>\n setMonth(addMonths(currentMonth(), delta));\n\n const canPrev = () =>\n !merged.min ||\n isAfter(startOfMonth(currentMonth()), startOfMonth(merged.min));\n\n const canNext = () =>\n !merged.max ||\n isBefore(startOfMonth(currentMonth()), startOfMonth(merged.max));\n\n const monthList = createMemo(() => {\n const count = Math.max(1, merged.numberOfMonths ?? 1);\n return Array.from({ length: count }, (_, i) =>\n addMonths(currentMonth(), i),\n );\n });\n\n const localeCode = createMemo(() => resolveLocaleCode(merged.locale));\n\n const monthOptions = createMemo(() =>\n Array.from({ length: 12 }, (_, i) => {\n const monthDate = new Date(2024, i, 1);\n return {\n value: String(i),\n label: new Intl.DateTimeFormat(localeCode(), {\n month: \"long\",\n }).format(monthDate),\n };\n }),\n );\n\n const yearOptions = createMemo(() => {\n const currentYear = new Date().getFullYear();\n return Array.from({ length: 201 }, (_, i) => currentYear - 100 + i);\n });\n\n const slotClass = (key: keyof CalendarClassNames) =>\n clsx(defaultClassNames[key], merged.classNames?.[key]);\n\n const isDisabledDay = (day: Date) => {\n if (merged.disabled === true) return true;\n if (typeof merged.disabled === \"function\") return merged.disabled(day);\n if (merged.min && isBefore(day, merged.min)) return true;\n if (merged.max && isAfter(day, merged.max)) return true;\n return false;\n };\n\n const isRangeStart = (day: Date) => {\n const range = selected() as DateRange | undefined;\n return !!range?.from && isSameDay(day, range.from);\n };\n\n const isRangeEnd = (day: Date) => {\n const range = selected() as DateRange | undefined;\n return !!range?.to && isSameDay(day, range.to);\n };\n\n const isRangeMiddle = (day: Date) => {\n const range = selected() as DateRange | undefined;\n return (\n !!range?.from &&\n !!range?.to &&\n isAfter(day, range.from) &&\n isBefore(day, range.to)\n );\n };\n\n const isDateSelected = (day: Date) => {\n const value = selected();\n if (merged.mode === \"single\") {\n return value instanceof Date && isSameDay(day, value);\n }\n if (merged.mode === \"multiple\") {\n return Array.isArray(value) && value.some((d) => isSameDay(d, day));\n }\n const range = value as DateRange | undefined;\n return (\n !!range &&\n ((range.from && isSameDay(day, range.from)) ||\n (range.to && isSameDay(day, range.to)) ||\n (!!range.from &&\n !!range.to &&\n isAfterOrSame(day, range.from) &&\n isBeforeOrSame(day, range.to)))\n );\n };\n\n const selectDay = (day: Date) => {\n if (isDisabledDay(day)) return;\n\n if (merged.mode === \"single\") {\n const current = selected();\n commitSelected(\n current instanceof Date && isSameDay(current, day) ? undefined : day,\n );\n return;\n }\n\n if (merged.mode === \"multiple\") {\n const current = selected();\n const list = Array.isArray(current) ? [...current] : [];\n const index = list.findIndex((d) => isSameDay(d, day));\n if (index >= 0) list.splice(index, 1);\n else list.push(day);\n commitSelected(list);\n return;\n }\n\n const range = selected() as DateRange | undefined;\n if (!range?.from || (range.from && range.to)) {\n commitSelected({ from: day });\n } else if (isBefore(day, range.from)) {\n commitSelected({ from: day, to: range.from });\n } else if (isSameDay(day, range.from)) {\n commitSelected({ from: day, to: day });\n } else {\n commitSelected({ from: range.from, to: day });\n }\n };\n\n const renderDay = (day: Date, monthDate: Date) => {\n return (\n <div\n aria-disabled={isDisabledDay(day)}\n data-selected={isDateSelected(day) ? \"true\" : undefined}\n class={clsx(\n slotClass(\"day\"),\n day.getMonth() !== monthDate.getMonth() && slotClass(\"outside\"),\n !merged.showOutsideDays &&\n day.getMonth() !== monthDate.getMonth() &&\n slotClass(\"hidden\"),\n isSameDay(day, new Date()) && slotClass(\"today\"),\n isDisabledDay(day) && slotClass(\"disabled\"),\n isRangeStart(day) && slotClass(\"range_start\"),\n isRangeMiddle(day) && slotClass(\"range_middle\"),\n isRangeEnd(day) && slotClass(\"range_end\"),\n )}\n >\n <button\n type=\"button\"\n disabled={isDisabledDay(day)}\n aria-pressed={isDateSelected(day)}\n data-day={day.toLocaleDateString(localeCode())}\n data-selected-single={\n merged.mode === \"single\" &&\n selected() instanceof Date &&\n isSameDay(day, selected() as Date)\n ? \"true\"\n : undefined\n }\n data-range-start={isRangeStart(day) ? \"true\" : undefined}\n data-range-end={isRangeEnd(day) ? \"true\" : undefined}\n data-range-middle={isRangeMiddle(day) ? \"true\" : undefined}\n onClick={() => selectDay(day)}\n class={clsx(\n buttonVariants({ variant: merged.buttonVariant }),\n \"relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 border-0 leading-none font-normal\",\n \"data-[range-end=true]:rounded-(--cell-radius) data-[range-end=true]:rounded-r-(--cell-radius) data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground\",\n \"data-[range-end=true]:hover:bg-primary data-[range-end=true]:hover:text-primary-foreground\",\n \"data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-muted data-[range-middle=true]:text-foreground\",\n \"data-[range-middle=true]:hover:bg-muted data-[range-middle=true]:hover:text-foreground\",\n \"data-[range-start=true]:rounded-(--cell-radius) data-[range-start=true]:rounded-l-(--cell-radius) data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground\",\n \"data-[range-start=true]:hover:bg-primary data-[range-start=true]:hover:text-primary-foreground\",\n \"data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground\",\n \"data-[selected-single=true]:hover:bg-primary data-[selected-single=true]:hover:text-primary-foreground\",\n day.getMonth() !== monthDate.getMonth() && \"text-muted-foreground\",\n )}\n >\n {day.getDate()}\n </button>\n </div>\n );\n };\n\n const renderMonth = (monthDate: Date) => {\n const firstDay = startOfMonth(monthDate);\n const lastDay = addDays(addMonths(monthDate, 1), -1);\n const gridStart = startOfWeek(firstDay, merged.weekStartsOn);\n const gridEnd = endOfWeek(lastDay, merged.weekStartsOn);\n const days = eachDayOfInterval(gridStart, gridEnd);\n const weeks: Date[][] = [];\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n const weekdayLabels = Array.from({ length: 7 }, (_, i) =>\n formatWeekday(addDays(gridStart, i), localeCode()),\n );\n\n return (\n <div class={slotClass(\"month\")}>\n <div class={slotClass(\"nav\")}>\n <button\n type=\"button\"\n disabled={!canPrev()}\n aria-label=\"Previous month\"\n onClick={() => moveMonth(-1)}\n class={clsx(\n buttonVariants({ variant: merged.buttonVariant }),\n slotClass(\"button_previous\"),\n )}\n >\n <ChevronLeft class=\"size-4\" />\n </button>\n <button\n type=\"button\"\n disabled={!canNext()}\n aria-label=\"Next month\"\n onClick={() => moveMonth(1)}\n class={clsx(\n buttonVariants({ variant: merged.buttonVariant }),\n slotClass(\"button_next\"),\n )}\n >\n <ChevronRight class=\"size-4\" />\n </button>\n </div>\n\n <div class={slotClass(\"month_caption\")}>\n <Show\n when={merged.captionLayout === \"dropdown\"}\n fallback={\n <span class={slotClass(\"caption_label\")}>\n {formatMonthYear(monthDate, localeCode())}\n </span>\n }\n >\n <div class={slotClass(\"dropdowns\")}>\n <Select\n value={String(monthDate.getMonth())}\n onValueChange={(value) => {\n setMonth(new Date(monthDate.getFullYear(), Number(value), 1));\n }}\n >\n <SelectTrigger\n variant=\"ghost\"\n class={clsx(\n \"h-(--cell-size) rounded-(--cell-radius) px-2 text-sm font-medium\",\n slotClass(\"dropdown_root\"),\n )}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent class=\"max-h-56\">\n <For each={monthOptions()}>\n {(option) => (\n <SelectItem value={option.value}>\n {option.label}\n </SelectItem>\n )}\n </For>\n </SelectContent>\n </Select>\n\n <Select\n value={String(monthDate.getFullYear())}\n onValueChange={(value) => {\n setMonth(new Date(Number(value), monthDate.getMonth(), 1));\n }}\n >\n <SelectTrigger\n variant=\"ghost\"\n class={clsx(\n \"h-(--cell-size) rounded-(--cell-radius) px-2 text-sm font-medium tabular-nums\",\n slotClass(\"dropdown_root\"),\n )}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent class=\"max-h-56\">\n <For each={yearOptions()}>\n {(year) => (\n <SelectItem value={String(year)}>{year}</SelectItem>\n )}\n </For>\n </SelectContent>\n </Select>\n </div>\n </Show>\n </div>\n\n <div class={slotClass(\"month_grid\")}>\n <div class={slotClass(\"weekdays\")}>\n <Show when={merged.showWeekNumber}>\n <div class={slotClass(\"week_number_header\")} />\n </Show>\n <For each={weekdayLabels}>\n {(label) => <div class={slotClass(\"weekday\")}>{label}</div>}\n </For>\n </div>\n\n <For each={weeks}>\n {(week) => (\n <div class={slotClass(\"week\")}>\n <Show when={merged.showWeekNumber}>\n <div class={slotClass(\"week_number\")}>\n {getISOWeekNumber(week[0])}\n </div>\n </Show>\n <For each={week}>{(day) => renderDay(day, monthDate)}</For>\n </div>\n )}\n </For>\n </div>\n </div>\n );\n };\n\n return (\n <div\n data-slot=\"calendar\"\n class={clsx(slotClass(\"root\"), local.class)}\n style={local.style}\n dir={local.dir}\n {...rest}\n >\n <div class={slotClass(\"months\")}>\n <For each={monthList()}>{(monthDate) => renderMonth(monthDate)}</For>\n </div>\n </div>\n );\n}\n\nexport { defaultClassNames as calendarClassNames };\n"],"mappings":";;;;;;;;;;;;0VA6CMqC,IAA8D;CAClEE,MAAM;CACNC,QAAQ;CACRC,OAAO;CACPC,KAAK;CACLC,iBACE;CACFC,aAAa;CACbC,eACE;CACFC,WACE;CACFC,eAAe;CACfC,UAAU;CACVC,eAAe;CACfC,YAAY;CACZC,UAAU;CACVC,SACE;CACFC,MAAM;CACNC,oBAAoB;CACpBC,aAAa;CACbC,KAAK;CACLC,SAAS;CACTC,UAAU;CACVC,QAAQ;CACRC,OACE;CACFC,aACE;CACFC,cAAc;CACdC,WACE;AACJ;AAEA,SAASC,EAAoBC,GAA4B;CACvD,OACEA,EAAMxB,SACNwB,EAAME,gBACNxC,EAAasC,EAAMG,YAAYH,EAAMI,eAAe,qBACpD,IAAIH,KAAK;AAEb;AAOA,SAAgBI,EAASL,GAAmC;CAC1D,IAAMO,IAASpE,GACb;EACEqE,MAAM;EACNC,iBAAiB;EACjBC,eAAe;EACfC,eAAe;EACfC,cAAc;EACdC,gBAAgB;CAClB,GACAb,CACF,GAEM,CAACc,GAAOC,KAAQ3E,GAAWmE,GAAQ;EACvC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAK,CACN,GAEK,CAACS,IAAkBC,MACvB/E,EAA+BqE,EAAOH,eAAe,GACjDD,IAAWlE,QACfsE,EAAOJ,aAAae,KAAAA,IAA8BF,GAAiB,IAAnCT,EAAOJ,QACzC,GAEMgB,KAAkBC,MAA2B;EAEjDb,AADIA,EAAOJ,aAAae,KAAAA,KAAWD,GAAoBG,CAAI,GAC3Db,EAAOc,WAAWD,CAAI;CACxB,GAEM,CAACE,IAAeC,MAAoBrF,EACxCgC,EAAa6B,EAAoBQ,CAAM,CAAC,CAC1C,GACMiB,IAAevF,QACnBiC,EAAaqC,EAAO/B,SAAS8C,GAAc,CAAC,CAC9C,GAEMG,KAAYL,MAAe;EAC/B,IAAMM,IAAQxD,EAAakD,CAAI;EAE/Bb,AADIA,EAAO/B,UAAU0C,KAAAA,KAAWK,GAAiBG,CAAK,GACtDnB,EAAOoB,gBAAgBD,CAAK;CAC9B,GAEME,KAAaC,MACjBJ,EAASpE,EAAUmE,EAAa,GAAGK,CAAK,CAAC,GAErCC,WACJ,CAACvB,EAAOwB,OACRnE,EAAQM,EAAasD,EAAa,CAAC,GAAGtD,EAAaqC,EAAOwB,GAAG,CAAC,GAE1DC,WACJ,CAACzB,EAAO0B,OACRnE,EAASI,EAAasD,EAAa,CAAC,GAAGtD,EAAaqC,EAAO0B,GAAG,CAAC,GAE3DC,KAAYjG,QAAiB;EACjC,IAAMkG,IAAQC,KAAKH,IAAI,GAAG1B,EAAOM,kBAAkB,CAAC;EACpD,OAAOwB,MAAMC,KAAK,EAAEC,QAAQJ,EAAM,IAAIK,GAAGC,MACvCpF,EAAUmE,EAAa,GAAGiB,CAAC,CAC7B;CACF,CAAC,GAEKC,IAAazG,QAAiBgC,EAAkBsC,EAAOoC,MAAM,CAAC,GAE9DC,KAAe3G,QACnBoG,MAAMC,KAAK,EAAEC,QAAQ,GAAG,IAAIC,GAAGC,MAAM;EACnC,IAAMI,IAAY,IAAI5C,KAAK,MAAMwC,GAAG,CAAC;EACrC,OAAO;GACLf,OAAOoB,OAAOL,CAAC;GACfM,OAAO,IAAIC,KAAKC,eAAeP,EAAW,GAAG,EAC3ClE,OAAO,OACT,CAAC,CAAC,CAAC0E,OAAOL,CAAS;EACrB;CACF,CAAC,CACH,GAEMM,KAAclH,QAAiB;EACnC,IAAMmH,qBAAc,IAAInD,KAAK,EAAA,CAAEoD,YAAY;EAC3C,OAAOhB,MAAMC,KAAK,EAAEC,QAAQ,IAAI,IAAIC,GAAGC,MAAMW,IAAc,MAAMX,CAAC;CACpE,CAAC,GAEKa,KAAaC,MACjBzG,EAAKsB,EAAkBmF,IAAMhD,EAAOiD,aAAaD,EAAI,GAEjDE,KAAiBlE,MACjBgB,EAAOd,aAAa,KAAa,KACjC,OAAOc,EAAOd,YAAa,aAAmBc,EAAOd,SAASF,CAAG,IAErE,GADIgB,EAAOwB,OAAOjE,EAASyB,GAAKgB,EAAOwB,GAAG,KACtCxB,EAAO0B,OAAOrE,EAAQ2B,GAAKgB,EAAO0B,GAAG,IAIrCyB,KAAgBnE,MAAc;EAClC,IAAMoE,IAAQxD,EAAS;EACvB,OAAO,CAAC,CAACwD,GAAOrB,QAAQtE,EAAUuB,GAAKoE,EAAMrB,IAAI;CACnD,GAEMsB,KAAcrE,MAAc;EAChC,IAAMoE,IAAQxD,EAAS;EACvB,OAAO,CAAC,CAACwD,GAAOE,MAAM7F,EAAUuB,GAAKoE,EAAME,EAAE;CAC/C,GAEMC,KAAiBvE,MAAc;EACnC,IAAMoE,IAAQxD,EAAS;EACvB,OACE,CAAC,CAACwD,GAAOrB,QACT,CAAC,CAACqB,GAAOE,MACTjG,EAAQ2B,GAAKoE,EAAMrB,IAAI,KACvBxE,EAASyB,GAAKoE,EAAME,EAAE;CAE1B,GAEME,KAAkBxE,MAAc;EACpC,IAAMmC,IAAQvB,EAAS;EACvB,IAAII,EAAOC,SAAS,UAClB,OAAOkB,aAAiBzB,QAAQjC,EAAUuB,GAAKmC,CAAK;EAEtD,IAAInB,EAAOC,SAAS,YAClB,OAAO6B,MAAM2B,QAAQtC,CAAK,KAAKA,EAAMuC,MAAMC,MAAMlG,EAAUkG,GAAG3E,CAAG,CAAC;EAEpE,IAAMoE,IAAQjC;EACd,OACE,CAAC,CAACiC,MACAA,EAAMrB,QAAQtE,EAAUuB,GAAKoE,EAAMrB,IAAI,KACtCqB,EAAME,MAAM7F,EAAUuB,GAAKoE,EAAME,EAAE,KACnC,CAAC,CAACF,EAAMrB,QACP,CAAC,CAACqB,EAAME,MACRhG,EAAc0B,GAAKoE,EAAMrB,IAAI,KAC7BvE,EAAewB,GAAKoE,EAAME,EAAE;CAEpC,GAEMM,MAAa5E,MAAc;EAC/B,IAAIkE,EAAclE,CAAG,GAAG;EAExB,IAAIgB,EAAOC,SAAS,UAAU;GAC5B,IAAM4D,IAAUjE,EAAS;GACzBgB,EACEiD,aAAmBnE,QAAQjC,EAAUoG,GAAS7E,CAAG,IAAI2B,KAAAA,IAAY3B,CACnE;GACA;EACF;EAEA,IAAIgB,EAAOC,SAAS,YAAY;GAC9B,IAAM4D,IAAUjE,EAAS,GACnBkE,IAAOhC,MAAM2B,QAAQI,CAAO,IAAI,CAAC,GAAGA,CAAO,IAAI,CAAA,GAC/CE,IAAQD,EAAKE,WAAWL,MAAMlG,EAAUkG,GAAG3E,CAAG,CAAC;GAGrD4B,AAFImD,KAAS,IAAGD,EAAKG,OAAOF,GAAO,CAAC,IAC/BD,EAAKI,KAAKlF,CAAG,GAClB4B,EAAekD,CAAI;GACnB;EACF;EAEA,IAAMV,IAAQxD,EAAS;EACvB,AAAI,CAACwD,GAAOrB,QAASqB,EAAMrB,QAAQqB,EAAME,KACvC1C,EAAe,EAAEmB,MAAM/C,EAAI,CAAC,IACnBzB,EAASyB,GAAKoE,EAAMrB,IAAI,IACjCnB,EAAe;GAAEmB,MAAM/C;GAAKsE,IAAIF,EAAMrB;EAAK,CAAC,IACnCtE,EAAUuB,GAAKoE,EAAMrB,IAAI,IAClCnB,EAAe;GAAEmB,MAAM/C;GAAKsE,IAAItE;EAAI,CAAC,IAErC4B,EAAe;GAAEmB,MAAMqB,EAAMrB;GAAMuB,IAAItE;EAAI,CAAC;CAEhD,GAEMmF,MAAanF,GAAWsD,aAC5B;EAAA,IAAA8B,IAAAC,GAAA,GAAAC,IAAAF,EAAAG;EA6CO,OA7CPD,EAAAE,gBAgCqBZ,GAAU5E,CAAG,GAACyF,EAAAH,SAe5BtF,EAAI0F,QAAQ,CAAC,GAAAC,GAAAC,MAAA;GAAA,IAAAC,IA7CD3B,EAAclE,CAAG,GAAC8F,IAClBtB,EAAexE,CAAG,IAAI,SAAS2B,KAAAA,GAASoE,IAChDxI,EACLwG,EAAU,KAAK,GACf/D,EAAIgG,SAAS,MAAM1C,EAAU0C,SAAS,KAAKjC,EAAU,SAAS,GAC9D,CAAC/C,EAAOE,mBACNlB,EAAIgG,SAAS,MAAM1C,EAAU0C,SAAS,KACtCjC,EAAU,QAAQ,GACpBtF,EAAUuB,mBAAK,IAAIU,KAAK,CAAC,KAAKqD,EAAU,OAAO,GAC/CG,EAAclE,CAAG,KAAK+D,EAAU,UAAU,GAC1CI,EAAanE,CAAG,KAAK+D,EAAU,aAAa,GAC5CQ,EAAcvE,CAAG,KAAK+D,EAAU,cAAc,GAC9CM,EAAWrE,CAAG,KAAK+D,EAAU,WAAW,CAC1C,GAACkC,IAIW/B,EAAclE,CAAG,GAACkG,IACd1B,EAAexE,CAAG,GAACmG,IACvBnG,EAAIoG,mBAAmBjD,EAAW,CAAC,GAACkD,IAE5CrF,EAAOC,SAAS,YAChBL,EAAS,aAAaF,QACtBjC,EAAUuB,GAAKY,EAAS,CAAS,IAC7B,SACAe,KAAAA,GAAS2E,IAEGnC,EAAanE,CAAG,IAAI,SAAS2B,KAAAA,GAAS4E,IACxClC,EAAWrE,CAAG,IAAI,SAAS2B,KAAAA,GAAS6E,IACjCjC,EAAcvE,CAAG,IAAI,SAAS2B,KAAAA,GAAS8E,IAEnDlJ,EACLN,EAAe,EAAEyJ,SAAS1F,EAAOI,cAAc,CAAC,GAChD,kIACA,gLACA,8FACA,oHACA,0FACA,wLACA,kGACA,8FACA,0GACApB,EAAIgG,SAAS,MAAM1C,EAAU0C,SAAS,KAAK,uBAC7C;GAAC,OAAAH,MAAAD,EAAAe,KAAAC,EAAAxB,GAAA,iBAAAQ,EAAAe,IAAAd,CAAA,GAAAC,MAAAF,EAAAiB,KAAAD,EAAAxB,GAAA,iBAAAQ,EAAAiB,IAAAf,CAAA,GAAAC,MAAAH,EAAAkB,KAAAC,EAAA3B,GAAAQ,EAAAkB,IAAAf,CAAA,GAAAE,MAAAL,EAAAoB,MAAA1B,EAAApF,WAAA0F,EAAAoB,IAAAf,IAAAC,MAAAN,EAAA1C,KAAA0D,EAAAtB,GAAA,gBAAAM,EAAA1C,IAAAgD,CAAA,GAAAC,MAAAP,EAAAqB,KAAAL,EAAAtB,GAAA,YAAAM,EAAAqB,IAAAd,CAAA,GAAAE,MAAAT,EAAAsB,KAAAN,EAAAtB,GAAA,wBAAAM,EAAAsB,IAAAb,CAAA,GAAAC,MAAAV,EAAAuB,KAAAP,EAAAtB,GAAA,oBAAAM,EAAAuB,IAAAb,CAAA,GAAAC,MAAAX,EAAAwB,KAAAR,EAAAtB,GAAA,kBAAAM,EAAAwB,IAAAb,CAAA,GAAAC,MAAAZ,EAAAjB,KAAAiC,EAAAtB,GAAA,qBAAAM,EAAAjB,IAAA6B,CAAA,GAAAC,MAAAb,EAAAyB,KAAAN,EAAAzB,GAAAM,EAAAyB,IAAAZ,CAAA,GAAAb;EAAA,GAAA;GAAAe,GAAAhF,KAAAA;GAAAkF,GAAAlF,KAAAA;GAAAmF,GAAAnF,KAAAA;GAAAqF,GAAArF,KAAAA;GAAAuB,GAAAvB,KAAAA;GAAAsF,GAAAtF,KAAAA;GAAAuF,GAAAvF,KAAAA;GAAAwF,GAAAxF,KAAAA;GAAAyF,GAAAzF,KAAAA;GAAAgD,GAAAhD,KAAAA;GAAA0F,GAAA1F,KAAAA;EAAA,CAAA,GAAAyD;CAAA,EAAA,CAAA,GAQHkC,MAAehE,MAAoB;EACvC,IAAMiE,IAAW5I,EAAa2E,CAAS,GACjCkE,IAAU3J,EAAQC,EAAUwF,GAAW,CAAC,GAAG,EAAE,GAC7CmE,IAAY7I,EAAY2I,GAAUvG,EAAOK,YAAY,GACrDqG,IAAU1J,EAAUwJ,GAASxG,EAAOK,YAAY,GAChDsG,IAAO5J,EAAkB0J,GAAWC,CAAO,GAC3CE,IAAkB,CAAA;EACxB,KAAK,IAAI1E,IAAI,GAAGA,IAAIyE,EAAK3E,QAAQE,KAAK,GACpC0E,EAAM1C,KAAKyC,EAAKE,MAAM3E,GAAGA,IAAI,CAAC,CAAC;EAGjC,IAAM4E,IAAgBhF,MAAMC,KAAK,EAAEC,QAAQ,EAAE,IAAIC,GAAGC,MAClDhF,EAAcL,EAAQ4J,GAAWvE,CAAC,GAAGC,EAAW,CAAC,CACnD;EAEA,cAAA;GAAA,IAAA4E,IAAAC,EAAA,GAAAC,IAAAF,EAAAxC,YAAA2C,IAAAD,EAAA1C,YAAA4C,IAAAD,EAAAE,aAAAC,IAAAJ,EAAAG,aAAAE,IAAAD,EAAAD,aAAAG,IAAAD,EAAA/C;GA6FuC,OA7FvC2C,EAAA1C,gBAOuBnD,EAAU,EAAE,GAACoD,EAAAyC,GAAAM,EAM3BzL,IAAW,EAAA,OAAA,SAAA,CAAA,CAAA,GAAAoL,EAAA3C,gBAMGnD,EAAU,CAAC,GAACoD,EAAA0C,GAAAK,EAM1BxL,IAAY,EAAA,OAAA,SAAA,CAAA,CAAA,GAAAyI,EAAA4C,GAAAG,EAKd/L,GAAI;IAAA,IACHgM,OAAI;KAAA,OAAEzH,EAAOG,kBAAkB;IAAU;IAAA,IACzCuH,WAAQ;KAAA,cAAA;MAAA,IAAAC,IAAAC,EAAA;MACiC,OADjCnD,EAAAkD,SAEH1K,EAAgBqF,GAAWH,EAAW,CAAC,CAAC,GAAAwC,QAAAoB,EAAA4B,GAD9B5E,EAAU,eAAe,CAAC,CAAA,GAAA4E;KAAA,EAAA,CAAA;IAAA;IAAA,IAAAE,WAAA;KAAA,IAAAC,IAAAC,EAAA;KAKP,OALOtD,EAAAqD,GAAAN,EAMtCtL,GAAM;MAAA,IACLiF,QAAK;OAAA,OAAEoB,OAAOD,EAAU0C,SAAS,CAAC;MAAC;MACnCgD,gBAAgB7G,MAAU;OACxBD,EAAS,IAAIxB,KAAK4C,EAAUQ,YAAY,GAAGmF,OAAO9G,CAAK,GAAG,CAAC,CAAC;MAC9D;MAAC,IAAA0G,WAAA;OAAA,OAAA,CAAAL,EAEAnL,GAAa;QACZqJ,SAAO;QAAA,IAAA,QAAA;SAAA,OACAnJ,EACL,oEACAwG,EAAU,eAAe,CAC3B;QAAC;QAAA,IAAA8E,WAAA;SAAA,OAAAL,EAEAlL,GAAW,CAAA,CAAA;QAAA;OAAA,CAAA,GAAAkL,EAEbrL,GAAa;QAAA,OAAA;QAAA,IAAA0L,WAAA;SAAA,OAAAL,EACXhM,GAAG;UAAA,IAAC2M,OAAI;WAAA,OAAE9F,GAAa;UAAC;UAAAwF,WACrBO,MAAMZ,EACLpL,GAAU;WAAA,IAAC+E,QAAK;YAAA,OAAEiH,EAAOjH;WAAK;WAAA,IAAA0G,WAAA;YAAA,OAC5BO,EAAO5F;WAAK;UAAA,CAAA;SAEhB,CAAA;QAAA;OAAA,CAAA,CAAA;MAAA;KAAA,CAAA,GAAA,IAAA,GAAAiC,EAAAqD,GAAAN,EAKNtL,GAAM;MAAA,IACLiF,QAAK;OAAA,OAAEoB,OAAOD,EAAUQ,YAAY,CAAC;MAAC;MACtCkF,gBAAgB7G,MAAU;OACxBD,EAAS,IAAIxB,KAAKuI,OAAO9G,CAAK,GAAGmB,EAAU0C,SAAS,GAAG,CAAC,CAAC;MAC3D;MAAC,IAAA6C,WAAA;OAAA,OAAA,CAAAL,EAEAnL,GAAa;QACZqJ,SAAO;QAAA,IAAA,QAAA;SAAA,OACAnJ,EACL,iFACAwG,EAAU,eAAe,CAC3B;QAAC;QAAA,IAAA8E,WAAA;SAAA,OAAAL,EAEAlL,GAAW,CAAA,CAAA;QAAA;OAAA,CAAA,GAAAkL,EAEbrL,GAAa;QAAA,OAAA;QAAA,IAAA0L,WAAA;SAAA,OAAAL,EACXhM,GAAG;UAAA,IAAC2M,OAAI;WAAA,OAAEvF,GAAY;UAAC;UAAAiF,WACpBQ,MAAIb,EACHpL,GAAU;WAAA,IAAC+E,QAAK;YAAA,OAAEoB,OAAO8F,CAAI;WAAC;WAAAR,UAAGQ;UAAI,CAAA;SACvC,CAAA;QAAA;OAAA,CAAA,CAAA;MAAA;KAAA,CAAA,GAAA,IAAA,GAAA1D,QAAAoB,EAAA+B,GA9CG/E,EAAU,WAAW,CAAC,CAAA,GAAA+E;IAAA;GAAA,CAAA,CAAA,GAAArD,EAAA8C,GAAAC,EAwDjC/L,GAAI;IAAA,IAACgM,OAAI;KAAA,OAAEzH,EAAOsI;IAAc;IAAA,IAAAT,WAAA;KAAA,IAAAU,IAAAR,EAAA;KACY,OADZpD,QAAAoB,EAAAwC,GACnBxF,EAAU,oBAAoB,CAAC,CAAA,GAAAwF;IAAA;GAAA,CAAA,GAAA,IAAA,GAAA9D,EAAA8C,GAAAC,EAE5ChM,GAAG;IAAC2M,MAAMrB;IAAae,WACpBrF,aAAK;KAAA,IAAAgG,IAAAT,EAAA;KAAqC,OAArCtD,EAAA+D,GAAwChG,CAAK,GAAAmC,QAAAoB,EAAAyC,GAA5BzF,EAAU,SAAS,CAAC,CAAA,GAAAyF;IAAA,EAAA,CAAA;GAAe,CAAA,GAAA,IAAA,GAAA/D,EAAA6C,GAAAE,EAI9DhM,GAAG;IAAC2M,MAAMvB;IAAKiB,WACZhJ,aAAI;KAAA,IAAA4J,IAAAV,EAAA;KACyB,OADzBtD,EAAAgE,GAAAjB,EAED/L,GAAI;MAAA,IAACgM,OAAI;OAAA,OAAEzH,EAAOsI;MAAc;MAAA,IAAAT,WAAA;OAAA,IAAAa,IAAAX,EAAA;OACK,OADLtD,EAAAiE,SAE5BtL,EAAiByB,EAAK,EAAE,CAAC,GAAA8F,QAAAoB,EAAA2C,GADhB3F,EAAU,aAAa,CAAC,CAAA,GAAA2F;MAAA;KAAA,CAAA,GAAA,IAAA,GAAAjE,EAAAgE,GAAAjB,EAIrChM,GAAG;MAAC2M,MAAMtJ;MAAIgJ,WAAI7I,MAAQmF,GAAUnF,GAAKsD,CAAS;KAAC,CAAA,GAAA,IAAA,GAAAqC,QAAAoB,EAAA0C,GAN1C1F,EAAU,MAAM,CAAC,CAAA,GAAA0F;IAAA,EAAA,CAAA;GAQ9B,CAAA,GAAA,IAAA,GAAA9D,GAAAC,MAAA;IAAA,IAAA+D,IA/GK5F,EAAU,OAAO,GAAC6F,IAChB7F,EAAU,KAAK,GAAC8F,IAGd,CAACtH,GAAQ,GAACuH,IAGbvM,EACLN,EAAe,EAAEyJ,SAAS1F,EAAOI,cAAc,CAAC,GAChD2C,EAAU,iBAAiB,CAC7B,GAACgG,IAMS,CAACtH,GAAQ,GAACuH,IAGbzM,EACLN,EAAe,EAAEyJ,SAAS1F,EAAOI,cAAc,CAAC,GAChD2C,EAAU,aAAa,CACzB,GAACkG,IAMOlG,EAAU,eAAe,GAACmG,IA+D1BnG,EAAU,YAAY,GAACoG,IACrBpG,EAAU,UAAU;IAAC,OAAA4F,MAAA/D,EAAAe,KAAAI,EAAAgB,GAAAnC,EAAAe,IAAAgD,CAAA,GAAAC,MAAAhE,EAAAiB,KAAAE,EAAAkB,GAAArC,EAAAiB,IAAA+C,CAAA,GAAAC,MAAAjE,EAAAkB,MAAAoB,EAAAhI,WAAA0F,EAAAkB,IAAA+C,IAAAC,MAAAlE,EAAAoB,KAAAD,EAAAmB,GAAAtC,EAAAoB,IAAA8C,CAAA,GAAAC,MAAAnE,EAAA1C,MAAAiF,EAAAjI,WAAA0F,EAAA1C,IAAA6G,IAAAC,MAAApE,EAAAqB,KAAAF,EAAAoB,GAAAvC,EAAAqB,IAAA+C,CAAA,GAAAC,MAAArE,EAAAsB,KAAAH,EAAAsB,GAAAzC,EAAAsB,IAAA+C,CAAA,GAAAC,MAAAtE,EAAAuB,KAAAJ,EAAAuB,GAAA1C,EAAAuB,IAAA+C,CAAA,GAAAC,MAAAvE,EAAAwB,KAAAL,EAAAwB,GAAA3C,EAAAwB,IAAA+C,CAAA,GAAAvE;GAAA,GAAA;IAAAe,GAAAhF,KAAAA;IAAAkF,GAAAlF,KAAAA;IAAAmF,GAAAnF,KAAAA;IAAAqF,GAAArF,KAAAA;IAAAuB,GAAAvB,KAAAA;IAAAsF,GAAAtF,KAAAA;IAAAuF,GAAAvF,KAAAA;IAAAwF,GAAAxF,KAAAA;IAAAyF,GAAAzF,KAAAA;GAAA,CAAA,GAAAoG;EAAA,EAAA,CAAA;CAwBzC;CAEA,cAAA;EAAA,IAAAqC,IAAAC,EAAA,GAAAC,IAAAF,EAAA7E;EAQmC,OARnCgF,GAAAH,GAAAI,EAAA;GAAA,IAAA,QAAA;IAAA,OAGWjN,EAAKwG,EAAU,MAAM,GAAGxC,EAAM2H,KAAK;GAAC;GAAA,IAC3CuB,QAAK;IAAA,OAAElJ,EAAMkJ;GAAK;GAAA,IAClBC,MAAG;IAAA,OAAEnJ,EAAMmJ;GAAG;EAAA,GACVlJ,CAAI,GAAA,IAAA,EAAA,GAAAiE,EAAA6E,GAAA9B,EAGLhM,GAAG;GAAA,IAAC2M,OAAI;IAAA,OAAExG,GAAU;GAAC;GAAAkG,WAAIvF,MAAcgE,GAAYhE,CAAS;EAAC,CAAA,CAAA,GAAAqC,QAAAoB,EAAAuD,GADpDvG,EAAU,QAAQ,CAAC,CAAA,GAAAqG;CAAA,EAAA,CAAA;AAKrC;AAEmDQ,EAAA,CAAA,OAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"Calendar.js","names":["For","Show","createMemo","createSignal","mergeProps","splitProps","JSX","ChevronLeft","ChevronRight","buttonVariants","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","clsx","CalendarClassNames","CalendarMode","CalendarProps","CalendarSelected","DateRange","addDays","addMonths","eachDayOfInterval","endOfWeek","formatMonthYear","formatWeekday","getFirstDate","getISOWeekNumber","isAfter","isAfterOrSame","isBefore","isBeforeOrSame","isSameDay","resolveLocaleCode","startOfMonth","startOfWeek","defaultClassNames","Record","root","months","month","nav","button_previous","button_next","month_caption","dropdowns","dropdown_root","dropdown","caption_label","month_grid","weekdays","weekday","week","week_number_header","week_number","day","outside","disabled","hidden","today","range_start","range_middle","range_end","resolveInitialMonth","props","Date","defaultMonth","selected","defaultSelected","Calendar","Element","merged","mode","showOutsideDays","captionLayout","buttonVariant","weekStartsOn","numberOfMonths","local","rest","internalSelected","setInternalSelected","undefined","commitSelected","next","onSelect","internalMonth","setInternalMonth","currentMonth","setMonth","value","onMonthChange","moveMonth","delta","canPrev","min","canNext","max","monthList","count","Math","Array","from","length","_","i","localeCode","locale","monthOptions","year","filter","beforeMin","getFullYear","getMonth","afterMax","map","monthDate","String","label","Intl","DateTimeFormat","format","yearOptions","currentYear","startYear","endYear","slotClass","key","classNames","isDisabledDay","isRangeStart","range","isRangeEnd","to","isRangeMiddle","isDateSelected","isArray","some","d","selectDay","current","list","index","findIndex","splice","push","renderDay","_el$","_tmpl$","_el$2","firstChild","$$click","_$insert","getDate","_$effect","_p$","_v$","_v$2","_v$3","_v$4","_v$5","_v$6","toLocaleDateString","_v$7","_v$8","_v$9","_v$0","_v$1","variant","e","_$setAttribute","t","a","_$className","o","n","s","h","r","l","renderMonth","firstDay","lastDay","gridStart","gridEnd","days","weeks","slice","weekdayLabels","_el$3","_tmpl$3","_el$4","_el$5","_el$6","nextSibling","_el$7","_el$9","_el$0","_$createComponent","when","fallback","_el$10","_tmpl$4","children","_el$8","_tmpl$2","onValueChange","Number","class","each","option","showWeekNumber","_el$1","_el$11","_el$12","_el$13","_v$10","_v$11","_v$12","_v$13","_v$14","_v$15","_v$16","_v$17","_v$18","_el$14","_tmpl$5","_el$15","_$spread","_$mergeProps","style","dir","calendarClassNames","_$delegateEvents"],"sources":["../../../../src/components/calendar/Calendar/Calendar.tsx"],"sourcesContent":["import {\n For,\n Show,\n createMemo,\n createSignal,\n mergeProps,\n splitProps,\n type JSX,\n} from \"solid-js\";\nimport { ChevronLeft, ChevronRight } from \"lucide-solid\";\nimport buttonVariants from \"~/components/button/Button.styles\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"~/components/select\";\nimport { clsx } from \"~/utils\";\nimport type {\n CalendarClassNames,\n CalendarMode,\n CalendarProps,\n CalendarSelected,\n DateRange,\n} from \"./Calendar.types\";\nimport {\n addDays,\n addMonths,\n eachDayOfInterval,\n endOfWeek,\n formatMonthYear,\n formatWeekday,\n getFirstDate,\n getISOWeekNumber,\n isAfter,\n isAfterOrSame,\n isBefore,\n isBeforeOrSame,\n isSameDay,\n resolveLocaleCode,\n startOfMonth,\n startOfWeek,\n} from \"./Calendar.utils\";\n\nconst defaultClassNames: Record<keyof CalendarClassNames, string> = {\n root: \"group/calendar w-fit bg-background p-2 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(7)] in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent\",\n months: \"relative flex flex-row gap-4\",\n month: \"relative flex w-full flex-col gap-4\",\n nav: \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n button_previous:\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n button_next: \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n month_caption:\n \"flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)\",\n dropdowns:\n \"flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium\",\n dropdown_root: \"relative rounded-(--cell-radius)\",\n dropdown: \"absolute inset-0 bg-popover opacity-0\",\n caption_label: \"font-medium select-none text-sm\",\n month_grid: \"w-full border-collapse\",\n weekdays: \"flex\",\n weekday:\n \"flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal text-muted-foreground select-none\",\n week: \"mt-2 flex w-full\",\n week_number_header: \"w-(--cell-size) select-none\",\n week_number: \"text-[0.8rem] text-muted-foreground select-none\",\n day: \"relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius) [&:first-child[data-selected=true]_button]:rounded-l-(--cell-radius)\",\n outside: \"text-muted-foreground aria-selected:text-muted-foreground\",\n disabled: \"text-muted-foreground opacity-50\",\n hidden: \"invisible\",\n today:\n \"rounded-(--cell-radius) bg-muted text-foreground data-[selected=true]:rounded-none\",\n range_start:\n \"relative isolate z-0 rounded-l-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:right-0 after:w-4 after:bg-muted\",\n range_middle: \"rounded-none\",\n range_end:\n \"relative isolate z-0 rounded-r-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:left-0 after:w-4 after:bg-muted\",\n};\n\nfunction resolveInitialMonth(props: CalendarProps): Date {\n return (\n props.month ??\n props.defaultMonth ??\n getFirstDate(props.selected ?? props.defaultSelected) ??\n new Date()\n );\n}\n\n/**\n * 日历组件:react-day-picker 的 SolidJS 移植,覆盖 shadcn Base UI 版本\n * Calendar 中使用到的核心 props(mode/selected/onSelect/month/classNames 等)。\n * 支持 single、multiple、range 三种模式,以及 label/dropdown 两种标题布局。\n */\nexport function Calendar(props: CalendarProps): JSX.Element {\n const merged = mergeProps(\n {\n mode: \"single\" as CalendarMode,\n showOutsideDays: true,\n captionLayout: \"label\" as CalendarProps[\"captionLayout\"],\n buttonVariant: \"ghost\" as CalendarProps[\"buttonVariant\"],\n weekStartsOn: 0 as 0 | 1 | 2 | 3 | 4 | 5 | 6,\n numberOfMonths: 1,\n },\n props,\n );\n\n const [local, rest] = splitProps(merged, [\n \"mode\",\n \"selected\",\n \"defaultSelected\",\n \"onSelect\",\n \"month\",\n \"defaultMonth\",\n \"onMonthChange\",\n \"numberOfMonths\",\n \"showOutsideDays\",\n \"showWeekNumber\",\n \"weekStartsOn\",\n \"captionLayout\",\n \"locale\",\n \"buttonVariant\",\n \"classNames\",\n \"disabled\",\n \"min\",\n \"max\",\n \"class\",\n \"classList\",\n \"style\",\n \"dir\",\n ]);\n\n const [internalSelected, setInternalSelected] =\n createSignal<CalendarSelected>(merged.defaultSelected);\n const selected = createMemo(() =>\n merged.selected !== undefined ? merged.selected : internalSelected(),\n );\n\n const commitSelected = (next: CalendarSelected) => {\n if (merged.selected === undefined) setInternalSelected(next);\n merged.onSelect?.(next);\n };\n\n const [internalMonth, setInternalMonth] = createSignal<Date>(\n startOfMonth(resolveInitialMonth(merged)),\n );\n const currentMonth = createMemo(() =>\n startOfMonth(merged.month ?? internalMonth()),\n );\n\n const setMonth = (next: Date) => {\n const value = startOfMonth(next);\n if (merged.month === undefined) setInternalMonth(value);\n merged.onMonthChange?.(value);\n };\n\n const moveMonth = (delta: number) =>\n setMonth(addMonths(currentMonth(), delta));\n\n const canPrev = () =>\n !merged.min ||\n isAfter(startOfMonth(currentMonth()), startOfMonth(merged.min));\n\n const canNext = () =>\n !merged.max ||\n isBefore(startOfMonth(currentMonth()), startOfMonth(merged.max));\n\n const monthList = createMemo(() => {\n const count = Math.max(1, merged.numberOfMonths ?? 1);\n return Array.from({ length: count }, (_, i) =>\n addMonths(currentMonth(), i),\n );\n });\n\n const localeCode = createMemo(() => resolveLocaleCode(merged.locale));\n\n const monthOptions = (year: number) =>\n Array.from({ length: 12 }, (_, i) => i)\n .filter((i) => {\n const beforeMin =\n !!merged.min &&\n (year < merged.min.getFullYear() ||\n (year === merged.min.getFullYear() && i < merged.min.getMonth()));\n const afterMax =\n !!merged.max &&\n (year > merged.max.getFullYear() ||\n (year === merged.max.getFullYear() && i > merged.max.getMonth()));\n return !beforeMin && !afterMax;\n })\n .map((i) => {\n const monthDate = new Date(2024, i, 1);\n return {\n value: String(i),\n label: new Intl.DateTimeFormat(localeCode(), {\n month: \"long\",\n }).format(monthDate),\n };\n });\n\n const yearOptions = createMemo(() => {\n const currentYear = new Date().getFullYear();\n const startYear = merged.min\n ? merged.min.getFullYear()\n : currentYear - 100;\n const endYear = merged.max ? merged.max.getFullYear() : currentYear + 100;\n return Array.from(\n { length: Math.max(0, endYear - startYear + 1) },\n (_, i) => startYear + i,\n );\n });\n\n const slotClass = (key: keyof CalendarClassNames) =>\n clsx(defaultClassNames[key], merged.classNames?.[key]);\n\n const isDisabledDay = (day: Date) => {\n if (merged.disabled === true) return true;\n if (typeof merged.disabled === \"function\") return merged.disabled(day);\n if (merged.min && isBefore(day, merged.min)) return true;\n if (merged.max && isAfter(day, merged.max)) return true;\n return false;\n };\n\n const isRangeStart = (day: Date) => {\n const range = selected() as DateRange | undefined;\n return !!range?.from && isSameDay(day, range.from);\n };\n\n const isRangeEnd = (day: Date) => {\n const range = selected() as DateRange | undefined;\n return !!range?.to && isSameDay(day, range.to);\n };\n\n const isRangeMiddle = (day: Date) => {\n const range = selected() as DateRange | undefined;\n return (\n !!range?.from &&\n !!range?.to &&\n isAfter(day, range.from) &&\n isBefore(day, range.to)\n );\n };\n\n const isDateSelected = (day: Date) => {\n const value = selected();\n if (merged.mode === \"single\") {\n return value instanceof Date && isSameDay(day, value);\n }\n if (merged.mode === \"multiple\") {\n return Array.isArray(value) && value.some((d) => isSameDay(d, day));\n }\n const range = value as DateRange | undefined;\n return (\n !!range &&\n ((range.from && isSameDay(day, range.from)) ||\n (range.to && isSameDay(day, range.to)) ||\n (!!range.from &&\n !!range.to &&\n isAfterOrSame(day, range.from) &&\n isBeforeOrSame(day, range.to)))\n );\n };\n\n const selectDay = (day: Date) => {\n if (isDisabledDay(day)) return;\n\n if (merged.mode === \"single\") {\n const current = selected();\n commitSelected(\n current instanceof Date && isSameDay(current, day) ? undefined : day,\n );\n return;\n }\n\n if (merged.mode === \"multiple\") {\n const current = selected();\n const list = Array.isArray(current) ? [...current] : [];\n const index = list.findIndex((d) => isSameDay(d, day));\n if (index >= 0) list.splice(index, 1);\n else list.push(day);\n commitSelected(list);\n return;\n }\n\n const range = selected() as DateRange | undefined;\n if (!range?.from || (range.from && range.to)) {\n commitSelected({ from: day });\n } else if (isBefore(day, range.from)) {\n commitSelected({ from: day, to: range.from });\n } else if (isSameDay(day, range.from)) {\n commitSelected({ from: day, to: day });\n } else {\n commitSelected({ from: range.from, to: day });\n }\n };\n\n const renderDay = (day: Date, monthDate: Date) => {\n return (\n <div\n aria-disabled={isDisabledDay(day)}\n data-selected={isDateSelected(day) ? \"true\" : undefined}\n class={clsx(\n slotClass(\"day\"),\n day.getMonth() !== monthDate.getMonth() && slotClass(\"outside\"),\n !merged.showOutsideDays &&\n day.getMonth() !== monthDate.getMonth() &&\n slotClass(\"hidden\"),\n isSameDay(day, new Date()) && slotClass(\"today\"),\n isDisabledDay(day) && slotClass(\"disabled\"),\n isRangeStart(day) && slotClass(\"range_start\"),\n isRangeMiddle(day) && slotClass(\"range_middle\"),\n isRangeEnd(day) && slotClass(\"range_end\"),\n )}\n >\n <button\n type=\"button\"\n disabled={isDisabledDay(day)}\n aria-pressed={isDateSelected(day)}\n data-day={day.toLocaleDateString(localeCode())}\n data-selected-single={\n merged.mode === \"single\" &&\n selected() instanceof Date &&\n isSameDay(day, selected() as Date)\n ? \"true\"\n : undefined\n }\n data-range-start={isRangeStart(day) ? \"true\" : undefined}\n data-range-end={isRangeEnd(day) ? \"true\" : undefined}\n data-range-middle={isRangeMiddle(day) ? \"true\" : undefined}\n onClick={() => selectDay(day)}\n class={clsx(\n buttonVariants({ variant: merged.buttonVariant }),\n \"relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 border-0 leading-none font-normal\",\n \"data-[range-end=true]:rounded-(--cell-radius) data-[range-end=true]:rounded-r-(--cell-radius) data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground\",\n \"data-[range-end=true]:hover:bg-primary data-[range-end=true]:hover:text-primary-foreground\",\n \"data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-muted data-[range-middle=true]:text-foreground\",\n \"data-[range-middle=true]:hover:bg-muted data-[range-middle=true]:hover:text-foreground\",\n \"data-[range-start=true]:rounded-(--cell-radius) data-[range-start=true]:rounded-l-(--cell-radius) data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground\",\n \"data-[range-start=true]:hover:bg-primary data-[range-start=true]:hover:text-primary-foreground\",\n \"data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground\",\n \"data-[selected-single=true]:hover:bg-primary data-[selected-single=true]:hover:text-primary-foreground\",\n day.getMonth() !== monthDate.getMonth() && \"text-muted-foreground\",\n )}\n >\n {day.getDate()}\n </button>\n </div>\n );\n };\n\n const renderMonth = (monthDate: Date) => {\n const firstDay = startOfMonth(monthDate);\n const lastDay = addDays(addMonths(monthDate, 1), -1);\n const gridStart = startOfWeek(firstDay, merged.weekStartsOn);\n const gridEnd = endOfWeek(lastDay, merged.weekStartsOn);\n const days = eachDayOfInterval(gridStart, gridEnd);\n const weeks: Date[][] = [];\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n const weekdayLabels = Array.from({ length: 7 }, (_, i) =>\n formatWeekday(addDays(gridStart, i), localeCode()),\n );\n\n return (\n <div class={slotClass(\"month\")}>\n <div class={slotClass(\"nav\")}>\n <button\n type=\"button\"\n disabled={!canPrev()}\n aria-label=\"Previous month\"\n onClick={() => moveMonth(-1)}\n class={clsx(\n buttonVariants({ variant: merged.buttonVariant }),\n slotClass(\"button_previous\"),\n )}\n >\n <ChevronLeft class=\"size-4\" />\n </button>\n <button\n type=\"button\"\n disabled={!canNext()}\n aria-label=\"Next month\"\n onClick={() => moveMonth(1)}\n class={clsx(\n buttonVariants({ variant: merged.buttonVariant }),\n slotClass(\"button_next\"),\n )}\n >\n <ChevronRight class=\"size-4\" />\n </button>\n </div>\n\n <div class={slotClass(\"month_caption\")}>\n <Show\n when={merged.captionLayout === \"dropdown\"}\n fallback={\n <span class={slotClass(\"caption_label\")}>\n {formatMonthYear(monthDate, localeCode())}\n </span>\n }\n >\n <div class={slotClass(\"dropdowns\")}>\n <Select\n value={String(monthDate.getMonth())}\n onValueChange={(value) => {\n setMonth(new Date(monthDate.getFullYear(), Number(value), 1));\n }}\n >\n <SelectTrigger\n variant=\"ghost\"\n class={clsx(\n \"h-(--cell-size) rounded-(--cell-radius) px-2 text-sm font-medium\",\n slotClass(\"dropdown_root\"),\n )}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent class=\"max-h-56\">\n <For each={monthOptions(monthDate.getFullYear())}>\n {(option) => (\n <SelectItem value={option.value}>\n {option.label}\n </SelectItem>\n )}\n </For>\n </SelectContent>\n </Select>\n\n <Select\n value={String(monthDate.getFullYear())}\n onValueChange={(value) => {\n setMonth(new Date(Number(value), monthDate.getMonth(), 1));\n }}\n >\n <SelectTrigger\n variant=\"ghost\"\n class={clsx(\n \"h-(--cell-size) rounded-(--cell-radius) px-2 text-sm font-medium tabular-nums\",\n slotClass(\"dropdown_root\"),\n )}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent class=\"max-h-56\">\n <For each={yearOptions()}>\n {(year) => (\n <SelectItem value={String(year)}>{year}</SelectItem>\n )}\n </For>\n </SelectContent>\n </Select>\n </div>\n </Show>\n </div>\n\n <div class={slotClass(\"month_grid\")}>\n <div class={slotClass(\"weekdays\")}>\n <Show when={merged.showWeekNumber}>\n <div class={slotClass(\"week_number_header\")} />\n </Show>\n <For each={weekdayLabels}>\n {(label) => <div class={slotClass(\"weekday\")}>{label}</div>}\n </For>\n </div>\n\n <For each={weeks}>\n {(week) => (\n <div class={slotClass(\"week\")}>\n <Show when={merged.showWeekNumber}>\n <div class={slotClass(\"week_number\")}>\n {getISOWeekNumber(week[0])}\n </div>\n </Show>\n <For each={week}>{(day) => renderDay(day, monthDate)}</For>\n </div>\n )}\n </For>\n </div>\n </div>\n );\n };\n\n return (\n <div\n data-slot=\"calendar\"\n class={clsx(slotClass(\"root\"), local.class)}\n style={local.style}\n dir={local.dir}\n {...rest}\n >\n <div class={slotClass(\"months\")}>\n <For each={monthList()}>{(monthDate) => renderMonth(monthDate)}</For>\n </div>\n </div>\n );\n}\n\nexport { defaultClassNames as calendarClassNames };\n"],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ function f(f) {
|
|
|
14
14
|
});
|
|
15
15
|
let v = () => {
|
|
16
16
|
let e = p.value();
|
|
17
|
-
return
|
|
17
|
+
return e == null ? !1 : Array.isArray(e) ? e.length > 0 : e !== "";
|
|
18
18
|
}, y = (e) => {
|
|
19
19
|
if (h()) return;
|
|
20
20
|
let t = p.filteredItems();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComboboxInput.js","names":["Show","createEffect","mergeProps","onCleanup","JSX","InputGroup","InputGroupAddon","InputGroupInput","clsx","useComboboxContext","ComboboxClear","ComboboxInput","props","placeholder","disabled","showClear","class","children","Element","ctx","local","mountedWithExternalReference","reference","undefined","inputEl","HTMLInputElement","open","focus","hasValue","current","value","
|
|
1
|
+
{"version":3,"file":"ComboboxInput.js","names":["Show","createEffect","mergeProps","onCleanup","JSX","InputGroup","InputGroupAddon","InputGroupInput","clsx","useComboboxContext","ComboboxClear","ComboboxInput","props","placeholder","disabled","showClear","class","children","Element","ctx","local","mountedWithExternalReference","reference","undefined","inputEl","HTMLInputElement","open","focus","hasValue","current","value","Array","isArray","length","onKeyDown","e","KeyboardEvent","list","filteredItems","key","preventDefault","setOpen","setActiveIndex","activeIndex","item","selectItem","close","_$createComponent","ref","el","setReference","aria-invalid","inputValue","onInput","next","String","setInputValue","setFilterValue","multiple","trim","setValue","onFocus","onClick","align","when","_$memo"],"sources":["../../../../src/components/combobox/ComboboxInput/ComboboxInput.tsx"],"sourcesContent":["import { Show, createEffect, mergeProps, onCleanup, type JSX } from \"solid-js\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"~/components/input-group\";\nimport { clsx } from \"~/utils\";\nimport { useComboboxContext } from \"../Combobox/Combobox.context\";\nimport { ComboboxClear } from \"../ComboboxClear\";\n\nexport function ComboboxInput(props: {\n placeholder?: string;\n disabled?: boolean;\n showClear?: boolean;\n class?: string;\n \"aria-invalid\"?: string | boolean;\n children?: JSX.Element;\n}) {\n const ctx = useComboboxContext(\"ComboboxInput\");\n const local = mergeProps({ showClear: false }, props);\n const disabled = () => ctx.disabled() || !!local.disabled;\n // 当 ComboboxInput 作为 ComboboxContent 子组件时(Popup 模式),\n // 此时 reference 已经由 ComboboxTrigger 设置。打开弹层后自动聚焦输入框。\n const mountedWithExternalReference = ctx.reference() !== undefined;\n let inputEl: HTMLInputElement | undefined;\n\n createEffect(() => {\n if (ctx.open() && mountedWithExternalReference && inputEl) {\n inputEl.focus();\n }\n });\n\n const hasValue = () => {\n const current = ctx.value();\n if (current == null) return false;\n if (Array.isArray(current)) return current.length > 0;\n return current !== \"\";\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (disabled()) return;\n const list = ctx.filteredItems();\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n ctx.setOpen(true);\n ctx.setActiveIndex(\n list.length === 0 ? -1 : (ctx.activeIndex() + 1) % list.length,\n );\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n ctx.setOpen(true);\n ctx.setActiveIndex(\n list.length === 0\n ? -1\n : (ctx.activeIndex() - 1 + list.length) % list.length,\n );\n } else if (e.key === \"Enter\" && ctx.open()) {\n e.preventDefault();\n const item = ctx.filteredItems()[ctx.activeIndex()];\n if (item !== undefined) ctx.selectItem(item);\n } else if (e.key === \"Escape\" && ctx.open()) {\n e.preventDefault();\n ctx.close();\n }\n };\n\n return (\n <InputGroup\n ref={(el) => {\n if (!ctx.reference()) ctx.setReference(el);\n onCleanup(() => {\n if (ctx.reference() === el) ctx.setReference(undefined);\n });\n }}\n class={clsx(\"w-auto\", local.class)}\n >\n <InputGroupInput\n ref={(el) => {\n inputEl = el;\n }}\n placeholder={local.placeholder}\n disabled={disabled()}\n aria-invalid={local[\"aria-invalid\"] as any}\n value={ctx.inputValue()}\n onInput={(value) => {\n const next = String(value);\n ctx.setInputValue(next);\n ctx.setFilterValue(next);\n ctx.setOpen(true);\n if (!ctx.multiple() && next.trim() === \"\") {\n ctx.setValue(null);\n ctx.setFilterValue(\"\");\n }\n }}\n onFocus={() => ctx.setOpen(true)}\n onClick={() => ctx.setOpen(true)}\n onKeyDown={onKeyDown}\n />\n <InputGroupAddon align=\"inline-end\">\n <Show when={local.showClear && hasValue() && !disabled()}>\n <ComboboxClear />\n </Show>\n </InputGroupAddon>\n {local.children}\n </InputGroup>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +1,41 @@
|
|
|
1
|
-
import { ToggleGroupContextValue } from './ToggleGroup.types';
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { ToggleGroupChangeHandler, ToggleGroupContextValue, ToggleGroupOrientation, ToggleGroupSize, ToggleGroupValue, ToggleGroupVariant } from './ToggleGroup.types';
|
|
2
|
+
declare const ToggleGroupContext: import('solid-js').Context<ToggleGroupContextValue<ToggleGroupValue> | undefined>;
|
|
3
|
+
/**
|
|
4
|
+
* createToggleGroupState 的输入:ToggleGroupProps 的运行时形态。
|
|
5
|
+
*
|
|
6
|
+
* 受控值时单选给标量、多选给数组,内部统一规范化成数组;
|
|
7
|
+
* `multiple` 同时决定 onValueChange 用哪种签名回调。
|
|
8
|
+
*/
|
|
9
|
+
export interface ToggleGroupStateProps<TValue extends ToggleGroupValue = ToggleGroupValue> {
|
|
10
|
+
value?: TValue | readonly TValue[];
|
|
11
|
+
defaultValue?: TValue | readonly TValue[];
|
|
12
|
+
onValueChange?: ToggleGroupChangeHandler<TValue>;
|
|
13
|
+
multiple?: boolean;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
orientation?: ToggleGroupOrientation;
|
|
16
|
+
loopFocus?: boolean;
|
|
17
|
+
dir?: "ltr" | "rtl" | "auto";
|
|
18
|
+
spacing?: number;
|
|
19
|
+
variant?: ToggleGroupVariant;
|
|
20
|
+
size?: ToggleGroupSize;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* ToggleGroup 的唯一状态源:选中值(受控/非受控)、焦点高亮、item 注册表。
|
|
24
|
+
*
|
|
25
|
+
* 返回的 context 值里所有字段都是 accessor,因此传入的 `props` 可以是
|
|
26
|
+
* splitProps 得到的响应式代理,读取始终是最新值。
|
|
27
|
+
* 组件根只负责输出 DOM 与 data-* 样式钩子,状态与交互算法收敛在这里。
|
|
28
|
+
*
|
|
29
|
+
* 值类型由泛型参数决定;内部只用 `===` / `includes` 做同一性比较,
|
|
30
|
+
* 因此 string 与 number 都能正常工作。
|
|
31
|
+
*/
|
|
32
|
+
export declare function createToggleGroupState<TValue extends ToggleGroupValue = ToggleGroupValue>(props: ToggleGroupStateProps<TValue>): ToggleGroupContextValue<TValue>;
|
|
33
|
+
/**
|
|
34
|
+
* 读取 ToggleGroup 的 context。
|
|
35
|
+
*
|
|
36
|
+
* 泛型参数是**调用方标注**:组件本身无法从子节点推导所属 group 的值类型,
|
|
37
|
+
* 自定义 item 时请显式传入与 ToggleGroup 一致的类型,例如
|
|
38
|
+
* `useToggleGroupContext<"bold" | "italic">("MyToggle")`。
|
|
39
|
+
*/
|
|
40
|
+
export declare function useToggleGroupContext<TValue extends ToggleGroupValue = ToggleGroupValue>(component: string): ToggleGroupContextValue<TValue>;
|
|
41
|
+
export { ToggleGroupContext };
|
|
@@ -1,12 +1,40 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createChangeEventDetails as e } from "./create-change-event-details.js";
|
|
2
|
+
import { createContext as t, createSignal as n, useContext as r } from "solid-js";
|
|
2
3
|
//#region src/components/toggle-group/ToggleGroup/ToggleGroup.context.ts
|
|
3
|
-
var
|
|
4
|
-
function
|
|
5
|
-
let r = t(n);
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
var i = t();
|
|
5
|
+
function a(t) {
|
|
6
|
+
let r = () => t.multiple === !0, i = (e) => e === void 0 ? [] : Array.isArray(e) ? [...e] : [e], [a, o] = n(i(t.defaultValue)), [s, c] = n(), [l, u] = n([]), d = () => t.value !== void 0, f = () => d() ? i(t.value) : a();
|
|
7
|
+
return {
|
|
8
|
+
value: f,
|
|
9
|
+
multiple: r,
|
|
10
|
+
disabled: () => t.disabled === !0,
|
|
11
|
+
orientation: () => t.orientation ?? "horizontal",
|
|
12
|
+
loopFocus: () => t.loopFocus ?? !0,
|
|
13
|
+
dir: () => t.dir,
|
|
14
|
+
spacing: () => t.spacing ?? 2,
|
|
15
|
+
variant: () => t.variant,
|
|
16
|
+
size: () => t.size,
|
|
17
|
+
highlightedValue: s,
|
|
18
|
+
isPressed: (e) => f().includes(e),
|
|
19
|
+
toggleItem: (n, i, a) => {
|
|
20
|
+
let s = f(), c = s.includes(n), l;
|
|
21
|
+
l = r() ? c ? s.filter((e) => e !== n) : [...s, n] : c ? [] : [n];
|
|
22
|
+
let u = e(i, a);
|
|
23
|
+
r() ? t.onValueChange?.(l, u) : t.onValueChange?.(l[0], u), !u.isCanceled && (d() || o(l));
|
|
24
|
+
},
|
|
25
|
+
setHighlightedValue: c,
|
|
26
|
+
registerItem: (e) => (u((t) => [...t, e]), () => u((t) => t.filter((t) => t !== e))),
|
|
27
|
+
getItems: () => l(),
|
|
28
|
+
isFirstEnabled: (e) => l().find((e) => !e.disabled())?.value === e,
|
|
29
|
+
isUsable: (e) => l().some((t) => t.value === e && !t.disabled())
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function o(e) {
|
|
33
|
+
let t = r(i);
|
|
34
|
+
if (!t) throw Error(`<${e}> 必须渲染在 <ToggleGroup> 内部`);
|
|
35
|
+
return t;
|
|
8
36
|
}
|
|
9
37
|
//#endregion
|
|
10
|
-
export {
|
|
38
|
+
export { i as ToggleGroupContext, a as createToggleGroupState, o as useToggleGroupContext };
|
|
11
39
|
|
|
12
40
|
//# sourceMappingURL=ToggleGroup.context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToggleGroup.context.js","names":[],"sources":["../../../../src/components/toggle-group/ToggleGroup/ToggleGroup.context.ts"],"sourcesContent":["import { createContext, useContext } from \"solid-js\";\nimport type {
|
|
1
|
+
{"version":3,"file":"ToggleGroup.context.js","names":[],"sources":["../../../../src/components/toggle-group/ToggleGroup/ToggleGroup.context.ts"],"sourcesContent":["import { createContext, createSignal, useContext } from \"solid-js\";\nimport { createChangeEventDetails } from \"./create-change-event-details\";\nimport type {\n ToggleGroupChangeHandler,\n ToggleGroupContextValue,\n ToggleGroupItemEntry,\n ToggleGroupMultipleProps,\n ToggleGroupOrientation,\n ToggleGroupSingleProps,\n ToggleGroupSize,\n ToggleGroupValue,\n ToggleGroupVariant,\n} from \"./ToggleGroup.types\";\n\nconst ToggleGroupContext = createContext<ToggleGroupContextValue>();\n\n/** 单选/多选的 onValueChange 签名(从 props 类型派生,保持单一事实来源) */\ntype SingleChangeHandler<TValue extends ToggleGroupValue> = NonNullable<\n ToggleGroupSingleProps<TValue>[\"onValueChange\"]\n>;\ntype MultipleChangeHandler<TValue extends ToggleGroupValue> = NonNullable<\n ToggleGroupMultipleProps<TValue>[\"onValueChange\"]\n>;\n\n/**\n * createToggleGroupState 的输入:ToggleGroupProps 的运行时形态。\n *\n * 受控值时单选给标量、多选给数组,内部统一规范化成数组;\n * `multiple` 同时决定 onValueChange 用哪种签名回调。\n */\nexport interface ToggleGroupStateProps<\n TValue extends ToggleGroupValue = ToggleGroupValue,\n> {\n value?: TValue | readonly TValue[];\n defaultValue?: TValue | readonly TValue[];\n onValueChange?: ToggleGroupChangeHandler<TValue>;\n multiple?: boolean;\n disabled?: boolean;\n orientation?: ToggleGroupOrientation;\n loopFocus?: boolean;\n dir?: \"ltr\" | \"rtl\" | \"auto\";\n spacing?: number;\n variant?: ToggleGroupVariant;\n size?: ToggleGroupSize;\n}\n\n/**\n * ToggleGroup 的唯一状态源:选中值(受控/非受控)、焦点高亮、item 注册表。\n *\n * 返回的 context 值里所有字段都是 accessor,因此传入的 `props` 可以是\n * splitProps 得到的响应式代理,读取始终是最新值。\n * 组件根只负责输出 DOM 与 data-* 样式钩子,状态与交互算法收敛在这里。\n *\n * 值类型由泛型参数决定;内部只用 `===` / `includes` 做同一性比较,\n * 因此 string 与 number 都能正常工作。\n */\nexport function createToggleGroupState<\n TValue extends ToggleGroupValue = ToggleGroupValue,\n>(props: ToggleGroupStateProps<TValue>): ToggleGroupContextValue<TValue> {\n const multiple = () => props.multiple === true;\n\n /** 单选传标量、多选传数组,内部统一成数组 */\n const toArray = (v: TValue | readonly TValue[] | undefined): TValue[] => {\n if (v === undefined) return [];\n return Array.isArray(v) ? [...(v as readonly TValue[])] : [v as TValue];\n };\n\n const [internalValue, setInternalValue] = createSignal<TValue[]>(\n toArray(props.defaultValue),\n );\n const [highlightedValue, setHighlightedValue] = createSignal<\n TValue | undefined\n >();\n const [itemOrder, setItemOrder] = createSignal<\n ToggleGroupItemEntry<TValue>[]\n >([]);\n\n const isControlled = () => props.value !== undefined;\n // 受控优先:props.value 存在时读外部值,否则读内部状态\n const value = (): readonly TValue[] =>\n isControlled() ? toArray(props.value) : internalValue();\n\n const isPressed = (v: TValue) => value().includes(v);\n\n const toggleItem = (\n itemValue: TValue,\n event: Event,\n trigger?: Element,\n ): void => {\n const current = value();\n const pressed = current.includes(itemValue);\n\n // 单选时再次点击已按下项会取消选中(next = [])\n let next: TValue[];\n if (multiple()) {\n next = pressed\n ? current.filter((v) => v !== itemValue)\n : [...current, itemValue];\n } else {\n next = pressed ? [] : [itemValue];\n }\n\n // 先通知外部:onValueChange 中 cancel() 可阻止组件提交本次变更\n // 单选回调标量(取消时是 undefined),多选回调数组\n const details = createChangeEventDetails(event, trigger);\n if (multiple()) {\n (props.onValueChange as MultipleChangeHandler<TValue> | undefined)?.(\n next,\n details,\n );\n } else {\n (props.onValueChange as SingleChangeHandler<TValue> | undefined)?.(\n next[0],\n details,\n );\n }\n if (details.isCanceled) return;\n\n // 受控模式只通知外部,不改内部状态\n if (!isControlled()) setInternalValue(next);\n };\n\n const registerItem = (entry: ToggleGroupItemEntry<TValue>) => {\n setItemOrder((prev) => [...prev, entry]);\n return () => setItemOrder((prev) => prev.filter((item) => item !== entry));\n };\n\n const isFirstEnabled = (v: TValue) =>\n itemOrder().find((item) => !item.disabled())?.value === v;\n\n const isUsable = (v: TValue) =>\n itemOrder().some((item) => item.value === v && !item.disabled());\n\n return {\n value,\n multiple,\n disabled: () => props.disabled === true,\n orientation: () => props.orientation ?? \"horizontal\",\n loopFocus: () => props.loopFocus ?? true,\n dir: () => props.dir,\n spacing: () => props.spacing ?? 2,\n variant: () => props.variant,\n size: () => props.size,\n highlightedValue,\n isPressed,\n toggleItem,\n setHighlightedValue,\n registerItem,\n getItems: () => itemOrder(),\n isFirstEnabled,\n isUsable,\n };\n}\n\n/**\n * 读取 ToggleGroup 的 context。\n *\n * 泛型参数是**调用方标注**:组件本身无法从子节点推导所属 group 的值类型,\n * 自定义 item 时请显式传入与 ToggleGroup 一致的类型,例如\n * `useToggleGroupContext<\"bold\" | \"italic\">(\"MyToggle\")`。\n */\nexport function useToggleGroupContext<\n TValue extends ToggleGroupValue = ToggleGroupValue,\n>(component: string): ToggleGroupContextValue<TValue> {\n const ctx = useContext(ToggleGroupContext);\n if (!ctx) {\n throw new Error(`<${component}> 必须渲染在 <ToggleGroup> 内部`);\n }\n return ctx as ToggleGroupContextValue<TValue>;\n}\n\nexport { ToggleGroupContext };\n"],"mappings":";;;AAcA,IAAM,IAAqB,EAAuC;AA0ClE,SAAgB,EAEd,GAAuE;CACvE,IAAM,UAAiB,EAAM,aAAa,IAGpC,KAAW,MACX,MAAM,KAAA,IAAkB,CAAC,IACtB,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAI,CAAuB,IAAI,CAAC,CAAW,GAGlE,CAAC,GAAe,KAAoB,EACxC,EAAQ,EAAM,YAAY,CAC5B,GACM,CAAC,GAAkB,KAAuB,EAE9C,GACI,CAAC,GAAW,KAAgB,EAEhC,CAAC,CAAC,GAEE,UAAqB,EAAM,UAAU,KAAA,GAErC,UACJ,EAAa,IAAI,EAAQ,EAAM,KAAK,IAAI,EAAc;CAqDxD,OAAO;EACL;EACA;EACA,gBAAgB,EAAM,aAAa;EACnC,mBAAmB,EAAM,eAAe;EACxC,iBAAiB,EAAM,aAAa;EACpC,WAAW,EAAM;EACjB,eAAe,EAAM,WAAW;EAChC,eAAe,EAAM;EACrB,YAAY,EAAM;EAClB;EACA,YA9DiB,MAAc,EAAM,CAAC,CAAC,SAAS,CAAC;EA+DjD,aA5DA,GACA,GACA,MACS;GACT,IAAM,IAAU,EAAM,GAChB,IAAU,EAAQ,SAAS,CAAS,GAGtC;GACJ,AAKE,IALE,EAAS,IACJ,IACH,EAAQ,QAAQ,MAAM,MAAM,CAAS,IACrC,CAAC,GAAG,GAAS,CAAS,IAEnB,IAAU,CAAC,IAAI,CAAC,CAAS;GAKlC,IAAM,IAAU,EAAyB,GAAO,CAAO;GACvD,AAAI,EAAS,IACX,EAAO,gBACL,GACA,CACF,IAEA,EAAO,gBACL,EAAK,IACL,CACF,GAEE,GAAQ,eAGP,EAAa,KAAG,EAAiB,CAAI;EAC5C;EA0BE;EACA,eAzBoB,OACpB,GAAc,MAAS,CAAC,GAAG,GAAM,CAAK,CAAC,SAC1B,GAAc,MAAS,EAAK,QAAQ,MAAS,MAAS,CAAK,CAAC;EAwBzE,gBAAgB,EAAU;EAC1B,iBAtBsB,MACtB,EAAU,CAAC,CAAC,MAAM,MAAS,CAAC,EAAK,SAAS,CAAC,CAAC,EAAE,UAAU;EAsBxD,WApBgB,MAChB,EAAU,CAAC,CAAC,MAAM,MAAS,EAAK,UAAU,KAAK,CAAC,EAAK,SAAS,CAAC;CAoBjE;AACF;AASA,SAAgB,EAEd,GAAoD;CACpD,IAAM,IAAM,EAAW,CAAkB;CACzC,IAAI,CAAC,GACH,MAAU,MAAM,IAAI,EAAU,yBAAyB;CAEzD,OAAO;AACT"}
|
|
@@ -1,3 +1,24 @@
|
|
|
1
1
|
import { JSX } from 'solid-js';
|
|
2
|
-
import { ToggleGroupProps } from './ToggleGroup.types';
|
|
3
|
-
|
|
2
|
+
import { ToggleGroupProps, ToggleGroupValue } from './ToggleGroup.types';
|
|
3
|
+
/**
|
|
4
|
+
* ToggleGroup 根组件:渲染 `<div role="group">`,输出样式与语义钩子
|
|
5
|
+
* (`data-orientation` / `data-vertical` / `data-horizontal` / `data-multiple`
|
|
6
|
+
* / `data-disabled` / `data-spacing` / `data-variant` / `data-size`),
|
|
7
|
+
* 并挂载 roving focus 键盘导航。
|
|
8
|
+
*
|
|
9
|
+
* 单选模式(默认)的 value 是标量,多选模式(`multiple`)才是数组:
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* // 单选
|
|
14
|
+
* <ToggleGroup defaultValue="bold" onValueChange={(v) => ...}>
|
|
15
|
+
* <ToggleGroupItem value="bold">Bold</ToggleGroupItem>
|
|
16
|
+
* </ToggleGroup>
|
|
17
|
+
*
|
|
18
|
+
* // 多选
|
|
19
|
+
* <ToggleGroup multiple value={["bold"]} onValueChange={(v) => ...}>
|
|
20
|
+
* <ToggleGroupItem value="bold">Bold</ToggleGroupItem>
|
|
21
|
+
* </ToggleGroup>
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function ToggleGroup<TValue extends ToggleGroupValue = ToggleGroupValue>(props: ToggleGroupProps<TValue>): JSX.Element;
|
|
@@ -1,68 +1,88 @@
|
|
|
1
1
|
import { clsx as e } from "../../../utils/clsx.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { callEventHandler as t } from "../call-event-handler.js";
|
|
3
|
+
import { ToggleGroupContext as n, createToggleGroupState as r } from "./ToggleGroup.context.js";
|
|
4
|
+
import { toggleGroupVariants as i } from "./ToggleGroup.styles.js";
|
|
5
|
+
import { useToggleGroupKeyboard as a } from "./useToggleGroupKeyboard.js";
|
|
6
|
+
import { createComponent as o, delegateEvents as s, insert as c, mergeProps as l, spread as u, template as d } from "solid-js/web";
|
|
7
|
+
import { splitProps as f } from "solid-js";
|
|
5
8
|
//#region src/components/toggle-group/ToggleGroup/ToggleGroup.tsx
|
|
6
|
-
var
|
|
7
|
-
function
|
|
8
|
-
let [d,
|
|
9
|
+
var p = /*#__PURE__*/ d("<div role=group data-slot=toggle-group>");
|
|
10
|
+
function m(s) {
|
|
11
|
+
let [d, m] = f(s, [
|
|
9
12
|
"value",
|
|
10
13
|
"defaultValue",
|
|
11
14
|
"onValueChange",
|
|
12
15
|
"multiple",
|
|
13
16
|
"disabled",
|
|
14
17
|
"orientation",
|
|
18
|
+
"loopFocus",
|
|
15
19
|
"spacing",
|
|
16
20
|
"variant",
|
|
17
21
|
"size",
|
|
18
22
|
"class",
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
},
|
|
26
|
-
multiple: g,
|
|
27
|
-
disabled: _,
|
|
28
|
-
orientation: v,
|
|
29
|
-
spacing: y,
|
|
30
|
-
variant: b,
|
|
31
|
-
size: x
|
|
32
|
-
};
|
|
23
|
+
"classList",
|
|
24
|
+
"style",
|
|
25
|
+
"dir",
|
|
26
|
+
"onKeyDown",
|
|
27
|
+
"children"
|
|
28
|
+
]), h = r(d), { handleKeyDown: g } = a(h), _ = () => h.orientation() === "vertical";
|
|
33
29
|
return (() => {
|
|
34
|
-
var
|
|
35
|
-
return
|
|
30
|
+
var r = p();
|
|
31
|
+
return r.$$keydown = (e) => {
|
|
32
|
+
t(d.onKeyDown, e), e.defaultPrevented || g(e);
|
|
33
|
+
}, u(r, l({
|
|
36
34
|
get "data-variant"() {
|
|
37
|
-
return
|
|
35
|
+
return h.variant();
|
|
38
36
|
},
|
|
39
37
|
get "data-size"() {
|
|
40
|
-
return
|
|
38
|
+
return h.size();
|
|
41
39
|
},
|
|
42
40
|
get "data-spacing"() {
|
|
43
|
-
return
|
|
41
|
+
return h.spacing();
|
|
44
42
|
},
|
|
45
43
|
get "data-orientation"() {
|
|
46
|
-
return
|
|
44
|
+
return h.orientation();
|
|
47
45
|
},
|
|
48
|
-
get
|
|
49
|
-
return
|
|
46
|
+
get "data-vertical"() {
|
|
47
|
+
return _() ? "" : null;
|
|
48
|
+
},
|
|
49
|
+
get "data-horizontal"() {
|
|
50
|
+
return _() ? null : "";
|
|
51
|
+
},
|
|
52
|
+
get "data-multiple"() {
|
|
53
|
+
return h.multiple() ? "" : null;
|
|
54
|
+
},
|
|
55
|
+
get "data-disabled"() {
|
|
56
|
+
return h.disabled() ? "" : null;
|
|
57
|
+
},
|
|
58
|
+
get "aria-disabled"() {
|
|
59
|
+
return h.disabled() ? "true" : void 0;
|
|
50
60
|
},
|
|
51
61
|
get dir() {
|
|
52
62
|
return d.dir;
|
|
53
63
|
},
|
|
64
|
+
get style() {
|
|
65
|
+
return {
|
|
66
|
+
"--gap": h.spacing(),
|
|
67
|
+
...d.style
|
|
68
|
+
};
|
|
69
|
+
},
|
|
54
70
|
get class() {
|
|
55
|
-
return e(
|
|
71
|
+
return e(i(), d.class);
|
|
72
|
+
},
|
|
73
|
+
get classList() {
|
|
74
|
+
return d.classList;
|
|
56
75
|
}
|
|
57
|
-
},
|
|
58
|
-
value:
|
|
76
|
+
}, m), !1, !0), c(r, o(n.Provider, {
|
|
77
|
+
value: h,
|
|
59
78
|
get children() {
|
|
60
79
|
return d.children;
|
|
61
80
|
}
|
|
62
|
-
})),
|
|
81
|
+
})), r;
|
|
63
82
|
})();
|
|
64
83
|
}
|
|
84
|
+
s(["keydown"]);
|
|
65
85
|
//#endregion
|
|
66
|
-
export {
|
|
86
|
+
export { m as ToggleGroup };
|
|
67
87
|
|
|
68
88
|
//# sourceMappingURL=ToggleGroup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToggleGroup.js","names":["
|
|
1
|
+
{"version":3,"file":"ToggleGroup.js","names":["splitProps","JSX","clsx","callEventHandler","createToggleGroupState","ToggleGroupContext","toggleGroupVariants","ToggleGroupProps","ToggleGroupValue","useToggleGroupKeyboard","ToggleGroup","props","TValue","Element","local","rest","ctx","handleKeyDown","isVertical","orientation","_el$","_tmpl$","$$keydown","e","onKeyDown","defaultPrevented","_$spread","_$mergeProps","data-variant","variant","data-size","size","data-spacing","spacing","data-orientation","data-vertical","data-horizontal","data-multiple","multiple","data-disabled","disabled","aria-disabled","undefined","dir","style","CSSProperties","class","classList","_$insert","_$createComponent","Provider","value","children","_$delegateEvents"],"sources":["../../../../src/components/toggle-group/ToggleGroup/ToggleGroup.tsx"],"sourcesContent":["import { splitProps, type JSX } from \"solid-js\";\nimport { clsx } from \"~/utils\";\nimport { callEventHandler } from \"../call-event-handler\";\nimport {\n createToggleGroupState,\n ToggleGroupContext,\n} from \"./ToggleGroup.context\";\nimport { toggleGroupVariants } from \"./ToggleGroup.styles\";\nimport type { ToggleGroupProps, ToggleGroupValue } from \"./ToggleGroup.types\";\nimport { useToggleGroupKeyboard } from \"./useToggleGroupKeyboard\";\n\n/**\n * ToggleGroup 根组件:渲染 `<div role=\"group\">`,输出样式与语义钩子\n * (`data-orientation` / `data-vertical` / `data-horizontal` / `data-multiple`\n * / `data-disabled` / `data-spacing` / `data-variant` / `data-size`),\n * 并挂载 roving focus 键盘导航。\n *\n * 单选模式(默认)的 value 是标量,多选模式(`multiple`)才是数组:\n *\n * @example\n * ```tsx\n * // 单选\n * <ToggleGroup defaultValue=\"bold\" onValueChange={(v) => ...}>\n * <ToggleGroupItem value=\"bold\">Bold</ToggleGroupItem>\n * </ToggleGroup>\n *\n * // 多选\n * <ToggleGroup multiple value={[\"bold\"]} onValueChange={(v) => ...}>\n * <ToggleGroupItem value=\"bold\">Bold</ToggleGroupItem>\n * </ToggleGroup>\n * ```\n */\nexport function ToggleGroup<TValue extends ToggleGroupValue = ToggleGroupValue>(\n props: ToggleGroupProps<TValue>,\n): JSX.Element {\n const [local, rest] = splitProps(props, [\n \"value\",\n \"defaultValue\",\n \"onValueChange\",\n \"multiple\",\n \"disabled\",\n \"orientation\",\n \"loopFocus\",\n \"spacing\",\n \"variant\",\n \"size\",\n \"class\",\n \"classList\",\n \"style\",\n \"dir\",\n \"onKeyDown\",\n \"children\",\n ]);\n\n // 默认值与单选/多选的差异统一由状态层处理,渲染用 ctx 里的已解析值\n const ctx = createToggleGroupState<TValue>(local);\n const { handleKeyDown } = useToggleGroupKeyboard(ctx);\n const isVertical = () => ctx.orientation() === \"vertical\";\n\n return (\n <div\n role=\"group\"\n data-slot=\"toggle-group\"\n data-variant={ctx.variant()}\n data-size={ctx.size()}\n data-spacing={ctx.spacing()}\n data-orientation={ctx.orientation()}\n // 拼接态样式依赖 data-vertical / data-horizontal(与 tabs 根保持一致)\n data-vertical={isVertical() ? \"\" : null}\n data-horizontal={isVertical() ? null : \"\"}\n data-multiple={ctx.multiple() ? \"\" : null}\n data-disabled={ctx.disabled() ? \"\" : null}\n aria-disabled={ctx.disabled() ? \"true\" : undefined}\n dir={local.dir}\n // --gap 作为 spacing 的样式入口,用户 style 可覆盖\n style={{ \"--gap\": ctx.spacing(), ...local.style } as JSX.CSSProperties}\n class={clsx(toggleGroupVariants(), local.class)}\n classList={local.classList}\n onKeyDown={(e) => {\n callEventHandler(local.onKeyDown, e);\n if (!e.defaultPrevented) handleKeyDown(e);\n }}\n {...rest}\n >\n <ToggleGroupContext.Provider value={ctx}>\n {local.children}\n </ToggleGroupContext.Provider>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAgCA,SAAgBU,EACdC,GACa;CACb,IAAM,CAACG,GAAOC,KAAQf,EAAWW,GAAO;EACtC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAU,CACX,GAGKK,IAAMZ,EAA+BU,CAAK,GAC1C,EAAEG,qBAAkBR,EAAuBO,CAAG,GAC9CE,UAAmBF,EAAIG,YAAY,MAAM;CAE/C,cAAA;EAAA,IAAAC,IAAAC,EAAA;EA0BqB,OA1BrBD,EAAAE,aAmBgBC,MAAM;GAEhB,AADApB,EAAiBW,EAAMU,WAAWD,CAAC,GAC9BA,EAAEE,oBAAkBR,EAAcM,CAAC;EAC1C,GAACG,EAAAN,GAAAO,EAAA;GAAA,IAAA,iBAAA;IAAA,OAlBaX,EAAIa,QAAQ;GAAC;GAAA,IAAA,cAAA;IAAA,OAChBb,EAAIe,KAAK;GAAC;GAAA,IAAA,iBAAA;IAAA,OACPf,EAAIiB,QAAQ;GAAC;GAAA,IAAA,qBAAA;IAAA,OACTjB,EAAIG,YAAY;GAAC;GAAA,IAAA,kBAAA;IAAA,OAEpBD,EAAW,IAAI,KAAK;GAAI;GAAA,IAAA,oBAAA;IAAA,OACtBA,EAAW,IAAI,OAAO;GAAE;GAAA,IAAA,kBAAA;IAAA,OAC1BF,EAAIsB,SAAS,IAAI,KAAK;GAAI;GAAA,IAAA,kBAAA;IAAA,OAC1BtB,EAAIwB,SAAS,IAAI,KAAK;GAAI;GAAA,IAAA,kBAAA;IAAA,OAC1BxB,EAAIwB,SAAS,IAAI,SAASE,KAAAA;GAAS;GAAA,IAClDC,MAAG;IAAA,OAAE7B,EAAM6B;GAAG;GAAA,IAEdC,QAAK;IAAA,OAAE;KAAE,SAAS5B,EAAIiB,QAAQ;KAAG,GAAGnB,EAAM8B;IAAM;GAAsB;GAAA,IAAA,QAAA;IAAA,OAC/D1C,EAAKI,EAAoB,GAAGQ,EAAMgC,KAAK;GAAC;GAAA,IAC/CC,YAAS;IAAA,OAAEjC,EAAMiC;GAAS;EAAA,GAKtBhC,CAAI,GAAA,IAAA,EAAA,GAAAiC,EAAA5B,GAAA6B,EAEP5C,EAAmB6C,UAAQ;GAACC,OAAOnC;GAAG,IAAAoC,WAAA;IAAA,OACpCtC,EAAMsC;GAAQ;EAAA,CAAA,CAAA,GAAAhC;CAAA,EAAA,CAAA;AAIvB;AAACiC,EAAA,CAAA,SAAA,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ToggleGroup 根容器样式。
|
|
3
|
+
*
|
|
4
|
+
* 根元素同时输出 `data-vertical` / `data-horizontal`(见 ToggleGroup.tsx),
|
|
5
|
+
* 使 `data-vertical:*`、`group-data-vertical/toggle-group:*` 这类选择器生效 ——
|
|
6
|
+
* item 的“拼接态”样式依赖后两者。
|
|
7
|
+
*/
|
|
8
|
+
export declare const toggleGroupVariants: (props?: import('class-variance-authority/types').ClassProp | undefined) => string;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { cva as e } from "class-variance-authority";
|
|
2
|
+
//#region src/components/toggle-group/ToggleGroup/ToggleGroup.styles.ts
|
|
3
|
+
var t = e("group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-vertical:flex-col data-vertical:items-stretch");
|
|
4
|
+
//#endregion
|
|
5
|
+
export { t as toggleGroupVariants };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=ToggleGroup.styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToggleGroup.styles.js","names":[],"sources":["../../../../src/components/toggle-group/ToggleGroup/ToggleGroup.styles.ts"],"sourcesContent":["import { cva } from \"class-variance-authority\";\n\n/**\n * ToggleGroup 根容器样式。\n *\n * 根元素同时输出 `data-vertical` / `data-horizontal`(见 ToggleGroup.tsx),\n * 使 `data-vertical:*`、`group-data-vertical/toggle-group:*` 这类选择器生效 ——\n * item 的“拼接态”样式依赖后两者。\n */\nexport const toggleGroupVariants = cva(\n \"group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-vertical:flex-col data-vertical:items-stretch\",\n);\n"],"mappings":";;AASA,IAAa,IAAsB,EACjC,mMACF"}
|