@raystack/apsara 0.53.2 → 0.53.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/calendar/date-picker.cjs +1 -1
- package/dist/components/calendar/date-picker.cjs.map +1 -1
- package/dist/components/calendar/date-picker.js +1 -1
- package/dist/components/calendar/date-picker.js.map +1 -1
- package/dist/components/data-table/components/filters.cjs +15 -4
- package/dist/components/data-table/components/filters.cjs.map +1 -1
- package/dist/components/data-table/components/filters.d.ts +16 -1
- package/dist/components/data-table/components/filters.d.ts.map +1 -1
- package/dist/components/data-table/components/filters.js +15 -4
- package/dist/components/data-table/components/filters.js.map +1 -1
- package/dist/components/data-table/data-table.cjs +3 -1
- package/dist/components/data-table/data-table.cjs.map +1 -1
- package/dist/components/data-table/data-table.d.ts +2 -0
- package/dist/components/data-table/data-table.d.ts.map +1 -1
- package/dist/components/data-table/data-table.js +3 -1
- package/dist/components/data-table/data-table.js.map +1 -1
- package/dist/components/headline/headline.cjs +24 -19
- package/dist/components/headline/headline.cjs.map +1 -1
- package/dist/components/headline/headline.d.ts +5 -3
- package/dist/components/headline/headline.d.ts.map +1 -1
- package/dist/components/headline/headline.js +24 -19
- package/dist/components/headline/headline.js.map +1 -1
- package/dist/components/headline/headline.module.css.cjs +1 -1
- package/dist/components/headline/headline.module.css.js +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
|
@@ -113,7 +113,7 @@ function DatePicker({ dateFormat = 'DD/MM/YYYY', inputFieldProps, calendarProps,
|
|
|
113
113
|
setError('Invalid date');
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
|
-
const defaultTrigger = (jsxRuntime.jsx(inputField.InputField, { size: 'small', placeholder: 'Select date', error: error, className: calendar_module.default.datePickerInput, trailingIcon: showCalendarIcon ? jsxRuntime.jsx(reactIcons_esm.CalendarIcon, {}) : undefined, ...inputFieldProps, ref: inputFieldRef,
|
|
116
|
+
const defaultTrigger = (jsxRuntime.jsx(inputField.InputField, { size: 'small', placeholder: 'Select date', error: error, className: calendar_module.default.datePickerInput, trailingIcon: showCalendarIcon ? jsxRuntime.jsx(reactIcons_esm.CalendarIcon, {}) : undefined, ...inputFieldProps, ref: inputFieldRef, value: formattedDate, onChange: handleInputChange, onFocus: handleInputFocus, onBlur: handleInputBlur, onKeyUp: handleKeyUp }));
|
|
117
117
|
const trigger = typeof children === 'function' ? (children({ selectedDate: formattedDate })) : children ? (jsxRuntime.jsx("div", { children: children })) : (jsxRuntime.jsx("div", { children: defaultTrigger }));
|
|
118
118
|
return (jsxRuntime.jsxs(popover.Popover, { open: showCalendar, onOpenChange: onOpenChange, children: [jsxRuntime.jsx(popover.Popover.Trigger, { asChild: true, children: trigger }), jsxRuntime.jsx(popover.Popover.Content, { ref: contentRef, ...popoverProps, className: index.cx(calendar_module.default.calendarPopover, popoverProps?.className), side: popoverProps?.side ?? 'top', children: jsxRuntime.jsx(calendar.Calendar, { required: true, ...calendarProps, timeZone: timeZone, onDropdownOpen: onDropdownOpen, mode: 'single', selected: selectedDate, month: selectedDate, onSelect: handleSelect, onMonthChange: setSelectedDate }) })] }));
|
|
119
119
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-picker.cjs","sources":["../../../components/calendar/date-picker.tsx"],"sourcesContent":["'use client';\n\nimport { CalendarIcon } from '@radix-ui/react-icons';\nimport { cx } from 'class-variance-authority';\nimport dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { PropsBase, PropsSingleRequired } from 'react-day-picker';\nimport { InputField } from '../input-field';\nimport { InputFieldProps } from '../input-field/input-field';\nimport { Popover } from '../popover';\nimport { PopoverContentProps } from '../popover/popover';\nimport { Calendar } from './calendar';\nimport styles from './calendar.module.css';\n\ndayjs.extend(customParseFormat);\n\ninterface DatePickerProps {\n dateFormat?: string;\n inputFieldProps?: InputFieldProps;\n calendarProps?: PropsSingleRequired & PropsBase;\n onSelect?: (date: Date) => void;\n value?: Date;\n children?:\n | React.ReactNode\n | ((props: { selectedDate: string }) => React.ReactNode);\n showCalendarIcon?: boolean;\n timeZone?: string;\n popoverProps?: PopoverContentProps;\n}\n\nexport function DatePicker({\n dateFormat = 'DD/MM/YYYY',\n inputFieldProps,\n calendarProps,\n value = new Date(),\n onSelect = () => {},\n children,\n showCalendarIcon = true,\n timeZone,\n popoverProps\n}: DatePickerProps) {\n const [showCalendar, setShowCalendar] = useState(false);\n const [selectedDate, setSelectedDate] = useState(value);\n const [error, setError] = useState<string>();\n\n const formattedDate = dayjs(selectedDate).format(dateFormat);\n\n const isDropdownOpenRef = useRef(false);\n const inputFieldRef = useRef<HTMLInputElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const isInputFieldFocused = useRef(false);\n const selectedDateRef = useRef(selectedDate);\n\n useEffect(() => {\n selectedDateRef.current = selectedDate;\n }, [selectedDate]);\n\n const isElementOutside = useCallback((el: HTMLElement) => {\n return (\n !isDropdownOpenRef.current && // Month and Year dropdown from Date picker\n !inputFieldRef.current?.contains(el) && // InputField\n !contentRef.current?.contains(el)\n );\n }, []);\n\n const handleMouseDown = useCallback(\n (event: MouseEvent) => {\n const el = event.target as HTMLElement | null;\n if (el && isElementOutside(el)) removeEventListeners();\n },\n [isElementOutside]\n );\n\n function registerEventListeners() {\n isInputFieldFocused.current = true;\n document.addEventListener('mouseup', handleMouseDown);\n }\n\n function removeEventListeners(skipUpdate = false) {\n isInputFieldFocused.current = false;\n setShowCalendar(false);\n\n const updatedVal = dayjs(selectedDateRef.current).format(dateFormat);\n\n if (inputFieldRef.current) inputFieldRef.current.value = updatedVal;\n if (!error && !skipUpdate) onSelect(dayjs(updatedVal).toDate());\n\n document.removeEventListener('mouseup', handleMouseDown);\n }\n\n const handleSelect = (day: Date) => {\n setSelectedDate(day);\n onSelect(day);\n setError(undefined);\n removeEventListeners(true);\n };\n\n function onDropdownOpen() {\n isDropdownOpenRef.current = true;\n }\n\n function onOpenChange(open?: boolean) {\n if (\n !isDropdownOpenRef.current &&\n !(isInputFieldFocused.current && showCalendar)\n ) {\n setShowCalendar(Boolean(open));\n }\n\n isDropdownOpenRef.current = false;\n }\n\n function handleInputFocus() {\n if (isInputFieldFocused.current) return;\n if (!showCalendar) setShowCalendar(true);\n }\n\n function handleInputBlur(event: React.FocusEvent) {\n if (isInputFieldFocused.current) {\n const el = event.relatedTarget as HTMLElement | null;\n if (el && isElementOutside(el)) removeEventListeners();\n } else {\n registerEventListeners();\n setTimeout(() => inputFieldRef.current?.select());\n }\n }\n\n function handleKeyUp(event: React.KeyboardEvent) {\n if (event.code === 'Enter' && inputFieldRef.current) {\n inputFieldRef.current.blur();\n removeEventListeners();\n }\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n const { value } = event.target;\n\n const format = value.includes('/')\n ? 'DD/MM/YYYY'\n : value.includes('-')\n ? 'DD-MM-YYYY'\n : undefined;\n const date = dayjs(value, format);\n\n const isValidDate = date.isValid();\n\n const isAfter =\n calendarProps?.startMonth !== undefined\n ? dayjs(date).isSameOrAfter(calendarProps.startMonth)\n : true;\n const isBefore =\n calendarProps?.endMonth !== undefined\n ? dayjs(date).isSameOrBefore(calendarProps.endMonth)\n : true;\n\n const isValid =\n isValidDate && isAfter && isBefore && dayjs(date).isSameOrBefore(dayjs());\n\n if (isValid) {\n setSelectedDate(date.toDate());\n setError(undefined);\n } else {\n setError('Invalid date');\n }\n }\n\n const defaultTrigger = (\n <InputField\n size='small'\n placeholder='Select date'\n error={error}\n className={styles.datePickerInput}\n trailingIcon={showCalendarIcon ? <CalendarIcon /> : undefined}\n {...inputFieldProps}\n ref={inputFieldRef}\n
|
|
1
|
+
{"version":3,"file":"date-picker.cjs","sources":["../../../components/calendar/date-picker.tsx"],"sourcesContent":["'use client';\n\nimport { CalendarIcon } from '@radix-ui/react-icons';\nimport { cx } from 'class-variance-authority';\nimport dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { PropsBase, PropsSingleRequired } from 'react-day-picker';\nimport { InputField } from '../input-field';\nimport { InputFieldProps } from '../input-field/input-field';\nimport { Popover } from '../popover';\nimport { PopoverContentProps } from '../popover/popover';\nimport { Calendar } from './calendar';\nimport styles from './calendar.module.css';\n\ndayjs.extend(customParseFormat);\n\ninterface DatePickerProps {\n dateFormat?: string;\n inputFieldProps?: InputFieldProps;\n calendarProps?: PropsSingleRequired & PropsBase;\n onSelect?: (date: Date) => void;\n value?: Date;\n children?:\n | React.ReactNode\n | ((props: { selectedDate: string }) => React.ReactNode);\n showCalendarIcon?: boolean;\n timeZone?: string;\n popoverProps?: PopoverContentProps;\n}\n\nexport function DatePicker({\n dateFormat = 'DD/MM/YYYY',\n inputFieldProps,\n calendarProps,\n value = new Date(),\n onSelect = () => {},\n children,\n showCalendarIcon = true,\n timeZone,\n popoverProps\n}: DatePickerProps) {\n const [showCalendar, setShowCalendar] = useState(false);\n const [selectedDate, setSelectedDate] = useState(value);\n const [error, setError] = useState<string>();\n\n const formattedDate = dayjs(selectedDate).format(dateFormat);\n\n const isDropdownOpenRef = useRef(false);\n const inputFieldRef = useRef<HTMLInputElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const isInputFieldFocused = useRef(false);\n const selectedDateRef = useRef(selectedDate);\n\n useEffect(() => {\n selectedDateRef.current = selectedDate;\n }, [selectedDate]);\n\n const isElementOutside = useCallback((el: HTMLElement) => {\n return (\n !isDropdownOpenRef.current && // Month and Year dropdown from Date picker\n !inputFieldRef.current?.contains(el) && // InputField\n !contentRef.current?.contains(el)\n );\n }, []);\n\n const handleMouseDown = useCallback(\n (event: MouseEvent) => {\n const el = event.target as HTMLElement | null;\n if (el && isElementOutside(el)) removeEventListeners();\n },\n [isElementOutside]\n );\n\n function registerEventListeners() {\n isInputFieldFocused.current = true;\n document.addEventListener('mouseup', handleMouseDown);\n }\n\n function removeEventListeners(skipUpdate = false) {\n isInputFieldFocused.current = false;\n setShowCalendar(false);\n\n const updatedVal = dayjs(selectedDateRef.current).format(dateFormat);\n\n if (inputFieldRef.current) inputFieldRef.current.value = updatedVal;\n if (!error && !skipUpdate) onSelect(dayjs(updatedVal).toDate());\n\n document.removeEventListener('mouseup', handleMouseDown);\n }\n\n const handleSelect = (day: Date) => {\n setSelectedDate(day);\n onSelect(day);\n setError(undefined);\n removeEventListeners(true);\n };\n\n function onDropdownOpen() {\n isDropdownOpenRef.current = true;\n }\n\n function onOpenChange(open?: boolean) {\n if (\n !isDropdownOpenRef.current &&\n !(isInputFieldFocused.current && showCalendar)\n ) {\n setShowCalendar(Boolean(open));\n }\n\n isDropdownOpenRef.current = false;\n }\n\n function handleInputFocus() {\n if (isInputFieldFocused.current) return;\n if (!showCalendar) setShowCalendar(true);\n }\n\n function handleInputBlur(event: React.FocusEvent) {\n if (isInputFieldFocused.current) {\n const el = event.relatedTarget as HTMLElement | null;\n if (el && isElementOutside(el)) removeEventListeners();\n } else {\n registerEventListeners();\n setTimeout(() => inputFieldRef.current?.select());\n }\n }\n\n function handleKeyUp(event: React.KeyboardEvent) {\n if (event.code === 'Enter' && inputFieldRef.current) {\n inputFieldRef.current.blur();\n removeEventListeners();\n }\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n const { value } = event.target;\n\n const format = value.includes('/')\n ? 'DD/MM/YYYY'\n : value.includes('-')\n ? 'DD-MM-YYYY'\n : undefined;\n const date = dayjs(value, format);\n\n const isValidDate = date.isValid();\n\n const isAfter =\n calendarProps?.startMonth !== undefined\n ? dayjs(date).isSameOrAfter(calendarProps.startMonth)\n : true;\n const isBefore =\n calendarProps?.endMonth !== undefined\n ? dayjs(date).isSameOrBefore(calendarProps.endMonth)\n : true;\n\n const isValid =\n isValidDate && isAfter && isBefore && dayjs(date).isSameOrBefore(dayjs());\n\n if (isValid) {\n setSelectedDate(date.toDate());\n setError(undefined);\n } else {\n setError('Invalid date');\n }\n }\n\n const defaultTrigger = (\n <InputField\n size='small'\n placeholder='Select date'\n error={error}\n className={styles.datePickerInput}\n trailingIcon={showCalendarIcon ? <CalendarIcon /> : undefined}\n {...inputFieldProps}\n ref={inputFieldRef}\n value={formattedDate}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onKeyUp={handleKeyUp}\n />\n );\n\n const trigger =\n typeof children === 'function' ? (\n children({ selectedDate: formattedDate })\n ) : children ? (\n <div>{children}</div>\n ) : (\n <div>{defaultTrigger}</div>\n );\n\n return (\n <Popover open={showCalendar} onOpenChange={onOpenChange}>\n <Popover.Trigger asChild>{trigger}</Popover.Trigger>\n <Popover.Content\n ref={contentRef}\n {...popoverProps}\n className={cx(styles.calendarPopover, popoverProps?.className)}\n side={popoverProps?.side ?? 'top'}\n >\n <Calendar\n required={true}\n {...calendarProps}\n timeZone={timeZone}\n onDropdownOpen={onDropdownOpen}\n mode='single'\n selected={selectedDate}\n month={selectedDate}\n onSelect={handleSelect}\n onMonthChange={setSelectedDate}\n />\n </Popover.Content>\n </Popover>\n );\n}\n"],"names":["dayjs"],"mappings":";;;;;;;;;;;;;;AAeAA;AAgBgB;;;;;AAiBd;AACA;AACA;AACA;AACA;;AAGE;AACF;AAEA;AACE;;;;AAOF;AAEI;AACA;AAAgC;AAClC;AAIF;AACE;AACA;;AAGF;AACE;;AAGA;;AAE2B;AAC3B;;AAEA;;AAGF;;;;;AAKA;AAEA;AACE;;;;;AAQE;;AAGF;;AAGF;;;AAEE;;;;AAIA;AACE;AACA;AAAgC;;;AAEhC;;;;;;AAOA;AACA;;;;AAKF;AAEA;AACE;AACA;AACE;;;AAIJ;AAEA;;;AAIA;;;AAKA;;AAIE;;;;;;;AAOJ;AAiBA;;AAgCF;;"}
|
|
@@ -111,7 +111,7 @@ function DatePicker({ dateFormat = 'DD/MM/YYYY', inputFieldProps, calendarProps,
|
|
|
111
111
|
setError('Invalid date');
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
|
-
const defaultTrigger = (jsx(InputField, { size: 'small', placeholder: 'Select date', error: error, className: styles.datePickerInput, trailingIcon: showCalendarIcon ? jsx(CalendarIcon, {}) : undefined, ...inputFieldProps, ref: inputFieldRef,
|
|
114
|
+
const defaultTrigger = (jsx(InputField, { size: 'small', placeholder: 'Select date', error: error, className: styles.datePickerInput, trailingIcon: showCalendarIcon ? jsx(CalendarIcon, {}) : undefined, ...inputFieldProps, ref: inputFieldRef, value: formattedDate, onChange: handleInputChange, onFocus: handleInputFocus, onBlur: handleInputBlur, onKeyUp: handleKeyUp }));
|
|
115
115
|
const trigger = typeof children === 'function' ? (children({ selectedDate: formattedDate })) : children ? (jsx("div", { children: children })) : (jsx("div", { children: defaultTrigger }));
|
|
116
116
|
return (jsxs(Popover, { open: showCalendar, onOpenChange: onOpenChange, children: [jsx(Popover.Trigger, { asChild: true, children: trigger }), jsx(Popover.Content, { ref: contentRef, ...popoverProps, className: cx(styles.calendarPopover, popoverProps?.className), side: popoverProps?.side ?? 'top', children: jsx(Calendar, { required: true, ...calendarProps, timeZone: timeZone, onDropdownOpen: onDropdownOpen, mode: 'single', selected: selectedDate, month: selectedDate, onSelect: handleSelect, onMonthChange: setSelectedDate }) })] }));
|
|
117
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-picker.js","sources":["../../../components/calendar/date-picker.tsx"],"sourcesContent":["'use client';\n\nimport { CalendarIcon } from '@radix-ui/react-icons';\nimport { cx } from 'class-variance-authority';\nimport dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { PropsBase, PropsSingleRequired } from 'react-day-picker';\nimport { InputField } from '../input-field';\nimport { InputFieldProps } from '../input-field/input-field';\nimport { Popover } from '../popover';\nimport { PopoverContentProps } from '../popover/popover';\nimport { Calendar } from './calendar';\nimport styles from './calendar.module.css';\n\ndayjs.extend(customParseFormat);\n\ninterface DatePickerProps {\n dateFormat?: string;\n inputFieldProps?: InputFieldProps;\n calendarProps?: PropsSingleRequired & PropsBase;\n onSelect?: (date: Date) => void;\n value?: Date;\n children?:\n | React.ReactNode\n | ((props: { selectedDate: string }) => React.ReactNode);\n showCalendarIcon?: boolean;\n timeZone?: string;\n popoverProps?: PopoverContentProps;\n}\n\nexport function DatePicker({\n dateFormat = 'DD/MM/YYYY',\n inputFieldProps,\n calendarProps,\n value = new Date(),\n onSelect = () => {},\n children,\n showCalendarIcon = true,\n timeZone,\n popoverProps\n}: DatePickerProps) {\n const [showCalendar, setShowCalendar] = useState(false);\n const [selectedDate, setSelectedDate] = useState(value);\n const [error, setError] = useState<string>();\n\n const formattedDate = dayjs(selectedDate).format(dateFormat);\n\n const isDropdownOpenRef = useRef(false);\n const inputFieldRef = useRef<HTMLInputElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const isInputFieldFocused = useRef(false);\n const selectedDateRef = useRef(selectedDate);\n\n useEffect(() => {\n selectedDateRef.current = selectedDate;\n }, [selectedDate]);\n\n const isElementOutside = useCallback((el: HTMLElement) => {\n return (\n !isDropdownOpenRef.current && // Month and Year dropdown from Date picker\n !inputFieldRef.current?.contains(el) && // InputField\n !contentRef.current?.contains(el)\n );\n }, []);\n\n const handleMouseDown = useCallback(\n (event: MouseEvent) => {\n const el = event.target as HTMLElement | null;\n if (el && isElementOutside(el)) removeEventListeners();\n },\n [isElementOutside]\n );\n\n function registerEventListeners() {\n isInputFieldFocused.current = true;\n document.addEventListener('mouseup', handleMouseDown);\n }\n\n function removeEventListeners(skipUpdate = false) {\n isInputFieldFocused.current = false;\n setShowCalendar(false);\n\n const updatedVal = dayjs(selectedDateRef.current).format(dateFormat);\n\n if (inputFieldRef.current) inputFieldRef.current.value = updatedVal;\n if (!error && !skipUpdate) onSelect(dayjs(updatedVal).toDate());\n\n document.removeEventListener('mouseup', handleMouseDown);\n }\n\n const handleSelect = (day: Date) => {\n setSelectedDate(day);\n onSelect(day);\n setError(undefined);\n removeEventListeners(true);\n };\n\n function onDropdownOpen() {\n isDropdownOpenRef.current = true;\n }\n\n function onOpenChange(open?: boolean) {\n if (\n !isDropdownOpenRef.current &&\n !(isInputFieldFocused.current && showCalendar)\n ) {\n setShowCalendar(Boolean(open));\n }\n\n isDropdownOpenRef.current = false;\n }\n\n function handleInputFocus() {\n if (isInputFieldFocused.current) return;\n if (!showCalendar) setShowCalendar(true);\n }\n\n function handleInputBlur(event: React.FocusEvent) {\n if (isInputFieldFocused.current) {\n const el = event.relatedTarget as HTMLElement | null;\n if (el && isElementOutside(el)) removeEventListeners();\n } else {\n registerEventListeners();\n setTimeout(() => inputFieldRef.current?.select());\n }\n }\n\n function handleKeyUp(event: React.KeyboardEvent) {\n if (event.code === 'Enter' && inputFieldRef.current) {\n inputFieldRef.current.blur();\n removeEventListeners();\n }\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n const { value } = event.target;\n\n const format = value.includes('/')\n ? 'DD/MM/YYYY'\n : value.includes('-')\n ? 'DD-MM-YYYY'\n : undefined;\n const date = dayjs(value, format);\n\n const isValidDate = date.isValid();\n\n const isAfter =\n calendarProps?.startMonth !== undefined\n ? dayjs(date).isSameOrAfter(calendarProps.startMonth)\n : true;\n const isBefore =\n calendarProps?.endMonth !== undefined\n ? dayjs(date).isSameOrBefore(calendarProps.endMonth)\n : true;\n\n const isValid =\n isValidDate && isAfter && isBefore && dayjs(date).isSameOrBefore(dayjs());\n\n if (isValid) {\n setSelectedDate(date.toDate());\n setError(undefined);\n } else {\n setError('Invalid date');\n }\n }\n\n const defaultTrigger = (\n <InputField\n size='small'\n placeholder='Select date'\n error={error}\n className={styles.datePickerInput}\n trailingIcon={showCalendarIcon ? <CalendarIcon /> : undefined}\n {...inputFieldProps}\n ref={inputFieldRef}\n
|
|
1
|
+
{"version":3,"file":"date-picker.js","sources":["../../../components/calendar/date-picker.tsx"],"sourcesContent":["'use client';\n\nimport { CalendarIcon } from '@radix-ui/react-icons';\nimport { cx } from 'class-variance-authority';\nimport dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { PropsBase, PropsSingleRequired } from 'react-day-picker';\nimport { InputField } from '../input-field';\nimport { InputFieldProps } from '../input-field/input-field';\nimport { Popover } from '../popover';\nimport { PopoverContentProps } from '../popover/popover';\nimport { Calendar } from './calendar';\nimport styles from './calendar.module.css';\n\ndayjs.extend(customParseFormat);\n\ninterface DatePickerProps {\n dateFormat?: string;\n inputFieldProps?: InputFieldProps;\n calendarProps?: PropsSingleRequired & PropsBase;\n onSelect?: (date: Date) => void;\n value?: Date;\n children?:\n | React.ReactNode\n | ((props: { selectedDate: string }) => React.ReactNode);\n showCalendarIcon?: boolean;\n timeZone?: string;\n popoverProps?: PopoverContentProps;\n}\n\nexport function DatePicker({\n dateFormat = 'DD/MM/YYYY',\n inputFieldProps,\n calendarProps,\n value = new Date(),\n onSelect = () => {},\n children,\n showCalendarIcon = true,\n timeZone,\n popoverProps\n}: DatePickerProps) {\n const [showCalendar, setShowCalendar] = useState(false);\n const [selectedDate, setSelectedDate] = useState(value);\n const [error, setError] = useState<string>();\n\n const formattedDate = dayjs(selectedDate).format(dateFormat);\n\n const isDropdownOpenRef = useRef(false);\n const inputFieldRef = useRef<HTMLInputElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const isInputFieldFocused = useRef(false);\n const selectedDateRef = useRef(selectedDate);\n\n useEffect(() => {\n selectedDateRef.current = selectedDate;\n }, [selectedDate]);\n\n const isElementOutside = useCallback((el: HTMLElement) => {\n return (\n !isDropdownOpenRef.current && // Month and Year dropdown from Date picker\n !inputFieldRef.current?.contains(el) && // InputField\n !contentRef.current?.contains(el)\n );\n }, []);\n\n const handleMouseDown = useCallback(\n (event: MouseEvent) => {\n const el = event.target as HTMLElement | null;\n if (el && isElementOutside(el)) removeEventListeners();\n },\n [isElementOutside]\n );\n\n function registerEventListeners() {\n isInputFieldFocused.current = true;\n document.addEventListener('mouseup', handleMouseDown);\n }\n\n function removeEventListeners(skipUpdate = false) {\n isInputFieldFocused.current = false;\n setShowCalendar(false);\n\n const updatedVal = dayjs(selectedDateRef.current).format(dateFormat);\n\n if (inputFieldRef.current) inputFieldRef.current.value = updatedVal;\n if (!error && !skipUpdate) onSelect(dayjs(updatedVal).toDate());\n\n document.removeEventListener('mouseup', handleMouseDown);\n }\n\n const handleSelect = (day: Date) => {\n setSelectedDate(day);\n onSelect(day);\n setError(undefined);\n removeEventListeners(true);\n };\n\n function onDropdownOpen() {\n isDropdownOpenRef.current = true;\n }\n\n function onOpenChange(open?: boolean) {\n if (\n !isDropdownOpenRef.current &&\n !(isInputFieldFocused.current && showCalendar)\n ) {\n setShowCalendar(Boolean(open));\n }\n\n isDropdownOpenRef.current = false;\n }\n\n function handleInputFocus() {\n if (isInputFieldFocused.current) return;\n if (!showCalendar) setShowCalendar(true);\n }\n\n function handleInputBlur(event: React.FocusEvent) {\n if (isInputFieldFocused.current) {\n const el = event.relatedTarget as HTMLElement | null;\n if (el && isElementOutside(el)) removeEventListeners();\n } else {\n registerEventListeners();\n setTimeout(() => inputFieldRef.current?.select());\n }\n }\n\n function handleKeyUp(event: React.KeyboardEvent) {\n if (event.code === 'Enter' && inputFieldRef.current) {\n inputFieldRef.current.blur();\n removeEventListeners();\n }\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n const { value } = event.target;\n\n const format = value.includes('/')\n ? 'DD/MM/YYYY'\n : value.includes('-')\n ? 'DD-MM-YYYY'\n : undefined;\n const date = dayjs(value, format);\n\n const isValidDate = date.isValid();\n\n const isAfter =\n calendarProps?.startMonth !== undefined\n ? dayjs(date).isSameOrAfter(calendarProps.startMonth)\n : true;\n const isBefore =\n calendarProps?.endMonth !== undefined\n ? dayjs(date).isSameOrBefore(calendarProps.endMonth)\n : true;\n\n const isValid =\n isValidDate && isAfter && isBefore && dayjs(date).isSameOrBefore(dayjs());\n\n if (isValid) {\n setSelectedDate(date.toDate());\n setError(undefined);\n } else {\n setError('Invalid date');\n }\n }\n\n const defaultTrigger = (\n <InputField\n size='small'\n placeholder='Select date'\n error={error}\n className={styles.datePickerInput}\n trailingIcon={showCalendarIcon ? <CalendarIcon /> : undefined}\n {...inputFieldProps}\n ref={inputFieldRef}\n value={formattedDate}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onKeyUp={handleKeyUp}\n />\n );\n\n const trigger =\n typeof children === 'function' ? (\n children({ selectedDate: formattedDate })\n ) : children ? (\n <div>{children}</div>\n ) : (\n <div>{defaultTrigger}</div>\n );\n\n return (\n <Popover open={showCalendar} onOpenChange={onOpenChange}>\n <Popover.Trigger asChild>{trigger}</Popover.Trigger>\n <Popover.Content\n ref={contentRef}\n {...popoverProps}\n className={cx(styles.calendarPopover, popoverProps?.className)}\n side={popoverProps?.side ?? 'top'}\n >\n <Calendar\n required={true}\n {...calendarProps}\n timeZone={timeZone}\n onDropdownOpen={onDropdownOpen}\n mode='single'\n selected={selectedDate}\n month={selectedDate}\n onSelect={handleSelect}\n onMonthChange={setSelectedDate}\n />\n </Popover.Content>\n </Popover>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAeA;AAgBgB;;;;;AAiBd;AACA;AACA;AACA;AACA;;AAGE;AACF;AAEA;AACE;;;;AAOF;AAEI;AACA;AAAgC;AAClC;AAIF;AACE;AACA;;AAGF;AACE;;AAGA;;AAE2B;AAC3B;;AAEA;;AAGF;;;;;AAKA;AAEA;AACE;;;;;AAQE;;AAGF;;AAGF;;;AAEE;;;;AAIA;AACE;AACA;AAAgC;;;AAEhC;;;;;;AAOA;AACA;;;;AAKF;AAEA;AACE;AACA;AACE;;;AAIJ;AAEA;;;AAIA;;;AAKA;;AAIE;;;;;;;AAOJ;AAiBA;;AAgCF;;"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
var React = require('react');
|
|
5
6
|
var filter = require('../../../icons/assets/filter.svg.cjs');
|
|
6
7
|
var filters = require('../../../types/filters.cjs');
|
|
7
8
|
var button = require('../../button/button.cjs');
|
|
@@ -12,15 +13,25 @@ var iconButton = require('../../icon-button/icon-button.cjs');
|
|
|
12
13
|
var useDataTable = require('../hooks/useDataTable.cjs');
|
|
13
14
|
var useFilters = require('../hooks/useFilters.cjs');
|
|
14
15
|
|
|
15
|
-
function AddFilter({ columnList = [], appliedFiltersSet, onAddFilter }) {
|
|
16
|
+
function AddFilter({ columnList = [], appliedFiltersSet, onAddFilter, children }) {
|
|
16
17
|
const availableFilters = columnList?.filter(col => !appliedFiltersSet.has(col.id));
|
|
17
|
-
|
|
18
|
+
const trigger = React.useMemo(() => {
|
|
19
|
+
if (typeof children === 'function')
|
|
20
|
+
return children({ availableFilters, appliedFilters: appliedFiltersSet });
|
|
21
|
+
else if (children)
|
|
22
|
+
return children;
|
|
23
|
+
else if (appliedFiltersSet.size > 0)
|
|
24
|
+
return (jsxRuntime.jsx(iconButton.IconButton, { size: 4, children: jsxRuntime.jsx(filter.ReactComponent, {}) }));
|
|
25
|
+
else
|
|
26
|
+
return (jsxRuntime.jsx(button.Button, { variant: 'text', size: 'small', leadingIcon: jsxRuntime.jsx(filter.ReactComponent, {}), color: 'neutral', children: "Filter" }));
|
|
27
|
+
}, [children, appliedFiltersSet, availableFilters]);
|
|
28
|
+
return availableFilters.length > 0 ? (jsxRuntime.jsxs(dropdownMenu.DropdownMenu, { children: [jsxRuntime.jsx(dropdownMenu.DropdownMenu.Trigger, { asChild: true, children: trigger }), jsxRuntime.jsx(dropdownMenu.DropdownMenu.Content, { children: availableFilters?.map(column => {
|
|
18
29
|
const columnDef = column.columnDef;
|
|
19
30
|
const id = columnDef.accessorKey || column.id;
|
|
20
31
|
return (jsxRuntime.jsx(dropdownMenu.DropdownMenu.Item, { onClick: () => onAddFilter(column), children: columnDef.header || id }, id));
|
|
21
32
|
}) })] })) : null;
|
|
22
33
|
}
|
|
23
|
-
function Filters() {
|
|
34
|
+
function Filters({ classNames, className, trigger }) {
|
|
24
35
|
const { table, tableQuery } = useDataTable.useDataTable();
|
|
25
36
|
const columns = table?.getAllColumns();
|
|
26
37
|
const { onAddFilter, handleRemoveFilter, handleFilterValueChange, handleFilterOperationChange } = useFilters.useFilters();
|
|
@@ -39,7 +50,7 @@ function Filters() {
|
|
|
39
50
|
...filter
|
|
40
51
|
};
|
|
41
52
|
}) || [];
|
|
42
|
-
return (jsxRuntime.jsxs(flex.Flex, { gap: 3, children: [jsxRuntime.jsx(flex.Flex, { gap: 3, children: appliedFilters.map(filter => (jsxRuntime.jsx(filterChip.FilterChip, { label: filter.label, value: filter.value, onRemove: () => handleRemoveFilter(filter.name), onValueChange: value => handleFilterValueChange(filter.name, value), onOperationChange: operator => handleFilterOperationChange(filter.name, operator), columnType: filter.filterType, options: filter.options }, filter.name))) }), jsxRuntime.jsx(AddFilter, { columnList: columnList, appliedFiltersSet: appliedFiltersSet, onAddFilter: onAddFilter })] }));
|
|
53
|
+
return (jsxRuntime.jsxs(flex.Flex, { gap: 3, className: className, children: [jsxRuntime.jsx(flex.Flex, { gap: 3, className: classNames?.container, children: appliedFilters.map(filter => (jsxRuntime.jsx(filterChip.FilterChip, { label: filter.label, value: filter.value, onRemove: () => handleRemoveFilter(filter.name), onValueChange: value => handleFilterValueChange(filter.name, value), onOperationChange: operator => handleFilterOperationChange(filter.name, operator), columnType: filter.filterType, options: filter.options, className: classNames?.filterChips }, filter.name))) }), jsxRuntime.jsx(AddFilter, { columnList: columnList, appliedFiltersSet: appliedFiltersSet, onAddFilter: onAddFilter, children: trigger })] }));
|
|
43
54
|
}
|
|
44
55
|
|
|
45
56
|
exports.Filters = Filters;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.cjs","sources":["../../../../components/data-table/components/filters.tsx"],"sourcesContent":["'use client';\n\nimport { FilterIcon } from '~/icons';\nimport { FilterOperatorTypes, FilterType } from '~/types/filters';\nimport { Button } from '../../button';\nimport { DropdownMenu } from '../../dropdown-menu';\nimport { FilterChip } from '../../filter-chip';\nimport { Flex } from '../../flex';\nimport { IconButton } from '../../icon-button';\nimport { DataTableColumn } from '../data-table.types';\nimport { useDataTable } from '../hooks/useDataTable';\nimport { useFilters } from '../hooks/useFilters';\n\ninterface AddFilterProps<TData, TValue> {\n columnList: DataTableColumn<TData, TValue>[];\n appliedFiltersSet: Set<string>;\n onAddFilter: (column: DataTableColumn<TData, TValue>) => void;\n}\n\nfunction AddFilter<TData, TValue>({\n columnList = [],\n appliedFiltersSet,\n onAddFilter\n}: AddFilterProps<TData, TValue>) {\n const availableFilters = columnList?.filter(\n col => !appliedFiltersSet.has(col.id)\n );\n\n
|
|
1
|
+
{"version":3,"file":"filters.cjs","sources":["../../../../components/data-table/components/filters.tsx"],"sourcesContent":["'use client';\n\nimport { ReactNode, useMemo } from 'react';\nimport { FilterIcon } from '~/icons';\nimport { FilterOperatorTypes, FilterType } from '~/types/filters';\nimport { Button } from '../../button';\nimport { DropdownMenu } from '../../dropdown-menu';\nimport { FilterChip } from '../../filter-chip';\nimport { Flex } from '../../flex';\nimport { IconButton } from '../../icon-button';\nimport { DataTableColumn } from '../data-table.types';\nimport { useDataTable } from '../hooks/useDataTable';\nimport { useFilters } from '../hooks/useFilters';\n\ntype Trigger<TData, TValue> =\n | ReactNode\n | (({\n availableFilters,\n appliedFilters\n }: {\n availableFilters: DataTableColumn<TData, TValue>[];\n appliedFilters: Set<string>;\n }) => ReactNode);\n\ninterface AddFilterProps<TData, TValue> {\n columnList: DataTableColumn<TData, TValue>[];\n appliedFiltersSet: Set<string>;\n onAddFilter: (column: DataTableColumn<TData, TValue>) => void;\n children?: Trigger<TData, TValue>;\n}\n\nfunction AddFilter<TData, TValue>({\n columnList = [],\n appliedFiltersSet,\n onAddFilter,\n children\n}: AddFilterProps<TData, TValue>) {\n const availableFilters = columnList?.filter(\n col => !appliedFiltersSet.has(col.id)\n );\n\n const trigger = useMemo(() => {\n if (typeof children === 'function')\n return children({ availableFilters, appliedFilters: appliedFiltersSet });\n else if (children) return children;\n else if (appliedFiltersSet.size > 0)\n return (\n <IconButton size={4}>\n <FilterIcon />\n </IconButton>\n );\n else\n return (\n <Button\n variant='text'\n size='small'\n leadingIcon={<FilterIcon />}\n color='neutral'\n >\n Filter\n </Button>\n );\n }, [children, appliedFiltersSet, availableFilters]);\n\n return availableFilters.length > 0 ? (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>{trigger}</DropdownMenu.Trigger>\n <DropdownMenu.Content>\n {availableFilters?.map(column => {\n const columnDef = column.columnDef;\n const id = columnDef.accessorKey || column.id;\n return (\n <DropdownMenu.Item key={id} onClick={() => onAddFilter(column)}>\n {columnDef.header || id}\n </DropdownMenu.Item>\n );\n })}\n </DropdownMenu.Content>\n </DropdownMenu>\n ) : null;\n}\n\nexport function Filters<TData, TValue>({\n classNames,\n className,\n trigger\n}: {\n classNames?: {\n container?: string;\n filterChips?: string;\n addFilter?: string;\n };\n className?: string;\n trigger?: Trigger<TData, TValue>;\n}) {\n const { table, tableQuery } = useDataTable();\n const columns = table?.getAllColumns() as DataTableColumn<TData, TValue>[];\n\n const {\n onAddFilter,\n handleRemoveFilter,\n handleFilterValueChange,\n handleFilterOperationChange\n } = useFilters<TData, TValue>();\n\n const columnList = columns?.filter(\n column => column.columnDef.enableColumnFilter\n );\n\n const appliedFiltersSet = new Set(\n tableQuery?.filters?.map(filter => filter.name)\n );\n\n const appliedFilters =\n tableQuery?.filters?.map(filter => {\n const columnDef = columns?.find(col => {\n const columnDef = col.columnDef;\n const id = columnDef.accessorKey || col.id;\n return id === filter.name;\n })?.columnDef;\n return {\n filterType: columnDef?.filterType || FilterType.string,\n label: (columnDef?.header as string) || '',\n options: columnDef?.filterOptions || [],\n ...filter\n };\n }) || [];\n\n return (\n <Flex gap={3} className={className}>\n <Flex gap={3} className={classNames?.container}>\n {appliedFilters.map(filter => (\n <FilterChip\n key={filter.name}\n label={filter.label}\n value={filter.value}\n onRemove={() => handleRemoveFilter(filter.name)}\n onValueChange={value => handleFilterValueChange(filter.name, value)}\n onOperationChange={operator =>\n handleFilterOperationChange(\n filter.name,\n operator as FilterOperatorTypes\n )\n }\n columnType={filter.filterType}\n options={filter.options}\n className={classNames?.filterChips}\n />\n ))}\n </Flex>\n <AddFilter\n columnList={columnList}\n appliedFiltersSet={appliedFiltersSet}\n onAddFilter={onAddFilter}\n >\n {trigger}\n </AddFilter>\n </Flex>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA+BA;;AAUE;;;AAGO;AAAc;AACd;AACH;;;;AAkBJ;AAKQ;;;;AAWV;AAEM;;AAcJ;AAEA;AAOA;;;;AAWM;;AAEA;;;AAGA;AACA;AACA;AACA;;;AAIN;AA+BF;;"}
|
|
@@ -1,2 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { DataTableColumn } from '../data-table.types';
|
|
3
|
+
type Trigger<TData, TValue> = ReactNode | (({ availableFilters, appliedFilters }: {
|
|
4
|
+
availableFilters: DataTableColumn<TData, TValue>[];
|
|
5
|
+
appliedFilters: Set<string>;
|
|
6
|
+
}) => ReactNode);
|
|
7
|
+
export declare function Filters<TData, TValue>({ classNames, className, trigger }: {
|
|
8
|
+
classNames?: {
|
|
9
|
+
container?: string;
|
|
10
|
+
filterChips?: string;
|
|
11
|
+
addFilter?: string;
|
|
12
|
+
};
|
|
13
|
+
className?: string;
|
|
14
|
+
trigger?: Trigger<TData, TValue>;
|
|
15
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
2
17
|
//# sourceMappingURL=filters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../../components/data-table/components/filters.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../../components/data-table/components/filters.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAW,MAAM,OAAO,CAAC;AAQ3C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAItD,KAAK,OAAO,CAAC,KAAK,EAAE,MAAM,IACtB,SAAS,GACT,CAAC,CAAC,EACA,gBAAgB,EAChB,cAAc,EACf,EAAE;IACD,gBAAgB,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;IACnD,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B,KAAK,SAAS,CAAC,CAAC;AA4DrB,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EACrC,UAAU,EACV,SAAS,EACT,OAAO,EACR,EAAE;IACD,UAAU,CAAC,EAAE;QACX,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;CAClC,2CAiEA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useMemo } from 'react';
|
|
3
4
|
import { ReactComponent as SvgFilter } from '../../../icons/assets/filter.svg.js';
|
|
4
5
|
import { FilterType } from '../../../types/filters.js';
|
|
5
6
|
import { Button } from '../../button/button.js';
|
|
@@ -10,15 +11,25 @@ import { IconButton } from '../../icon-button/icon-button.js';
|
|
|
10
11
|
import { useDataTable } from '../hooks/useDataTable.js';
|
|
11
12
|
import { useFilters } from '../hooks/useFilters.js';
|
|
12
13
|
|
|
13
|
-
function AddFilter({ columnList = [], appliedFiltersSet, onAddFilter }) {
|
|
14
|
+
function AddFilter({ columnList = [], appliedFiltersSet, onAddFilter, children }) {
|
|
14
15
|
const availableFilters = columnList?.filter(col => !appliedFiltersSet.has(col.id));
|
|
15
|
-
|
|
16
|
+
const trigger = useMemo(() => {
|
|
17
|
+
if (typeof children === 'function')
|
|
18
|
+
return children({ availableFilters, appliedFilters: appliedFiltersSet });
|
|
19
|
+
else if (children)
|
|
20
|
+
return children;
|
|
21
|
+
else if (appliedFiltersSet.size > 0)
|
|
22
|
+
return (jsx(IconButton, { size: 4, children: jsx(SvgFilter, {}) }));
|
|
23
|
+
else
|
|
24
|
+
return (jsx(Button, { variant: 'text', size: 'small', leadingIcon: jsx(SvgFilter, {}), color: 'neutral', children: "Filter" }));
|
|
25
|
+
}, [children, appliedFiltersSet, availableFilters]);
|
|
26
|
+
return availableFilters.length > 0 ? (jsxs(DropdownMenu, { children: [jsx(DropdownMenu.Trigger, { asChild: true, children: trigger }), jsx(DropdownMenu.Content, { children: availableFilters?.map(column => {
|
|
16
27
|
const columnDef = column.columnDef;
|
|
17
28
|
const id = columnDef.accessorKey || column.id;
|
|
18
29
|
return (jsx(DropdownMenu.Item, { onClick: () => onAddFilter(column), children: columnDef.header || id }, id));
|
|
19
30
|
}) })] })) : null;
|
|
20
31
|
}
|
|
21
|
-
function Filters() {
|
|
32
|
+
function Filters({ classNames, className, trigger }) {
|
|
22
33
|
const { table, tableQuery } = useDataTable();
|
|
23
34
|
const columns = table?.getAllColumns();
|
|
24
35
|
const { onAddFilter, handleRemoveFilter, handleFilterValueChange, handleFilterOperationChange } = useFilters();
|
|
@@ -37,7 +48,7 @@ function Filters() {
|
|
|
37
48
|
...filter
|
|
38
49
|
};
|
|
39
50
|
}) || [];
|
|
40
|
-
return (jsxs(Flex, { gap: 3, children: [jsx(Flex, { gap: 3, children: appliedFilters.map(filter => (jsx(FilterChip, { label: filter.label, value: filter.value, onRemove: () => handleRemoveFilter(filter.name), onValueChange: value => handleFilterValueChange(filter.name, value), onOperationChange: operator => handleFilterOperationChange(filter.name, operator), columnType: filter.filterType, options: filter.options }, filter.name))) }), jsx(AddFilter, { columnList: columnList, appliedFiltersSet: appliedFiltersSet, onAddFilter: onAddFilter })] }));
|
|
51
|
+
return (jsxs(Flex, { gap: 3, className: className, children: [jsx(Flex, { gap: 3, className: classNames?.container, children: appliedFilters.map(filter => (jsx(FilterChip, { label: filter.label, value: filter.value, onRemove: () => handleRemoveFilter(filter.name), onValueChange: value => handleFilterValueChange(filter.name, value), onOperationChange: operator => handleFilterOperationChange(filter.name, operator), columnType: filter.filterType, options: filter.options, className: classNames?.filterChips }, filter.name))) }), jsx(AddFilter, { columnList: columnList, appliedFiltersSet: appliedFiltersSet, onAddFilter: onAddFilter, children: trigger })] }));
|
|
41
52
|
}
|
|
42
53
|
|
|
43
54
|
export { Filters };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.js","sources":["../../../../components/data-table/components/filters.tsx"],"sourcesContent":["'use client';\n\nimport { FilterIcon } from '~/icons';\nimport { FilterOperatorTypes, FilterType } from '~/types/filters';\nimport { Button } from '../../button';\nimport { DropdownMenu } from '../../dropdown-menu';\nimport { FilterChip } from '../../filter-chip';\nimport { Flex } from '../../flex';\nimport { IconButton } from '../../icon-button';\nimport { DataTableColumn } from '../data-table.types';\nimport { useDataTable } from '../hooks/useDataTable';\nimport { useFilters } from '../hooks/useFilters';\n\ninterface AddFilterProps<TData, TValue> {\n columnList: DataTableColumn<TData, TValue>[];\n appliedFiltersSet: Set<string>;\n onAddFilter: (column: DataTableColumn<TData, TValue>) => void;\n}\n\nfunction AddFilter<TData, TValue>({\n columnList = [],\n appliedFiltersSet,\n onAddFilter\n}: AddFilterProps<TData, TValue>) {\n const availableFilters = columnList?.filter(\n col => !appliedFiltersSet.has(col.id)\n );\n\n
|
|
1
|
+
{"version":3,"file":"filters.js","sources":["../../../../components/data-table/components/filters.tsx"],"sourcesContent":["'use client';\n\nimport { ReactNode, useMemo } from 'react';\nimport { FilterIcon } from '~/icons';\nimport { FilterOperatorTypes, FilterType } from '~/types/filters';\nimport { Button } from '../../button';\nimport { DropdownMenu } from '../../dropdown-menu';\nimport { FilterChip } from '../../filter-chip';\nimport { Flex } from '../../flex';\nimport { IconButton } from '../../icon-button';\nimport { DataTableColumn } from '../data-table.types';\nimport { useDataTable } from '../hooks/useDataTable';\nimport { useFilters } from '../hooks/useFilters';\n\ntype Trigger<TData, TValue> =\n | ReactNode\n | (({\n availableFilters,\n appliedFilters\n }: {\n availableFilters: DataTableColumn<TData, TValue>[];\n appliedFilters: Set<string>;\n }) => ReactNode);\n\ninterface AddFilterProps<TData, TValue> {\n columnList: DataTableColumn<TData, TValue>[];\n appliedFiltersSet: Set<string>;\n onAddFilter: (column: DataTableColumn<TData, TValue>) => void;\n children?: Trigger<TData, TValue>;\n}\n\nfunction AddFilter<TData, TValue>({\n columnList = [],\n appliedFiltersSet,\n onAddFilter,\n children\n}: AddFilterProps<TData, TValue>) {\n const availableFilters = columnList?.filter(\n col => !appliedFiltersSet.has(col.id)\n );\n\n const trigger = useMemo(() => {\n if (typeof children === 'function')\n return children({ availableFilters, appliedFilters: appliedFiltersSet });\n else if (children) return children;\n else if (appliedFiltersSet.size > 0)\n return (\n <IconButton size={4}>\n <FilterIcon />\n </IconButton>\n );\n else\n return (\n <Button\n variant='text'\n size='small'\n leadingIcon={<FilterIcon />}\n color='neutral'\n >\n Filter\n </Button>\n );\n }, [children, appliedFiltersSet, availableFilters]);\n\n return availableFilters.length > 0 ? (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>{trigger}</DropdownMenu.Trigger>\n <DropdownMenu.Content>\n {availableFilters?.map(column => {\n const columnDef = column.columnDef;\n const id = columnDef.accessorKey || column.id;\n return (\n <DropdownMenu.Item key={id} onClick={() => onAddFilter(column)}>\n {columnDef.header || id}\n </DropdownMenu.Item>\n );\n })}\n </DropdownMenu.Content>\n </DropdownMenu>\n ) : null;\n}\n\nexport function Filters<TData, TValue>({\n classNames,\n className,\n trigger\n}: {\n classNames?: {\n container?: string;\n filterChips?: string;\n addFilter?: string;\n };\n className?: string;\n trigger?: Trigger<TData, TValue>;\n}) {\n const { table, tableQuery } = useDataTable();\n const columns = table?.getAllColumns() as DataTableColumn<TData, TValue>[];\n\n const {\n onAddFilter,\n handleRemoveFilter,\n handleFilterValueChange,\n handleFilterOperationChange\n } = useFilters<TData, TValue>();\n\n const columnList = columns?.filter(\n column => column.columnDef.enableColumnFilter\n );\n\n const appliedFiltersSet = new Set(\n tableQuery?.filters?.map(filter => filter.name)\n );\n\n const appliedFilters =\n tableQuery?.filters?.map(filter => {\n const columnDef = columns?.find(col => {\n const columnDef = col.columnDef;\n const id = columnDef.accessorKey || col.id;\n return id === filter.name;\n })?.columnDef;\n return {\n filterType: columnDef?.filterType || FilterType.string,\n label: (columnDef?.header as string) || '',\n options: columnDef?.filterOptions || [],\n ...filter\n };\n }) || [];\n\n return (\n <Flex gap={3} className={className}>\n <Flex gap={3} className={classNames?.container}>\n {appliedFilters.map(filter => (\n <FilterChip\n key={filter.name}\n label={filter.label}\n value={filter.value}\n onRemove={() => handleRemoveFilter(filter.name)}\n onValueChange={value => handleFilterValueChange(filter.name, value)}\n onOperationChange={operator =>\n handleFilterOperationChange(\n filter.name,\n operator as FilterOperatorTypes\n )\n }\n columnType={filter.filterType}\n options={filter.options}\n className={classNames?.filterChips}\n />\n ))}\n </Flex>\n <AddFilter\n columnList={columnList}\n appliedFiltersSet={appliedFiltersSet}\n onAddFilter={onAddFilter}\n >\n {trigger}\n </AddFilter>\n </Flex>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AA+BA;;AAUE;;;AAGO;AAAc;AACd;AACH;;;;AAkBJ;AAKQ;;;;AAWV;AAEM;;AAcJ;AAEA;AAOA;;;;AAWM;;AAEA;;;AAGA;AACA;AACA;AACA;;;AAIN;AA+BF;;"}
|
|
@@ -5,6 +5,7 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
5
5
|
var index$1 = require('../../node_modules/.pnpm/@tanstack_react-table@8.9.2_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@tanstack/react-table/build/lib/index.cjs');
|
|
6
6
|
var React = require('react');
|
|
7
7
|
var content = require('./components/content.cjs');
|
|
8
|
+
var filters = require('./components/filters.cjs');
|
|
8
9
|
var search = require('./components/search.cjs');
|
|
9
10
|
var toolbar = require('./components/toolbar.cjs');
|
|
10
11
|
var context = require('./context.cjs');
|
|
@@ -106,7 +107,8 @@ function DataTableRoot({ data = [], columns, query, mode = 'client', isLoading =
|
|
|
106
107
|
const DataTable = Object.assign(DataTableRoot, {
|
|
107
108
|
Content: content.Content,
|
|
108
109
|
Toolbar: toolbar.Toolbar,
|
|
109
|
-
Search: search.TableSearch
|
|
110
|
+
Search: search.TableSearch,
|
|
111
|
+
Filters: filters.Filters
|
|
110
112
|
});
|
|
111
113
|
|
|
112
114
|
exports.DataTable = DataTable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.cjs","sources":["../../../components/data-table/data-table.tsx"],"sourcesContent":["'use client';\n\nimport {\n VisibilityState,\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getSortedRowModel,\n useReactTable\n} from '@tanstack/react-table';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Content } from './components/content';\nimport { TableSearch } from './components/search';\nimport { Toolbar } from './components/toolbar';\nimport { TableContext } from './context';\nimport {\n DataTableProps,\n GroupedData,\n InternalQuery,\n TableContextType,\n TableQueryUpdateFn,\n defaultGroupOption\n} from './data-table.types';\nimport {\n getColumnsWithFilterFn,\n getDefaultTableQuery,\n getInitialColumnVisibility,\n groupData,\n hasQueryChanged,\n queryToTableState,\n transformToDataTableQuery\n} from './utils';\n\nfunction DataTableRoot<TData, TValue>({\n data = [],\n columns,\n query,\n mode = 'client',\n isLoading = false,\n loadingRowCount = 3,\n defaultSort,\n children,\n onTableQueryChange,\n onLoadMore,\n onRowClick\n}: React.PropsWithChildren<DataTableProps<TData, TValue>>) {\n const defaultTableQuery = getDefaultTableQuery(defaultSort, query);\n const initialColumnVisibility = getInitialColumnVisibility(columns);\n\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>(\n initialColumnVisibility\n );\n const [tableQuery, setTableQuery] =\n useState<InternalQuery>(defaultTableQuery);\n\n const oldQueryRef = useRef<InternalQuery | null>(null);\n\n const reactTableState = useMemo(\n () => queryToTableState(tableQuery),\n [tableQuery]\n );\n\n const onDisplaySettingsReset = useCallback(() => {\n setTableQuery(prev => ({ ...prev, ...defaultTableQuery }));\n setColumnVisibility(initialColumnVisibility);\n }, [defaultTableQuery, initialColumnVisibility]);\n\n const group_by = tableQuery.group_by?.[0];\n\n const columnsWithFilters = useMemo(\n () => getColumnsWithFilterFn<TData, TValue>(columns, tableQuery.filters),\n [columns, tableQuery.filters]\n );\n\n const groupedData = useMemo(\n () => groupData(data, group_by, columns),\n [data, group_by, columns]\n );\n\n useEffect(() => {\n if (\n tableQuery &&\n onTableQueryChange &&\n hasQueryChanged(oldQueryRef.current, tableQuery) &&\n mode === 'server'\n ) {\n onTableQueryChange(transformToDataTableQuery(tableQuery));\n oldQueryRef.current = tableQuery;\n }\n }, [tableQuery, onTableQueryChange]);\n\n const table = useReactTable({\n data: groupedData as unknown as TData[],\n columns: columnsWithFilters,\n getCoreRowModel: getCoreRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n getSubRows: row => (row as unknown as GroupedData<TData>)?.subRows || [],\n getSortedRowModel: mode === 'server' ? undefined : getSortedRowModel(),\n getFilteredRowModel: mode === 'server' ? undefined : getFilteredRowModel(),\n manualSorting: mode === 'server',\n manualFiltering: mode === 'server',\n onColumnVisibilityChange: setColumnVisibility,\n globalFilterFn: mode === 'server' ? undefined : 'auto',\n initialState: {\n columnVisibility: initialColumnVisibility\n },\n filterFromLeafRows: true,\n state: {\n ...reactTableState,\n columnVisibility: columnVisibility,\n expanded:\n group_by && group_by !== defaultGroupOption.id ? true : undefined\n }\n });\n\n function updateTableQuery(fn: TableQueryUpdateFn) {\n setTableQuery(prev => fn(prev));\n }\n\n const loadMoreData = useCallback(() => {\n if (mode === 'server' && onLoadMore) {\n onLoadMore();\n }\n }, [mode, onLoadMore]);\n\n const searchQuery = query?.search;\n useEffect(() => {\n if (searchQuery) {\n updateTableQuery(prev => ({\n ...prev,\n search: searchQuery\n }));\n }\n }, [searchQuery]);\n\n const contextValue: TableContextType<TData, TValue> = useMemo(() => {\n return {\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick\n };\n }, [\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick\n ]);\n\n return (\n <TableContext.Provider value={contextValue}>\n {children}\n </TableContext.Provider>\n );\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Content: Content,\n Toolbar: Toolbar,\n Search: TableSearch\n});\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"data-table.cjs","sources":["../../../components/data-table/data-table.tsx"],"sourcesContent":["'use client';\n\nimport {\n VisibilityState,\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getSortedRowModel,\n useReactTable\n} from '@tanstack/react-table';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Content } from './components/content';\nimport { Filters } from './components/filters';\nimport { TableSearch } from './components/search';\nimport { Toolbar } from './components/toolbar';\nimport { TableContext } from './context';\nimport {\n DataTableProps,\n GroupedData,\n InternalQuery,\n TableContextType,\n TableQueryUpdateFn,\n defaultGroupOption\n} from './data-table.types';\nimport {\n getColumnsWithFilterFn,\n getDefaultTableQuery,\n getInitialColumnVisibility,\n groupData,\n hasQueryChanged,\n queryToTableState,\n transformToDataTableQuery\n} from './utils';\n\nfunction DataTableRoot<TData, TValue>({\n data = [],\n columns,\n query,\n mode = 'client',\n isLoading = false,\n loadingRowCount = 3,\n defaultSort,\n children,\n onTableQueryChange,\n onLoadMore,\n onRowClick\n}: React.PropsWithChildren<DataTableProps<TData, TValue>>) {\n const defaultTableQuery = getDefaultTableQuery(defaultSort, query);\n const initialColumnVisibility = getInitialColumnVisibility(columns);\n\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>(\n initialColumnVisibility\n );\n const [tableQuery, setTableQuery] =\n useState<InternalQuery>(defaultTableQuery);\n\n const oldQueryRef = useRef<InternalQuery | null>(null);\n\n const reactTableState = useMemo(\n () => queryToTableState(tableQuery),\n [tableQuery]\n );\n\n const onDisplaySettingsReset = useCallback(() => {\n setTableQuery(prev => ({ ...prev, ...defaultTableQuery }));\n setColumnVisibility(initialColumnVisibility);\n }, [defaultTableQuery, initialColumnVisibility]);\n\n const group_by = tableQuery.group_by?.[0];\n\n const columnsWithFilters = useMemo(\n () => getColumnsWithFilterFn<TData, TValue>(columns, tableQuery.filters),\n [columns, tableQuery.filters]\n );\n\n const groupedData = useMemo(\n () => groupData(data, group_by, columns),\n [data, group_by, columns]\n );\n\n useEffect(() => {\n if (\n tableQuery &&\n onTableQueryChange &&\n hasQueryChanged(oldQueryRef.current, tableQuery) &&\n mode === 'server'\n ) {\n onTableQueryChange(transformToDataTableQuery(tableQuery));\n oldQueryRef.current = tableQuery;\n }\n }, [tableQuery, onTableQueryChange]);\n\n const table = useReactTable({\n data: groupedData as unknown as TData[],\n columns: columnsWithFilters,\n getCoreRowModel: getCoreRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n getSubRows: row => (row as unknown as GroupedData<TData>)?.subRows || [],\n getSortedRowModel: mode === 'server' ? undefined : getSortedRowModel(),\n getFilteredRowModel: mode === 'server' ? undefined : getFilteredRowModel(),\n manualSorting: mode === 'server',\n manualFiltering: mode === 'server',\n onColumnVisibilityChange: setColumnVisibility,\n globalFilterFn: mode === 'server' ? undefined : 'auto',\n initialState: {\n columnVisibility: initialColumnVisibility\n },\n filterFromLeafRows: true,\n state: {\n ...reactTableState,\n columnVisibility: columnVisibility,\n expanded:\n group_by && group_by !== defaultGroupOption.id ? true : undefined\n }\n });\n\n function updateTableQuery(fn: TableQueryUpdateFn) {\n setTableQuery(prev => fn(prev));\n }\n\n const loadMoreData = useCallback(() => {\n if (mode === 'server' && onLoadMore) {\n onLoadMore();\n }\n }, [mode, onLoadMore]);\n\n const searchQuery = query?.search;\n useEffect(() => {\n if (searchQuery) {\n updateTableQuery(prev => ({\n ...prev,\n search: searchQuery\n }));\n }\n }, [searchQuery]);\n\n const contextValue: TableContextType<TData, TValue> = useMemo(() => {\n return {\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick\n };\n }, [\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick\n ]);\n\n return (\n <TableContext.Provider value={contextValue}>\n {children}\n </TableContext.Provider>\n );\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Content: Content,\n Toolbar: Toolbar,\n Search: TableSearch,\n Filters: Filters\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAkCA;;AAcE;;;AAQA;AAEA;AAKA;AACE;;AAEF;;;;;AAeE;;AAGE;;AAGA;AACA;;AAEJ;;AAGE;AACA;;;;AAIA;AACA;;;AAGA;;AAEA;AACE;AACD;AACD;AACA;AACE;AACA;AACA;AAED;AACF;;;;AAMD;AACE;AACE;;AAEJ;AAEA;;;AAGI;AACE;AACA;AACD;;AAEL;AAEA;;;;;;;;;;;;;;AAcA;;;;;;;;;;;;AAYC;AAED;AAKF;;AAGE;AACA;AACA;AACA;AACD;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Content } from './components/content';
|
|
2
|
+
import { Filters } from './components/filters';
|
|
2
3
|
import { Toolbar } from './components/toolbar';
|
|
3
4
|
import { DataTableProps } from './data-table.types';
|
|
4
5
|
declare function DataTableRoot<TData, TValue>({ data, columns, query, mode, isLoading, loadingRowCount, defaultSort, children, onTableQueryChange, onLoadMore, onRowClick }: React.PropsWithChildren<DataTableProps<TData, TValue>>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -6,6 +7,7 @@ export declare const DataTable: typeof DataTableRoot & {
|
|
|
6
7
|
Content: typeof Content;
|
|
7
8
|
Toolbar: typeof Toolbar;
|
|
8
9
|
Search: import("react").ForwardRefExoticComponent<import("../search/search").SearchProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
10
|
+
Filters: typeof Filters;
|
|
9
11
|
};
|
|
10
12
|
export {};
|
|
11
13
|
//# sourceMappingURL=data-table.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../../components/data-table/data-table.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EACL,cAAc,EAMf,MAAM,oBAAoB,CAAC;AAW5B,iBAAS,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EACpC,IAAS,EACT,OAAO,EACP,KAAK,EACL,IAAe,EACf,SAAiB,EACjB,eAAmB,EACnB,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,UAAU,EACV,UAAU,EACX,EAAE,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,2CA2HxD;AAED,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../../components/data-table/data-table.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EACL,cAAc,EAMf,MAAM,oBAAoB,CAAC;AAW5B,iBAAS,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EACpC,IAAS,EACT,OAAO,EACP,KAAK,EACL,IAAe,EACf,SAAiB,EACjB,eAAmB,EACnB,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,UAAU,EACV,UAAU,EACX,EAAE,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,2CA2HxD;AAED,eAAO,MAAM,SAAS;;;;;CAKpB,CAAC"}
|
|
@@ -3,6 +3,7 @@ import { jsx } from 'react/jsx-runtime';
|
|
|
3
3
|
import { useReactTable } from '../../node_modules/.pnpm/@tanstack_react-table@8.9.2_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@tanstack/react-table/build/lib/index.js';
|
|
4
4
|
import { useState, useRef, useMemo, useCallback, useEffect } from 'react';
|
|
5
5
|
import { Content } from './components/content.js';
|
|
6
|
+
import { Filters } from './components/filters.js';
|
|
6
7
|
import { TableSearch } from './components/search.js';
|
|
7
8
|
import { Toolbar } from './components/toolbar.js';
|
|
8
9
|
import { TableContext } from './context.js';
|
|
@@ -104,7 +105,8 @@ function DataTableRoot({ data = [], columns, query, mode = 'client', isLoading =
|
|
|
104
105
|
const DataTable = Object.assign(DataTableRoot, {
|
|
105
106
|
Content: Content,
|
|
106
107
|
Toolbar: Toolbar,
|
|
107
|
-
Search: TableSearch
|
|
108
|
+
Search: TableSearch,
|
|
109
|
+
Filters: Filters
|
|
108
110
|
});
|
|
109
111
|
|
|
110
112
|
export { DataTable };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.js","sources":["../../../components/data-table/data-table.tsx"],"sourcesContent":["'use client';\n\nimport {\n VisibilityState,\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getSortedRowModel,\n useReactTable\n} from '@tanstack/react-table';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Content } from './components/content';\nimport { TableSearch } from './components/search';\nimport { Toolbar } from './components/toolbar';\nimport { TableContext } from './context';\nimport {\n DataTableProps,\n GroupedData,\n InternalQuery,\n TableContextType,\n TableQueryUpdateFn,\n defaultGroupOption\n} from './data-table.types';\nimport {\n getColumnsWithFilterFn,\n getDefaultTableQuery,\n getInitialColumnVisibility,\n groupData,\n hasQueryChanged,\n queryToTableState,\n transformToDataTableQuery\n} from './utils';\n\nfunction DataTableRoot<TData, TValue>({\n data = [],\n columns,\n query,\n mode = 'client',\n isLoading = false,\n loadingRowCount = 3,\n defaultSort,\n children,\n onTableQueryChange,\n onLoadMore,\n onRowClick\n}: React.PropsWithChildren<DataTableProps<TData, TValue>>) {\n const defaultTableQuery = getDefaultTableQuery(defaultSort, query);\n const initialColumnVisibility = getInitialColumnVisibility(columns);\n\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>(\n initialColumnVisibility\n );\n const [tableQuery, setTableQuery] =\n useState<InternalQuery>(defaultTableQuery);\n\n const oldQueryRef = useRef<InternalQuery | null>(null);\n\n const reactTableState = useMemo(\n () => queryToTableState(tableQuery),\n [tableQuery]\n );\n\n const onDisplaySettingsReset = useCallback(() => {\n setTableQuery(prev => ({ ...prev, ...defaultTableQuery }));\n setColumnVisibility(initialColumnVisibility);\n }, [defaultTableQuery, initialColumnVisibility]);\n\n const group_by = tableQuery.group_by?.[0];\n\n const columnsWithFilters = useMemo(\n () => getColumnsWithFilterFn<TData, TValue>(columns, tableQuery.filters),\n [columns, tableQuery.filters]\n );\n\n const groupedData = useMemo(\n () => groupData(data, group_by, columns),\n [data, group_by, columns]\n );\n\n useEffect(() => {\n if (\n tableQuery &&\n onTableQueryChange &&\n hasQueryChanged(oldQueryRef.current, tableQuery) &&\n mode === 'server'\n ) {\n onTableQueryChange(transformToDataTableQuery(tableQuery));\n oldQueryRef.current = tableQuery;\n }\n }, [tableQuery, onTableQueryChange]);\n\n const table = useReactTable({\n data: groupedData as unknown as TData[],\n columns: columnsWithFilters,\n getCoreRowModel: getCoreRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n getSubRows: row => (row as unknown as GroupedData<TData>)?.subRows || [],\n getSortedRowModel: mode === 'server' ? undefined : getSortedRowModel(),\n getFilteredRowModel: mode === 'server' ? undefined : getFilteredRowModel(),\n manualSorting: mode === 'server',\n manualFiltering: mode === 'server',\n onColumnVisibilityChange: setColumnVisibility,\n globalFilterFn: mode === 'server' ? undefined : 'auto',\n initialState: {\n columnVisibility: initialColumnVisibility\n },\n filterFromLeafRows: true,\n state: {\n ...reactTableState,\n columnVisibility: columnVisibility,\n expanded:\n group_by && group_by !== defaultGroupOption.id ? true : undefined\n }\n });\n\n function updateTableQuery(fn: TableQueryUpdateFn) {\n setTableQuery(prev => fn(prev));\n }\n\n const loadMoreData = useCallback(() => {\n if (mode === 'server' && onLoadMore) {\n onLoadMore();\n }\n }, [mode, onLoadMore]);\n\n const searchQuery = query?.search;\n useEffect(() => {\n if (searchQuery) {\n updateTableQuery(prev => ({\n ...prev,\n search: searchQuery\n }));\n }\n }, [searchQuery]);\n\n const contextValue: TableContextType<TData, TValue> = useMemo(() => {\n return {\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick\n };\n }, [\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick\n ]);\n\n return (\n <TableContext.Provider value={contextValue}>\n {children}\n </TableContext.Provider>\n );\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Content: Content,\n Toolbar: Toolbar,\n Search: TableSearch\n});\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"data-table.js","sources":["../../../components/data-table/data-table.tsx"],"sourcesContent":["'use client';\n\nimport {\n VisibilityState,\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getSortedRowModel,\n useReactTable\n} from '@tanstack/react-table';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Content } from './components/content';\nimport { Filters } from './components/filters';\nimport { TableSearch } from './components/search';\nimport { Toolbar } from './components/toolbar';\nimport { TableContext } from './context';\nimport {\n DataTableProps,\n GroupedData,\n InternalQuery,\n TableContextType,\n TableQueryUpdateFn,\n defaultGroupOption\n} from './data-table.types';\nimport {\n getColumnsWithFilterFn,\n getDefaultTableQuery,\n getInitialColumnVisibility,\n groupData,\n hasQueryChanged,\n queryToTableState,\n transformToDataTableQuery\n} from './utils';\n\nfunction DataTableRoot<TData, TValue>({\n data = [],\n columns,\n query,\n mode = 'client',\n isLoading = false,\n loadingRowCount = 3,\n defaultSort,\n children,\n onTableQueryChange,\n onLoadMore,\n onRowClick\n}: React.PropsWithChildren<DataTableProps<TData, TValue>>) {\n const defaultTableQuery = getDefaultTableQuery(defaultSort, query);\n const initialColumnVisibility = getInitialColumnVisibility(columns);\n\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>(\n initialColumnVisibility\n );\n const [tableQuery, setTableQuery] =\n useState<InternalQuery>(defaultTableQuery);\n\n const oldQueryRef = useRef<InternalQuery | null>(null);\n\n const reactTableState = useMemo(\n () => queryToTableState(tableQuery),\n [tableQuery]\n );\n\n const onDisplaySettingsReset = useCallback(() => {\n setTableQuery(prev => ({ ...prev, ...defaultTableQuery }));\n setColumnVisibility(initialColumnVisibility);\n }, [defaultTableQuery, initialColumnVisibility]);\n\n const group_by = tableQuery.group_by?.[0];\n\n const columnsWithFilters = useMemo(\n () => getColumnsWithFilterFn<TData, TValue>(columns, tableQuery.filters),\n [columns, tableQuery.filters]\n );\n\n const groupedData = useMemo(\n () => groupData(data, group_by, columns),\n [data, group_by, columns]\n );\n\n useEffect(() => {\n if (\n tableQuery &&\n onTableQueryChange &&\n hasQueryChanged(oldQueryRef.current, tableQuery) &&\n mode === 'server'\n ) {\n onTableQueryChange(transformToDataTableQuery(tableQuery));\n oldQueryRef.current = tableQuery;\n }\n }, [tableQuery, onTableQueryChange]);\n\n const table = useReactTable({\n data: groupedData as unknown as TData[],\n columns: columnsWithFilters,\n getCoreRowModel: getCoreRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n getSubRows: row => (row as unknown as GroupedData<TData>)?.subRows || [],\n getSortedRowModel: mode === 'server' ? undefined : getSortedRowModel(),\n getFilteredRowModel: mode === 'server' ? undefined : getFilteredRowModel(),\n manualSorting: mode === 'server',\n manualFiltering: mode === 'server',\n onColumnVisibilityChange: setColumnVisibility,\n globalFilterFn: mode === 'server' ? undefined : 'auto',\n initialState: {\n columnVisibility: initialColumnVisibility\n },\n filterFromLeafRows: true,\n state: {\n ...reactTableState,\n columnVisibility: columnVisibility,\n expanded:\n group_by && group_by !== defaultGroupOption.id ? true : undefined\n }\n });\n\n function updateTableQuery(fn: TableQueryUpdateFn) {\n setTableQuery(prev => fn(prev));\n }\n\n const loadMoreData = useCallback(() => {\n if (mode === 'server' && onLoadMore) {\n onLoadMore();\n }\n }, [mode, onLoadMore]);\n\n const searchQuery = query?.search;\n useEffect(() => {\n if (searchQuery) {\n updateTableQuery(prev => ({\n ...prev,\n search: searchQuery\n }));\n }\n }, [searchQuery]);\n\n const contextValue: TableContextType<TData, TValue> = useMemo(() => {\n return {\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick\n };\n }, [\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick\n ]);\n\n return (\n <TableContext.Provider value={contextValue}>\n {children}\n </TableContext.Provider>\n );\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Content: Content,\n Toolbar: Toolbar,\n Search: TableSearch,\n Filters: Filters\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;AAkCA;;AAcE;;;AAQA;AAEA;AAKA;AACE;;AAEF;;;;;AAeE;;AAGE;;AAGA;AACA;;AAEJ;;AAGE;AACA;;;;AAIA;AACA;;;AAGA;;AAEA;AACE;AACD;AACD;AACA;AACE;AACA;AACA;AAED;AACF;;;;AAMD;AACE;AACE;;AAEJ;AAEA;;;AAGI;AACE;AACA;AACD;;AAEL;AAEA;;;;;;;;;;;;;;AAcA;;;;;;;;;;;;AAYC;AAED;AAKF;;AAGE;AACA;AACA;AACA;AACD;;"}
|
|
@@ -8,33 +8,38 @@ var headline_module = require('./headline.module.css.cjs');
|
|
|
8
8
|
const headline = index.cva(headline_module.default.headline, {
|
|
9
9
|
variants: {
|
|
10
10
|
size: {
|
|
11
|
-
t1: headline_module.default[
|
|
12
|
-
t2: headline_module.default[
|
|
13
|
-
t3: headline_module.default[
|
|
14
|
-
t4: headline_module.default[
|
|
15
|
-
small: headline_module.default[
|
|
16
|
-
medium: headline_module.default[
|
|
17
|
-
large: headline_module.default[
|
|
11
|
+
t1: headline_module.default['headline-t1'],
|
|
12
|
+
t2: headline_module.default['headline-t2'],
|
|
13
|
+
t3: headline_module.default['headline-t3'],
|
|
14
|
+
t4: headline_module.default['headline-t4'],
|
|
15
|
+
small: headline_module.default['headline-small'],
|
|
16
|
+
medium: headline_module.default['headline-medium'],
|
|
17
|
+
large: headline_module.default['headline-large']
|
|
18
|
+
},
|
|
19
|
+
weight: {
|
|
20
|
+
regular: headline_module.default['headline-weight-regular'],
|
|
21
|
+
medium: headline_module.default['headline-weight-medium']
|
|
18
22
|
},
|
|
19
23
|
align: {
|
|
20
|
-
left: headline_module.default[
|
|
21
|
-
center: headline_module.default[
|
|
22
|
-
right: headline_module.default[
|
|
24
|
+
left: headline_module.default['headline-align-left'],
|
|
25
|
+
center: headline_module.default['headline-align-center'],
|
|
26
|
+
right: headline_module.default['headline-align-right']
|
|
23
27
|
},
|
|
24
28
|
truncate: {
|
|
25
|
-
true: headline_module.default[
|
|
26
|
-
}
|
|
29
|
+
true: headline_module.default['headline-truncate']
|
|
30
|
+
}
|
|
27
31
|
},
|
|
28
32
|
defaultVariants: {
|
|
29
|
-
size:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
size: 't2',
|
|
34
|
+
weight: 'medium',
|
|
35
|
+
align: 'left',
|
|
36
|
+
truncate: false
|
|
37
|
+
}
|
|
33
38
|
});
|
|
34
|
-
const Headline = React.forwardRef(({ className, size, align, truncate, as: Component =
|
|
35
|
-
return (jsxRuntime.jsx(Component, { ref: ref, className: headline({ size, align, truncate, className }), ...props }));
|
|
39
|
+
const Headline = React.forwardRef(({ className, size, weight, align, truncate, as: Component = 'h2', ...props }, ref) => {
|
|
40
|
+
return (jsxRuntime.jsx(Component, { ref: ref, className: headline({ size, weight, align, truncate, className }), ...props }));
|
|
36
41
|
});
|
|
37
|
-
Headline.displayName =
|
|
42
|
+
Headline.displayName = 'Headline';
|
|
38
43
|
|
|
39
44
|
exports.Headline = Headline;
|
|
40
45
|
//# sourceMappingURL=headline.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headline.cjs","sources":["../../../components/headline/headline.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"headline.cjs","sources":["../../../components/headline/headline.tsx"],"sourcesContent":["import { type VariantProps, cva } from 'class-variance-authority';\nimport { HTMLAttributes, forwardRef } from 'react';\n\nimport styles from './headline.module.css';\n\nconst headline = cva(styles.headline, {\n variants: {\n size: {\n t1: styles['headline-t1'],\n t2: styles['headline-t2'],\n t3: styles['headline-t3'],\n t4: styles['headline-t4'],\n small: styles['headline-small'],\n medium: styles['headline-medium'],\n large: styles['headline-large']\n },\n weight: {\n regular: styles['headline-weight-regular'],\n medium: styles['headline-weight-medium']\n },\n align: {\n left: styles['headline-align-left'],\n center: styles['headline-align-center'],\n right: styles['headline-align-right']\n },\n truncate: {\n true: styles['headline-truncate']\n }\n },\n defaultVariants: {\n size: 't2',\n weight: 'medium',\n align: 'left',\n truncate: false\n }\n});\n\nexport type HeadlineBaseProps = VariantProps<typeof headline> & {\n /**\n * @remarks Use \"t1\" | \"t2\" | \"t3\" | \"t4\"\n */\n size?: 't1' | 't2' | 't3' | 't4' | 'small' | 'medium' | 'large';\n};\n\ntype HeadlineProps = HeadlineBaseProps &\n HTMLAttributes<HTMLHeadingElement> & {\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n };\n\nexport const Headline = forwardRef<HTMLHeadingElement, HeadlineProps>(\n (\n {\n className,\n size,\n weight,\n align,\n truncate,\n as: Component = 'h2',\n ...props\n },\n ref\n ) => {\n return (\n <Component\n ref={ref}\n className={headline({ size, weight, align, truncate, className })}\n {...props}\n />\n );\n }\n);\n\nHeadline.displayName = 'Headline';\n"],"names":["cva","styles","forwardRef","_jsx"],"mappings":";;;;;;;AAKA,MAAM,QAAQ,GAAGA,SAAG,CAACC,uBAAM,CAAC,QAAQ,EAAE;AACpC,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAEA,uBAAM,CAAC,aAAa,CAAC;AACzB,YAAA,EAAE,EAAEA,uBAAM,CAAC,aAAa,CAAC;AACzB,YAAA,EAAE,EAAEA,uBAAM,CAAC,aAAa,CAAC;AACzB,YAAA,EAAE,EAAEA,uBAAM,CAAC,aAAa,CAAC;AACzB,YAAA,KAAK,EAAEA,uBAAM,CAAC,gBAAgB,CAAC;AAC/B,YAAA,MAAM,EAAEA,uBAAM,CAAC,iBAAiB,CAAC;AACjC,YAAA,KAAK,EAAEA,uBAAM,CAAC,gBAAgB,CAAC;AAChC,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,OAAO,EAAEA,uBAAM,CAAC,yBAAyB,CAAC;AAC1C,YAAA,MAAM,EAAEA,uBAAM,CAAC,wBAAwB,CAAC;AACzC,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAEA,uBAAM,CAAC,qBAAqB,CAAC;AACnC,YAAA,MAAM,EAAEA,uBAAM,CAAC,uBAAuB,CAAC;AACvC,YAAA,KAAK,EAAEA,uBAAM,CAAC,sBAAsB,CAAC;AACtC,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAEA,uBAAM,CAAC,mBAAmB,CAAC;AAClC,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,MAAM,EAAE,QAAQ;AAChB,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,QAAQ,EAAE,KAAK;AAChB,KAAA;AACF,CAAA,CAAC,CAAC;AAcI,MAAM,QAAQ,GAAGC,gBAAU,CAChC,CACE,EACE,SAAS,EACT,IAAI,EACJ,MAAM,EACN,KAAK,EACL,QAAQ,EACR,EAAE,EAAE,SAAS,GAAG,IAAI,EACpB,GAAG,KAAK,EACT,EACD,GAAG,KACD;AACF,IAAA,QACEC,cAAA,CAAC,SAAS,EAAA,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAC7D,GAAA,KAAK,EACT,CAAA,EACF;AACJ,CAAC,EACD;AAEF,QAAQ,CAAC,WAAW,GAAG,UAAU;;;;"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { type VariantProps } from
|
|
2
|
-
import { HTMLAttributes } from
|
|
1
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
2
|
+
import { HTMLAttributes } from 'react';
|
|
3
3
|
declare const headline: (props?: ({
|
|
4
4
|
size?: "small" | "medium" | "large" | "t1" | "t2" | "t3" | "t4" | null | undefined;
|
|
5
|
+
weight?: "medium" | "regular" | null | undefined;
|
|
5
6
|
align?: "center" | "left" | "right" | null | undefined;
|
|
6
7
|
truncate?: boolean | null | undefined;
|
|
7
8
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
@@ -9,10 +10,11 @@ export type HeadlineBaseProps = VariantProps<typeof headline> & {
|
|
|
9
10
|
/**
|
|
10
11
|
* @remarks Use "t1" | "t2" | "t3" | "t4"
|
|
11
12
|
*/
|
|
12
|
-
size?:
|
|
13
|
+
size?: 't1' | 't2' | 't3' | 't4' | 'small' | 'medium' | 'large';
|
|
13
14
|
};
|
|
14
15
|
export declare const Headline: import("react").ForwardRefExoticComponent<VariantProps<(props?: ({
|
|
15
16
|
size?: "small" | "medium" | "large" | "t1" | "t2" | "t3" | "t4" | null | undefined;
|
|
17
|
+
weight?: "medium" | "regular" | null | undefined;
|
|
16
18
|
align?: "center" | "left" | "right" | null | undefined;
|
|
17
19
|
truncate?: boolean | null | undefined;
|
|
18
20
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headline.d.ts","sourceRoot":"","sources":["../../../components/headline/headline.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"headline.d.ts","sourceRoot":"","sources":["../../../components/headline/headline.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAc,MAAM,OAAO,CAAC;AAInD,QAAA,MAAM,QAAQ;;;;;8EA8BZ,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG;IAC9D;;OAEG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;CACjE,CAAC;AAOF,eAAO,MAAM,QAAQ;;;;;;IAXnB;;OAEG;;;;sDA8BJ,CAAC"}
|
|
@@ -6,33 +6,38 @@ import styles from './headline.module.css.js';
|
|
|
6
6
|
const headline = cva(styles.headline, {
|
|
7
7
|
variants: {
|
|
8
8
|
size: {
|
|
9
|
-
t1: styles[
|
|
10
|
-
t2: styles[
|
|
11
|
-
t3: styles[
|
|
12
|
-
t4: styles[
|
|
13
|
-
small: styles[
|
|
14
|
-
medium: styles[
|
|
15
|
-
large: styles[
|
|
9
|
+
t1: styles['headline-t1'],
|
|
10
|
+
t2: styles['headline-t2'],
|
|
11
|
+
t3: styles['headline-t3'],
|
|
12
|
+
t4: styles['headline-t4'],
|
|
13
|
+
small: styles['headline-small'],
|
|
14
|
+
medium: styles['headline-medium'],
|
|
15
|
+
large: styles['headline-large']
|
|
16
|
+
},
|
|
17
|
+
weight: {
|
|
18
|
+
regular: styles['headline-weight-regular'],
|
|
19
|
+
medium: styles['headline-weight-medium']
|
|
16
20
|
},
|
|
17
21
|
align: {
|
|
18
|
-
left: styles[
|
|
19
|
-
center: styles[
|
|
20
|
-
right: styles[
|
|
22
|
+
left: styles['headline-align-left'],
|
|
23
|
+
center: styles['headline-align-center'],
|
|
24
|
+
right: styles['headline-align-right']
|
|
21
25
|
},
|
|
22
26
|
truncate: {
|
|
23
|
-
true: styles[
|
|
24
|
-
}
|
|
27
|
+
true: styles['headline-truncate']
|
|
28
|
+
}
|
|
25
29
|
},
|
|
26
30
|
defaultVariants: {
|
|
27
|
-
size:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
size: 't2',
|
|
32
|
+
weight: 'medium',
|
|
33
|
+
align: 'left',
|
|
34
|
+
truncate: false
|
|
35
|
+
}
|
|
31
36
|
});
|
|
32
|
-
const Headline = forwardRef(({ className, size, align, truncate, as: Component =
|
|
33
|
-
return (jsx(Component, { ref: ref, className: headline({ size, align, truncate, className }), ...props }));
|
|
37
|
+
const Headline = forwardRef(({ className, size, weight, align, truncate, as: Component = 'h2', ...props }, ref) => {
|
|
38
|
+
return (jsx(Component, { ref: ref, className: headline({ size, weight, align, truncate, className }), ...props }));
|
|
34
39
|
});
|
|
35
|
-
Headline.displayName =
|
|
40
|
+
Headline.displayName = 'Headline';
|
|
36
41
|
|
|
37
42
|
export { Headline };
|
|
38
43
|
//# sourceMappingURL=headline.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headline.js","sources":["../../../components/headline/headline.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"headline.js","sources":["../../../components/headline/headline.tsx"],"sourcesContent":["import { type VariantProps, cva } from 'class-variance-authority';\nimport { HTMLAttributes, forwardRef } from 'react';\n\nimport styles from './headline.module.css';\n\nconst headline = cva(styles.headline, {\n variants: {\n size: {\n t1: styles['headline-t1'],\n t2: styles['headline-t2'],\n t3: styles['headline-t3'],\n t4: styles['headline-t4'],\n small: styles['headline-small'],\n medium: styles['headline-medium'],\n large: styles['headline-large']\n },\n weight: {\n regular: styles['headline-weight-regular'],\n medium: styles['headline-weight-medium']\n },\n align: {\n left: styles['headline-align-left'],\n center: styles['headline-align-center'],\n right: styles['headline-align-right']\n },\n truncate: {\n true: styles['headline-truncate']\n }\n },\n defaultVariants: {\n size: 't2',\n weight: 'medium',\n align: 'left',\n truncate: false\n }\n});\n\nexport type HeadlineBaseProps = VariantProps<typeof headline> & {\n /**\n * @remarks Use \"t1\" | \"t2\" | \"t3\" | \"t4\"\n */\n size?: 't1' | 't2' | 't3' | 't4' | 'small' | 'medium' | 'large';\n};\n\ntype HeadlineProps = HeadlineBaseProps &\n HTMLAttributes<HTMLHeadingElement> & {\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n };\n\nexport const Headline = forwardRef<HTMLHeadingElement, HeadlineProps>(\n (\n {\n className,\n size,\n weight,\n align,\n truncate,\n as: Component = 'h2',\n ...props\n },\n ref\n ) => {\n return (\n <Component\n ref={ref}\n className={headline({ size, weight, align, truncate, className })}\n {...props}\n />\n );\n }\n);\n\nHeadline.displayName = 'Headline';\n"],"names":["_jsx"],"mappings":";;;;;AAKA,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE;AACpC,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC;AACzB,YAAA,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC;AACzB,YAAA,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC;AACzB,YAAA,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC;AACzB,YAAA,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC;AAC/B,YAAA,MAAM,EAAE,MAAM,CAAC,iBAAiB,CAAC;AACjC,YAAA,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC;AAChC,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,OAAO,EAAE,MAAM,CAAC,yBAAyB,CAAC;AAC1C,YAAA,MAAM,EAAE,MAAM,CAAC,wBAAwB,CAAC;AACzC,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,MAAM,CAAC,qBAAqB,CAAC;AACnC,YAAA,MAAM,EAAE,MAAM,CAAC,uBAAuB,CAAC;AACvC,YAAA,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC;AACtC,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,MAAM,CAAC,mBAAmB,CAAC;AAClC,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,MAAM,EAAE,QAAQ;AAChB,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,QAAQ,EAAE,KAAK;AAChB,KAAA;AACF,CAAA,CAAC,CAAC;AAcI,MAAM,QAAQ,GAAG,UAAU,CAChC,CACE,EACE,SAAS,EACT,IAAI,EACJ,MAAM,EACN,KAAK,EACL,QAAQ,EACR,EAAE,EAAE,SAAS,GAAG,IAAI,EACpB,GAAG,KAAK,EACT,EACD,GAAG,KACD;AACF,IAAA,QACEA,GAAA,CAAC,SAAS,EAAA,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAC7D,GAAA,KAAK,EACT,CAAA,EACF;AACJ,CAAC,EACD;AAEF,QAAQ,CAAC,WAAW,GAAG,UAAU;;;;"}
|