@neut/ui 0.0.14 → 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/toggle-group/ToggleGroup/ToggleGroup.context.d.ts +16 -11
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.js +19 -19
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.d.ts +10 -4
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js +25 -31
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.types.d.ts +43 -13
- package/dist/components/toggle-group/ToggleGroup/index.d.ts +1 -1
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.types.d.ts +5 -1
- package/dist/components/toggle-group/index.d.ts +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":"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"}
|
|
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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"}
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ToggleGroupChangeHandler, ToggleGroupContextValue, ToggleGroupOrientation, ToggleGroupSize, ToggleGroupValue, ToggleGroupVariant } from './ToggleGroup.types';
|
|
2
2
|
declare const ToggleGroupContext: import('solid-js').Context<ToggleGroupContextValue<ToggleGroupValue> | undefined>;
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* createToggleGroupState 的输入:ToggleGroupProps 的运行时形态。
|
|
5
|
+
*
|
|
6
|
+
* 受控值时单选给标量、多选给数组,内部统一规范化成数组;
|
|
7
|
+
* `multiple` 同时决定 onValueChange 用哪种签名回调。
|
|
8
|
+
*/
|
|
4
9
|
export interface ToggleGroupStateProps<TValue extends ToggleGroupValue = ToggleGroupValue> {
|
|
5
|
-
value?: readonly TValue[];
|
|
6
|
-
defaultValue?: readonly TValue[];
|
|
7
|
-
onValueChange?:
|
|
8
|
-
multiple
|
|
9
|
-
disabled
|
|
10
|
-
orientation
|
|
11
|
-
loopFocus
|
|
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;
|
|
12
17
|
dir?: "ltr" | "rtl" | "auto";
|
|
13
|
-
spacing
|
|
18
|
+
spacing?: number;
|
|
14
19
|
variant?: ToggleGroupVariant;
|
|
15
20
|
size?: ToggleGroupSize;
|
|
16
21
|
}
|
|
@@ -18,7 +23,7 @@ export interface ToggleGroupStateProps<TValue extends ToggleGroupValue = ToggleG
|
|
|
18
23
|
* ToggleGroup 的唯一状态源:选中值(受控/非受控)、焦点高亮、item 注册表。
|
|
19
24
|
*
|
|
20
25
|
* 返回的 context 值里所有字段都是 accessor,因此传入的 `props` 可以是
|
|
21
|
-
* splitProps
|
|
26
|
+
* splitProps 得到的响应式代理,读取始终是最新值。
|
|
22
27
|
* 组件根只负责输出 DOM 与 data-* 样式钩子,状态与交互算法收敛在这里。
|
|
23
28
|
*
|
|
24
29
|
* 值类型由泛型参数决定;内部只用 `===` / `includes` 做同一性比较,
|
|
@@ -3,30 +3,30 @@ import { createContext as t, createSignal as n, useContext as r } from "solid-js
|
|
|
3
3
|
//#region src/components/toggle-group/ToggleGroup/ToggleGroup.context.ts
|
|
4
4
|
var i = t();
|
|
5
5
|
function a(t) {
|
|
6
|
-
let
|
|
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
7
|
return {
|
|
8
|
-
value:
|
|
9
|
-
multiple:
|
|
10
|
-
disabled: () => t.disabled,
|
|
11
|
-
orientation: () => t.orientation,
|
|
12
|
-
loopFocus: () => t.loopFocus,
|
|
8
|
+
value: f,
|
|
9
|
+
multiple: r,
|
|
10
|
+
disabled: () => t.disabled === !0,
|
|
11
|
+
orientation: () => t.orientation ?? "horizontal",
|
|
12
|
+
loopFocus: () => t.loopFocus ?? !0,
|
|
13
13
|
dir: () => t.dir,
|
|
14
|
-
spacing: () => t.spacing,
|
|
14
|
+
spacing: () => t.spacing ?? 2,
|
|
15
15
|
variant: () => t.variant,
|
|
16
16
|
size: () => t.size,
|
|
17
|
-
highlightedValue:
|
|
18
|
-
isPressed: (e) =>
|
|
19
|
-
toggleItem: (n,
|
|
20
|
-
let
|
|
21
|
-
|
|
22
|
-
let
|
|
23
|
-
t.onValueChange?.(
|
|
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
24
|
},
|
|
25
|
-
setHighlightedValue:
|
|
26
|
-
registerItem: (e) => (
|
|
27
|
-
getItems: () =>
|
|
28
|
-
isFirstEnabled: (e) =>
|
|
29
|
-
isUsable: (e) =>
|
|
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
30
|
};
|
|
31
31
|
}
|
|
32
32
|
function o(e) {
|
|
@@ -1 +1 @@
|
|
|
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
|
|
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"}
|
|
@@ -6,12 +6,18 @@ import { ToggleGroupProps, ToggleGroupValue } from './ToggleGroup.types';
|
|
|
6
6
|
* / `data-disabled` / `data-spacing` / `data-variant` / `data-size`),
|
|
7
7
|
* 并挂载 roving focus 键盘导航。
|
|
8
8
|
*
|
|
9
|
+
* 单选模式(默认)的 value 是标量,多选模式(`multiple`)才是数组:
|
|
10
|
+
*
|
|
9
11
|
* @example
|
|
10
12
|
* ```tsx
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
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>
|
|
15
21
|
* </ToggleGroup>
|
|
16
22
|
* ```
|
|
17
23
|
*/
|
|
@@ -4,17 +4,11 @@ import { ToggleGroupContext as n, createToggleGroupState as r } from "./ToggleGr
|
|
|
4
4
|
import { toggleGroupVariants as i } from "./ToggleGroup.styles.js";
|
|
5
5
|
import { useToggleGroupKeyboard as a } from "./useToggleGroupKeyboard.js";
|
|
6
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 {
|
|
7
|
+
import { splitProps as f } from "solid-js";
|
|
8
8
|
//#region src/components/toggle-group/ToggleGroup/ToggleGroup.tsx
|
|
9
|
-
var
|
|
10
|
-
function
|
|
11
|
-
let d = f(
|
|
12
|
-
multiple: !1,
|
|
13
|
-
disabled: !1,
|
|
14
|
-
orientation: "horizontal",
|
|
15
|
-
loopFocus: !0,
|
|
16
|
-
spacing: 2
|
|
17
|
-
}, s), [h, g] = p(d, [
|
|
9
|
+
var p = /*#__PURE__*/ d("<div role=group data-slot=toggle-group>");
|
|
10
|
+
function m(s) {
|
|
11
|
+
let [d, m] = f(s, [
|
|
18
12
|
"value",
|
|
19
13
|
"defaultValue",
|
|
20
14
|
"onValueChange",
|
|
@@ -31,64 +25,64 @@ function h(s) {
|
|
|
31
25
|
"dir",
|
|
32
26
|
"onKeyDown",
|
|
33
27
|
"children"
|
|
34
|
-
]),
|
|
28
|
+
]), h = r(d), { handleKeyDown: g } = a(h), _ = () => h.orientation() === "vertical";
|
|
35
29
|
return (() => {
|
|
36
|
-
var r =
|
|
30
|
+
var r = p();
|
|
37
31
|
return r.$$keydown = (e) => {
|
|
38
|
-
t(
|
|
32
|
+
t(d.onKeyDown, e), e.defaultPrevented || g(e);
|
|
39
33
|
}, u(r, l({
|
|
40
34
|
get "data-variant"() {
|
|
41
|
-
return h.variant;
|
|
35
|
+
return h.variant();
|
|
42
36
|
},
|
|
43
37
|
get "data-size"() {
|
|
44
|
-
return h.size;
|
|
38
|
+
return h.size();
|
|
45
39
|
},
|
|
46
40
|
get "data-spacing"() {
|
|
47
|
-
return h.spacing;
|
|
41
|
+
return h.spacing();
|
|
48
42
|
},
|
|
49
43
|
get "data-orientation"() {
|
|
50
|
-
return h.orientation;
|
|
44
|
+
return h.orientation();
|
|
51
45
|
},
|
|
52
46
|
get "data-vertical"() {
|
|
53
|
-
return
|
|
47
|
+
return _() ? "" : null;
|
|
54
48
|
},
|
|
55
49
|
get "data-horizontal"() {
|
|
56
|
-
return
|
|
50
|
+
return _() ? null : "";
|
|
57
51
|
},
|
|
58
52
|
get "data-multiple"() {
|
|
59
|
-
return h.multiple ? "" : null;
|
|
53
|
+
return h.multiple() ? "" : null;
|
|
60
54
|
},
|
|
61
55
|
get "data-disabled"() {
|
|
62
|
-
return h.disabled ? "" : null;
|
|
56
|
+
return h.disabled() ? "" : null;
|
|
63
57
|
},
|
|
64
58
|
get "aria-disabled"() {
|
|
65
|
-
return h.disabled ? "true" : void 0;
|
|
59
|
+
return h.disabled() ? "true" : void 0;
|
|
66
60
|
},
|
|
67
61
|
get dir() {
|
|
68
|
-
return
|
|
62
|
+
return d.dir;
|
|
69
63
|
},
|
|
70
64
|
get style() {
|
|
71
65
|
return {
|
|
72
|
-
"--gap": h.spacing,
|
|
73
|
-
...
|
|
66
|
+
"--gap": h.spacing(),
|
|
67
|
+
...d.style
|
|
74
68
|
};
|
|
75
69
|
},
|
|
76
70
|
get class() {
|
|
77
|
-
return e(i(),
|
|
71
|
+
return e(i(), d.class);
|
|
78
72
|
},
|
|
79
73
|
get classList() {
|
|
80
|
-
return
|
|
74
|
+
return d.classList;
|
|
81
75
|
}
|
|
82
|
-
},
|
|
83
|
-
value:
|
|
76
|
+
}, m), !1, !0), c(r, o(n.Provider, {
|
|
77
|
+
value: h,
|
|
84
78
|
get children() {
|
|
85
|
-
return
|
|
79
|
+
return d.children;
|
|
86
80
|
}
|
|
87
81
|
})), r;
|
|
88
82
|
})();
|
|
89
83
|
}
|
|
90
84
|
s(["keydown"]);
|
|
91
85
|
//#endregion
|
|
92
|
-
export {
|
|
86
|
+
export { m as ToggleGroup };
|
|
93
87
|
|
|
94
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"}
|
|
@@ -28,15 +28,8 @@ export interface ToggleGroupChangeEventDetails {
|
|
|
28
28
|
readonly isPropagationAllowed: boolean;
|
|
29
29
|
trigger: Element | undefined;
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
value?: readonly TValue[];
|
|
34
|
-
/** 非受控模式下的初始选中值 */
|
|
35
|
-
defaultValue?: readonly TValue[];
|
|
36
|
-
/** 选中值变化回调(受控与非受控都会触发) */
|
|
37
|
-
onValueChange?: (value: TValue[], eventDetails: ToggleGroupChangeEventDetails) => void;
|
|
38
|
-
/** 是否允许同时选中多个,默认 false;单选时再次点击会取消选中(对齐 base-ui) */
|
|
39
|
-
multiple?: boolean;
|
|
31
|
+
/** 单选与多选共用的 props */
|
|
32
|
+
interface ToggleGroupCommonProps extends BaseProps {
|
|
40
33
|
/** 整组禁用,item 会继承该状态 */
|
|
41
34
|
disabled?: boolean;
|
|
42
35
|
/** 布局方向,默认 "horizontal";同时决定方向键映射与排列方向 */
|
|
@@ -53,14 +46,48 @@ interface BaseToggleGroupProps<TValue extends ToggleGroupValue> extends BaseProp
|
|
|
53
46
|
/** 组级 size,item 未单独指定时继承 */
|
|
54
47
|
size?: ToggleGroupSize;
|
|
55
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* 单选模式(默认):`value` / `defaultValue` / `onValueChange` 都是**标量**。
|
|
51
|
+
*
|
|
52
|
+
* 这是本项目对 base-ui 的一处有意偏离 —— base-ui 单选时也要求传数组,用起来别扭。
|
|
53
|
+
* 取消选中时回调收到 `undefined`。
|
|
54
|
+
*
|
|
55
|
+
* 注意:`value === undefined` 视为非受控,所以受控的单选组请让信号有确定值
|
|
56
|
+
* (信号类型建议 `TValue | undefined`,并在传参前用 `??` 兜底,或改用多选数组模式)。
|
|
57
|
+
*/
|
|
58
|
+
export interface ToggleGroupSingleProps<TValue extends ToggleGroupValue = ToggleGroupValue> extends ToggleGroupCommonProps {
|
|
59
|
+
/** 单选模式标记(默认),不需要显式传 */
|
|
60
|
+
multiple?: false;
|
|
61
|
+
/** 受控选中值;不传则内部自管理 */
|
|
62
|
+
value?: TValue;
|
|
63
|
+
/** 非受控模式下的初始选中值 */
|
|
64
|
+
defaultValue?: TValue;
|
|
65
|
+
/** 选中值变化回调(受控与非受控都会触发) */
|
|
66
|
+
onValueChange?: (value: TValue | undefined, eventDetails: ToggleGroupChangeEventDetails) => void;
|
|
67
|
+
}
|
|
68
|
+
/** 多选模式(`multiple`):值是数组,未选中时为空数组 */
|
|
69
|
+
export interface ToggleGroupMultipleProps<TValue extends ToggleGroupValue = ToggleGroupValue> extends ToggleGroupCommonProps {
|
|
70
|
+
/** 多选模式标记 */
|
|
71
|
+
multiple: true;
|
|
72
|
+
/** 受控选中值;不传则内部自管理 */
|
|
73
|
+
value?: readonly TValue[];
|
|
74
|
+
/** 非受控模式下的初始选中值 */
|
|
75
|
+
defaultValue?: readonly TValue[];
|
|
76
|
+
/** 选中值变化回调(受控与非受控都会触发) */
|
|
77
|
+
onValueChange?: (value: TValue[], eventDetails: ToggleGroupChangeEventDetails) => void;
|
|
78
|
+
}
|
|
56
79
|
/**
|
|
57
80
|
* 值类型由泛型参数决定:
|
|
58
81
|
* - 不传时是宽类型 `ToggleGroupValue`(string | number)
|
|
59
82
|
* - `defaultValue` / `value` / `onValueChange` 中任意一处给出具体类型即可推导,
|
|
60
|
-
* 例如 `defaultValue={
|
|
83
|
+
* 例如 `defaultValue={1}` 会推导出 `number`
|
|
61
84
|
* - 也可显式指定:`<ToggleGroup<"bold" | "italic"> />`
|
|
85
|
+
*
|
|
86
|
+
* `multiple` 决定值的形状:单选是标量,多选是数组(传错会被类型拦住)。
|
|
62
87
|
*/
|
|
63
|
-
export type ToggleGroupProps<TValue extends ToggleGroupValue = ToggleGroupValue> = PolymorphicProps<"div",
|
|
88
|
+
export type ToggleGroupProps<TValue extends ToggleGroupValue = ToggleGroupValue> = PolymorphicProps<"div", ToggleGroupSingleProps<TValue> | ToggleGroupMultipleProps<TValue>, false>;
|
|
89
|
+
/** 两种模式下 onValueChange 的联合类型(供内部状态实现使用) */
|
|
90
|
+
export type ToggleGroupChangeHandler<TValue extends ToggleGroupValue> = NonNullable<ToggleGroupSingleProps<TValue>["onValueChange"]> | NonNullable<ToggleGroupMultipleProps<TValue>["onValueChange"]>;
|
|
64
91
|
/** 已注册的 item,供 roving focus 与键盘导航使用 */
|
|
65
92
|
export interface ToggleGroupItemEntry<TValue extends ToggleGroupValue = ToggleGroupValue> {
|
|
66
93
|
value: TValue;
|
|
@@ -69,7 +96,10 @@ export interface ToggleGroupItemEntry<TValue extends ToggleGroupValue = ToggleGr
|
|
|
69
96
|
disabled: () => boolean;
|
|
70
97
|
}
|
|
71
98
|
export interface ToggleGroupContextValue<TValue extends ToggleGroupValue = ToggleGroupValue> {
|
|
72
|
-
/**
|
|
99
|
+
/**
|
|
100
|
+
* 当前选中值,**已规范化成数组**:单选模式是 0 或 1 个元素。
|
|
101
|
+
* 判断某个 item 是否选中请用 `isPressed`。
|
|
102
|
+
*/
|
|
73
103
|
value: Accessor<readonly TValue[]>;
|
|
74
104
|
multiple: Accessor<boolean>;
|
|
75
105
|
disabled: Accessor<boolean>;
|
|
@@ -89,7 +119,7 @@ export interface ToggleGroupContextValue<TValue extends ToggleGroupValue = Toggl
|
|
|
89
119
|
*/
|
|
90
120
|
/** 该 value 当前是否处于按下状态 */
|
|
91
121
|
isPressed(value: TValue): boolean;
|
|
92
|
-
/** 切换某个 item
|
|
122
|
+
/** 切换某个 item 的按下状态,并按模式派发 onValueChange */
|
|
93
123
|
toggleItem(value: TValue, event: Event, trigger?: Element): void;
|
|
94
124
|
setHighlightedValue(value: TValue): void;
|
|
95
125
|
/** 按挂载顺序注册 item,返回注销函数 */
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { ToggleGroup } from './ToggleGroup';
|
|
2
2
|
export { ToggleGroupContext, useToggleGroupContext, } from './ToggleGroup.context';
|
|
3
|
-
export type { ToggleGroupProps, ToggleGroupValue, ToggleGroupContextValue, ToggleGroupItemEntry, ToggleGroupOrientation, ToggleGroupVariant, ToggleGroupSize, ToggleGroupChangeEventDetails, ToggleGroupChangeEventReason, } from './ToggleGroup.types';
|
|
3
|
+
export type { ToggleGroupProps, ToggleGroupSingleProps, ToggleGroupMultipleProps, ToggleGroupValue, ToggleGroupContextValue, ToggleGroupItemEntry, ToggleGroupOrientation, ToggleGroupVariant, ToggleGroupSize, ToggleGroupChangeEventDetails, ToggleGroupChangeEventReason, } from './ToggleGroup.types';
|
|
@@ -3,7 +3,11 @@ import { ComponentProps } from 'solid-js';
|
|
|
3
3
|
import { toggleVariants } from '../../toggle/Toggle/Toggle.styles';
|
|
4
4
|
import { HTMLAttributes, PolymorphicProps } from '../../../types';
|
|
5
5
|
import { ToggleGroupValue } from '../ToggleGroup/ToggleGroup.types';
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* 必须先从 button 属性里摘掉原生的 `value`(Solid 声明为 `string | undefined`),
|
|
8
|
+
* 否则会与下面的 `value: TValue` 求交叉:`number & string` 会塌缩成 `never`。
|
|
9
|
+
*/
|
|
10
|
+
type BaseToggleGroupItemProps<TValue extends ToggleGroupValue> = VariantProps<typeof toggleVariants> & Omit<HTMLAttributes<"button">, "value"> & {
|
|
7
11
|
/** 当前 item 的唯一值,类型由泛型参数决定(与所属 ToggleGroup 保持一致) */
|
|
8
12
|
value: TValue;
|
|
9
13
|
/** 组件内部会先处理选中,再调用用户回调(与 tabs 的 trigger 一致) */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { ToggleGroup } from './ToggleGroup';
|
|
2
|
-
export type { ToggleGroupProps, ToggleGroupValue, ToggleGroupContextValue, ToggleGroupItemEntry, ToggleGroupOrientation, ToggleGroupVariant, ToggleGroupSize, ToggleGroupChangeEventDetails, ToggleGroupChangeEventReason, } from './ToggleGroup';
|
|
2
|
+
export type { ToggleGroupProps, ToggleGroupSingleProps, ToggleGroupMultipleProps, ToggleGroupValue, ToggleGroupContextValue, ToggleGroupItemEntry, ToggleGroupOrientation, ToggleGroupVariant, ToggleGroupSize, ToggleGroupChangeEventDetails, ToggleGroupChangeEventReason, } from './ToggleGroup';
|
|
3
3
|
export { ToggleGroupItem } from './ToggleGroupItem';
|
|
4
4
|
export type { ToggleGroupItemProps } from './ToggleGroupItem';
|