@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.
Files changed (34) hide show
  1. package/dist/components/calendar/Calendar/Calendar.js +11 -8
  2. package/dist/components/calendar/Calendar/Calendar.js.map +1 -1
  3. package/dist/components/combobox/ComboboxInput/ComboboxInput.js +1 -1
  4. package/dist/components/combobox/ComboboxInput/ComboboxInput.js.map +1 -1
  5. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.d.ts +41 -3
  6. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.js +35 -7
  7. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.js.map +1 -1
  8. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.d.ts +23 -2
  9. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js +53 -33
  10. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js.map +1 -1
  11. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.styles.d.ts +8 -0
  12. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.styles.js +7 -0
  13. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.styles.js.map +1 -0
  14. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.types.d.ts +125 -19
  15. package/dist/components/toggle-group/ToggleGroup/create-change-event-details.d.ts +8 -0
  16. package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js +25 -0
  17. package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js.map +1 -0
  18. package/dist/components/toggle-group/ToggleGroup/index.d.ts +1 -1
  19. package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.d.ts +17 -0
  20. package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js +47 -0
  21. package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js.map +1 -0
  22. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.d.ts +9 -1
  23. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js +58 -42
  24. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js.map +1 -1
  25. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.d.ts +12 -0
  26. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.js +7 -0
  27. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.js.map +1 -0
  28. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.types.d.ts +21 -7
  29. package/dist/components/toggle-group/call-event-handler.d.ts +5 -0
  30. package/dist/components/toggle-group/call-event-handler.js +9 -0
  31. package/dist/components/toggle-group/call-event-handler.js.map +1 -0
  32. package/dist/components/toggle-group/index.d.ts +1 -1
  33. package/dist/ui.css +1 -1
  34. 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 = N(() => Array.from({ length: 12 }, (e, t) => {
83
- let n = new Date(2024, t, 1);
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(t),
86
- label: new Intl.DateTimeFormat(q(), { month: "long" }).format(n)
88
+ value: String(e),
89
+ label: new Intl.DateTimeFormat(q(), { month: "long" }).format(t)
87
90
  };
88
- })), me = N(() => {
89
- let e = (/* @__PURE__ */ new Date()).getFullYear();
90
- return Array.from({ length: 201 }, (t, n) => e - 100 + n);
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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"}
@@ -14,7 +14,7 @@ function f(f) {
14
14
  });
15
15
  let v = () => {
16
16
  let e = p.value();
17
- return console.log(m.showClear, e), e == null ? !1 : Array.isArray(e) ? e.length > 0 : e !== "";
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","console","log","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 console.log(local.showClear, current);\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
+ {"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
- export declare const ToggleGroupContext: import('solid-js').Context<ToggleGroupContextValue | undefined>;
3
- export declare function useToggleGroupContext(component: string): ToggleGroupContextValue;
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 { createContext as e, useContext as t } from "solid-js";
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 n = e();
4
- function r(e) {
5
- let r = t(n);
6
- if (!r) throw Error(`<${e}> 必须渲染在 <ToggleGroup> 内部`);
7
- return r;
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 { n as ToggleGroupContext, r as useToggleGroupContext };
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 { ToggleGroupContextValue } from \"./ToggleGroup.types\";\n\nexport const ToggleGroupContext = createContext<ToggleGroupContextValue>();\n\nexport function useToggleGroupContext(\n component: string,\n): ToggleGroupContextValue {\n const ctx = useContext(ToggleGroupContext);\n if (!ctx) {\n throw new Error(`<${component}> 必须渲染在 <ToggleGroup> 内部`);\n }\n return ctx;\n}\n"],"mappings":";;AAGA,IAAa,IAAqB,EAAuC;AAEzE,SAAgB,EACd,GACyB;CACzB,IAAM,IAAM,EAAW,CAAkB;CACzC,IAAI,CAAC,GACH,MAAU,MAAM,IAAI,EAAU,yBAAyB;CAEzD,OAAO;AACT"}
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
- export declare function ToggleGroup(props: ToggleGroupProps): JSX.Element;
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 { ToggleGroupContext as t } from "./ToggleGroup.context.js";
3
- import { createComponent as n, insert as r, mergeProps as i, spread as a, template as o } from "solid-js/web";
4
- import { createMemo as s, createSignal as c, splitProps as l } from "solid-js";
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 u = /*#__PURE__*/ o("<div role=group data-slot=toggle-group>");
7
- function d(o) {
8
- let [d, f] = l(o, [
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
- "children",
20
- "dir"
21
- ]), [p, m] = c(d.defaultValue ?? []), h = s(() => d.value === void 0 ? p() : d.value), g = s(() => !!d.multiple), _ = s(() => !!d.disabled), v = s(() => d.orientation ?? "horizontal"), y = s(() => d.spacing ?? 2), b = s(() => d.variant ?? "default"), x = s(() => d.size ?? "default"), S = {
22
- value: h,
23
- setValue: (e) => {
24
- d.value === void 0 && m(e), d.onValueChange?.(e);
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 o = u();
35
- return a(o, i({
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 b();
35
+ return h.variant();
38
36
  },
39
37
  get "data-size"() {
40
- return x();
38
+ return h.size();
41
39
  },
42
40
  get "data-spacing"() {
43
- return y();
41
+ return h.spacing();
44
42
  },
45
43
  get "data-orientation"() {
46
- return v();
44
+ return h.orientation();
47
45
  },
48
- get style() {
49
- return { "--gap": y() };
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("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-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch", d.class);
71
+ return e(i(), d.class);
72
+ },
73
+ get classList() {
74
+ return d.classList;
56
75
  }
57
- }, f), !1, !0), r(o, n(t.Provider, {
58
- value: S,
76
+ }, m), !1, !0), c(r, o(n.Provider, {
77
+ value: h,
59
78
  get children() {
60
79
  return d.children;
61
80
  }
62
- })), o;
81
+ })), r;
63
82
  })();
