jaci-ui 0.9.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +11 -1
- package/dist/_virtual/_rolldown/runtime.cjs +1 -1
- package/dist/components/accordion/accordion.cjs.map +1 -1
- package/dist/components/accordion/accordion.js.map +1 -1
- package/dist/components/alert/alert.cjs.map +1 -1
- package/dist/components/alert/alert.js.map +1 -1
- package/dist/components/alert-dialog/alert-dialog.cjs.map +1 -1
- package/dist/components/alert-dialog/alert-dialog.js.map +1 -1
- package/dist/components/aspect-ratio/aspect-ratio.cjs.map +1 -1
- package/dist/components/avatar/avatar.cjs.map +1 -1
- package/dist/components/avatar/avatar.js.map +1 -1
- package/dist/components/breadcrumbs/breadcrumbs.cjs.map +1 -1
- package/dist/components/button/button.cjs +1 -0
- package/dist/components/button/button.cjs.map +1 -1
- package/dist/components/button/button.d.cts +2 -1
- package/dist/components/button/button.d.ts +2 -1
- package/dist/components/button/button.js +1 -0
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/button-group/button-group.cjs.map +1 -1
- package/dist/components/calendar/calendar.cjs +4 -6
- package/dist/components/calendar/calendar.cjs.map +1 -1
- package/dist/components/calendar/calendar.js +4 -6
- package/dist/components/calendar/calendar.js.map +1 -1
- package/dist/components/card/card.cjs.map +1 -1
- package/dist/components/carousel/carousel.cjs.map +1 -1
- package/dist/components/carousel/carousel.js.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.cjs +7 -3
- package/dist/components/checkbox-group/checkbox-group.cjs.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.js +7 -3
- package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
- package/dist/components/code/code.cjs.map +1 -1
- package/dist/components/code/code.js.map +1 -1
- package/dist/components/collapsible/collapsible.cjs.map +1 -1
- package/dist/components/collapsible/collapsible.js.map +1 -1
- package/dist/components/color-picker/color-picker.cjs.map +1 -1
- package/dist/components/color-picker/color-picker.js.map +1 -1
- package/dist/components/color-swatch/color-swatch.cjs.map +1 -1
- package/dist/components/combobox/combobox.cjs +2 -1
- package/dist/components/combobox/combobox.cjs.map +1 -1
- package/dist/components/combobox/combobox.js +2 -1
- package/dist/components/combobox/combobox.js.map +1 -1
- package/dist/components/command/command.cjs.map +1 -1
- package/dist/components/command/command.js.map +1 -1
- package/dist/components/context-menu/context-menu.cjs.map +1 -1
- package/dist/components/controls/checkbox.cjs.map +1 -1
- package/dist/components/controls/checkbox.js.map +1 -1
- package/dist/components/controls/input.cjs.map +1 -1
- package/dist/components/controls/input.js.map +1 -1
- package/dist/components/controls/radio.cjs.map +1 -1
- package/dist/components/controls/switch.cjs.map +1 -1
- package/dist/components/controls/switch.js.map +1 -1
- package/dist/components/controls/textarea.cjs.map +1 -1
- package/dist/components/controls/textarea.js.map +1 -1
- package/dist/components/copyable/copyable.cjs.map +1 -1
- package/dist/components/copyable/copyable.js.map +1 -1
- package/dist/components/data-toolbar/data-toolbar.cjs.map +1 -1
- package/dist/components/data-toolbar/data-toolbar.js.map +1 -1
- package/dist/components/data-view/data-view.cjs.map +1 -1
- package/dist/components/date-picker/date-picker.cjs +4 -7
- package/dist/components/date-picker/date-picker.cjs.map +1 -1
- package/dist/components/date-picker/date-picker.js +4 -7
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.cjs +4 -6
- package/dist/components/date-range-picker/date-range-picker.cjs.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.js +4 -6
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/dialog/dialog.cjs.map +1 -1
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/download-trigger/download-trigger.cjs.map +1 -1
- package/dist/components/drawer/drawer.cjs.map +1 -1
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/empty-state/empty-state.cjs.map +1 -1
- package/dist/components/feedback/badge.cjs.map +1 -1
- package/dist/components/feedback/badge.d.cts +2 -1
- package/dist/components/feedback/badge.d.ts +2 -1
- package/dist/components/feedback/badge.js.map +1 -1
- package/dist/components/field/field.cjs.map +1 -1
- package/dist/components/field/field.js.map +1 -1
- package/dist/components/fieldset/fieldset.cjs.map +1 -1
- package/dist/components/figure/figure.cjs.map +1 -1
- package/dist/components/figure/figure.js.map +1 -1
- package/dist/components/form/form.cjs.map +1 -1
- package/dist/components/form/form.js.map +1 -1
- package/dist/components/icon-button/icon-button.cjs.map +1 -1
- package/dist/components/icon-button/icon-button.js.map +1 -1
- package/dist/components/image/image.cjs.map +1 -1
- package/dist/components/image/image.js.map +1 -1
- package/dist/components/input-group/input-group.cjs.map +1 -1
- package/dist/components/kbd/kbd.cjs.map +1 -1
- package/dist/components/layout/index.cjs.map +1 -1
- package/dist/components/list/list.cjs.map +1 -1
- package/dist/components/menu/menu.cjs.map +1 -1
- package/dist/components/menubar/menubar.cjs.map +1 -1
- package/dist/components/menubar/menubar.js.map +1 -1
- package/dist/components/meter/meter.cjs.map +1 -1
- package/dist/components/meter/meter.js.map +1 -1
- package/dist/components/navigation/navigation.cjs.map +1 -1
- package/dist/components/navigation/navigation.js.map +1 -1
- package/dist/components/navigation-menu/navigation-menu.cjs.map +1 -1
- package/dist/components/navigation-menu/navigation-menu.js.map +1 -1
- package/dist/components/number-field/number-field.cjs +2 -1
- package/dist/components/number-field/number-field.cjs.map +1 -1
- package/dist/components/number-field/number-field.js +2 -1
- package/dist/components/number-field/number-field.js.map +1 -1
- package/dist/components/option-selector/option-selector.cjs.map +1 -1
- package/dist/components/option-selector/option-selector.js.map +1 -1
- package/dist/components/pagination/pagination.cjs.map +1 -1
- package/dist/components/pagination/pagination.js.map +1 -1
- package/dist/components/pin-input/pin-input.cjs.map +1 -1
- package/dist/components/pin-input/pin-input.js.map +1 -1
- package/dist/components/popover/popover.cjs.map +1 -1
- package/dist/components/popover/popover.js.map +1 -1
- package/dist/components/progress/progress.cjs.map +1 -1
- package/dist/components/progress/progress.js.map +1 -1
- package/dist/components/qr-code/qr-code.cjs.map +1 -1
- package/dist/components/qr-code/qr-code.js.map +1 -1
- package/dist/components/quote/quote.cjs.map +1 -1
- package/dist/components/quote/quote.js.map +1 -1
- package/dist/components/radio-group/radio-group.cjs +7 -3
- package/dist/components/radio-group/radio-group.cjs.map +1 -1
- package/dist/components/radio-group/radio-group.js +7 -3
- package/dist/components/radio-group/radio-group.js.map +1 -1
- package/dist/components/range-slider/range-slider.cjs.map +1 -1
- package/dist/components/range-slider/range-slider.js.map +1 -1
- package/dist/components/scroll-area/scroll-area.cjs.map +1 -1
- package/dist/components/select/select.cjs.map +1 -1
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/sidebar/sidebar.cjs.map +1 -1
- package/dist/components/sidebar/sidebar.js.map +1 -1
- package/dist/components/skeleton/skeleton.cjs.map +1 -1
- package/dist/components/slider/slider.cjs.map +1 -1
- package/dist/components/slider/slider.js.map +1 -1
- package/dist/components/spacer/spacer.cjs.map +1 -1
- package/dist/components/stat/stat.cjs.map +1 -1
- package/dist/components/stat/stat.js.map +1 -1
- package/dist/components/stepper/stepper.cjs +2 -1
- package/dist/components/stepper/stepper.cjs.map +1 -1
- package/dist/components/stepper/stepper.js +2 -1
- package/dist/components/stepper/stepper.js.map +1 -1
- package/dist/components/table/table.cjs.map +1 -1
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/tabs/tabs.cjs.map +1 -1
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/tags-input/tags-input.cjs.map +1 -1
- package/dist/components/tags-input/tags-input.js.map +1 -1
- package/dist/components/toast/toast.cjs.map +1 -1
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/toggle/toggle.cjs.map +1 -1
- package/dist/components/toggle-group/toggle-group.cjs.map +1 -1
- package/dist/components/toolbar/toolbar.cjs.map +1 -1
- package/dist/components/tooltip/tooltip.cjs.map +1 -1
- package/dist/components/tree-view/tree-view.cjs.map +1 -1
- package/dist/components/tree-view/tree-view.js.map +1 -1
- package/dist/components/typography/heading.cjs.map +1 -1
- package/dist/components/typography/link.cjs.map +1 -1
- package/dist/components/typography/paragraph.cjs.map +1 -1
- package/dist/components/typography/text.cjs.map +1 -1
- package/dist/components/upload/upload.cjs +2 -2
- package/dist/components/upload/upload.cjs.map +1 -1
- package/dist/components/upload/upload.js +2 -2
- package/dist/components/upload/upload.js.map +1 -1
- package/dist/components/visually-hidden/visually-hidden.cjs.map +1 -1
- package/dist/panda-preset.cjs.map +1 -1
- package/dist/styled-system/recipes/badge.cjs +4 -1
- package/dist/styled-system/recipes/badge.cjs.map +1 -1
- package/dist/styled-system/recipes/badge.js +4 -1
- package/dist/styled-system/recipes/badge.js.map +1 -1
- package/dist/styles/theme.cjs +88 -68
- package/dist/styles/theme.cjs.map +1 -1
- package/dist/styles/theme.js +88 -68
- package/dist/styles/theme.js.map +1 -1
- package/dist/styles.css +5 -19
- package/dist/theme/theme-provider.cjs.map +1 -1
- package/dist/theme/theme-provider.js.map +1 -1
- package/dist/theme/theme-scope.cjs.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepper.js","names":[],"sources":["../../../src/components/stepper/stepper.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { stepper } from \"../../styled-system/recipes\";\n\nexport type StepperOrientation = \"horizontal\" | \"vertical\";\nexport type StepperStatus = \"current\" | \"complete\" | \"upcoming\" | \"disabled\";\n\ninterface StepRecord {\n value: string;\n disabled: boolean;\n status?: StepperStatus;\n}\n\ninterface StepperContextValue {\n activeValue: string | undefined;\n allowStepSelect: boolean;\n disabled: boolean;\n getStatus: (value: string, status?: StepperStatus, disabled?: boolean) => StepperStatus;\n goTo: (value: string, options?: { fromNavigation?: boolean }) => void;\n linear: boolean;\n orientation: StepperOrientation;\n register: (record: StepRecord) => void;\n unregister: (value: string) => void;\n move: (direction: -1 | 1) => void;\n moveToBoundary: (direction: -1 | 1) => void;\n}\n\ninterface StepperItemContextValue {\n disabled: boolean;\n status: StepperStatus;\n value: string;\n}\n\nconst StepperContext = createContext<StepperContextValue | null>(null);\nconst StepperItemContext = createContext<StepperItemContextValue | null>(null);\n\nfunction useStepperContext() {\n const context = useContext(StepperContext);\n if (!context) throw new Error(\"Stepper parts must be rendered inside Stepper.Root.\");\n return context;\n}\n\nfunction useStepperItemContext() {\n const context = useContext(StepperItemContext);\n if (!context) throw new Error(\"This Stepper part must be rendered inside Stepper.Item.\");\n return context;\n}\n\nexport interface StepperRootProps extends Omit<ComponentPropsWithoutRef<\"nav\">, \"children\"> {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n orientation?: StepperOrientation;\n linear?: boolean;\n allowStepSelect?: boolean;\n disabled?: boolean;\n name?: string;\n form?: string;\n children?: ReactNode;\n}\n\nexport const StepperRoot = forwardRef<HTMLElement, StepperRootProps>(function StepperRoot(\n {\n allowStepSelect = true,\n \"aria-label\": ariaLabel,\n children,\n className,\n defaultValue,\n disabled = false,\n form,\n linear = false,\n name,\n onValueChange,\n orientation = \"horizontal\",\n value: controlledValue,\n ...props\n },\n ref,\n) {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const [records, setRecords] = useState<StepRecord[]>([]);\n const activeValue = controlledValue ?? uncontrolledValue ?? records[0]?.value;\n\n const register = useCallback((record: StepRecord) => {\n setRecords((current) => {\n const index = current.findIndex((item) => item.value === record.value);\n if (index === -1) return [...current, record];\n const currentRecord = current[index];\n if (!currentRecord) return current;\n if (currentRecord.disabled === record.disabled && currentRecord.status === record.status) {\n return current;\n }\n const next = current.slice();\n next[index] = record;\n return next;\n });\n }, []);\n\n const unregister = useCallback((valueToRemove: string) => {\n setRecords((current) => current.filter((item) => item.value !== valueToRemove));\n }, []);\n\n const goTo = useCallback(\n (nextValue: string, options?: { fromNavigation?: boolean }) => {\n if (disabled) return;\n const targetIndex = records.findIndex((item) => item.value === nextValue);\n const activeIndex = records.findIndex((item) => item.value === activeValue);\n const target = records[targetIndex];\n if (!target || target.disabled) return;\n if (nextValue === activeValue) return;\n if (!allowStepSelect && !options?.fromNavigation && nextValue !== activeValue) return;\n if (linear && activeIndex >= 0 && targetIndex > activeIndex + 1) return;\n if (controlledValue === undefined) setUncontrolledValue(nextValue);\n onValueChange?.(nextValue);\n },\n [activeValue, allowStepSelect, controlledValue, disabled, linear, onValueChange, records],\n );\n\n const move = useCallback(\n (direction: -1 | 1) => {\n const activeIndex = records.findIndex((item) => item.value === activeValue);\n let index = activeIndex + direction;\n while (index >= 0 && index < records.length && records[index]?.disabled) index += direction;\n const target = records[index];\n if (target) goTo(target.value, { fromNavigation: true });\n },\n [activeValue, goTo, records],\n );\n\n const moveToBoundary = useCallback(\n (direction: -1 | 1) => {\n const candidates = direction === -1 ? records : records.slice().reverse();\n const target = candidates.find((record) => !record.disabled);\n if (target) goTo(target.value, { fromNavigation: true });\n },\n [goTo, records],\n );\n\n const getStatus = useCallback(\n (itemValue: string, explicitStatus?: StepperStatus, itemDisabled = false) => {\n if (itemDisabled || disabled) return \"disabled\";\n if (explicitStatus) return explicitStatus;\n const itemIndex = records.findIndex((item) => item.value === itemValue);\n const activeIndex = records.findIndex((item) => item.value === activeValue);\n if (itemValue === activeValue || (activeIndex < 0 && itemIndex === 0)) return \"current\";\n if (itemIndex >= 0 && activeIndex >= 0 && itemIndex < activeIndex) return \"complete\";\n return \"upcoming\";\n },\n [activeValue, disabled, records],\n );\n\n const context = useMemo(\n () => ({\n activeValue,\n allowStepSelect,\n disabled,\n getStatus,\n goTo,\n linear,\n move,\n moveToBoundary,\n orientation,\n register,\n unregister,\n }),\n [\n activeValue,\n allowStepSelect,\n disabled,\n getStatus,\n goTo,\n linear,\n move,\n moveToBoundary,\n orientation,\n register,\n unregister,\n ],\n );\n\n return (\n <StepperContext.Provider value={context}>\n <nav\n {...props}\n aria-label={ariaLabel ?? \"Progress\"}\n className={cx(stepper({ orientation }).root, className)}\n data-jaci-component=\"stepper\"\n data-orientation={orientation}\n data-slot=\"stepper\"\n data-state={disabled ? \"disabled\" : \"active\"}\n ref={ref}\n >\n {children}\n {name ? (\n <input\n aria-hidden=\"true\"\n name={name}\n type=\"hidden\"\n value={activeValue ?? \"\"}\n form={form}\n />\n ) : null}\n </nav>\n </StepperContext.Provider>\n );\n});\n\nexport type StepperListProps = ComponentPropsWithoutRef<\"ol\">;\nexport const StepperList = forwardRef<HTMLOListElement, StepperListProps>(function StepperList(\n { className, ...props },\n ref,\n) {\n const { orientation } = useStepperContext();\n return (\n <ol\n {...props}\n className={cx(stepper({ orientation }).list, className)}\n data-slot=\"stepper-list\"\n ref={ref}\n />\n );\n});\n\nexport interface StepperItemProps extends ComponentPropsWithoutRef<\"li\"> {\n value: string;\n status?: StepperStatus;\n disabled?: boolean;\n}\n\nexport const StepperItem = forwardRef<HTMLLIElement, StepperItemProps>(function StepperItem(\n { children, className, disabled = false, status, value, ...props },\n ref,\n) {\n const context = useStepperContext();\n const resolvedStatus = context.getStatus(value, status, disabled);\n useEffect(() => {\n const record: StepRecord = { disabled: disabled || status === \"disabled\", value };\n if (status !== undefined) record.status = status;\n context.register(record);\n return () => context.unregister(value);\n }, [context.register, context.unregister, disabled, status, value]);\n const itemContext = useMemo<StepperItemContextValue>(\n () => ({\n disabled: disabled || context.disabled || resolvedStatus === \"disabled\",\n status: resolvedStatus,\n value,\n }),\n [context.disabled, disabled, resolvedStatus, value],\n );\n const styles = stepper({ orientation: context.orientation, status: resolvedStatus });\n\n return (\n <StepperItemContext.Provider value={itemContext}>\n <li\n {...props}\n aria-disabled={itemContext.disabled || undefined}\n className={cx(styles.item, className)}\n data-disabled={itemContext.disabled || undefined}\n data-jaci-component=\"stepper-item\"\n data-slot=\"stepper-item\"\n data-status={resolvedStatus}\n data-value={value}\n ref={ref}\n >\n {children}\n </li>\n </StepperItemContext.Provider>\n );\n});\n\nexport type StepperTriggerProps = ComponentPropsWithoutRef<\"button\">;\nexport const StepperTrigger = forwardRef<HTMLButtonElement, StepperTriggerProps>(\n function StepperTrigger({ className, onClick, onKeyDown, type = \"button\", ...props }, ref) {\n const context = useStepperContext();\n const item = useStepperItemContext();\n const styles = stepper({ orientation: context.orientation, status: item.status });\n return (\n <button\n {...props}\n aria-current={item.status === \"current\" ? \"step\" : undefined}\n aria-disabled={\n item.disabled || (!context.allowStepSelect && item.status !== \"current\") || undefined\n }\n className={cx(styles.trigger, className)}\n data-disabled={item.disabled || undefined}\n data-slot=\"stepper-trigger\"\n data-status={item.status}\n disabled={context.disabled || item.disabled}\n onClick={(event) => {\n if (!event.defaultPrevented) context.goTo(item.value);\n onClick?.(event);\n }}\n onKeyDown={(event) => {\n const isForwardKey =\n (context.orientation === \"horizontal\" && event.key === \"ArrowRight\") ||\n (context.orientation === \"vertical\" && event.key === \"ArrowDown\");\n const isBackwardKey =\n (context.orientation === \"horizontal\" && event.key === \"ArrowLeft\") ||\n (context.orientation === \"vertical\" && event.key === \"ArrowUp\");\n if (isForwardKey) {\n event.preventDefault();\n context.move(1);\n } else if (isBackwardKey) {\n event.preventDefault();\n context.move(-1);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n context.moveToBoundary(-1);\n } else if (event.key === \"End\") {\n event.preventDefault();\n context.moveToBoundary(1);\n }\n onKeyDown?.(event);\n }}\n ref={ref}\n type={type}\n />\n );\n },\n);\n\nexport type StepperIndicatorProps = ComponentPropsWithoutRef<\"span\">;\nexport const StepperIndicator = forwardRef<HTMLSpanElement, StepperIndicatorProps>(\n function StepperIndicator({ children, className, ...props }, ref) {\n const { orientation } = useStepperContext();\n const item = useStepperItemContext();\n const styles = stepper({ orientation, status: item.status });\n return (\n <span\n {...props}\n aria-hidden={props[\"aria-hidden\"] ?? true}\n className={cx(styles.indicator, className)}\n data-slot=\"stepper-indicator\"\n data-status={item.status}\n ref={ref}\n >\n {children ?? (item.status === \"complete\" ? \"✓\" : \"\")}\n </span>\n );\n },\n);\n\nfunction createSpanSlot(slot: \"title\" | \"description\" | \"separator\") {\n return forwardRef<HTMLSpanElement, ComponentPropsWithoutRef<\"span\">>(function StepperSlot(\n { className, ...props },\n ref,\n ) {\n const { orientation } = useStepperContext();\n const item = useStepperItemContext();\n const styles = stepper({ orientation, status: item.status });\n return (\n <span\n {...props}\n className={cx(styles[slot], className)}\n data-slot={`stepper-${slot}`}\n ref={ref}\n />\n );\n });\n}\n\nexport const StepperTitle = createSpanSlot(\"title\");\nexport const StepperDescription = createSpanSlot(\"description\");\n\nexport const StepperContent = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<\"div\">>(\n function StepperContent({ className, hidden, ...props }, ref) {\n const item = useStepperItemContext();\n const { orientation } = useStepperContext();\n const styles = stepper({ orientation, status: item.status });\n return (\n <div\n {...props}\n className={cx(styles.content, className)}\n data-slot=\"stepper-content\"\n hidden={hidden ?? item.status !== \"current\"}\n ref={ref}\n />\n );\n },\n);\n\nexport const StepperSeparator = createSpanSlot(\"separator\");\n\nexport interface StepperNavigationButtonProps extends ComponentPropsWithoutRef<\"button\"> {\n children?: ReactNode;\n}\n\nexport const StepperPrevious = forwardRef<HTMLButtonElement, StepperNavigationButtonProps>(\n function StepperPrevious(\n { children = \"Previous\", className, disabled: disabledProp, ...props },\n ref,\n ) {\n const context = useStepperContext();\n const styles = stepper({ orientation: context.orientation });\n return (\n <button\n {...props}\n className={cx(styles.previous, className)}\n data-slot=\"stepper-previous\"\n disabled={disabledProp || context.disabled}\n onClick={(event) => {\n context.move(-1);\n props.onClick?.(event);\n }}\n ref={ref}\n type={props.type ?? \"button\"}\n >\n {children}\n </button>\n );\n },\n);\n\nexport const StepperNext = forwardRef<HTMLButtonElement, StepperNavigationButtonProps>(\n function StepperNext({ children = \"Next\", className, disabled: disabledProp, ...props }, ref) {\n const context = useStepperContext();\n const styles = stepper({ orientation: context.orientation });\n return (\n <button\n {...props}\n className={cx(styles.next, className)}\n data-slot=\"stepper-next\"\n disabled={disabledProp || context.disabled}\n onClick={(event) => {\n context.move(1);\n props.onClick?.(event);\n }}\n ref={ref}\n type={props.type ?? \"button\"}\n >\n {children}\n </button>\n );\n },\n);\n\nexport const Stepper = {\n Root: StepperRoot,\n List: StepperList,\n Item: StepperItem,\n Trigger: StepperTrigger,\n Indicator: StepperIndicator,\n Title: StepperTitle,\n Description: StepperDescription,\n Content: StepperContent,\n Separator: StepperSeparator,\n Previous: StepperPrevious,\n Next: StepperNext,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stepper.js","names":[],"sources":["../../../src/components/stepper/stepper.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { stepper } from \"../../styled-system/recipes\";\n\nexport type StepperOrientation = \"horizontal\" | \"vertical\";\nexport type StepperStatus = \"current\" | \"complete\" | \"upcoming\" | \"disabled\";\n\ninterface StepRecord {\n value: string;\n disabled: boolean;\n status?: StepperStatus;\n}\n\ninterface StepperContextValue {\n activeValue: string | undefined;\n allowStepSelect: boolean;\n disabled: boolean;\n getStatus: (value: string, status?: StepperStatus, disabled?: boolean) => StepperStatus;\n goTo: (value: string, options?: { fromNavigation?: boolean }) => void;\n linear: boolean;\n orientation: StepperOrientation;\n register: (record: StepRecord) => void;\n unregister: (value: string) => void;\n move: (direction: -1 | 1) => void;\n moveToBoundary: (direction: -1 | 1) => void;\n}\n\ninterface StepperItemContextValue {\n disabled: boolean;\n status: StepperStatus;\n value: string;\n}\n\nconst StepperContext = createContext<StepperContextValue | null>(null);\nconst StepperItemContext = createContext<StepperItemContextValue | null>(null);\n\nfunction useStepperContext() {\n const context = useContext(StepperContext);\n if (!context) throw new Error(\"Stepper parts must be rendered inside Stepper.Root.\");\n return context;\n}\n\nfunction useStepperItemContext() {\n const context = useContext(StepperItemContext);\n if (!context) throw new Error(\"This Stepper part must be rendered inside Stepper.Item.\");\n return context;\n}\n\nexport interface StepperRootProps extends Omit<ComponentPropsWithoutRef<\"nav\">, \"children\"> {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n orientation?: StepperOrientation;\n linear?: boolean;\n allowStepSelect?: boolean;\n disabled?: boolean;\n name?: string;\n form?: string;\n children?: ReactNode;\n}\n\nexport const StepperRoot = forwardRef<HTMLElement, StepperRootProps>(function StepperRoot(\n {\n allowStepSelect = true,\n \"aria-label\": ariaLabel,\n children,\n className,\n defaultValue,\n disabled = false,\n form,\n linear = false,\n name,\n onValueChange,\n orientation = \"horizontal\",\n value: controlledValue,\n ...props\n },\n ref,\n) {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const [records, setRecords] = useState<StepRecord[]>([]);\n const activeValue = controlledValue ?? uncontrolledValue ?? records[0]?.value;\n\n const register = useCallback((record: StepRecord) => {\n setRecords((current) => {\n const index = current.findIndex((item) => item.value === record.value);\n if (index === -1) return [...current, record];\n const currentRecord = current[index];\n if (!currentRecord) return current;\n if (currentRecord.disabled === record.disabled && currentRecord.status === record.status) {\n return current;\n }\n const next = current.slice();\n next[index] = record;\n return next;\n });\n }, []);\n\n const unregister = useCallback((valueToRemove: string) => {\n setRecords((current) => current.filter((item) => item.value !== valueToRemove));\n }, []);\n\n const goTo = useCallback(\n (nextValue: string, options?: { fromNavigation?: boolean }) => {\n if (disabled) return;\n const targetIndex = records.findIndex((item) => item.value === nextValue);\n const activeIndex = records.findIndex((item) => item.value === activeValue);\n const target = records[targetIndex];\n if (!target || target.disabled) return;\n if (nextValue === activeValue) return;\n if (!allowStepSelect && !options?.fromNavigation && nextValue !== activeValue) return;\n if (linear && activeIndex >= 0 && targetIndex > activeIndex + 1) return;\n if (controlledValue === undefined) setUncontrolledValue(nextValue);\n onValueChange?.(nextValue);\n },\n [activeValue, allowStepSelect, controlledValue, disabled, linear, onValueChange, records],\n );\n\n const move = useCallback(\n (direction: -1 | 1) => {\n const activeIndex = records.findIndex((item) => item.value === activeValue);\n let index = activeIndex + direction;\n while (index >= 0 && index < records.length && records[index]?.disabled) index += direction;\n const target = records[index];\n if (target) goTo(target.value, { fromNavigation: true });\n },\n [activeValue, goTo, records],\n );\n\n const moveToBoundary = useCallback(\n (direction: -1 | 1) => {\n const candidates = direction === -1 ? records : records.slice().reverse();\n const target = candidates.find((record) => !record.disabled);\n if (target) goTo(target.value, { fromNavigation: true });\n },\n [goTo, records],\n );\n\n const getStatus = useCallback(\n (itemValue: string, explicitStatus?: StepperStatus, itemDisabled = false) => {\n if (itemDisabled || disabled) return \"disabled\";\n if (explicitStatus) return explicitStatus;\n const itemIndex = records.findIndex((item) => item.value === itemValue);\n const activeIndex = records.findIndex((item) => item.value === activeValue);\n if (itemValue === activeValue || (activeIndex < 0 && itemIndex === 0)) return \"current\";\n if (itemIndex >= 0 && activeIndex >= 0 && itemIndex < activeIndex) return \"complete\";\n return \"upcoming\";\n },\n [activeValue, disabled, records],\n );\n\n const context = useMemo(\n () => ({\n activeValue,\n allowStepSelect,\n disabled,\n getStatus,\n goTo,\n linear,\n move,\n moveToBoundary,\n orientation,\n register,\n unregister,\n }),\n [\n activeValue,\n allowStepSelect,\n disabled,\n getStatus,\n goTo,\n linear,\n move,\n moveToBoundary,\n orientation,\n register,\n unregister,\n ],\n );\n\n return (\n <StepperContext.Provider value={context}>\n <nav\n {...props}\n aria-label={ariaLabel ?? \"Progress\"}\n className={cx(stepper({ orientation }).root, className)}\n data-jaci-component=\"stepper\"\n data-orientation={orientation}\n data-slot=\"stepper\"\n data-state={disabled ? \"disabled\" : \"active\"}\n ref={ref}\n >\n {children}\n {name ? (\n <input\n aria-hidden=\"true\"\n name={name}\n type=\"hidden\"\n value={activeValue ?? \"\"}\n form={form}\n />\n ) : null}\n </nav>\n </StepperContext.Provider>\n );\n});\n\nexport type StepperListProps = ComponentPropsWithoutRef<\"ol\">;\nexport const StepperList = forwardRef<HTMLOListElement, StepperListProps>(function StepperList(\n { className, ...props },\n ref,\n) {\n const { orientation } = useStepperContext();\n return (\n <ol\n {...props}\n className={cx(stepper({ orientation }).list, className)}\n data-slot=\"stepper-list\"\n ref={ref}\n />\n );\n});\n\nexport interface StepperItemProps extends ComponentPropsWithoutRef<\"li\"> {\n value: string;\n status?: StepperStatus;\n disabled?: boolean;\n}\n\nexport const StepperItem = forwardRef<HTMLLIElement, StepperItemProps>(function StepperItem(\n { children, className, disabled = false, status, value, ...props },\n ref,\n) {\n const context = useStepperContext();\n const resolvedStatus = context.getStatus(value, status, disabled);\n useEffect(() => {\n const record: StepRecord = { disabled: disabled || status === \"disabled\", value };\n if (status !== undefined) record.status = status;\n context.register(record);\n return () => context.unregister(value);\n }, [context.register, context.unregister, disabled, status, value]);\n const itemContext = useMemo<StepperItemContextValue>(\n () => ({\n disabled: disabled || context.disabled || resolvedStatus === \"disabled\",\n status: resolvedStatus,\n value,\n }),\n [context.disabled, disabled, resolvedStatus, value],\n );\n const styles = stepper({ orientation: context.orientation, status: resolvedStatus });\n\n return (\n <StepperItemContext.Provider value={itemContext}>\n <li\n {...props}\n aria-disabled={itemContext.disabled || undefined}\n className={cx(styles.item, className)}\n data-disabled={itemContext.disabled || undefined}\n data-jaci-component=\"stepper-item\"\n data-slot=\"stepper-item\"\n data-status={resolvedStatus}\n data-value={value}\n ref={ref}\n >\n {children}\n </li>\n </StepperItemContext.Provider>\n );\n});\n\nexport type StepperTriggerProps = ComponentPropsWithoutRef<\"button\">;\nexport const StepperTrigger = forwardRef<HTMLButtonElement, StepperTriggerProps>(\n function StepperTrigger({ className, onClick, onKeyDown, type = \"button\", ...props }, ref) {\n const context = useStepperContext();\n const item = useStepperItemContext();\n const styles = stepper({ orientation: context.orientation, status: item.status });\n return (\n <button\n {...props}\n aria-current={item.status === \"current\" ? \"step\" : undefined}\n aria-disabled={\n item.disabled || (!context.allowStepSelect && item.status !== \"current\") || undefined\n }\n className={cx(styles.trigger, className)}\n data-disabled={item.disabled || undefined}\n data-slot=\"stepper-trigger\"\n data-status={item.status}\n disabled={context.disabled || item.disabled}\n onClick={(event) => {\n if (!event.defaultPrevented) context.goTo(item.value);\n onClick?.(event);\n }}\n onKeyDown={(event) => {\n const isForwardKey =\n (context.orientation === \"horizontal\" && event.key === \"ArrowRight\") ||\n (context.orientation === \"vertical\" && event.key === \"ArrowDown\");\n const isBackwardKey =\n (context.orientation === \"horizontal\" && event.key === \"ArrowLeft\") ||\n (context.orientation === \"vertical\" && event.key === \"ArrowUp\");\n if (isForwardKey) {\n event.preventDefault();\n context.move(1);\n } else if (isBackwardKey) {\n event.preventDefault();\n context.move(-1);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n context.moveToBoundary(-1);\n } else if (event.key === \"End\") {\n event.preventDefault();\n context.moveToBoundary(1);\n }\n onKeyDown?.(event);\n }}\n ref={ref}\n type={type}\n />\n );\n },\n);\n\nexport type StepperIndicatorProps = ComponentPropsWithoutRef<\"span\">;\nexport const StepperIndicator = forwardRef<HTMLSpanElement, StepperIndicatorProps>(\n function StepperIndicator({ children, className, ...props }, ref) {\n const { orientation } = useStepperContext();\n const item = useStepperItemContext();\n const styles = stepper({ orientation, status: item.status });\n return (\n <span\n {...props}\n aria-hidden={props[\"aria-hidden\"] ?? true}\n className={cx(styles.indicator, className)}\n data-slot=\"stepper-indicator\"\n data-status={item.status}\n ref={ref}\n >\n {children ?? (item.status === \"complete\" ? \"✓\" : \"\")}\n </span>\n );\n },\n);\n\nfunction createSpanSlot(slot: \"title\" | \"description\" | \"separator\") {\n return forwardRef<HTMLSpanElement, ComponentPropsWithoutRef<\"span\">>(function StepperSlot(\n { className, ...props },\n ref,\n ) {\n const { orientation } = useStepperContext();\n const item = useStepperItemContext();\n const styles = stepper({ orientation, status: item.status });\n return (\n <span\n {...props}\n className={cx(styles[slot], className)}\n data-slot={`stepper-${slot}`}\n ref={ref}\n />\n );\n });\n}\n\nexport const StepperTitle = createSpanSlot(\"title\");\nexport const StepperDescription = createSpanSlot(\"description\");\n\nexport const StepperContent = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<\"div\">>(\n function StepperContent({ className, hidden, ...props }, ref) {\n const item = useStepperItemContext();\n const { orientation } = useStepperContext();\n const styles = stepper({ orientation, status: item.status });\n return (\n <div\n {...props}\n className={cx(styles.content, className)}\n data-slot=\"stepper-content\"\n hidden={hidden ?? item.status !== \"current\"}\n ref={ref}\n />\n );\n },\n);\n\nexport const StepperSeparator = createSpanSlot(\"separator\");\n\nexport interface StepperNavigationButtonProps extends ComponentPropsWithoutRef<\"button\"> {\n children?: ReactNode;\n}\n\nexport const StepperPrevious = forwardRef<HTMLButtonElement, StepperNavigationButtonProps>(\n function StepperPrevious(\n { children = \"Previous\", className, disabled: disabledProp, ...props },\n ref,\n ) {\n const context = useStepperContext();\n const styles = stepper({ orientation: context.orientation });\n return (\n <button\n {...props}\n className={cx(styles.previous, className)}\n data-slot=\"stepper-previous\"\n disabled={disabledProp || context.disabled}\n onClick={(event) => {\n context.move(-1);\n props.onClick?.(event);\n }}\n ref={ref}\n type={props.type ?? \"button\"}\n >\n {children}\n </button>\n );\n },\n);\n\nexport const StepperNext = forwardRef<HTMLButtonElement, StepperNavigationButtonProps>(\n function StepperNext({ children = \"Next\", className, disabled: disabledProp, ...props }, ref) {\n const context = useStepperContext();\n const styles = stepper({ orientation: context.orientation });\n return (\n <button\n {...props}\n className={cx(styles.next, className)}\n data-slot=\"stepper-next\"\n disabled={disabledProp || context.disabled}\n onClick={(event) => {\n context.move(1);\n props.onClick?.(event);\n }}\n ref={ref}\n type={props.type ?? \"button\"}\n >\n {children}\n </button>\n );\n },\n);\n\nexport const Stepper = {\n Root: StepperRoot,\n List: StepperList,\n Item: StepperItem,\n Trigger: StepperTrigger,\n Indicator: StepperIndicator,\n Title: StepperTitle,\n Description: StepperDescription,\n Content: StepperContent,\n Separator: StepperSeparator,\n Previous: StepperPrevious,\n Next: StepperNext,\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.cjs","names":["cx","table"],"sources":["../../../src/components/table/table.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { table } from \"../../styled-system/recipes\";\n\nexport type TableSortDirection = \"none\" | \"ascending\" | \"descending\";\nexport type TableDensity = \"compact\" | \"comfortable\";\nexport type TableSelectionMode = \"none\" | \"single\" | \"multiple\";\nexport type TableStatus = \"idle\" | \"loading\" | \"empty\" | \"error\" | \"ready\";\nexport type TableAlignment = \"start\" | \"center\" | \"end\";\nexport type TableHideBelow = \"sm\" | \"md\" | \"lg\";\n\nexport interface TableSortState {\n id: string;\n direction: Exclude<TableSortDirection, \"none\">;\n}\n\ninterface TableRowRecord {\n disabled: boolean;\n}\n\ninterface TableContextValue {\n allSelected: boolean;\n indeterminate: boolean;\n isRowSelected: (id: string) => boolean;\n registerRow: (id: string, row: TableRowRecord) => () => void;\n requestSort: (id: string, direction?: TableSortDirection) => void;\n selectedRowIds: ReadonlySet<string>;\n selectionMode: TableSelectionMode;\n toggleAll: (checked: boolean) => void;\n toggleRow: (id: string, checked: boolean) => void;\n sort: TableSortState | null;\n status: TableStatus;\n}\n\ninterface TableRowContextValue {\n id: string;\n selectionDisabled: boolean;\n}\n\ntype TableSection = \"head\" | \"body\" | \"foot\";\n\nconst TableContext = createContext<TableContextValue | null>(null);\nconst TableRowContext = createContext<TableRowContextValue | null>(null);\nconst TableSectionContext = createContext<TableSection>(\"body\");\n\nfunction useTableContext() {\n return useContext(TableContext);\n}\n\nfunction useRequiredTableContext() {\n const context = useTableContext();\n if (!context) throw new Error(\"Table parts must be rendered inside Table.Root.\");\n return context;\n}\n\nfunction useTableRowContext() {\n return useContext(TableRowContext);\n}\n\nfunction cycleSortDirection(direction: TableSortDirection): TableSortDirection {\n if (direction === \"none\") return \"ascending\";\n if (direction === \"ascending\") return \"descending\";\n return \"none\";\n}\n\nexport interface TableContainerProps extends ComponentPropsWithoutRef<\"div\"> {}\n\nexport const TableContainer = forwardRef<HTMLDivElement, TableContainerProps>(\n function TableContainer({ className, ...props }, ref) {\n return (\n <div\n {...props}\n ref={ref}\n className={cx(table().container, className)}\n data-jaci-component=\"table\"\n data-slot=\"table-container\"\n />\n );\n },\n);\n\nexport interface TableRootProps extends ComponentPropsWithoutRef<\"table\"> {\n bordered?: boolean;\n density?: TableDensity;\n defaultSelectedRowIds?: readonly string[];\n defaultSort?: TableSortState | null;\n onSelectionChange?: (rowIds: string[]) => void;\n onSortChange?: (sort: TableSortState | null) => void;\n selectedRowIds?: readonly string[];\n selectionMode?: TableSelectionMode;\n sort?: TableSortState | null;\n status?: TableStatus;\n stickyHeader?: boolean;\n striped?: boolean;\n}\n\nexport const TableRoot = forwardRef<HTMLTableElement, TableRootProps>(function TableRoot(\n {\n bordered = false,\n className,\n defaultSelectedRowIds = [],\n defaultSort = null,\n density = \"comfortable\",\n onSelectionChange,\n onSortChange,\n selectedRowIds: controlledSelectedRowIds,\n selectionMode = \"none\",\n sort: controlledSort,\n status = \"idle\",\n stickyHeader = false,\n striped = false,\n ...props\n },\n ref,\n) {\n const [uncontrolledSelectedRowIds, setUncontrolledSelectedRowIds] = useState(\n () => new Set(defaultSelectedRowIds),\n );\n const [uncontrolledSort, setUncontrolledSort] = useState<TableSortState | null>(defaultSort);\n const [rows, setRows] = useState<Map<string, TableRowRecord>>(() => new Map());\n const selectedRowIds = useMemo(\n () => new Set(controlledSelectedRowIds ?? uncontrolledSelectedRowIds),\n [controlledSelectedRowIds, uncontrolledSelectedRowIds],\n );\n const sort = controlledSort === undefined ? uncontrolledSort : controlledSort;\n const selectableRows = useMemo(\n () => [...rows.entries()].filter(([, row]) => !row.disabled).map(([id]) => id),\n [rows],\n );\n const selectedSelectableRows = selectableRows.filter((id) => selectedRowIds.has(id));\n const allSelected =\n selectableRows.length > 0 && selectedSelectableRows.length === selectableRows.length;\n const indeterminate = selectedSelectableRows.length > 0 && !allSelected;\n const styles = table({ bordered, density, stickyHeader, striped });\n\n const updateSelection = useCallback(\n (next: Set<string>) => {\n const normalized = selectionMode === \"single\" ? new Set([...next].slice(-1)) : next;\n if (controlledSelectedRowIds === undefined) setUncontrolledSelectedRowIds(normalized);\n onSelectionChange?.([...normalized]);\n },\n [controlledSelectedRowIds, onSelectionChange, selectionMode],\n );\n const toggleRow = useCallback(\n (id: string, checked: boolean) => {\n const row = rows.get(id);\n if (selectionMode === \"none\" || row?.disabled) return;\n const next = new Set(selectedRowIds);\n if (selectionMode === \"single\") next.clear();\n if (checked) next.add(id);\n else next.delete(id);\n updateSelection(next);\n },\n [rows, selectedRowIds, selectionMode, updateSelection],\n );\n const toggleAll = useCallback(\n (checked: boolean) => {\n if (selectionMode !== \"multiple\") return;\n updateSelection(new Set(checked ? selectableRows : []));\n },\n [selectableRows, selectionMode, updateSelection],\n );\n const registerRow = useCallback((id: string, row: TableRowRecord) => {\n setRows((current) => {\n const next = new Map(current);\n next.set(id, row);\n return next;\n });\n return () =>\n setRows((current) => {\n if (!current.has(id)) return current;\n const next = new Map(current);\n next.delete(id);\n return next;\n });\n }, []);\n const requestSort = useCallback(\n (id: string, requestedDirection?: TableSortDirection) => {\n const currentDirection = sort?.id === id ? sort.direction : \"none\";\n const direction = requestedDirection ?? cycleSortDirection(currentDirection);\n const nextSort = direction === \"none\" ? null : { id, direction };\n if (controlledSort === undefined) setUncontrolledSort(nextSort);\n onSortChange?.(nextSort);\n },\n [controlledSort, onSortChange, sort],\n );\n\n const context = useMemo<TableContextValue>(\n () => ({\n allSelected,\n indeterminate,\n isRowSelected: (id) => selectedRowIds.has(id),\n registerRow,\n requestSort,\n selectedRowIds,\n selectionMode,\n status,\n toggleAll,\n toggleRow,\n sort,\n }),\n [\n allSelected,\n indeterminate,\n registerRow,\n requestSort,\n selectedRowIds,\n selectionMode,\n sort,\n status,\n toggleAll,\n toggleRow,\n ],\n );\n\n return (\n <TableContext.Provider value={context}>\n <table\n {...props}\n ref={ref}\n aria-busy={props[\"aria-busy\"] ?? (status === \"loading\" || undefined)}\n className={cx(styles.root, className)}\n data-jaci-component=\"table\"\n data-status={status}\n data-slot=\"table\"\n />\n </TableContext.Provider>\n );\n});\n\nexport type TableCaptionProps = ComponentPropsWithoutRef<\"caption\">;\nexport const TableCaption = forwardRef<HTMLTableCaptionElement, TableCaptionProps>(\n function TableCaption({ className, ...props }, ref) {\n return (\n <caption\n {...props}\n ref={ref}\n className={cx(table().caption, className)}\n data-slot=\"table-caption\"\n />\n );\n },\n);\n\nexport type TableDescriptionProps = ComponentPropsWithoutRef<\"p\">;\nexport const TableDescription = forwardRef<HTMLParagraphElement, TableDescriptionProps>(\n function TableDescription({ className, ...props }, ref) {\n return (\n <p\n {...props}\n ref={ref}\n className={cx(table().description, className)}\n data-slot=\"table-description\"\n />\n );\n },\n);\n\nexport type TableHeaderProps = ComponentPropsWithoutRef<\"thead\">;\nexport const TableHeader = forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n function TableHeader({ className, ...props }, ref) {\n return (\n <TableSectionContext.Provider value=\"head\">\n <thead\n {...props}\n ref={ref}\n className={cx(table().header, className)}\n data-slot=\"table-header\"\n />\n </TableSectionContext.Provider>\n );\n },\n);\n\nexport type TableBodyProps = ComponentPropsWithoutRef<\"tbody\">;\nexport const TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(function TableBody(\n { className, ...props },\n ref,\n) {\n return (\n <TableSectionContext.Provider value=\"body\">\n <tbody {...props} ref={ref} className={cx(table().body, className)} data-slot=\"table-body\" />\n </TableSectionContext.Provider>\n );\n});\n\nexport type TableFooterProps = ComponentPropsWithoutRef<\"tfoot\">;\nexport const TableFooter = forwardRef<HTMLTableSectionElement, TableFooterProps>(\n function TableFooter({ className, ...props }, ref) {\n return (\n <TableSectionContext.Provider value=\"foot\">\n <tfoot\n {...props}\n ref={ref}\n className={cx(table().footer, className)}\n data-slot=\"table-footer\"\n />\n </TableSectionContext.Provider>\n );\n },\n);\n\nexport interface TableRowProps extends Omit<ComponentPropsWithoutRef<\"tr\">, \"id\"> {\n id: string;\n selectionDisabled?: boolean;\n selected?: boolean;\n}\n\nexport const TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(function TableRow(\n { className, id, selectionDisabled = false, selected: selectedOverride, ...props },\n ref,\n) {\n const context = useTableContext();\n const section = useContext(TableSectionContext);\n const selected = selectedOverride ?? context?.isRowSelected(id) ?? false;\n useEffect(\n () =>\n section === \"head\" ? undefined : context?.registerRow(id, { disabled: selectionDisabled }),\n [context?.registerRow, id, section, selectionDisabled],\n );\n\n return (\n <TableRowContext.Provider value={{ id, selectionDisabled }}>\n <tr\n {...props}\n id={id}\n ref={ref}\n aria-selected={selected || undefined}\n className={cx(table().row, className)}\n data-selected={selected || undefined}\n data-selection-disabled={selectionDisabled || undefined}\n data-slot=\"table-row\"\n />\n </TableRowContext.Provider>\n );\n});\n\nexport interface TableHeadProps extends Omit<ComponentPropsWithoutRef<\"th\">, \"align\"> {\n align?: TableAlignment;\n hideBelow?: TableHideBelow;\n onSort?: (direction: TableSortDirection) => void;\n sortDirection?: TableSortDirection;\n sortable?: boolean;\n}\n\nexport const TableHead = forwardRef<HTMLTableCellElement, TableHeadProps>(function TableHead(\n {\n align = \"start\",\n children,\n className,\n hideBelow,\n onSort,\n sortDirection,\n sortable = false,\n ...props\n },\n ref,\n) {\n const context = useTableContext();\n const styles = table({ align, hideBelow });\n const resolvedDirection =\n sortDirection ??\n (sortable && props.id && context?.sort?.id === props.id ? context.sort.direction : \"none\");\n const sort = () => {\n const next = cycleSortDirection(resolvedDirection);\n if (props.id) context?.requestSort(props.id, next);\n onSort?.(next);\n };\n\n return (\n <th\n {...props}\n ref={ref}\n aria-sort={sortable ? resolvedDirection : undefined}\n className={cx(styles.head, className)}\n data-align={align}\n data-hide-below={hideBelow}\n data-sort-direction={sortable ? resolvedDirection : undefined}\n data-slot=\"table-head\"\n scope={props.scope ?? \"col\"}\n >\n {sortable ? (\n <button\n aria-label={\n props[\"aria-label\"] ?? `Sort by ${typeof children === \"string\" ? children : \"column\"}`\n }\n className={styles.sortButton}\n onClick={sort}\n type=\"button\"\n >\n <span>{children}</span>\n <span aria-hidden=\"true\">\n {resolvedDirection === \"ascending\"\n ? \"↑\"\n : resolvedDirection === \"descending\"\n ? \"↓\"\n : \"↕\"}\n </span>\n </button>\n ) : (\n children\n )}\n </th>\n );\n});\n\nexport interface TableCellProps extends Omit<ComponentPropsWithoutRef<\"td\">, \"align\"> {\n align?: TableAlignment;\n hideBelow?: TableHideBelow;\n}\n\nexport const TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(function TableCell(\n { align = \"start\", className, hideBelow, ...props },\n ref,\n) {\n const styles = table({ align, hideBelow });\n return (\n <td\n {...props}\n ref={ref}\n className={cx(styles.cell, className)}\n data-align={align}\n data-hide-below={hideBelow}\n data-slot=\"table-cell\"\n />\n );\n});\n\ninterface TableSelectionInputProps {\n \"aria-label\"?: string | undefined;\n checked?: boolean | undefined;\n indeterminate?: boolean | undefined;\n inputProps?: Omit<\n ComponentPropsWithoutRef<\"input\">,\n \"checked\" | \"defaultChecked\" | \"onChange\" | \"type\"\n >;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nfunction SelectionInput({\n \"aria-label\": ariaLabel,\n checked = false,\n indeterminate = false,\n inputProps,\n onCheckedChange,\n}: TableSelectionInputProps) {\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (ref.current) ref.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n return (\n <input\n {...inputProps}\n ref={ref}\n aria-label={ariaLabel ?? inputProps?.[\"aria-label\"]}\n aria-checked={indeterminate ? \"mixed\" : checked}\n checked={checked}\n onChange={(event) => onCheckedChange?.(event.currentTarget.checked)}\n type=\"checkbox\"\n />\n );\n}\n\nexport interface TableSelectionHeaderProps\n extends Omit<ComponentPropsWithoutRef<\"th\">, \"children\">,\n TableSelectionInputProps {}\n\nexport const TableSelectionHeader = forwardRef<HTMLTableCellElement, TableSelectionHeaderProps>(\n function TableSelectionHeader(\n {\n checked: checkedOverride,\n className,\n indeterminate: indeterminateOverride,\n inputProps,\n onCheckedChange,\n ...props\n },\n ref,\n ) {\n const context = useRequiredTableContext();\n const ariaLabel = props[\"aria-label\"] ?? inputProps?.[\"aria-label\"] ?? \"Select all rows\";\n const checked = checkedOverride ?? context.allSelected;\n const indeterminate = indeterminateOverride ?? context.indeterminate;\n const disabled = Boolean(\n inputProps?.disabled ||\n (context.selectionMode !== \"multiple\" && !onCheckedChange && checkedOverride === undefined),\n );\n return (\n <th\n {...props}\n ref={ref}\n aria-label={ariaLabel}\n className={cx(table().selection, className)}\n data-slot=\"table-selection-header\"\n scope=\"col\"\n >\n <SelectionInput\n aria-label={ariaLabel}\n checked={checked}\n indeterminate={indeterminate}\n inputProps={{ ...inputProps, disabled }}\n onCheckedChange={onCheckedChange ?? context.toggleAll}\n />\n </th>\n );\n },\n);\n\nexport interface TableSelectionCellProps\n extends Omit<ComponentPropsWithoutRef<\"td\">, \"children\">,\n TableSelectionInputProps {}\n\nexport const TableSelectionCell = forwardRef<HTMLTableCellElement, TableSelectionCellProps>(\n function TableSelectionCell(\n {\n checked: checkedOverride,\n className,\n indeterminate = false,\n inputProps,\n onCheckedChange,\n ...props\n },\n ref,\n ) {\n const context = useRequiredTableContext();\n const row = useTableRowContext();\n const id = row?.id ?? \"\";\n const ariaLabel = props[\"aria-label\"] ?? inputProps?.[\"aria-label\"] ?? \"Select row\";\n const checked = checkedOverride ?? context.isRowSelected(id);\n const disabled = Boolean(\n inputProps?.disabled ||\n row?.selectionDisabled ||\n (context.selectionMode === \"none\" && !onCheckedChange && checkedOverride === undefined),\n );\n return (\n <td\n {...props}\n ref={ref}\n className={cx(table().selection, className)}\n data-slot=\"table-selection-cell\"\n >\n <SelectionInput\n aria-label={ariaLabel}\n checked={checked}\n indeterminate={indeterminate}\n inputProps={{ ...inputProps, disabled }}\n onCheckedChange={onCheckedChange ?? ((next) => context.toggleRow(id, next))}\n />\n </td>\n );\n },\n);\n\nexport interface TableStateProps extends Omit<ComponentPropsWithoutRef<\"tr\">, \"children\"> {\n children?: ReactNode;\n colSpan?: number;\n}\n\nconst TableStateRow = forwardRef<\n HTMLTableRowElement,\n TableStateProps & { live?: \"polite\" | \"assertive\" }\n>(function TableStateRow({ children, className, colSpan = 1, live = \"polite\", ...props }, ref) {\n const name = live === \"assertive\" ? \"error\" : \"loading\";\n return (\n <tr {...props} ref={ref} className={cx(table().row, className)} data-slot={`table-${name}-row`}>\n <td aria-live={live} className={table().empty} colSpan={colSpan} data-slot={`table-${name}`}>\n {children}\n </td>\n </tr>\n );\n});\n\nexport interface TableEmptyProps extends TableStateProps {}\nexport type TableLoadingProps = TableStateProps;\nexport type TableErrorProps = TableStateProps;\nexport const TableEmpty = forwardRef<HTMLTableRowElement, TableEmptyProps>(function TableEmpty(\n { children = \"No results found.\", className, colSpan = 1, ...props },\n ref,\n) {\n return (\n <tr {...props} ref={ref} className={cx(table().row, className)} data-slot=\"table-empty-row\">\n <td className={table().empty} colSpan={colSpan} data-slot=\"table-empty\">\n {children}\n </td>\n </tr>\n );\n});\n\nexport const TableLoading = forwardRef<HTMLTableRowElement, TableStateProps>(function TableLoading(\n { children = \"Loading…\", ...props },\n ref,\n) {\n return (\n <TableStateRow {...props} ref={ref} live=\"polite\">\n {children}\n </TableStateRow>\n );\n});\n\nexport const TableError = forwardRef<HTMLTableRowElement, TableStateProps>(function TableError(\n { children = \"Something went wrong.\", ...props },\n ref,\n) {\n return (\n <TableStateRow {...props} ref={ref} live=\"assertive\">\n {children}\n </TableStateRow>\n );\n});\n\nexport const Table = {\n Container: TableContainer,\n Root: TableRoot,\n Caption: TableCaption,\n Description: TableDescription,\n Header: TableHeader,\n Body: TableBody,\n Footer: TableFooter,\n Row: TableRow,\n Head: TableHead,\n Cell: TableCell,\n SelectionHeader: TableSelectionHeader,\n SelectionCell: TableSelectionCell,\n Empty: TableEmpty,\n Loading: TableLoading,\n Error: TableError,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table.cjs","names":["createContext","useContext","forwardRef","cx","table","useState","useMemo","useCallback","useRef"],"sources":["../../../src/components/table/table.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { table } from \"../../styled-system/recipes\";\n\nexport type TableSortDirection = \"none\" | \"ascending\" | \"descending\";\nexport type TableDensity = \"compact\" | \"comfortable\";\nexport type TableSelectionMode = \"none\" | \"single\" | \"multiple\";\nexport type TableStatus = \"idle\" | \"loading\" | \"empty\" | \"error\" | \"ready\";\nexport type TableAlignment = \"start\" | \"center\" | \"end\";\nexport type TableHideBelow = \"sm\" | \"md\" | \"lg\";\n\nexport interface TableSortState {\n id: string;\n direction: Exclude<TableSortDirection, \"none\">;\n}\n\ninterface TableRowRecord {\n disabled: boolean;\n}\n\ninterface TableContextValue {\n allSelected: boolean;\n indeterminate: boolean;\n isRowSelected: (id: string) => boolean;\n registerRow: (id: string, row: TableRowRecord) => () => void;\n requestSort: (id: string, direction?: TableSortDirection) => void;\n selectedRowIds: ReadonlySet<string>;\n selectionMode: TableSelectionMode;\n toggleAll: (checked: boolean) => void;\n toggleRow: (id: string, checked: boolean) => void;\n sort: TableSortState | null;\n status: TableStatus;\n}\n\ninterface TableRowContextValue {\n id: string;\n selectionDisabled: boolean;\n}\n\ntype TableSection = \"head\" | \"body\" | \"foot\";\n\nconst TableContext = createContext<TableContextValue | null>(null);\nconst TableRowContext = createContext<TableRowContextValue | null>(null);\nconst TableSectionContext = createContext<TableSection>(\"body\");\n\nfunction useTableContext() {\n return useContext(TableContext);\n}\n\nfunction useRequiredTableContext() {\n const context = useTableContext();\n if (!context) throw new Error(\"Table parts must be rendered inside Table.Root.\");\n return context;\n}\n\nfunction useTableRowContext() {\n return useContext(TableRowContext);\n}\n\nfunction cycleSortDirection(direction: TableSortDirection): TableSortDirection {\n if (direction === \"none\") return \"ascending\";\n if (direction === \"ascending\") return \"descending\";\n return \"none\";\n}\n\nexport interface TableContainerProps extends ComponentPropsWithoutRef<\"div\"> {}\n\nexport const TableContainer = forwardRef<HTMLDivElement, TableContainerProps>(\n function TableContainer({ className, ...props }, ref) {\n return (\n <div\n {...props}\n ref={ref}\n className={cx(table().container, className)}\n data-jaci-component=\"table\"\n data-slot=\"table-container\"\n />\n );\n },\n);\n\nexport interface TableRootProps extends ComponentPropsWithoutRef<\"table\"> {\n bordered?: boolean;\n density?: TableDensity;\n defaultSelectedRowIds?: readonly string[];\n defaultSort?: TableSortState | null;\n onSelectionChange?: (rowIds: string[]) => void;\n onSortChange?: (sort: TableSortState | null) => void;\n selectedRowIds?: readonly string[];\n selectionMode?: TableSelectionMode;\n sort?: TableSortState | null;\n status?: TableStatus;\n stickyHeader?: boolean;\n striped?: boolean;\n}\n\nexport const TableRoot = forwardRef<HTMLTableElement, TableRootProps>(function TableRoot(\n {\n bordered = false,\n className,\n defaultSelectedRowIds = [],\n defaultSort = null,\n density = \"comfortable\",\n onSelectionChange,\n onSortChange,\n selectedRowIds: controlledSelectedRowIds,\n selectionMode = \"none\",\n sort: controlledSort,\n status = \"idle\",\n stickyHeader = false,\n striped = false,\n ...props\n },\n ref,\n) {\n const [uncontrolledSelectedRowIds, setUncontrolledSelectedRowIds] = useState(\n () => new Set(defaultSelectedRowIds),\n );\n const [uncontrolledSort, setUncontrolledSort] = useState<TableSortState | null>(defaultSort);\n const [rows, setRows] = useState<Map<string, TableRowRecord>>(() => new Map());\n const selectedRowIds = useMemo(\n () => new Set(controlledSelectedRowIds ?? uncontrolledSelectedRowIds),\n [controlledSelectedRowIds, uncontrolledSelectedRowIds],\n );\n const sort = controlledSort === undefined ? uncontrolledSort : controlledSort;\n const selectableRows = useMemo(\n () => [...rows.entries()].filter(([, row]) => !row.disabled).map(([id]) => id),\n [rows],\n );\n const selectedSelectableRows = selectableRows.filter((id) => selectedRowIds.has(id));\n const allSelected =\n selectableRows.length > 0 && selectedSelectableRows.length === selectableRows.length;\n const indeterminate = selectedSelectableRows.length > 0 && !allSelected;\n const styles = table({ bordered, density, stickyHeader, striped });\n\n const updateSelection = useCallback(\n (next: Set<string>) => {\n const normalized = selectionMode === \"single\" ? new Set([...next].slice(-1)) : next;\n if (controlledSelectedRowIds === undefined) setUncontrolledSelectedRowIds(normalized);\n onSelectionChange?.([...normalized]);\n },\n [controlledSelectedRowIds, onSelectionChange, selectionMode],\n );\n const toggleRow = useCallback(\n (id: string, checked: boolean) => {\n const row = rows.get(id);\n if (selectionMode === \"none\" || row?.disabled) return;\n const next = new Set(selectedRowIds);\n if (selectionMode === \"single\") next.clear();\n if (checked) next.add(id);\n else next.delete(id);\n updateSelection(next);\n },\n [rows, selectedRowIds, selectionMode, updateSelection],\n );\n const toggleAll = useCallback(\n (checked: boolean) => {\n if (selectionMode !== \"multiple\") return;\n updateSelection(new Set(checked ? selectableRows : []));\n },\n [selectableRows, selectionMode, updateSelection],\n );\n const registerRow = useCallback((id: string, row: TableRowRecord) => {\n setRows((current) => {\n const next = new Map(current);\n next.set(id, row);\n return next;\n });\n return () =>\n setRows((current) => {\n if (!current.has(id)) return current;\n const next = new Map(current);\n next.delete(id);\n return next;\n });\n }, []);\n const requestSort = useCallback(\n (id: string, requestedDirection?: TableSortDirection) => {\n const currentDirection = sort?.id === id ? sort.direction : \"none\";\n const direction = requestedDirection ?? cycleSortDirection(currentDirection);\n const nextSort = direction === \"none\" ? null : { id, direction };\n if (controlledSort === undefined) setUncontrolledSort(nextSort);\n onSortChange?.(nextSort);\n },\n [controlledSort, onSortChange, sort],\n );\n\n const context = useMemo<TableContextValue>(\n () => ({\n allSelected,\n indeterminate,\n isRowSelected: (id) => selectedRowIds.has(id),\n registerRow,\n requestSort,\n selectedRowIds,\n selectionMode,\n status,\n toggleAll,\n toggleRow,\n sort,\n }),\n [\n allSelected,\n indeterminate,\n registerRow,\n requestSort,\n selectedRowIds,\n selectionMode,\n sort,\n status,\n toggleAll,\n toggleRow,\n ],\n );\n\n return (\n <TableContext.Provider value={context}>\n <table\n {...props}\n ref={ref}\n aria-busy={props[\"aria-busy\"] ?? (status === \"loading\" || undefined)}\n className={cx(styles.root, className)}\n data-jaci-component=\"table\"\n data-status={status}\n data-slot=\"table\"\n />\n </TableContext.Provider>\n );\n});\n\nexport type TableCaptionProps = ComponentPropsWithoutRef<\"caption\">;\nexport const TableCaption = forwardRef<HTMLTableCaptionElement, TableCaptionProps>(\n function TableCaption({ className, ...props }, ref) {\n return (\n <caption\n {...props}\n ref={ref}\n className={cx(table().caption, className)}\n data-slot=\"table-caption\"\n />\n );\n },\n);\n\nexport type TableDescriptionProps = ComponentPropsWithoutRef<\"p\">;\nexport const TableDescription = forwardRef<HTMLParagraphElement, TableDescriptionProps>(\n function TableDescription({ className, ...props }, ref) {\n return (\n <p\n {...props}\n ref={ref}\n className={cx(table().description, className)}\n data-slot=\"table-description\"\n />\n );\n },\n);\n\nexport type TableHeaderProps = ComponentPropsWithoutRef<\"thead\">;\nexport const TableHeader = forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n function TableHeader({ className, ...props }, ref) {\n return (\n <TableSectionContext.Provider value=\"head\">\n <thead\n {...props}\n ref={ref}\n className={cx(table().header, className)}\n data-slot=\"table-header\"\n />\n </TableSectionContext.Provider>\n );\n },\n);\n\nexport type TableBodyProps = ComponentPropsWithoutRef<\"tbody\">;\nexport const TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(function TableBody(\n { className, ...props },\n ref,\n) {\n return (\n <TableSectionContext.Provider value=\"body\">\n <tbody {...props} ref={ref} className={cx(table().body, className)} data-slot=\"table-body\" />\n </TableSectionContext.Provider>\n );\n});\n\nexport type TableFooterProps = ComponentPropsWithoutRef<\"tfoot\">;\nexport const TableFooter = forwardRef<HTMLTableSectionElement, TableFooterProps>(\n function TableFooter({ className, ...props }, ref) {\n return (\n <TableSectionContext.Provider value=\"foot\">\n <tfoot\n {...props}\n ref={ref}\n className={cx(table().footer, className)}\n data-slot=\"table-footer\"\n />\n </TableSectionContext.Provider>\n );\n },\n);\n\nexport interface TableRowProps extends Omit<ComponentPropsWithoutRef<\"tr\">, \"id\"> {\n id: string;\n selectionDisabled?: boolean;\n selected?: boolean;\n}\n\nexport const TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(function TableRow(\n { className, id, selectionDisabled = false, selected: selectedOverride, ...props },\n ref,\n) {\n const context = useTableContext();\n const section = useContext(TableSectionContext);\n const selected = selectedOverride ?? context?.isRowSelected(id) ?? false;\n useEffect(\n () =>\n section === \"head\" ? undefined : context?.registerRow(id, { disabled: selectionDisabled }),\n [context?.registerRow, id, section, selectionDisabled],\n );\n\n return (\n <TableRowContext.Provider value={{ id, selectionDisabled }}>\n <tr\n {...props}\n id={id}\n ref={ref}\n aria-selected={selected || undefined}\n className={cx(table().row, className)}\n data-selected={selected || undefined}\n data-selection-disabled={selectionDisabled || undefined}\n data-slot=\"table-row\"\n />\n </TableRowContext.Provider>\n );\n});\n\nexport interface TableHeadProps extends Omit<ComponentPropsWithoutRef<\"th\">, \"align\"> {\n align?: TableAlignment;\n hideBelow?: TableHideBelow;\n onSort?: (direction: TableSortDirection) => void;\n sortDirection?: TableSortDirection;\n sortable?: boolean;\n}\n\nexport const TableHead = forwardRef<HTMLTableCellElement, TableHeadProps>(function TableHead(\n {\n align = \"start\",\n children,\n className,\n hideBelow,\n onSort,\n sortDirection,\n sortable = false,\n ...props\n },\n ref,\n) {\n const context = useTableContext();\n const styles = table({ align, hideBelow });\n const resolvedDirection =\n sortDirection ??\n (sortable && props.id && context?.sort?.id === props.id ? context.sort.direction : \"none\");\n const sort = () => {\n const next = cycleSortDirection(resolvedDirection);\n if (props.id) context?.requestSort(props.id, next);\n onSort?.(next);\n };\n\n return (\n <th\n {...props}\n ref={ref}\n aria-sort={sortable ? resolvedDirection : undefined}\n className={cx(styles.head, className)}\n data-align={align}\n data-hide-below={hideBelow}\n data-sort-direction={sortable ? resolvedDirection : undefined}\n data-slot=\"table-head\"\n scope={props.scope ?? \"col\"}\n >\n {sortable ? (\n <button\n aria-label={\n props[\"aria-label\"] ?? `Sort by ${typeof children === \"string\" ? children : \"column\"}`\n }\n className={styles.sortButton}\n onClick={sort}\n type=\"button\"\n >\n <span>{children}</span>\n <span aria-hidden=\"true\">\n {resolvedDirection === \"ascending\"\n ? \"↑\"\n : resolvedDirection === \"descending\"\n ? \"↓\"\n : \"↕\"}\n </span>\n </button>\n ) : (\n children\n )}\n </th>\n );\n});\n\nexport interface TableCellProps extends Omit<ComponentPropsWithoutRef<\"td\">, \"align\"> {\n align?: TableAlignment;\n hideBelow?: TableHideBelow;\n}\n\nexport const TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(function TableCell(\n { align = \"start\", className, hideBelow, ...props },\n ref,\n) {\n const styles = table({ align, hideBelow });\n return (\n <td\n {...props}\n ref={ref}\n className={cx(styles.cell, className)}\n data-align={align}\n data-hide-below={hideBelow}\n data-slot=\"table-cell\"\n />\n );\n});\n\ninterface TableSelectionInputProps {\n \"aria-label\"?: string | undefined;\n checked?: boolean | undefined;\n indeterminate?: boolean | undefined;\n inputProps?: Omit<\n ComponentPropsWithoutRef<\"input\">,\n \"checked\" | \"defaultChecked\" | \"onChange\" | \"type\"\n >;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nfunction SelectionInput({\n \"aria-label\": ariaLabel,\n checked = false,\n indeterminate = false,\n inputProps,\n onCheckedChange,\n}: TableSelectionInputProps) {\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (ref.current) ref.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n return (\n <input\n {...inputProps}\n ref={ref}\n aria-label={ariaLabel ?? inputProps?.[\"aria-label\"]}\n aria-checked={indeterminate ? \"mixed\" : checked}\n checked={checked}\n onChange={(event) => onCheckedChange?.(event.currentTarget.checked)}\n type=\"checkbox\"\n />\n );\n}\n\nexport interface TableSelectionHeaderProps\n extends Omit<ComponentPropsWithoutRef<\"th\">, \"children\">,\n TableSelectionInputProps {}\n\nexport const TableSelectionHeader = forwardRef<HTMLTableCellElement, TableSelectionHeaderProps>(\n function TableSelectionHeader(\n {\n checked: checkedOverride,\n className,\n indeterminate: indeterminateOverride,\n inputProps,\n onCheckedChange,\n ...props\n },\n ref,\n ) {\n const context = useRequiredTableContext();\n const ariaLabel = props[\"aria-label\"] ?? inputProps?.[\"aria-label\"] ?? \"Select all rows\";\n const checked = checkedOverride ?? context.allSelected;\n const indeterminate = indeterminateOverride ?? context.indeterminate;\n const disabled = Boolean(\n inputProps?.disabled ||\n (context.selectionMode !== \"multiple\" && !onCheckedChange && checkedOverride === undefined),\n );\n return (\n <th\n {...props}\n ref={ref}\n aria-label={ariaLabel}\n className={cx(table().selection, className)}\n data-slot=\"table-selection-header\"\n scope=\"col\"\n >\n <SelectionInput\n aria-label={ariaLabel}\n checked={checked}\n indeterminate={indeterminate}\n inputProps={{ ...inputProps, disabled }}\n onCheckedChange={onCheckedChange ?? context.toggleAll}\n />\n </th>\n );\n },\n);\n\nexport interface TableSelectionCellProps\n extends Omit<ComponentPropsWithoutRef<\"td\">, \"children\">,\n TableSelectionInputProps {}\n\nexport const TableSelectionCell = forwardRef<HTMLTableCellElement, TableSelectionCellProps>(\n function TableSelectionCell(\n {\n checked: checkedOverride,\n className,\n indeterminate = false,\n inputProps,\n onCheckedChange,\n ...props\n },\n ref,\n ) {\n const context = useRequiredTableContext();\n const row = useTableRowContext();\n const id = row?.id ?? \"\";\n const ariaLabel = props[\"aria-label\"] ?? inputProps?.[\"aria-label\"] ?? \"Select row\";\n const checked = checkedOverride ?? context.isRowSelected(id);\n const disabled = Boolean(\n inputProps?.disabled ||\n row?.selectionDisabled ||\n (context.selectionMode === \"none\" && !onCheckedChange && checkedOverride === undefined),\n );\n return (\n <td\n {...props}\n ref={ref}\n className={cx(table().selection, className)}\n data-slot=\"table-selection-cell\"\n >\n <SelectionInput\n aria-label={ariaLabel}\n checked={checked}\n indeterminate={indeterminate}\n inputProps={{ ...inputProps, disabled }}\n onCheckedChange={onCheckedChange ?? ((next) => context.toggleRow(id, next))}\n />\n </td>\n );\n },\n);\n\nexport interface TableStateProps extends Omit<ComponentPropsWithoutRef<\"tr\">, \"children\"> {\n children?: ReactNode;\n colSpan?: number;\n}\n\nconst TableStateRow = forwardRef<\n HTMLTableRowElement,\n TableStateProps & { live?: \"polite\" | \"assertive\" }\n>(function TableStateRow({ children, className, colSpan = 1, live = \"polite\", ...props }, ref) {\n const name = live === \"assertive\" ? \"error\" : \"loading\";\n return (\n <tr {...props} ref={ref} className={cx(table().row, className)} data-slot={`table-${name}-row`}>\n <td aria-live={live} className={table().empty} colSpan={colSpan} data-slot={`table-${name}`}>\n {children}\n </td>\n </tr>\n );\n});\n\nexport interface TableEmptyProps extends TableStateProps {}\nexport type TableLoadingProps = TableStateProps;\nexport type TableErrorProps = TableStateProps;\nexport const TableEmpty = forwardRef<HTMLTableRowElement, TableEmptyProps>(function TableEmpty(\n { children = \"No results found.\", className, colSpan = 1, ...props },\n ref,\n) {\n return (\n <tr {...props} ref={ref} className={cx(table().row, className)} data-slot=\"table-empty-row\">\n <td className={table().empty} colSpan={colSpan} data-slot=\"table-empty\">\n {children}\n </td>\n </tr>\n );\n});\n\nexport const TableLoading = forwardRef<HTMLTableRowElement, TableStateProps>(function TableLoading(\n { children = \"Loading…\", ...props },\n ref,\n) {\n return (\n <TableStateRow {...props} ref={ref} live=\"polite\">\n {children}\n </TableStateRow>\n );\n});\n\nexport const TableError = forwardRef<HTMLTableRowElement, TableStateProps>(function TableError(\n { children = \"Something went wrong.\", ...props },\n ref,\n) {\n return (\n <TableStateRow {...props} ref={ref} live=\"assertive\">\n {children}\n </TableStateRow>\n );\n});\n\nexport const Table = {\n Container: TableContainer,\n Root: TableRoot,\n Caption: TableCaption,\n Description: TableDescription,\n Header: TableHeader,\n Body: TableBody,\n Footer: TableFooter,\n Row: TableRow,\n Head: TableHead,\n Cell: TableCell,\n SelectionHeader: TableSelectionHeader,\n SelectionCell: TableSelectionCell,\n Empty: TableEmpty,\n Loading: TableLoading,\n Error: TableError,\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","names":[],"sources":["../../../src/components/table/table.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { table } from \"../../styled-system/recipes\";\n\nexport type TableSortDirection = \"none\" | \"ascending\" | \"descending\";\nexport type TableDensity = \"compact\" | \"comfortable\";\nexport type TableSelectionMode = \"none\" | \"single\" | \"multiple\";\nexport type TableStatus = \"idle\" | \"loading\" | \"empty\" | \"error\" | \"ready\";\nexport type TableAlignment = \"start\" | \"center\" | \"end\";\nexport type TableHideBelow = \"sm\" | \"md\" | \"lg\";\n\nexport interface TableSortState {\n id: string;\n direction: Exclude<TableSortDirection, \"none\">;\n}\n\ninterface TableRowRecord {\n disabled: boolean;\n}\n\ninterface TableContextValue {\n allSelected: boolean;\n indeterminate: boolean;\n isRowSelected: (id: string) => boolean;\n registerRow: (id: string, row: TableRowRecord) => () => void;\n requestSort: (id: string, direction?: TableSortDirection) => void;\n selectedRowIds: ReadonlySet<string>;\n selectionMode: TableSelectionMode;\n toggleAll: (checked: boolean) => void;\n toggleRow: (id: string, checked: boolean) => void;\n sort: TableSortState | null;\n status: TableStatus;\n}\n\ninterface TableRowContextValue {\n id: string;\n selectionDisabled: boolean;\n}\n\ntype TableSection = \"head\" | \"body\" | \"foot\";\n\nconst TableContext = createContext<TableContextValue | null>(null);\nconst TableRowContext = createContext<TableRowContextValue | null>(null);\nconst TableSectionContext = createContext<TableSection>(\"body\");\n\nfunction useTableContext() {\n return useContext(TableContext);\n}\n\nfunction useRequiredTableContext() {\n const context = useTableContext();\n if (!context) throw new Error(\"Table parts must be rendered inside Table.Root.\");\n return context;\n}\n\nfunction useTableRowContext() {\n return useContext(TableRowContext);\n}\n\nfunction cycleSortDirection(direction: TableSortDirection): TableSortDirection {\n if (direction === \"none\") return \"ascending\";\n if (direction === \"ascending\") return \"descending\";\n return \"none\";\n}\n\nexport interface TableContainerProps extends ComponentPropsWithoutRef<\"div\"> {}\n\nexport const TableContainer = forwardRef<HTMLDivElement, TableContainerProps>(\n function TableContainer({ className, ...props }, ref) {\n return (\n <div\n {...props}\n ref={ref}\n className={cx(table().container, className)}\n data-jaci-component=\"table\"\n data-slot=\"table-container\"\n />\n );\n },\n);\n\nexport interface TableRootProps extends ComponentPropsWithoutRef<\"table\"> {\n bordered?: boolean;\n density?: TableDensity;\n defaultSelectedRowIds?: readonly string[];\n defaultSort?: TableSortState | null;\n onSelectionChange?: (rowIds: string[]) => void;\n onSortChange?: (sort: TableSortState | null) => void;\n selectedRowIds?: readonly string[];\n selectionMode?: TableSelectionMode;\n sort?: TableSortState | null;\n status?: TableStatus;\n stickyHeader?: boolean;\n striped?: boolean;\n}\n\nexport const TableRoot = forwardRef<HTMLTableElement, TableRootProps>(function TableRoot(\n {\n bordered = false,\n className,\n defaultSelectedRowIds = [],\n defaultSort = null,\n density = \"comfortable\",\n onSelectionChange,\n onSortChange,\n selectedRowIds: controlledSelectedRowIds,\n selectionMode = \"none\",\n sort: controlledSort,\n status = \"idle\",\n stickyHeader = false,\n striped = false,\n ...props\n },\n ref,\n) {\n const [uncontrolledSelectedRowIds, setUncontrolledSelectedRowIds] = useState(\n () => new Set(defaultSelectedRowIds),\n );\n const [uncontrolledSort, setUncontrolledSort] = useState<TableSortState | null>(defaultSort);\n const [rows, setRows] = useState<Map<string, TableRowRecord>>(() => new Map());\n const selectedRowIds = useMemo(\n () => new Set(controlledSelectedRowIds ?? uncontrolledSelectedRowIds),\n [controlledSelectedRowIds, uncontrolledSelectedRowIds],\n );\n const sort = controlledSort === undefined ? uncontrolledSort : controlledSort;\n const selectableRows = useMemo(\n () => [...rows.entries()].filter(([, row]) => !row.disabled).map(([id]) => id),\n [rows],\n );\n const selectedSelectableRows = selectableRows.filter((id) => selectedRowIds.has(id));\n const allSelected =\n selectableRows.length > 0 && selectedSelectableRows.length === selectableRows.length;\n const indeterminate = selectedSelectableRows.length > 0 && !allSelected;\n const styles = table({ bordered, density, stickyHeader, striped });\n\n const updateSelection = useCallback(\n (next: Set<string>) => {\n const normalized = selectionMode === \"single\" ? new Set([...next].slice(-1)) : next;\n if (controlledSelectedRowIds === undefined) setUncontrolledSelectedRowIds(normalized);\n onSelectionChange?.([...normalized]);\n },\n [controlledSelectedRowIds, onSelectionChange, selectionMode],\n );\n const toggleRow = useCallback(\n (id: string, checked: boolean) => {\n const row = rows.get(id);\n if (selectionMode === \"none\" || row?.disabled) return;\n const next = new Set(selectedRowIds);\n if (selectionMode === \"single\") next.clear();\n if (checked) next.add(id);\n else next.delete(id);\n updateSelection(next);\n },\n [rows, selectedRowIds, selectionMode, updateSelection],\n );\n const toggleAll = useCallback(\n (checked: boolean) => {\n if (selectionMode !== \"multiple\") return;\n updateSelection(new Set(checked ? selectableRows : []));\n },\n [selectableRows, selectionMode, updateSelection],\n );\n const registerRow = useCallback((id: string, row: TableRowRecord) => {\n setRows((current) => {\n const next = new Map(current);\n next.set(id, row);\n return next;\n });\n return () =>\n setRows((current) => {\n if (!current.has(id)) return current;\n const next = new Map(current);\n next.delete(id);\n return next;\n });\n }, []);\n const requestSort = useCallback(\n (id: string, requestedDirection?: TableSortDirection) => {\n const currentDirection = sort?.id === id ? sort.direction : \"none\";\n const direction = requestedDirection ?? cycleSortDirection(currentDirection);\n const nextSort = direction === \"none\" ? null : { id, direction };\n if (controlledSort === undefined) setUncontrolledSort(nextSort);\n onSortChange?.(nextSort);\n },\n [controlledSort, onSortChange, sort],\n );\n\n const context = useMemo<TableContextValue>(\n () => ({\n allSelected,\n indeterminate,\n isRowSelected: (id) => selectedRowIds.has(id),\n registerRow,\n requestSort,\n selectedRowIds,\n selectionMode,\n status,\n toggleAll,\n toggleRow,\n sort,\n }),\n [\n allSelected,\n indeterminate,\n registerRow,\n requestSort,\n selectedRowIds,\n selectionMode,\n sort,\n status,\n toggleAll,\n toggleRow,\n ],\n );\n\n return (\n <TableContext.Provider value={context}>\n <table\n {...props}\n ref={ref}\n aria-busy={props[\"aria-busy\"] ?? (status === \"loading\" || undefined)}\n className={cx(styles.root, className)}\n data-jaci-component=\"table\"\n data-status={status}\n data-slot=\"table\"\n />\n </TableContext.Provider>\n );\n});\n\nexport type TableCaptionProps = ComponentPropsWithoutRef<\"caption\">;\nexport const TableCaption = forwardRef<HTMLTableCaptionElement, TableCaptionProps>(\n function TableCaption({ className, ...props }, ref) {\n return (\n <caption\n {...props}\n ref={ref}\n className={cx(table().caption, className)}\n data-slot=\"table-caption\"\n />\n );\n },\n);\n\nexport type TableDescriptionProps = ComponentPropsWithoutRef<\"p\">;\nexport const TableDescription = forwardRef<HTMLParagraphElement, TableDescriptionProps>(\n function TableDescription({ className, ...props }, ref) {\n return (\n <p\n {...props}\n ref={ref}\n className={cx(table().description, className)}\n data-slot=\"table-description\"\n />\n );\n },\n);\n\nexport type TableHeaderProps = ComponentPropsWithoutRef<\"thead\">;\nexport const TableHeader = forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n function TableHeader({ className, ...props }, ref) {\n return (\n <TableSectionContext.Provider value=\"head\">\n <thead\n {...props}\n ref={ref}\n className={cx(table().header, className)}\n data-slot=\"table-header\"\n />\n </TableSectionContext.Provider>\n );\n },\n);\n\nexport type TableBodyProps = ComponentPropsWithoutRef<\"tbody\">;\nexport const TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(function TableBody(\n { className, ...props },\n ref,\n) {\n return (\n <TableSectionContext.Provider value=\"body\">\n <tbody {...props} ref={ref} className={cx(table().body, className)} data-slot=\"table-body\" />\n </TableSectionContext.Provider>\n );\n});\n\nexport type TableFooterProps = ComponentPropsWithoutRef<\"tfoot\">;\nexport const TableFooter = forwardRef<HTMLTableSectionElement, TableFooterProps>(\n function TableFooter({ className, ...props }, ref) {\n return (\n <TableSectionContext.Provider value=\"foot\">\n <tfoot\n {...props}\n ref={ref}\n className={cx(table().footer, className)}\n data-slot=\"table-footer\"\n />\n </TableSectionContext.Provider>\n );\n },\n);\n\nexport interface TableRowProps extends Omit<ComponentPropsWithoutRef<\"tr\">, \"id\"> {\n id: string;\n selectionDisabled?: boolean;\n selected?: boolean;\n}\n\nexport const TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(function TableRow(\n { className, id, selectionDisabled = false, selected: selectedOverride, ...props },\n ref,\n) {\n const context = useTableContext();\n const section = useContext(TableSectionContext);\n const selected = selectedOverride ?? context?.isRowSelected(id) ?? false;\n useEffect(\n () =>\n section === \"head\" ? undefined : context?.registerRow(id, { disabled: selectionDisabled }),\n [context?.registerRow, id, section, selectionDisabled],\n );\n\n return (\n <TableRowContext.Provider value={{ id, selectionDisabled }}>\n <tr\n {...props}\n id={id}\n ref={ref}\n aria-selected={selected || undefined}\n className={cx(table().row, className)}\n data-selected={selected || undefined}\n data-selection-disabled={selectionDisabled || undefined}\n data-slot=\"table-row\"\n />\n </TableRowContext.Provider>\n );\n});\n\nexport interface TableHeadProps extends Omit<ComponentPropsWithoutRef<\"th\">, \"align\"> {\n align?: TableAlignment;\n hideBelow?: TableHideBelow;\n onSort?: (direction: TableSortDirection) => void;\n sortDirection?: TableSortDirection;\n sortable?: boolean;\n}\n\nexport const TableHead = forwardRef<HTMLTableCellElement, TableHeadProps>(function TableHead(\n {\n align = \"start\",\n children,\n className,\n hideBelow,\n onSort,\n sortDirection,\n sortable = false,\n ...props\n },\n ref,\n) {\n const context = useTableContext();\n const styles = table({ align, hideBelow });\n const resolvedDirection =\n sortDirection ??\n (sortable && props.id && context?.sort?.id === props.id ? context.sort.direction : \"none\");\n const sort = () => {\n const next = cycleSortDirection(resolvedDirection);\n if (props.id) context?.requestSort(props.id, next);\n onSort?.(next);\n };\n\n return (\n <th\n {...props}\n ref={ref}\n aria-sort={sortable ? resolvedDirection : undefined}\n className={cx(styles.head, className)}\n data-align={align}\n data-hide-below={hideBelow}\n data-sort-direction={sortable ? resolvedDirection : undefined}\n data-slot=\"table-head\"\n scope={props.scope ?? \"col\"}\n >\n {sortable ? (\n <button\n aria-label={\n props[\"aria-label\"] ?? `Sort by ${typeof children === \"string\" ? children : \"column\"}`\n }\n className={styles.sortButton}\n onClick={sort}\n type=\"button\"\n >\n <span>{children}</span>\n <span aria-hidden=\"true\">\n {resolvedDirection === \"ascending\"\n ? \"↑\"\n : resolvedDirection === \"descending\"\n ? \"↓\"\n : \"↕\"}\n </span>\n </button>\n ) : (\n children\n )}\n </th>\n );\n});\n\nexport interface TableCellProps extends Omit<ComponentPropsWithoutRef<\"td\">, \"align\"> {\n align?: TableAlignment;\n hideBelow?: TableHideBelow;\n}\n\nexport const TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(function TableCell(\n { align = \"start\", className, hideBelow, ...props },\n ref,\n) {\n const styles = table({ align, hideBelow });\n return (\n <td\n {...props}\n ref={ref}\n className={cx(styles.cell, className)}\n data-align={align}\n data-hide-below={hideBelow}\n data-slot=\"table-cell\"\n />\n );\n});\n\ninterface TableSelectionInputProps {\n \"aria-label\"?: string | undefined;\n checked?: boolean | undefined;\n indeterminate?: boolean | undefined;\n inputProps?: Omit<\n ComponentPropsWithoutRef<\"input\">,\n \"checked\" | \"defaultChecked\" | \"onChange\" | \"type\"\n >;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nfunction SelectionInput({\n \"aria-label\": ariaLabel,\n checked = false,\n indeterminate = false,\n inputProps,\n onCheckedChange,\n}: TableSelectionInputProps) {\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (ref.current) ref.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n return (\n <input\n {...inputProps}\n ref={ref}\n aria-label={ariaLabel ?? inputProps?.[\"aria-label\"]}\n aria-checked={indeterminate ? \"mixed\" : checked}\n checked={checked}\n onChange={(event) => onCheckedChange?.(event.currentTarget.checked)}\n type=\"checkbox\"\n />\n );\n}\n\nexport interface TableSelectionHeaderProps\n extends Omit<ComponentPropsWithoutRef<\"th\">, \"children\">,\n TableSelectionInputProps {}\n\nexport const TableSelectionHeader = forwardRef<HTMLTableCellElement, TableSelectionHeaderProps>(\n function TableSelectionHeader(\n {\n checked: checkedOverride,\n className,\n indeterminate: indeterminateOverride,\n inputProps,\n onCheckedChange,\n ...props\n },\n ref,\n ) {\n const context = useRequiredTableContext();\n const ariaLabel = props[\"aria-label\"] ?? inputProps?.[\"aria-label\"] ?? \"Select all rows\";\n const checked = checkedOverride ?? context.allSelected;\n const indeterminate = indeterminateOverride ?? context.indeterminate;\n const disabled = Boolean(\n inputProps?.disabled ||\n (context.selectionMode !== \"multiple\" && !onCheckedChange && checkedOverride === undefined),\n );\n return (\n <th\n {...props}\n ref={ref}\n aria-label={ariaLabel}\n className={cx(table().selection, className)}\n data-slot=\"table-selection-header\"\n scope=\"col\"\n >\n <SelectionInput\n aria-label={ariaLabel}\n checked={checked}\n indeterminate={indeterminate}\n inputProps={{ ...inputProps, disabled }}\n onCheckedChange={onCheckedChange ?? context.toggleAll}\n />\n </th>\n );\n },\n);\n\nexport interface TableSelectionCellProps\n extends Omit<ComponentPropsWithoutRef<\"td\">, \"children\">,\n TableSelectionInputProps {}\n\nexport const TableSelectionCell = forwardRef<HTMLTableCellElement, TableSelectionCellProps>(\n function TableSelectionCell(\n {\n checked: checkedOverride,\n className,\n indeterminate = false,\n inputProps,\n onCheckedChange,\n ...props\n },\n ref,\n ) {\n const context = useRequiredTableContext();\n const row = useTableRowContext();\n const id = row?.id ?? \"\";\n const ariaLabel = props[\"aria-label\"] ?? inputProps?.[\"aria-label\"] ?? \"Select row\";\n const checked = checkedOverride ?? context.isRowSelected(id);\n const disabled = Boolean(\n inputProps?.disabled ||\n row?.selectionDisabled ||\n (context.selectionMode === \"none\" && !onCheckedChange && checkedOverride === undefined),\n );\n return (\n <td\n {...props}\n ref={ref}\n className={cx(table().selection, className)}\n data-slot=\"table-selection-cell\"\n >\n <SelectionInput\n aria-label={ariaLabel}\n checked={checked}\n indeterminate={indeterminate}\n inputProps={{ ...inputProps, disabled }}\n onCheckedChange={onCheckedChange ?? ((next) => context.toggleRow(id, next))}\n />\n </td>\n );\n },\n);\n\nexport interface TableStateProps extends Omit<ComponentPropsWithoutRef<\"tr\">, \"children\"> {\n children?: ReactNode;\n colSpan?: number;\n}\n\nconst TableStateRow = forwardRef<\n HTMLTableRowElement,\n TableStateProps & { live?: \"polite\" | \"assertive\" }\n>(function TableStateRow({ children, className, colSpan = 1, live = \"polite\", ...props }, ref) {\n const name = live === \"assertive\" ? \"error\" : \"loading\";\n return (\n <tr {...props} ref={ref} className={cx(table().row, className)} data-slot={`table-${name}-row`}>\n <td aria-live={live} className={table().empty} colSpan={colSpan} data-slot={`table-${name}`}>\n {children}\n </td>\n </tr>\n );\n});\n\nexport interface TableEmptyProps extends TableStateProps {}\nexport type TableLoadingProps = TableStateProps;\nexport type TableErrorProps = TableStateProps;\nexport const TableEmpty = forwardRef<HTMLTableRowElement, TableEmptyProps>(function TableEmpty(\n { children = \"No results found.\", className, colSpan = 1, ...props },\n ref,\n) {\n return (\n <tr {...props} ref={ref} className={cx(table().row, className)} data-slot=\"table-empty-row\">\n <td className={table().empty} colSpan={colSpan} data-slot=\"table-empty\">\n {children}\n </td>\n </tr>\n );\n});\n\nexport const TableLoading = forwardRef<HTMLTableRowElement, TableStateProps>(function TableLoading(\n { children = \"Loading…\", ...props },\n ref,\n) {\n return (\n <TableStateRow {...props} ref={ref} live=\"polite\">\n {children}\n </TableStateRow>\n );\n});\n\nexport const TableError = forwardRef<HTMLTableRowElement, TableStateProps>(function TableError(\n { children = \"Something went wrong.\", ...props },\n ref,\n) {\n return (\n <TableStateRow {...props} ref={ref} live=\"assertive\">\n {children}\n </TableStateRow>\n );\n});\n\nexport const Table = {\n Container: TableContainer,\n Root: TableRoot,\n Caption: TableCaption,\n Description: TableDescription,\n Header: TableHeader,\n Body: TableBody,\n Footer: TableFooter,\n Row: TableRow,\n Head: TableHead,\n Cell: TableCell,\n SelectionHeader: TableSelectionHeader,\n SelectionCell: TableSelectionCell,\n Empty: TableEmpty,\n Loading: TableLoading,\n Error: TableError,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table.js","names":[],"sources":["../../../src/components/table/table.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { table } from \"../../styled-system/recipes\";\n\nexport type TableSortDirection = \"none\" | \"ascending\" | \"descending\";\nexport type TableDensity = \"compact\" | \"comfortable\";\nexport type TableSelectionMode = \"none\" | \"single\" | \"multiple\";\nexport type TableStatus = \"idle\" | \"loading\" | \"empty\" | \"error\" | \"ready\";\nexport type TableAlignment = \"start\" | \"center\" | \"end\";\nexport type TableHideBelow = \"sm\" | \"md\" | \"lg\";\n\nexport interface TableSortState {\n id: string;\n direction: Exclude<TableSortDirection, \"none\">;\n}\n\ninterface TableRowRecord {\n disabled: boolean;\n}\n\ninterface TableContextValue {\n allSelected: boolean;\n indeterminate: boolean;\n isRowSelected: (id: string) => boolean;\n registerRow: (id: string, row: TableRowRecord) => () => void;\n requestSort: (id: string, direction?: TableSortDirection) => void;\n selectedRowIds: ReadonlySet<string>;\n selectionMode: TableSelectionMode;\n toggleAll: (checked: boolean) => void;\n toggleRow: (id: string, checked: boolean) => void;\n sort: TableSortState | null;\n status: TableStatus;\n}\n\ninterface TableRowContextValue {\n id: string;\n selectionDisabled: boolean;\n}\n\ntype TableSection = \"head\" | \"body\" | \"foot\";\n\nconst TableContext = createContext<TableContextValue | null>(null);\nconst TableRowContext = createContext<TableRowContextValue | null>(null);\nconst TableSectionContext = createContext<TableSection>(\"body\");\n\nfunction useTableContext() {\n return useContext(TableContext);\n}\n\nfunction useRequiredTableContext() {\n const context = useTableContext();\n if (!context) throw new Error(\"Table parts must be rendered inside Table.Root.\");\n return context;\n}\n\nfunction useTableRowContext() {\n return useContext(TableRowContext);\n}\n\nfunction cycleSortDirection(direction: TableSortDirection): TableSortDirection {\n if (direction === \"none\") return \"ascending\";\n if (direction === \"ascending\") return \"descending\";\n return \"none\";\n}\n\nexport interface TableContainerProps extends ComponentPropsWithoutRef<\"div\"> {}\n\nexport const TableContainer = forwardRef<HTMLDivElement, TableContainerProps>(\n function TableContainer({ className, ...props }, ref) {\n return (\n <div\n {...props}\n ref={ref}\n className={cx(table().container, className)}\n data-jaci-component=\"table\"\n data-slot=\"table-container\"\n />\n );\n },\n);\n\nexport interface TableRootProps extends ComponentPropsWithoutRef<\"table\"> {\n bordered?: boolean;\n density?: TableDensity;\n defaultSelectedRowIds?: readonly string[];\n defaultSort?: TableSortState | null;\n onSelectionChange?: (rowIds: string[]) => void;\n onSortChange?: (sort: TableSortState | null) => void;\n selectedRowIds?: readonly string[];\n selectionMode?: TableSelectionMode;\n sort?: TableSortState | null;\n status?: TableStatus;\n stickyHeader?: boolean;\n striped?: boolean;\n}\n\nexport const TableRoot = forwardRef<HTMLTableElement, TableRootProps>(function TableRoot(\n {\n bordered = false,\n className,\n defaultSelectedRowIds = [],\n defaultSort = null,\n density = \"comfortable\",\n onSelectionChange,\n onSortChange,\n selectedRowIds: controlledSelectedRowIds,\n selectionMode = \"none\",\n sort: controlledSort,\n status = \"idle\",\n stickyHeader = false,\n striped = false,\n ...props\n },\n ref,\n) {\n const [uncontrolledSelectedRowIds, setUncontrolledSelectedRowIds] = useState(\n () => new Set(defaultSelectedRowIds),\n );\n const [uncontrolledSort, setUncontrolledSort] = useState<TableSortState | null>(defaultSort);\n const [rows, setRows] = useState<Map<string, TableRowRecord>>(() => new Map());\n const selectedRowIds = useMemo(\n () => new Set(controlledSelectedRowIds ?? uncontrolledSelectedRowIds),\n [controlledSelectedRowIds, uncontrolledSelectedRowIds],\n );\n const sort = controlledSort === undefined ? uncontrolledSort : controlledSort;\n const selectableRows = useMemo(\n () => [...rows.entries()].filter(([, row]) => !row.disabled).map(([id]) => id),\n [rows],\n );\n const selectedSelectableRows = selectableRows.filter((id) => selectedRowIds.has(id));\n const allSelected =\n selectableRows.length > 0 && selectedSelectableRows.length === selectableRows.length;\n const indeterminate = selectedSelectableRows.length > 0 && !allSelected;\n const styles = table({ bordered, density, stickyHeader, striped });\n\n const updateSelection = useCallback(\n (next: Set<string>) => {\n const normalized = selectionMode === \"single\" ? new Set([...next].slice(-1)) : next;\n if (controlledSelectedRowIds === undefined) setUncontrolledSelectedRowIds(normalized);\n onSelectionChange?.([...normalized]);\n },\n [controlledSelectedRowIds, onSelectionChange, selectionMode],\n );\n const toggleRow = useCallback(\n (id: string, checked: boolean) => {\n const row = rows.get(id);\n if (selectionMode === \"none\" || row?.disabled) return;\n const next = new Set(selectedRowIds);\n if (selectionMode === \"single\") next.clear();\n if (checked) next.add(id);\n else next.delete(id);\n updateSelection(next);\n },\n [rows, selectedRowIds, selectionMode, updateSelection],\n );\n const toggleAll = useCallback(\n (checked: boolean) => {\n if (selectionMode !== \"multiple\") return;\n updateSelection(new Set(checked ? selectableRows : []));\n },\n [selectableRows, selectionMode, updateSelection],\n );\n const registerRow = useCallback((id: string, row: TableRowRecord) => {\n setRows((current) => {\n const next = new Map(current);\n next.set(id, row);\n return next;\n });\n return () =>\n setRows((current) => {\n if (!current.has(id)) return current;\n const next = new Map(current);\n next.delete(id);\n return next;\n });\n }, []);\n const requestSort = useCallback(\n (id: string, requestedDirection?: TableSortDirection) => {\n const currentDirection = sort?.id === id ? sort.direction : \"none\";\n const direction = requestedDirection ?? cycleSortDirection(currentDirection);\n const nextSort = direction === \"none\" ? null : { id, direction };\n if (controlledSort === undefined) setUncontrolledSort(nextSort);\n onSortChange?.(nextSort);\n },\n [controlledSort, onSortChange, sort],\n );\n\n const context = useMemo<TableContextValue>(\n () => ({\n allSelected,\n indeterminate,\n isRowSelected: (id) => selectedRowIds.has(id),\n registerRow,\n requestSort,\n selectedRowIds,\n selectionMode,\n status,\n toggleAll,\n toggleRow,\n sort,\n }),\n [\n allSelected,\n indeterminate,\n registerRow,\n requestSort,\n selectedRowIds,\n selectionMode,\n sort,\n status,\n toggleAll,\n toggleRow,\n ],\n );\n\n return (\n <TableContext.Provider value={context}>\n <table\n {...props}\n ref={ref}\n aria-busy={props[\"aria-busy\"] ?? (status === \"loading\" || undefined)}\n className={cx(styles.root, className)}\n data-jaci-component=\"table\"\n data-status={status}\n data-slot=\"table\"\n />\n </TableContext.Provider>\n );\n});\n\nexport type TableCaptionProps = ComponentPropsWithoutRef<\"caption\">;\nexport const TableCaption = forwardRef<HTMLTableCaptionElement, TableCaptionProps>(\n function TableCaption({ className, ...props }, ref) {\n return (\n <caption\n {...props}\n ref={ref}\n className={cx(table().caption, className)}\n data-slot=\"table-caption\"\n />\n );\n },\n);\n\nexport type TableDescriptionProps = ComponentPropsWithoutRef<\"p\">;\nexport const TableDescription = forwardRef<HTMLParagraphElement, TableDescriptionProps>(\n function TableDescription({ className, ...props }, ref) {\n return (\n <p\n {...props}\n ref={ref}\n className={cx(table().description, className)}\n data-slot=\"table-description\"\n />\n );\n },\n);\n\nexport type TableHeaderProps = ComponentPropsWithoutRef<\"thead\">;\nexport const TableHeader = forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n function TableHeader({ className, ...props }, ref) {\n return (\n <TableSectionContext.Provider value=\"head\">\n <thead\n {...props}\n ref={ref}\n className={cx(table().header, className)}\n data-slot=\"table-header\"\n />\n </TableSectionContext.Provider>\n );\n },\n);\n\nexport type TableBodyProps = ComponentPropsWithoutRef<\"tbody\">;\nexport const TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(function TableBody(\n { className, ...props },\n ref,\n) {\n return (\n <TableSectionContext.Provider value=\"body\">\n <tbody {...props} ref={ref} className={cx(table().body, className)} data-slot=\"table-body\" />\n </TableSectionContext.Provider>\n );\n});\n\nexport type TableFooterProps = ComponentPropsWithoutRef<\"tfoot\">;\nexport const TableFooter = forwardRef<HTMLTableSectionElement, TableFooterProps>(\n function TableFooter({ className, ...props }, ref) {\n return (\n <TableSectionContext.Provider value=\"foot\">\n <tfoot\n {...props}\n ref={ref}\n className={cx(table().footer, className)}\n data-slot=\"table-footer\"\n />\n </TableSectionContext.Provider>\n );\n },\n);\n\nexport interface TableRowProps extends Omit<ComponentPropsWithoutRef<\"tr\">, \"id\"> {\n id: string;\n selectionDisabled?: boolean;\n selected?: boolean;\n}\n\nexport const TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(function TableRow(\n { className, id, selectionDisabled = false, selected: selectedOverride, ...props },\n ref,\n) {\n const context = useTableContext();\n const section = useContext(TableSectionContext);\n const selected = selectedOverride ?? context?.isRowSelected(id) ?? false;\n useEffect(\n () =>\n section === \"head\" ? undefined : context?.registerRow(id, { disabled: selectionDisabled }),\n [context?.registerRow, id, section, selectionDisabled],\n );\n\n return (\n <TableRowContext.Provider value={{ id, selectionDisabled }}>\n <tr\n {...props}\n id={id}\n ref={ref}\n aria-selected={selected || undefined}\n className={cx(table().row, className)}\n data-selected={selected || undefined}\n data-selection-disabled={selectionDisabled || undefined}\n data-slot=\"table-row\"\n />\n </TableRowContext.Provider>\n );\n});\n\nexport interface TableHeadProps extends Omit<ComponentPropsWithoutRef<\"th\">, \"align\"> {\n align?: TableAlignment;\n hideBelow?: TableHideBelow;\n onSort?: (direction: TableSortDirection) => void;\n sortDirection?: TableSortDirection;\n sortable?: boolean;\n}\n\nexport const TableHead = forwardRef<HTMLTableCellElement, TableHeadProps>(function TableHead(\n {\n align = \"start\",\n children,\n className,\n hideBelow,\n onSort,\n sortDirection,\n sortable = false,\n ...props\n },\n ref,\n) {\n const context = useTableContext();\n const styles = table({ align, hideBelow });\n const resolvedDirection =\n sortDirection ??\n (sortable && props.id && context?.sort?.id === props.id ? context.sort.direction : \"none\");\n const sort = () => {\n const next = cycleSortDirection(resolvedDirection);\n if (props.id) context?.requestSort(props.id, next);\n onSort?.(next);\n };\n\n return (\n <th\n {...props}\n ref={ref}\n aria-sort={sortable ? resolvedDirection : undefined}\n className={cx(styles.head, className)}\n data-align={align}\n data-hide-below={hideBelow}\n data-sort-direction={sortable ? resolvedDirection : undefined}\n data-slot=\"table-head\"\n scope={props.scope ?? \"col\"}\n >\n {sortable ? (\n <button\n aria-label={\n props[\"aria-label\"] ?? `Sort by ${typeof children === \"string\" ? children : \"column\"}`\n }\n className={styles.sortButton}\n onClick={sort}\n type=\"button\"\n >\n <span>{children}</span>\n <span aria-hidden=\"true\">\n {resolvedDirection === \"ascending\"\n ? \"↑\"\n : resolvedDirection === \"descending\"\n ? \"↓\"\n : \"↕\"}\n </span>\n </button>\n ) : (\n children\n )}\n </th>\n );\n});\n\nexport interface TableCellProps extends Omit<ComponentPropsWithoutRef<\"td\">, \"align\"> {\n align?: TableAlignment;\n hideBelow?: TableHideBelow;\n}\n\nexport const TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(function TableCell(\n { align = \"start\", className, hideBelow, ...props },\n ref,\n) {\n const styles = table({ align, hideBelow });\n return (\n <td\n {...props}\n ref={ref}\n className={cx(styles.cell, className)}\n data-align={align}\n data-hide-below={hideBelow}\n data-slot=\"table-cell\"\n />\n );\n});\n\ninterface TableSelectionInputProps {\n \"aria-label\"?: string | undefined;\n checked?: boolean | undefined;\n indeterminate?: boolean | undefined;\n inputProps?: Omit<\n ComponentPropsWithoutRef<\"input\">,\n \"checked\" | \"defaultChecked\" | \"onChange\" | \"type\"\n >;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nfunction SelectionInput({\n \"aria-label\": ariaLabel,\n checked = false,\n indeterminate = false,\n inputProps,\n onCheckedChange,\n}: TableSelectionInputProps) {\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (ref.current) ref.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n return (\n <input\n {...inputProps}\n ref={ref}\n aria-label={ariaLabel ?? inputProps?.[\"aria-label\"]}\n aria-checked={indeterminate ? \"mixed\" : checked}\n checked={checked}\n onChange={(event) => onCheckedChange?.(event.currentTarget.checked)}\n type=\"checkbox\"\n />\n );\n}\n\nexport interface TableSelectionHeaderProps\n extends Omit<ComponentPropsWithoutRef<\"th\">, \"children\">,\n TableSelectionInputProps {}\n\nexport const TableSelectionHeader = forwardRef<HTMLTableCellElement, TableSelectionHeaderProps>(\n function TableSelectionHeader(\n {\n checked: checkedOverride,\n className,\n indeterminate: indeterminateOverride,\n inputProps,\n onCheckedChange,\n ...props\n },\n ref,\n ) {\n const context = useRequiredTableContext();\n const ariaLabel = props[\"aria-label\"] ?? inputProps?.[\"aria-label\"] ?? \"Select all rows\";\n const checked = checkedOverride ?? context.allSelected;\n const indeterminate = indeterminateOverride ?? context.indeterminate;\n const disabled = Boolean(\n inputProps?.disabled ||\n (context.selectionMode !== \"multiple\" && !onCheckedChange && checkedOverride === undefined),\n );\n return (\n <th\n {...props}\n ref={ref}\n aria-label={ariaLabel}\n className={cx(table().selection, className)}\n data-slot=\"table-selection-header\"\n scope=\"col\"\n >\n <SelectionInput\n aria-label={ariaLabel}\n checked={checked}\n indeterminate={indeterminate}\n inputProps={{ ...inputProps, disabled }}\n onCheckedChange={onCheckedChange ?? context.toggleAll}\n />\n </th>\n );\n },\n);\n\nexport interface TableSelectionCellProps\n extends Omit<ComponentPropsWithoutRef<\"td\">, \"children\">,\n TableSelectionInputProps {}\n\nexport const TableSelectionCell = forwardRef<HTMLTableCellElement, TableSelectionCellProps>(\n function TableSelectionCell(\n {\n checked: checkedOverride,\n className,\n indeterminate = false,\n inputProps,\n onCheckedChange,\n ...props\n },\n ref,\n ) {\n const context = useRequiredTableContext();\n const row = useTableRowContext();\n const id = row?.id ?? \"\";\n const ariaLabel = props[\"aria-label\"] ?? inputProps?.[\"aria-label\"] ?? \"Select row\";\n const checked = checkedOverride ?? context.isRowSelected(id);\n const disabled = Boolean(\n inputProps?.disabled ||\n row?.selectionDisabled ||\n (context.selectionMode === \"none\" && !onCheckedChange && checkedOverride === undefined),\n );\n return (\n <td\n {...props}\n ref={ref}\n className={cx(table().selection, className)}\n data-slot=\"table-selection-cell\"\n >\n <SelectionInput\n aria-label={ariaLabel}\n checked={checked}\n indeterminate={indeterminate}\n inputProps={{ ...inputProps, disabled }}\n onCheckedChange={onCheckedChange ?? ((next) => context.toggleRow(id, next))}\n />\n </td>\n );\n },\n);\n\nexport interface TableStateProps extends Omit<ComponentPropsWithoutRef<\"tr\">, \"children\"> {\n children?: ReactNode;\n colSpan?: number;\n}\n\nconst TableStateRow = forwardRef<\n HTMLTableRowElement,\n TableStateProps & { live?: \"polite\" | \"assertive\" }\n>(function TableStateRow({ children, className, colSpan = 1, live = \"polite\", ...props }, ref) {\n const name = live === \"assertive\" ? \"error\" : \"loading\";\n return (\n <tr {...props} ref={ref} className={cx(table().row, className)} data-slot={`table-${name}-row`}>\n <td aria-live={live} className={table().empty} colSpan={colSpan} data-slot={`table-${name}`}>\n {children}\n </td>\n </tr>\n );\n});\n\nexport interface TableEmptyProps extends TableStateProps {}\nexport type TableLoadingProps = TableStateProps;\nexport type TableErrorProps = TableStateProps;\nexport const TableEmpty = forwardRef<HTMLTableRowElement, TableEmptyProps>(function TableEmpty(\n { children = \"No results found.\", className, colSpan = 1, ...props },\n ref,\n) {\n return (\n <tr {...props} ref={ref} className={cx(table().row, className)} data-slot=\"table-empty-row\">\n <td className={table().empty} colSpan={colSpan} data-slot=\"table-empty\">\n {children}\n </td>\n </tr>\n );\n});\n\nexport const TableLoading = forwardRef<HTMLTableRowElement, TableStateProps>(function TableLoading(\n { children = \"Loading…\", ...props },\n ref,\n) {\n return (\n <TableStateRow {...props} ref={ref} live=\"polite\">\n {children}\n </TableStateRow>\n );\n});\n\nexport const TableError = forwardRef<HTMLTableRowElement, TableStateProps>(function TableError(\n { children = \"Something went wrong.\", ...props },\n ref,\n) {\n return (\n <TableStateRow {...props} ref={ref} live=\"assertive\">\n {children}\n </TableStateRow>\n );\n});\n\nexport const Table = {\n Container: TableContainer,\n Root: TableRoot,\n Caption: TableCaption,\n Description: TableDescription,\n Header: TableHeader,\n Body: TableBody,\n Footer: TableFooter,\n Row: TableRow,\n Head: TableHead,\n Cell: TableCell,\n SelectionHeader: TableSelectionHeader,\n SelectionCell: TableSelectionCell,\n Empty: TableEmpty,\n Loading: TableLoading,\n Error: TableError,\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.cjs","names":["tabs","BaseTabs","withRecipeClassName"],"sources":["../../../src/components/tabs/tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tabs as BaseTabs } from \"@base-ui/react/tabs\";\nimport { createContext, forwardRef, useContext } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\nimport { withRecipeClassName } from \"../base-ui\";\nimport { tabs } from \"../../styled-system/recipes\";\n\nexport type TabsVariant = \"underline\" | \"pills\";\n\nconst TabsVariantContext = createContext<TabsVariant>(\"underline\");\n\nfunction useTabsStyles() {\n return tabs({ variant: useContext(TabsVariantContext) });\n}\n\nexport interface TabsRootProps extends ComponentPropsWithoutRef<typeof BaseTabs.Root> {\n variant?: TabsVariant;\n}\n\nexport const TabsRoot = forwardRef<HTMLDivElement, TabsRootProps>(function TabsRoot(\n { className, variant = \"underline\", ...props },\n ref,\n) {\n const styles = tabs({ variant });\n\n return (\n <TabsVariantContext.Provider value={variant}>\n <BaseTabs.Root\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.root, className)}\n data-jaci-component=\"tabs\"\n data-slot=\"tabs\"\n />\n </TabsVariantContext.Provider>\n );\n});\n\nexport type TabsListProps = ComponentPropsWithoutRef<typeof BaseTabs.List>;\n\nexport const TabsList = forwardRef<HTMLDivElement, TabsListProps>(function TabsList(\n { className, ...props },\n ref,\n) {\n const styles = useTabsStyles();\n\n return (\n <BaseTabs.List\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.list, className)}\n data-slot=\"tabs-list\"\n />\n );\n});\n\nexport type TabsTabProps = ComponentPropsWithoutRef<typeof BaseTabs.Tab>;\n\nexport const TabsTab = forwardRef<HTMLElement, TabsTabProps>(function TabsTab(\n { className, ...props },\n ref,\n) {\n const styles = useTabsStyles();\n\n return (\n <BaseTabs.Tab\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.tab, className)}\n data-slot=\"tabs-tab\"\n />\n );\n});\n\nexport type TabsPanelProps = ComponentPropsWithoutRef<typeof BaseTabs.Panel>;\n\nexport const TabsPanel = forwardRef<HTMLDivElement, TabsPanelProps>(function TabsPanel(\n { className, ...props },\n ref,\n) {\n const styles = useTabsStyles();\n\n return (\n <BaseTabs.Panel\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.panel, className)}\n data-slot=\"tabs-panel\"\n />\n );\n});\n\nexport const Tabs = {\n Root: TabsRoot,\n List: TabsList,\n Tab: TabsTab,\n Panel: TabsPanel,\n};\n"],"mappings":";;;;;;;AAWA,MAAM,sBAAA,
|
|
1
|
+
{"version":3,"file":"tabs.cjs","names":["createContext","tabs","useContext","forwardRef","BaseTabs","withRecipeClassName"],"sources":["../../../src/components/tabs/tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tabs as BaseTabs } from \"@base-ui/react/tabs\";\nimport { createContext, forwardRef, useContext } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\nimport { withRecipeClassName } from \"../base-ui\";\nimport { tabs } from \"../../styled-system/recipes\";\n\nexport type TabsVariant = \"underline\" | \"pills\";\n\nconst TabsVariantContext = createContext<TabsVariant>(\"underline\");\n\nfunction useTabsStyles() {\n return tabs({ variant: useContext(TabsVariantContext) });\n}\n\nexport interface TabsRootProps extends ComponentPropsWithoutRef<typeof BaseTabs.Root> {\n variant?: TabsVariant;\n}\n\nexport const TabsRoot = forwardRef<HTMLDivElement, TabsRootProps>(function TabsRoot(\n { className, variant = \"underline\", ...props },\n ref,\n) {\n const styles = tabs({ variant });\n\n return (\n <TabsVariantContext.Provider value={variant}>\n <BaseTabs.Root\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.root, className)}\n data-jaci-component=\"tabs\"\n data-slot=\"tabs\"\n />\n </TabsVariantContext.Provider>\n );\n});\n\nexport type TabsListProps = ComponentPropsWithoutRef<typeof BaseTabs.List>;\n\nexport const TabsList = forwardRef<HTMLDivElement, TabsListProps>(function TabsList(\n { className, ...props },\n ref,\n) {\n const styles = useTabsStyles();\n\n return (\n <BaseTabs.List\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.list, className)}\n data-slot=\"tabs-list\"\n />\n );\n});\n\nexport type TabsTabProps = ComponentPropsWithoutRef<typeof BaseTabs.Tab>;\n\nexport const TabsTab = forwardRef<HTMLElement, TabsTabProps>(function TabsTab(\n { className, ...props },\n ref,\n) {\n const styles = useTabsStyles();\n\n return (\n <BaseTabs.Tab\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.tab, className)}\n data-slot=\"tabs-tab\"\n />\n );\n});\n\nexport type TabsPanelProps = ComponentPropsWithoutRef<typeof BaseTabs.Panel>;\n\nexport const TabsPanel = forwardRef<HTMLDivElement, TabsPanelProps>(function TabsPanel(\n { className, ...props },\n ref,\n) {\n const styles = useTabsStyles();\n\n return (\n <BaseTabs.Panel\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.panel, className)}\n data-slot=\"tabs-panel\"\n />\n );\n});\n\nexport const Tabs = {\n Root: TabsRoot,\n List: TabsList,\n Tab: TabsTab,\n Panel: TabsPanel,\n};\n"],"mappings":";;;;;;;AAWA,MAAM,sBAAA,GAAqBA,MAAAA,cAAAA,CAA2B,WAAW;AAEjE,SAAS,gBAAgB;CACvB,OAAOC,aAAAA,KAAK,EAAE,UAAA,GAASC,MAAAA,WAAAA,CAAW,kBAAkB,EAAE,CAAC;AACzD;AAMA,MAAa,YAAA,GAAWC,MAAAA,WAAAA,CAA0C,SAAS,SACzE,EAAE,WAAW,UAAU,aAAa,GAAG,SACvC,KACA;CACA,MAAM,SAASF,aAAAA,KAAK,EAAE,QAAQ,CAAC;CAE/B,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAmB,UAApB;EAA6B,OAAO;EAClC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,oBAAAA,KAAS,MAAV;GACE,GAAI;GACC;GACL,WAAWC,gBAAAA,oBAAoB,OAAO,MAAM,SAAS;GACrD,uBAAoB;GACpB,aAAU;EACX,CAAA;CAC0B,CAAA;AAEjC,CAAC;AAID,MAAa,YAAA,GAAWF,MAAAA,WAAAA,CAA0C,SAAS,SACzE,EAAE,WAAW,GAAG,SAChB,KACA;CACA,MAAM,SAAS,cAAc;CAE7B,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,oBAAAA,KAAS,MAAV;EACE,GAAI;EACC;EACL,WAAWC,gBAAAA,oBAAoB,OAAO,MAAM,SAAS;EACrD,aAAU;CACX,CAAA;AAEL,CAAC;AAID,MAAa,WAAA,GAAUF,MAAAA,WAAAA,CAAsC,SAAS,QACpE,EAAE,WAAW,GAAG,SAChB,KACA;CACA,MAAM,SAAS,cAAc;CAE7B,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,oBAAAA,KAAS,KAAV;EACE,GAAI;EACC;EACL,WAAWC,gBAAAA,oBAAoB,OAAO,KAAK,SAAS;EACpD,aAAU;CACX,CAAA;AAEL,CAAC;AAID,MAAa,aAAA,GAAYF,MAAAA,WAAAA,CAA2C,SAAS,UAC3E,EAAE,WAAW,GAAG,SAChB,KACA;CACA,MAAM,SAAS,cAAc;CAE7B,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,oBAAAA,KAAS,OAAV;EACE,GAAI;EACC;EACL,WAAWC,gBAAAA,oBAAoB,OAAO,OAAO,SAAS;EACtD,aAAU;CACX,CAAA;AAEL,CAAC;AAED,MAAa,OAAO;CAClB,MAAM;CACN,MAAM;CACN,KAAK;CACL,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","names":["BaseTabs","Tabs"],"sources":["../../../src/components/tabs/tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tabs as BaseTabs } from \"@base-ui/react/tabs\";\nimport { createContext, forwardRef, useContext } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\nimport { withRecipeClassName } from \"../base-ui\";\nimport { tabs } from \"../../styled-system/recipes\";\n\nexport type TabsVariant = \"underline\" | \"pills\";\n\nconst TabsVariantContext = createContext<TabsVariant>(\"underline\");\n\nfunction useTabsStyles() {\n return tabs({ variant: useContext(TabsVariantContext) });\n}\n\nexport interface TabsRootProps extends ComponentPropsWithoutRef<typeof BaseTabs.Root> {\n variant?: TabsVariant;\n}\n\nexport const TabsRoot = forwardRef<HTMLDivElement, TabsRootProps>(function TabsRoot(\n { className, variant = \"underline\", ...props },\n ref,\n) {\n const styles = tabs({ variant });\n\n return (\n <TabsVariantContext.Provider value={variant}>\n <BaseTabs.Root\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.root, className)}\n data-jaci-component=\"tabs\"\n data-slot=\"tabs\"\n />\n </TabsVariantContext.Provider>\n );\n});\n\nexport type TabsListProps = ComponentPropsWithoutRef<typeof BaseTabs.List>;\n\nexport const TabsList = forwardRef<HTMLDivElement, TabsListProps>(function TabsList(\n { className, ...props },\n ref,\n) {\n const styles = useTabsStyles();\n\n return (\n <BaseTabs.List\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.list, className)}\n data-slot=\"tabs-list\"\n />\n );\n});\n\nexport type TabsTabProps = ComponentPropsWithoutRef<typeof BaseTabs.Tab>;\n\nexport const TabsTab = forwardRef<HTMLElement, TabsTabProps>(function TabsTab(\n { className, ...props },\n ref,\n) {\n const styles = useTabsStyles();\n\n return (\n <BaseTabs.Tab\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.tab, className)}\n data-slot=\"tabs-tab\"\n />\n );\n});\n\nexport type TabsPanelProps = ComponentPropsWithoutRef<typeof BaseTabs.Panel>;\n\nexport const TabsPanel = forwardRef<HTMLDivElement, TabsPanelProps>(function TabsPanel(\n { className, ...props },\n ref,\n) {\n const styles = useTabsStyles();\n\n return (\n <BaseTabs.Panel\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.panel, className)}\n data-slot=\"tabs-panel\"\n />\n );\n});\n\nexport const Tabs = {\n Root: TabsRoot,\n List: TabsList,\n Tab: TabsTab,\n Panel: TabsPanel,\n};\n"],"mappings":";;;;;;;AAWA,MAAM,qBAAqB,cAA2B,WAAW;AAEjE,SAAS,gBAAgB;CACvB,OAAO,KAAK,EAAE,SAAS,WAAW,kBAAkB,EAAE,CAAC;AACzD;AAMA,MAAa,WAAW,WAA0C,SAAS,SACzE,EAAE,WAAW,UAAU,aAAa,GAAG,SACvC,KACA;CACA,MAAM,SAAS,KAAK,EAAE,QAAQ,CAAC;CAE/B,OACE,oBAAC,mBAAmB,UAApB;EAA6B,OAAO;
|
|
1
|
+
{"version":3,"file":"tabs.js","names":["BaseTabs","Tabs"],"sources":["../../../src/components/tabs/tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tabs as BaseTabs } from \"@base-ui/react/tabs\";\nimport { createContext, forwardRef, useContext } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\nimport { withRecipeClassName } from \"../base-ui\";\nimport { tabs } from \"../../styled-system/recipes\";\n\nexport type TabsVariant = \"underline\" | \"pills\";\n\nconst TabsVariantContext = createContext<TabsVariant>(\"underline\");\n\nfunction useTabsStyles() {\n return tabs({ variant: useContext(TabsVariantContext) });\n}\n\nexport interface TabsRootProps extends ComponentPropsWithoutRef<typeof BaseTabs.Root> {\n variant?: TabsVariant;\n}\n\nexport const TabsRoot = forwardRef<HTMLDivElement, TabsRootProps>(function TabsRoot(\n { className, variant = \"underline\", ...props },\n ref,\n) {\n const styles = tabs({ variant });\n\n return (\n <TabsVariantContext.Provider value={variant}>\n <BaseTabs.Root\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.root, className)}\n data-jaci-component=\"tabs\"\n data-slot=\"tabs\"\n />\n </TabsVariantContext.Provider>\n );\n});\n\nexport type TabsListProps = ComponentPropsWithoutRef<typeof BaseTabs.List>;\n\nexport const TabsList = forwardRef<HTMLDivElement, TabsListProps>(function TabsList(\n { className, ...props },\n ref,\n) {\n const styles = useTabsStyles();\n\n return (\n <BaseTabs.List\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.list, className)}\n data-slot=\"tabs-list\"\n />\n );\n});\n\nexport type TabsTabProps = ComponentPropsWithoutRef<typeof BaseTabs.Tab>;\n\nexport const TabsTab = forwardRef<HTMLElement, TabsTabProps>(function TabsTab(\n { className, ...props },\n ref,\n) {\n const styles = useTabsStyles();\n\n return (\n <BaseTabs.Tab\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.tab, className)}\n data-slot=\"tabs-tab\"\n />\n );\n});\n\nexport type TabsPanelProps = ComponentPropsWithoutRef<typeof BaseTabs.Panel>;\n\nexport const TabsPanel = forwardRef<HTMLDivElement, TabsPanelProps>(function TabsPanel(\n { className, ...props },\n ref,\n) {\n const styles = useTabsStyles();\n\n return (\n <BaseTabs.Panel\n {...props}\n ref={ref}\n className={withRecipeClassName(styles.panel, className)}\n data-slot=\"tabs-panel\"\n />\n );\n});\n\nexport const Tabs = {\n Root: TabsRoot,\n List: TabsList,\n Tab: TabsTab,\n Panel: TabsPanel,\n};\n"],"mappings":";;;;;;;AAWA,MAAM,qBAAqB,cAA2B,WAAW;AAEjE,SAAS,gBAAgB;CACvB,OAAO,KAAK,EAAE,SAAS,WAAW,kBAAkB,EAAE,CAAC;AACzD;AAMA,MAAa,WAAW,WAA0C,SAAS,SACzE,EAAE,WAAW,UAAU,aAAa,GAAG,SACvC,KACA;CACA,MAAM,SAAS,KAAK,EAAE,QAAQ,CAAC;CAE/B,OACE,oBAAC,mBAAmB,UAApB;EAA6B,OAAO;EAClC,UAAA,oBAACA,KAAS,MAAV;GACE,GAAI;GACC;GACL,WAAW,oBAAoB,OAAO,MAAM,SAAS;GACrD,uBAAoB;GACpB,aAAU;EACX,CAAA;CAC0B,CAAA;AAEjC,CAAC;AAID,MAAa,WAAW,WAA0C,SAAS,SACzE,EAAE,WAAW,GAAG,SAChB,KACA;CACA,MAAM,SAAS,cAAc;CAE7B,OACE,oBAACA,KAAS,MAAV;EACE,GAAI;EACC;EACL,WAAW,oBAAoB,OAAO,MAAM,SAAS;EACrD,aAAU;CACX,CAAA;AAEL,CAAC;AAID,MAAa,UAAU,WAAsC,SAAS,QACpE,EAAE,WAAW,GAAG,SAChB,KACA;CACA,MAAM,SAAS,cAAc;CAE7B,OACE,oBAACA,KAAS,KAAV;EACE,GAAI;EACC;EACL,WAAW,oBAAoB,OAAO,KAAK,SAAS;EACpD,aAAU;CACX,CAAA;AAEL,CAAC;AAID,MAAa,YAAY,WAA2C,SAAS,UAC3E,EAAE,WAAW,GAAG,SAChB,KACA;CACA,MAAM,SAAS,cAAc;CAE7B,OACE,oBAACA,KAAS,OAAV;EACE,GAAI;EACC;EACL,WAAW,oBAAoB,OAAO,OAAO,SAAS;EACtD,aAAU;CACX,CAAA;AAEL,CAAC;AAED,MAAaC,SAAO;CAClB,MAAM;CACN,MAAM;CACN,KAAK;CACL,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags-input.cjs","names":["tagsInput","cx"],"sources":["../../../src/components/tags-input/tags-input.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport type {\n ChangeEvent,\n ChangeEventHandler,\n ComponentPropsWithoutRef,\n FocusEvent,\n KeyboardEvent,\n MouseEvent,\n ClipboardEvent,\n ReactNode,\n} from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { tagsInput } from \"../../styled-system/recipes\";\n\nexport interface TagsInputProps\n extends Omit<\n ComponentPropsWithoutRef<\"input\">,\n \"children\" | \"defaultValue\" | \"onChange\" | \"type\" | \"value\"\n > {\n /** Current tags. Omit this prop to use the uncontrolled API. */\n tags?: readonly string[];\n /** Initial tags for the uncontrolled API. */\n defaultTags?: readonly string[];\n /** Called whenever a tag is added or removed. */\n onTagsChange?: (tags: string[]) => void;\n /** Optional suggestions. A tag is accepted after a comma only when it is in this list. */\n data?: readonly string[];\n /** Visible label for the input. */\n label?: ReactNode;\n /** Current text query. This is the native input value, not the selected tags. */\n value?: string;\n /** Initial text query for an uncontrolled input. */\n defaultValue?: string;\n /** Native input change callback. */\n onChange?: ChangeEventHandler<HTMLInputElement>;\n /** Optional callback useful when a controlled query is cleared by selecting a tag. */\n onInputValueChange?: (value: string) => void;\n allowDuplicates?: boolean;\n delimiter?: string | RegExp;\n editable?: boolean;\n}\n\nfunction changedEvent(event: ChangeEvent<HTMLInputElement>, value: string) {\n const target = event.target;\n const nextTarget = {\n checked: target.checked,\n id: target.id,\n name: target.name,\n value,\n } as HTMLInputElement;\n\n return {\n ...event,\n currentTarget: nextTarget,\n target: nextTarget,\n } as ChangeEvent<HTMLInputElement>;\n}\n\nfunction tagKey(tag: string, index: number) {\n return `${tag}-${index}`;\n}\n\nfunction hasDelimiter(value: string, delimiter: string | RegExp) {\n if (typeof delimiter === \"string\") return delimiter.length > 0 && value.includes(delimiter);\n delimiter.lastIndex = 0;\n const result = delimiter.test(value);\n delimiter.lastIndex = 0;\n return result;\n}\n\nexport const TagsInput = forwardRef<HTMLInputElement, TagsInputProps>(function TagsInput(\n {\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n \"aria-label\": ariaLabel,\n allowDuplicates = false,\n className,\n data = [],\n defaultTags = [],\n defaultValue = \"\",\n disabled = false,\n delimiter = /[,\\n]/u,\n editable = false,\n id: providedId,\n label,\n onBlur,\n onChange,\n onFocus,\n onInputValueChange,\n onTagsChange,\n placeholder,\n tags: controlledTags,\n value: controlledInputValue,\n ...props\n },\n ref,\n) {\n const generatedId = useId();\n const id = providedId ?? generatedId;\n const [uncontrolledTags, setUncontrolledTags] = useState<string[]>(() => [...defaultTags]);\n const [uncontrolledInputValue, setUncontrolledInputValue] = useState(defaultValue);\n const [focused, setFocused] = useState(false);\n const [composing, setComposing] = useState(false);\n const [editingTag, setEditingTag] = useState<{ index: number; value: string } | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const styles = tagsInput();\n const selectedTags = controlledTags === undefined ? uncontrolledTags : [...controlledTags];\n const inputValue =\n controlledInputValue === undefined ? uncontrolledInputValue : controlledInputValue;\n\n const updateTags = useCallback(\n (nextTags: string[]) => {\n if (controlledTags === undefined) setUncontrolledTags(nextTags);\n onTagsChange?.(nextTags);\n },\n [controlledTags, onTagsChange],\n );\n\n const clearInput = useCallback(\n (event?: ChangeEvent<HTMLInputElement>) => {\n if (controlledInputValue === undefined) setUncontrolledInputValue(\"\");\n onInputValueChange?.(\"\");\n if (event) onChange?.(changedEvent(event, \"\"));\n },\n [controlledInputValue, onChange, onInputValueChange],\n );\n\n const addTag = useCallback(\n (rawTag: string, event?: ChangeEvent<HTMLInputElement>) => {\n const tag = rawTag.trim();\n const isAllowed = data.length === 0 || data.includes(tag);\n const duplicate = selectedTags.includes(tag);\n if (tag && isAllowed && (allowDuplicates || !duplicate)) {\n if (editingTag) {\n updateTags([\n ...selectedTags.slice(0, editingTag.index),\n tag,\n ...selectedTags.slice(editingTag.index),\n ]);\n setEditingTag(null);\n } else {\n updateTags([...selectedTags, tag]);\n }\n } else if (editingTag) {\n return;\n }\n clearInput(event);\n },\n [allowDuplicates, clearInput, data, editingTag, selectedTags, updateTags],\n );\n\n const addDelimited = useCallback(\n (rawValue: string, event?: ChangeEvent<HTMLInputElement>) => {\n const separator =\n typeof delimiter === \"string\" && delimiter.length === 0 ? /\\r?\\n/u : delimiter;\n const values = rawValue\n .split(separator)\n .map((value) => value.trim())\n .filter(Boolean);\n const nextTags = [...selectedTags];\n for (const value of values) {\n const isAllowed = data.length === 0 || data.includes(value);\n if (isAllowed && (allowDuplicates || !nextTags.includes(value))) nextTags.push(value);\n }\n if (nextTags.length !== selectedTags.length) updateTags(nextTags);\n clearInput(event);\n },\n [allowDuplicates, clearInput, data, delimiter, selectedTags, updateTags],\n );\n\n const suggestions = useMemo(() => {\n const query = inputValue.trim().toLocaleLowerCase();\n return data.filter(\n (item) =>\n !selectedTags.includes(item) &&\n (query.length === 0 || item.toLocaleLowerCase().includes(query)),\n );\n }, [data, inputValue, selectedTags]);\n\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n const nextValue = event.currentTarget.value;\n if (nextValue.trim() === \"\") {\n clearInput(event);\n onChange?.(event);\n return;\n }\n\n if (!composing && hasDelimiter(nextValue, delimiter)) {\n addDelimited(nextValue, event);\n return;\n }\n\n if (controlledInputValue === undefined) setUncontrolledInputValue(nextValue);\n onInputValueChange?.(nextValue);\n onChange?.(event);\n }\n\n function handleBlur(event: FocusEvent<HTMLInputElement>) {\n setFocused(false);\n onBlur?.(event);\n }\n\n function handlePaste(event: ClipboardEvent<HTMLInputElement>) {\n const pasted = event.clipboardData.getData(\"text\");\n if (!pasted || (!hasDelimiter(pasted, delimiter) && !pasted.includes(\"\\n\"))) return;\n event.preventDefault();\n addDelimited(pasted);\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n if (event.nativeEvent.isComposing || composing) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n if (inputValue.trim()) addTag(inputValue);\n else if (editingTag) setEditingTag(null);\n } else if (event.key === \"Escape\" && editingTag) {\n event.preventDefault();\n updateTags([\n ...selectedTags.slice(0, editingTag.index),\n editingTag.value,\n ...selectedTags.slice(editingTag.index),\n ]);\n clearInput();\n setEditingTag(null);\n } else if (event.key === \"Backspace\" && !inputValue && editable && selectedTags.length > 0) {\n const index = selectedTags.length - 1;\n const tag = selectedTags[index];\n if (tag === undefined) return;\n setEditingTag({ index, value: tag });\n updateTags(selectedTags.slice(0, -1));\n if (controlledInputValue === undefined) setUncontrolledInputValue(tag);\n onInputValueChange?.(tag);\n }\n props.onKeyDown?.(event);\n }\n\n function removeTag(index: number) {\n updateTags(selectedTags.filter((_, currentIndex) => currentIndex !== index));\n }\n\n return (\n <div\n className={styles.root}\n data-jaci-component=\"tags-input\"\n data-slot=\"tags-input\"\n ref={rootRef}\n >\n {label ? (\n <label className={styles.label} data-slot=\"tags-input-label\" htmlFor={id}>\n {label}\n </label>\n ) : null}\n <div\n className={cx(styles.control, className)}\n data-disabled={disabled || undefined}\n data-focus={focused || undefined}\n data-slot=\"tags-input-control\"\n >\n <div className={styles.tagList} data-slot=\"tags-input-tag-list\">\n {selectedTags.map((tag, index) => (\n <span className={styles.tag} data-slot=\"tags-input-tag\" key={tagKey(tag, index)}>\n <span className={styles.tagLabel} data-slot=\"tags-input-tag-label\">\n {tag}\n </span>\n <button\n aria-label={`Remove ${tag}`}\n className={styles.tagRemove}\n data-slot=\"tags-input-tag-remove\"\n disabled={disabled}\n onClick={() => removeTag(index)}\n type=\"button\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n <input\n {...props}\n {...(ariaDescribedBy ? { \"aria-describedby\": ariaDescribedBy } : {})}\n {...(ariaInvalid !== undefined ? { \"aria-invalid\": ariaInvalid } : {})}\n {...(ariaLabel ? { \"aria-label\": ariaLabel } : {})}\n autoComplete=\"off\"\n className={styles.input}\n disabled={disabled}\n id={id}\n onBlur={handleBlur}\n onChange={handleChange}\n onCompositionEnd={() => setComposing(false)}\n onCompositionStart={() => setComposing(true)}\n onFocus={(event) => {\n setFocused(true);\n onFocus?.(event);\n }}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n ref={ref}\n type=\"text\"\n value={inputValue}\n />\n </div>\n {focused && data.length > 0 ? (\n <div className={styles.positioner} data-slot=\"tags-input-positioner\">\n <div\n aria-label=\"Suggestions\"\n className={styles.list}\n data-slot=\"tags-input-list\"\n role=\"listbox\"\n >\n {suggestions.length > 0 ? (\n suggestions.map((item) => (\n <button\n aria-selected={false}\n className={styles.item}\n data-slot=\"tags-input-item\"\n key={item}\n onClick={() => addTag(item)}\n onMouseDown={(event: MouseEvent<HTMLButtonElement>) => event.preventDefault()}\n role=\"option\"\n type=\"button\"\n >\n {item}\n </button>\n ))\n ) : (\n <div className={styles.empty} data-slot=\"tags-input-empty\">\n No options\n </div>\n )}\n </div>\n </div>\n ) : null}\n </div>\n );\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tags-input.cjs","names":["forwardRef","useId","useState","useRef","tagsInput","useCallback","useMemo","cx"],"sources":["../../../src/components/tags-input/tags-input.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport type {\n ChangeEvent,\n ChangeEventHandler,\n ComponentPropsWithoutRef,\n FocusEvent,\n KeyboardEvent,\n MouseEvent,\n ClipboardEvent,\n ReactNode,\n} from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { tagsInput } from \"../../styled-system/recipes\";\n\nexport interface TagsInputProps\n extends Omit<\n ComponentPropsWithoutRef<\"input\">,\n \"children\" | \"defaultValue\" | \"onChange\" | \"type\" | \"value\"\n > {\n /** Current tags. Omit this prop to use the uncontrolled API. */\n tags?: readonly string[];\n /** Initial tags for the uncontrolled API. */\n defaultTags?: readonly string[];\n /** Called whenever a tag is added or removed. */\n onTagsChange?: (tags: string[]) => void;\n /** Optional suggestions. A tag is accepted after a comma only when it is in this list. */\n data?: readonly string[];\n /** Visible label for the input. */\n label?: ReactNode;\n /** Current text query. This is the native input value, not the selected tags. */\n value?: string;\n /** Initial text query for an uncontrolled input. */\n defaultValue?: string;\n /** Native input change callback. */\n onChange?: ChangeEventHandler<HTMLInputElement>;\n /** Optional callback useful when a controlled query is cleared by selecting a tag. */\n onInputValueChange?: (value: string) => void;\n allowDuplicates?: boolean;\n delimiter?: string | RegExp;\n editable?: boolean;\n}\n\nfunction changedEvent(event: ChangeEvent<HTMLInputElement>, value: string) {\n const target = event.target;\n const nextTarget = {\n checked: target.checked,\n id: target.id,\n name: target.name,\n value,\n } as HTMLInputElement;\n\n return {\n ...event,\n currentTarget: nextTarget,\n target: nextTarget,\n } as ChangeEvent<HTMLInputElement>;\n}\n\nfunction tagKey(tag: string, index: number) {\n return `${tag}-${index}`;\n}\n\nfunction hasDelimiter(value: string, delimiter: string | RegExp) {\n if (typeof delimiter === \"string\") return delimiter.length > 0 && value.includes(delimiter);\n delimiter.lastIndex = 0;\n const result = delimiter.test(value);\n delimiter.lastIndex = 0;\n return result;\n}\n\nexport const TagsInput = forwardRef<HTMLInputElement, TagsInputProps>(function TagsInput(\n {\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n \"aria-label\": ariaLabel,\n allowDuplicates = false,\n className,\n data = [],\n defaultTags = [],\n defaultValue = \"\",\n disabled = false,\n delimiter = /[,\\n]/u,\n editable = false,\n id: providedId,\n label,\n onBlur,\n onChange,\n onFocus,\n onInputValueChange,\n onTagsChange,\n placeholder,\n tags: controlledTags,\n value: controlledInputValue,\n ...props\n },\n ref,\n) {\n const generatedId = useId();\n const id = providedId ?? generatedId;\n const [uncontrolledTags, setUncontrolledTags] = useState<string[]>(() => [...defaultTags]);\n const [uncontrolledInputValue, setUncontrolledInputValue] = useState(defaultValue);\n const [focused, setFocused] = useState(false);\n const [composing, setComposing] = useState(false);\n const [editingTag, setEditingTag] = useState<{ index: number; value: string } | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const styles = tagsInput();\n const selectedTags = controlledTags === undefined ? uncontrolledTags : [...controlledTags];\n const inputValue =\n controlledInputValue === undefined ? uncontrolledInputValue : controlledInputValue;\n\n const updateTags = useCallback(\n (nextTags: string[]) => {\n if (controlledTags === undefined) setUncontrolledTags(nextTags);\n onTagsChange?.(nextTags);\n },\n [controlledTags, onTagsChange],\n );\n\n const clearInput = useCallback(\n (event?: ChangeEvent<HTMLInputElement>) => {\n if (controlledInputValue === undefined) setUncontrolledInputValue(\"\");\n onInputValueChange?.(\"\");\n if (event) onChange?.(changedEvent(event, \"\"));\n },\n [controlledInputValue, onChange, onInputValueChange],\n );\n\n const addTag = useCallback(\n (rawTag: string, event?: ChangeEvent<HTMLInputElement>) => {\n const tag = rawTag.trim();\n const isAllowed = data.length === 0 || data.includes(tag);\n const duplicate = selectedTags.includes(tag);\n if (tag && isAllowed && (allowDuplicates || !duplicate)) {\n if (editingTag) {\n updateTags([\n ...selectedTags.slice(0, editingTag.index),\n tag,\n ...selectedTags.slice(editingTag.index),\n ]);\n setEditingTag(null);\n } else {\n updateTags([...selectedTags, tag]);\n }\n } else if (editingTag) {\n return;\n }\n clearInput(event);\n },\n [allowDuplicates, clearInput, data, editingTag, selectedTags, updateTags],\n );\n\n const addDelimited = useCallback(\n (rawValue: string, event?: ChangeEvent<HTMLInputElement>) => {\n const separator =\n typeof delimiter === \"string\" && delimiter.length === 0 ? /\\r?\\n/u : delimiter;\n const values = rawValue\n .split(separator)\n .map((value) => value.trim())\n .filter(Boolean);\n const nextTags = [...selectedTags];\n for (const value of values) {\n const isAllowed = data.length === 0 || data.includes(value);\n if (isAllowed && (allowDuplicates || !nextTags.includes(value))) nextTags.push(value);\n }\n if (nextTags.length !== selectedTags.length) updateTags(nextTags);\n clearInput(event);\n },\n [allowDuplicates, clearInput, data, delimiter, selectedTags, updateTags],\n );\n\n const suggestions = useMemo(() => {\n const query = inputValue.trim().toLocaleLowerCase();\n return data.filter(\n (item) =>\n !selectedTags.includes(item) &&\n (query.length === 0 || item.toLocaleLowerCase().includes(query)),\n );\n }, [data, inputValue, selectedTags]);\n\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n const nextValue = event.currentTarget.value;\n if (nextValue.trim() === \"\") {\n clearInput(event);\n onChange?.(event);\n return;\n }\n\n if (!composing && hasDelimiter(nextValue, delimiter)) {\n addDelimited(nextValue, event);\n return;\n }\n\n if (controlledInputValue === undefined) setUncontrolledInputValue(nextValue);\n onInputValueChange?.(nextValue);\n onChange?.(event);\n }\n\n function handleBlur(event: FocusEvent<HTMLInputElement>) {\n setFocused(false);\n onBlur?.(event);\n }\n\n function handlePaste(event: ClipboardEvent<HTMLInputElement>) {\n const pasted = event.clipboardData.getData(\"text\");\n if (!pasted || (!hasDelimiter(pasted, delimiter) && !pasted.includes(\"\\n\"))) return;\n event.preventDefault();\n addDelimited(pasted);\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n if (event.nativeEvent.isComposing || composing) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n if (inputValue.trim()) addTag(inputValue);\n else if (editingTag) setEditingTag(null);\n } else if (event.key === \"Escape\" && editingTag) {\n event.preventDefault();\n updateTags([\n ...selectedTags.slice(0, editingTag.index),\n editingTag.value,\n ...selectedTags.slice(editingTag.index),\n ]);\n clearInput();\n setEditingTag(null);\n } else if (event.key === \"Backspace\" && !inputValue && editable && selectedTags.length > 0) {\n const index = selectedTags.length - 1;\n const tag = selectedTags[index];\n if (tag === undefined) return;\n setEditingTag({ index, value: tag });\n updateTags(selectedTags.slice(0, -1));\n if (controlledInputValue === undefined) setUncontrolledInputValue(tag);\n onInputValueChange?.(tag);\n }\n props.onKeyDown?.(event);\n }\n\n function removeTag(index: number) {\n updateTags(selectedTags.filter((_, currentIndex) => currentIndex !== index));\n }\n\n return (\n <div\n className={styles.root}\n data-jaci-component=\"tags-input\"\n data-slot=\"tags-input\"\n ref={rootRef}\n >\n {label ? (\n <label className={styles.label} data-slot=\"tags-input-label\" htmlFor={id}>\n {label}\n </label>\n ) : null}\n <div\n className={cx(styles.control, className)}\n data-disabled={disabled || undefined}\n data-focus={focused || undefined}\n data-slot=\"tags-input-control\"\n >\n <div className={styles.tagList} data-slot=\"tags-input-tag-list\">\n {selectedTags.map((tag, index) => (\n <span className={styles.tag} data-slot=\"tags-input-tag\" key={tagKey(tag, index)}>\n <span className={styles.tagLabel} data-slot=\"tags-input-tag-label\">\n {tag}\n </span>\n <button\n aria-label={`Remove ${tag}`}\n className={styles.tagRemove}\n data-slot=\"tags-input-tag-remove\"\n disabled={disabled}\n onClick={() => removeTag(index)}\n type=\"button\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n <input\n {...props}\n {...(ariaDescribedBy ? { \"aria-describedby\": ariaDescribedBy } : {})}\n {...(ariaInvalid !== undefined ? { \"aria-invalid\": ariaInvalid } : {})}\n {...(ariaLabel ? { \"aria-label\": ariaLabel } : {})}\n autoComplete=\"off\"\n className={styles.input}\n disabled={disabled}\n id={id}\n onBlur={handleBlur}\n onChange={handleChange}\n onCompositionEnd={() => setComposing(false)}\n onCompositionStart={() => setComposing(true)}\n onFocus={(event) => {\n setFocused(true);\n onFocus?.(event);\n }}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n ref={ref}\n type=\"text\"\n value={inputValue}\n />\n </div>\n {focused && data.length > 0 ? (\n <div className={styles.positioner} data-slot=\"tags-input-positioner\">\n <div\n aria-label=\"Suggestions\"\n className={styles.list}\n data-slot=\"tags-input-list\"\n role=\"listbox\"\n >\n {suggestions.length > 0 ? (\n suggestions.map((item) => (\n <button\n aria-selected={false}\n className={styles.item}\n data-slot=\"tags-input-item\"\n key={item}\n onClick={() => addTag(item)}\n onMouseDown={(event: MouseEvent<HTMLButtonElement>) => event.preventDefault()}\n role=\"option\"\n type=\"button\"\n >\n {item}\n </button>\n ))\n ) : (\n <div className={styles.empty} data-slot=\"tags-input-empty\">\n No options\n </div>\n )}\n </div>\n </div>\n ) : null}\n </div>\n );\n});\n"],"mappings":"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"}
|