64
83
  }
84
+ s(["keydown"]);
65
85
  //#endregion
66
- export { d as ToggleGroup };
86
+ export { m as ToggleGroup };
67
87
 
68
88
  //# sourceMappingURL=ToggleGroup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToggleGroup.js","names":["createMemo","createSignal","splitProps","JSX","clsx","ToggleGroupContext","ToggleGroupContextValue","ToggleGroupProps","ToggleGroup","props","Element","local","rest","internalValue","setInternalValue","defaultValue","value","undefined","multiple","disabled","orientation","spacing","variant","size","setValue","next","onValueChange","ctx","_el$","_tmpl$","_$spread","_$mergeProps","data-variant","data-size","data-spacing","data-orientation","style","CSSProperties","dir","class","_$insert","_$createComponent","Provider","children"],"sources":["../../../../src/components/toggle-group/ToggleGroup/ToggleGroup.tsx"],"sourcesContent":["import { createMemo, createSignal, splitProps, type JSX } from \"solid-js\";\nimport { clsx } from \"~/utils\";\nimport { ToggleGroupContext } from \"./ToggleGroup.context\";\nimport type {\n ToggleGroupContextValue,\n ToggleGroupProps,\n} from \"./ToggleGroup.types\";\n\nexport function ToggleGroup(props: ToggleGroupProps): JSX.Element {\n const [local, rest] = splitProps(props, [\n \"value\",\n \"defaultValue\",\n \"onValueChange\",\n \"multiple\",\n \"disabled\",\n \"orientation\",\n \"spacing\",\n \"variant\",\n \"size\",\n \"class\",\n \"children\",\n \"dir\",\n ]);\n\n const [internalValue, setInternalValue] = createSignal<string[]>(\n local.defaultValue ?? [],\n );\n const value = createMemo(() =>\n local.value !== undefined ? local.value : internalValue(),\n );\n const multiple = createMemo(() => !!local.multiple);\n const disabled = createMemo(() => !!local.disabled);\n const orientation = createMemo(() => local.orientation ?? \"horizontal\");\n const spacing = createMemo(() => local.spacing ?? 2);\n const variant = createMemo(() => local.variant ?? \"default\");\n const size = createMemo(() => local.size ?? \"default\");\n\n const setValue = (next: string[]) => {\n if (local.value === undefined) setInternalValue(next);\n local.onValueChange?.(next);\n };\n\n const ctx: ToggleGroupContextValue = {\n value,\n setValue,\n multiple,\n disabled,\n orientation,\n spacing,\n variant,\n size,\n };\n\n return (\n <div\n role=\"group\"\n data-slot=\"toggle-group\"\n data-variant={variant()}\n data-size={size()}\n data-spacing={spacing()}\n data-orientation={orientation()}\n style={{ \"--gap\": spacing() } as JSX.CSSProperties}\n dir={local.dir}\n class={clsx(\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-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch\",\n local.class,\n )}\n {...rest}\n >\n <ToggleGroupContext.Provider value={ctx}>\n {local.children}\n </ToggleGroupContext.Provider>\n </div>\n );\n}\n"],"mappings":";;;;;;AAQA,SAAgBQ,EAAYC,GAAsC;CAChE,IAAM,CAACE,GAAOC,KAAQV,EAAWO,GAAO;EACtC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAK,CACN,GAEK,CAACI,GAAeC,KAAoBb,EACxCU,EAAMI,gBAAgB,CAAA,CACxB,GACMC,IAAQhB,QACZW,EAAMK,UAAUC,KAAAA,IAA0BJ,EAAc,IAA5BF,EAAMK,KACpC,GACME,IAAWlB,QAAiB,CAAC,CAACW,EAAMO,QAAQ,GAC5CC,IAAWnB,QAAiB,CAAC,CAACW,EAAMQ,QAAQ,GAC5CC,IAAcpB,QAAiBW,EAAMS,eAAe,YAAY,GAChEC,IAAUrB,QAAiBW,EAAMU,WAAW,CAAC,GAC7CC,IAAUtB,QAAiBW,EAAMW,WAAW,SAAS,GACrDC,IAAOvB,QAAiBW,EAAMY,QAAQ,SAAS,GAO/CI,IAA+B;EACnCX;EACAQ,WAPgBC,MAAmB;GAEnCd,AADIA,EAAMK,UAAUC,KAAAA,KAAWH,EAAiBW,CAAI,GACpDd,EAAMe,gBAAgBD,CAAI;EAC5B;EAKEP;EACAC;EACAC;EACAC;EACAC;EACAC;CACF;CAEA,cAAA;EAAA,IAAAK,IAAAC,EAAA;EAiBqB,OAjBrBC,EAAAF,GAAAG,EAAA;GAAA,IAAA,iBAAA;IAAA,OAIkBT,EAAQ;GAAC;GAAA,IAAA,cAAA;IAAA,OACZC,EAAK;GAAC;GAAA,IAAA,iBAAA;IAAA,OACHF,EAAQ;GAAC;GAAA,IAAA,qBAAA;IAAA,OACLD,EAAY;GAAC;GAAA,IAC/BgB,QAAK;IAAA,OAAE,EAAE,SAASf,EAAQ,EAAE;GAAsB;GAAA,IAClDiB,MAAG;IAAA,OAAE3B,EAAM2B;GAAG;GAAA,IAAA,QAAA;IAAA,OACPlC,EACL,iOACAO,EAAM4B,KACR;GAAC;EAAA,GACG3B,CAAI,GAAA,IAAA,EAAA,GAAA4B,EAAAZ,GAAAa,EAEPpC,EAAmBqC,UAAQ;GAAC1B,OAAOW;GAAG,IAAAgB,WAAA;IAAA,OACpChC,EAAMgC;GAAQ;EAAA,CAAA,CAAA,GAAAf;CAAA,EAAA,CAAA;AAIvB"}
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"}