@fragments-sdk/ui 0.9.6 → 0.9.7
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/codeblock.cjs +25 -29
- package/dist/codeblock.cjs.map +1 -1
- package/dist/codeblock.js +25 -29
- package/dist/codeblock.js.map +1 -1
- package/dist/components/Chip/index.cjs +2 -1
- package/dist/components/Chip/index.cjs.map +1 -1
- package/dist/components/Chip/index.d.ts.map +1 -1
- package/dist/components/Chip/index.js +2 -1
- package/dist/components/Chip/index.js.map +1 -1
- package/dist/components/CodeBlock/index.d.ts.map +1 -1
- package/dist/components/Command/index.cjs +6 -0
- package/dist/components/Command/index.cjs.map +1 -1
- package/dist/components/Command/index.d.ts.map +1 -1
- package/dist/components/Command/index.js +6 -0
- package/dist/components/Command/index.js.map +1 -1
- package/dist/components/DataTable/index.cjs +26 -26
- package/dist/components/DataTable/index.cjs.map +1 -1
- package/dist/components/DataTable/index.d.ts.map +1 -1
- package/dist/components/DataTable/index.js +26 -26
- package/dist/components/DataTable/index.js.map +1 -1
- package/dist/components/Listbox/index.cjs +6 -0
- package/dist/components/Listbox/index.cjs.map +1 -1
- package/dist/components/Listbox/index.d.ts.map +1 -1
- package/dist/components/Listbox/index.js +6 -0
- package/dist/components/Listbox/index.js.map +1 -1
- package/dist/components/Loading/index.cjs +2 -12
- package/dist/components/Loading/index.cjs.map +1 -1
- package/dist/components/Loading/index.d.ts.map +1 -1
- package/dist/components/Loading/index.js +2 -12
- package/dist/components/Loading/index.js.map +1 -1
- package/dist/components/NavigationMenu/index.cjs +12 -1
- package/dist/components/NavigationMenu/index.cjs.map +1 -1
- package/dist/components/NavigationMenu/index.d.ts.map +1 -1
- package/dist/components/NavigationMenu/index.js +12 -1
- package/dist/components/NavigationMenu/index.js.map +1 -1
- package/dist/components/Skeleton/index.cjs +3 -3
- package/dist/components/Skeleton/index.cjs.map +1 -1
- package/dist/components/Skeleton/index.js +3 -3
- package/dist/components/Skeleton/index.js.map +1 -1
- package/dist/components/Stack/index.cjs +4 -3
- package/dist/components/Stack/index.cjs.map +1 -1
- package/dist/components/Stack/index.d.ts.map +1 -1
- package/dist/components/Stack/index.js +4 -3
- package/dist/components/Stack/index.js.map +1 -1
- package/dist/markdown.cjs +1 -1
- package/dist/markdown.cjs.map +1 -1
- package/dist/markdown.js +1 -1
- package/dist/markdown.js.map +1 -1
- package/fragments.json +1 -1
- package/package.json +1 -1
- package/src/components/Chip/index.tsx +3 -1
- package/src/components/CodeBlock/index.tsx +35 -41
- package/src/components/ColorPicker/ColorPicker.fragment.tsx +17 -15
- package/src/components/Command/index.tsx +1 -0
- package/src/components/DataTable/index.tsx +45 -45
- package/src/components/Listbox/index.tsx +1 -0
- package/src/components/Loading/index.tsx +6 -12
- package/src/components/Markdown/index.tsx +2 -2
- package/src/components/Menu/Menu.fragment.tsx +17 -15
- package/src/components/NavigationMenu/index.tsx +6 -1
- package/src/components/Skeleton/index.tsx +3 -3
- package/src/components/Slider/Slider.fragment.tsx +19 -17
- package/src/components/Stack/index.tsx +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/Chip/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Chip.module.scss';\n\nexport interface ChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n children: React.ReactNode;\n /** Visual style variant */\n variant?: 'filled' | 'outlined' | 'soft';\n /** Size of the chip */\n size?: 'sm' | 'md' | 'lg';\n /** Whether the chip is selected */\n selected?: boolean;\n /** Icon element rendered before the label */\n icon?: React.ReactNode;\n /** Avatar element rendered before the label */\n avatar?: React.ReactNode;\n /** Makes chip removable. Called when X is clicked. */\n onRemove?: () => void;\n /** Value identifier used by Chip.Group */\n value?: string;\n}\n\nexport interface ChipGroupProps {\n children: React.ReactNode;\n /** Controlled selected values */\n value?: string[];\n /** Default selected values (uncontrolled) */\n defaultValue?: string[];\n /** Called when selection changes */\n onChange?: (value: string[]) => void;\n className?: string;\n}\n\nconst ChipBase = React.forwardRef<HTMLButtonElement, ChipProps>(\n function Chip(\n {\n children,\n variant = 'filled',\n size = 'md',\n selected = false,\n disabled = false,\n icon,\n avatar,\n onRemove,\n className,\n onClick,\n value: _value,\n ...htmlProps\n },\n ref\n ) {\n const classes = [\n styles.chip,\n styles[size],\n styles[variant],\n selected && styles.selected,\n onRemove && styles.withRemove,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleRemoveClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n onRemove?.();\n };\n\n const removeAriaLabel = `Remove ${typeof children === 'string' ? children : 'chip'}`;\n\n const chipButton = (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={selected}\n disabled={disabled}\n className={classes}\n onClick={onClick}\n {...htmlProps}\n >\n {avatar && (\n <span className={styles.avatar} aria-hidden=\"true\">\n {avatar}\n </span>\n )}\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{children}</span>\n </button>\n );\n\n if (!onRemove) {\n return chipButton;\n }\n\n return (\n <span className={styles.removableChip} data-disabled={disabled || undefined}>\n {chipButton}\n <button\n type=\"button\"\n className={styles.remove}\n onClick={handleRemoveClick}\n aria-label={removeAriaLabel}\n disabled={disabled}\n >\n ×\n </button>\n </span>\n );\n }\n);\n\nfunction ChipGroupInner(\n { children, value: controlledValue, defaultValue =
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/Chip/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Chip.module.scss';\n\nexport interface ChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n children: React.ReactNode;\n /** Visual style variant */\n variant?: 'filled' | 'outlined' | 'soft';\n /** Size of the chip */\n size?: 'sm' | 'md' | 'lg';\n /** Whether the chip is selected */\n selected?: boolean;\n /** Icon element rendered before the label */\n icon?: React.ReactNode;\n /** Avatar element rendered before the label */\n avatar?: React.ReactNode;\n /** Makes chip removable. Called when X is clicked. */\n onRemove?: () => void;\n /** Value identifier used by Chip.Group */\n value?: string;\n}\n\nexport interface ChipGroupProps {\n children: React.ReactNode;\n /** Controlled selected values */\n value?: string[];\n /** Default selected values (uncontrolled) */\n defaultValue?: string[];\n /** Called when selection changes */\n onChange?: (value: string[]) => void;\n className?: string;\n}\n\nconst ChipBase = React.forwardRef<HTMLButtonElement, ChipProps>(\n function Chip(\n {\n children,\n variant = 'filled',\n size = 'md',\n selected = false,\n disabled = false,\n icon,\n avatar,\n onRemove,\n className,\n onClick,\n value: _value,\n ...htmlProps\n },\n ref\n ) {\n const classes = [\n styles.chip,\n styles[size],\n styles[variant],\n selected && styles.selected,\n onRemove && styles.withRemove,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleRemoveClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n onRemove?.();\n };\n\n const removeAriaLabel = `Remove ${typeof children === 'string' ? children : 'chip'}`;\n\n const chipButton = (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={selected}\n disabled={disabled}\n className={classes}\n onClick={onClick}\n {...htmlProps}\n >\n {avatar && (\n <span className={styles.avatar} aria-hidden=\"true\">\n {avatar}\n </span>\n )}\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{children}</span>\n </button>\n );\n\n if (!onRemove) {\n return chipButton;\n }\n\n return (\n <span className={styles.removableChip} data-disabled={disabled || undefined}>\n {chipButton}\n <button\n type=\"button\"\n className={styles.remove}\n onClick={handleRemoveClick}\n aria-label={removeAriaLabel}\n disabled={disabled}\n >\n ×\n </button>\n </span>\n );\n }\n);\n\nconst EMPTY_CHIP_GROUP: string[] = [];\n\nfunction ChipGroupInner(\n { children, value: controlledValue, defaultValue = EMPTY_CHIP_GROUP, onChange, className }: ChipGroupProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n const toggle = React.useCallback(\n (chipValue: string) => {\n const next = currentValue.includes(chipValue)\n ? currentValue.filter((v) => v !== chipValue)\n : [...currentValue, chipValue];\n\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n },\n [currentValue, isControlled, onChange]\n );\n\n const classes = [styles.group, className].filter(Boolean).join(' ');\n\n return (\n <div ref={ref} className={classes}>\n {React.Children.map(children, (child) => {\n if (!React.isValidElement<ChipProps>(child)) return child;\n const chipValue = child.props.value ?? (typeof child.props.children === 'string' ? child.props.children : '');\n return React.cloneElement(child, {\n selected: currentValue.includes(chipValue),\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n child.props.onClick?.(e);\n if (!e.defaultPrevented) {\n toggle(chipValue);\n }\n },\n } as Partial<ChipProps>);\n })}\n </div>\n );\n}\n\nconst ChipGroup = React.forwardRef<HTMLDivElement, ChipGroupProps>(ChipGroupInner);\n\n// Compose Chip with static Group property\nexport const Chip = Object.assign(ChipBase, { Group: ChipGroup });\n"],"names":["React","Chip","styles","jsxs","jsx"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Chip/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAChG,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACzC,uBAAuB;IACvB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Chip/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAChG,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACzC,uBAAuB;IACvB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmID,eAAO,MAAM,IAAI;;CAAgD,CAAC"}
|
|
@@ -65,7 +65,8 @@ const ChipBase = React.forwardRef(
|
|
|
65
65
|
] });
|
|
66
66
|
}
|
|
67
67
|
);
|
|
68
|
-
|
|
68
|
+
const EMPTY_CHIP_GROUP = [];
|
|
69
|
+
function ChipGroupInner({ children, value: controlledValue, defaultValue = EMPTY_CHIP_GROUP, onChange, className }, ref) {
|
|
69
70
|
const [internalValue, setInternalValue] = React.useState(defaultValue);
|
|
70
71
|
const isControlled = controlledValue !== void 0;
|
|
71
72
|
const currentValue = isControlled ? controlledValue : internalValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/Chip/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Chip.module.scss';\n\nexport interface ChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n children: React.ReactNode;\n /** Visual style variant */\n variant?: 'filled' | 'outlined' | 'soft';\n /** Size of the chip */\n size?: 'sm' | 'md' | 'lg';\n /** Whether the chip is selected */\n selected?: boolean;\n /** Icon element rendered before the label */\n icon?: React.ReactNode;\n /** Avatar element rendered before the label */\n avatar?: React.ReactNode;\n /** Makes chip removable. Called when X is clicked. */\n onRemove?: () => void;\n /** Value identifier used by Chip.Group */\n value?: string;\n}\n\nexport interface ChipGroupProps {\n children: React.ReactNode;\n /** Controlled selected values */\n value?: string[];\n /** Default selected values (uncontrolled) */\n defaultValue?: string[];\n /** Called when selection changes */\n onChange?: (value: string[]) => void;\n className?: string;\n}\n\nconst ChipBase = React.forwardRef<HTMLButtonElement, ChipProps>(\n function Chip(\n {\n children,\n variant = 'filled',\n size = 'md',\n selected = false,\n disabled = false,\n icon,\n avatar,\n onRemove,\n className,\n onClick,\n value: _value,\n ...htmlProps\n },\n ref\n ) {\n const classes = [\n styles.chip,\n styles[size],\n styles[variant],\n selected && styles.selected,\n onRemove && styles.withRemove,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleRemoveClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n onRemove?.();\n };\n\n const removeAriaLabel = `Remove ${typeof children === 'string' ? children : 'chip'}`;\n\n const chipButton = (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={selected}\n disabled={disabled}\n className={classes}\n onClick={onClick}\n {...htmlProps}\n >\n {avatar && (\n <span className={styles.avatar} aria-hidden=\"true\">\n {avatar}\n </span>\n )}\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{children}</span>\n </button>\n );\n\n if (!onRemove) {\n return chipButton;\n }\n\n return (\n <span className={styles.removableChip} data-disabled={disabled || undefined}>\n {chipButton}\n <button\n type=\"button\"\n className={styles.remove}\n onClick={handleRemoveClick}\n aria-label={removeAriaLabel}\n disabled={disabled}\n >\n ×\n </button>\n </span>\n );\n }\n);\n\nfunction ChipGroupInner(\n { children, value: controlledValue, defaultValue =
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Chip/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Chip.module.scss';\n\nexport interface ChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n children: React.ReactNode;\n /** Visual style variant */\n variant?: 'filled' | 'outlined' | 'soft';\n /** Size of the chip */\n size?: 'sm' | 'md' | 'lg';\n /** Whether the chip is selected */\n selected?: boolean;\n /** Icon element rendered before the label */\n icon?: React.ReactNode;\n /** Avatar element rendered before the label */\n avatar?: React.ReactNode;\n /** Makes chip removable. Called when X is clicked. */\n onRemove?: () => void;\n /** Value identifier used by Chip.Group */\n value?: string;\n}\n\nexport interface ChipGroupProps {\n children: React.ReactNode;\n /** Controlled selected values */\n value?: string[];\n /** Default selected values (uncontrolled) */\n defaultValue?: string[];\n /** Called when selection changes */\n onChange?: (value: string[]) => void;\n className?: string;\n}\n\nconst ChipBase = React.forwardRef<HTMLButtonElement, ChipProps>(\n function Chip(\n {\n children,\n variant = 'filled',\n size = 'md',\n selected = false,\n disabled = false,\n icon,\n avatar,\n onRemove,\n className,\n onClick,\n value: _value,\n ...htmlProps\n },\n ref\n ) {\n const classes = [\n styles.chip,\n styles[size],\n styles[variant],\n selected && styles.selected,\n onRemove && styles.withRemove,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleRemoveClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n onRemove?.();\n };\n\n const removeAriaLabel = `Remove ${typeof children === 'string' ? children : 'chip'}`;\n\n const chipButton = (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={selected}\n disabled={disabled}\n className={classes}\n onClick={onClick}\n {...htmlProps}\n >\n {avatar && (\n <span className={styles.avatar} aria-hidden=\"true\">\n {avatar}\n </span>\n )}\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{children}</span>\n </button>\n );\n\n if (!onRemove) {\n return chipButton;\n }\n\n return (\n <span className={styles.removableChip} data-disabled={disabled || undefined}>\n {chipButton}\n <button\n type=\"button\"\n className={styles.remove}\n onClick={handleRemoveClick}\n aria-label={removeAriaLabel}\n disabled={disabled}\n >\n ×\n </button>\n </span>\n );\n }\n);\n\nconst EMPTY_CHIP_GROUP: string[] = [];\n\nfunction ChipGroupInner(\n { children, value: controlledValue, defaultValue = EMPTY_CHIP_GROUP, onChange, className }: ChipGroupProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n const toggle = React.useCallback(\n (chipValue: string) => {\n const next = currentValue.includes(chipValue)\n ? currentValue.filter((v) => v !== chipValue)\n : [...currentValue, chipValue];\n\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n },\n [currentValue, isControlled, onChange]\n );\n\n const classes = [styles.group, className].filter(Boolean).join(' ');\n\n return (\n <div ref={ref} className={classes}>\n {React.Children.map(children, (child) => {\n if (!React.isValidElement<ChipProps>(child)) return child;\n const chipValue = child.props.value ?? (typeof child.props.children === 'string' ? child.props.children : '');\n return React.cloneElement(child, {\n selected: currentValue.includes(chipValue),\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n child.props.onClick?.(e);\n if (!e.defaultPrevented) {\n toggle(chipValue);\n }\n },\n } as Partial<ChipProps>);\n })}\n </div>\n );\n}\n\nconst ChipGroup = React.forwardRef<HTMLDivElement, ChipGroupProps>(ChipGroupInner);\n\n// Compose Chip with static Group property\nexport const Chip = Object.assign(ChipBase, { Group: ChipGroup });\n"],"names":["Chip"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CodeBlock/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA0B/B,OAAO,2BAA2B,CAAC;AAEnC,MAAM,MAAM,iBAAiB,GACzB,KAAK,GACL,YAAY,GACZ,YAAY,GACZ,KAAK,GACL,MAAM,GACN,OAAO,GACP,KAAK,GACL,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,KAAK,GACL,UAAU,GACV,IAAI,GACJ,MAAM,GACN,KAAK,GACL,QAAQ,GACR,IAAI,GACJ,MAAM,GACN,IAAI,GACJ,MAAM,GACN,MAAM,GACN,QAAQ,GACR,OAAO,GACP,GAAG,GACH,KAAK,GACL,QAAQ,GACR,KAAK,GACL,KAAK,GACL,SAAS,GACT,MAAM,GACN,WAAW,CAAC;AAEhB,2CAA2C;AAC3C,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,aAAa,GACb,cAAc,GACd,cAAc,GACd,SAAS,GACT,MAAM,GACN,SAAS,GACT,cAAc,GACd,eAAe,GACf,UAAU,GACV,WAAW,CAAC;AAEhB,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,cAAe,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC1E,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,gCAAgC;IAChC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,cAAc,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACrC,yCAAyC;IACzC,UAAU,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACjC,2CAA2C;IAC3C,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACnC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CodeBlock/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -294,6 +294,12 @@ function CommandItem({
|
|
|
294
294
|
"data-active": isActive || void 0,
|
|
295
295
|
"data-disabled": disabled || void 0,
|
|
296
296
|
onClick: handleClick,
|
|
297
|
+
onKeyDown: (e) => {
|
|
298
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
299
|
+
e.preventDefault();
|
|
300
|
+
handleClick();
|
|
301
|
+
}
|
|
302
|
+
},
|
|
297
303
|
onMouseEnter: handleMouseEnter,
|
|
298
304
|
className: [
|
|
299
305
|
Command_module.default.item,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({ className, ...htmlProps }: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n htmlProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-list\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n {...htmlProps}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n id=\"command-list\"\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n {...htmlProps}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n if (typeof children === 'string') return children;\n return '';\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleClick = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleMouseEnter = () => {\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n return (\n <div\n ref={groupRef}\n {...htmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":["React","jsxs","jsx","styles"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({ className, ...htmlProps }: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n htmlProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-list\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n {...htmlProps}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n id=\"command-list\"\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n {...htmlProps}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n if (typeof children === 'string') return children;\n return '';\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleClick = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleMouseEnter = () => {\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleClick(); } }}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n return (\n <div\n ref={groupRef}\n {...htmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":["React","jsxs","jsx","styles"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Command/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,MAAM,WAAW,YAAa,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACxE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;wEACoE;IACpE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IACxE,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAkB,SAAQ,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC5E,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IAC9F,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAkB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC7E,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAkB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC7E,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;AAiFzE,iBAAS,WAAW,CAAC,EACnB,QAAQ,EACR,MAAM,EAAE,gBAAgB,EACxB,aAAkB,EAClB,cAAc,EACd,MAAsB,EACtB,IAAW,EACX,SAAS,EACT,GAAG,SAAS,EACb,EAAE,YAAY,2CAsFd;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,EAAE,iBAAiB,2CA2FnE;AAED,iBAAS,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,EAAE,gBAAgB,2CAc3E;AAED,iBAAS,WAAW,CAAC,EACnB,QAAQ,EACR,KAAK,EAAE,SAAS,EAChB,QAAQ,EACR,QAAgB,EAChB,YAAY,EACZ,SAAS,EACT,GAAG,SAAS,EACb,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Command/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -275,6 +275,12 @@ function CommandItem({
|
|
|
275
275
|
"data-active": isActive || void 0,
|
|
276
276
|
"data-disabled": disabled || void 0,
|
|
277
277
|
onClick: handleClick,
|
|
278
|
+
onKeyDown: (e) => {
|
|
279
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
280
|
+
e.preventDefault();
|
|
281
|
+
handleClick();
|
|
282
|
+
}
|
|
283
|
+
},
|
|
278
284
|
onMouseEnter: handleMouseEnter,
|
|
279
285
|
className: [
|
|
280
286
|
styles.item,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({ className, ...htmlProps }: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n htmlProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-list\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n {...htmlProps}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n id=\"command-list\"\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n {...htmlProps}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n if (typeof children === 'string') return children;\n return '';\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleClick = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleMouseEnter = () => {\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n return (\n <div\n ref={groupRef}\n {...htmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({ className, ...htmlProps }: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n htmlProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-list\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n {...htmlProps}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n id=\"command-list\"\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n {...htmlProps}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n if (typeof children === 'string') return children;\n return '';\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleClick = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleMouseEnter = () => {\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleClick(); } }}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n return (\n <div\n ref={groupRef}\n {...htmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":[],"mappings":";;;AA4DA,SAAS,cAAc,OAAe,QAAgB,UAA6B;AACjF,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,cAAc,OAAO,YAAA;AAC3B,QAAM,aAAa,MAAM,YAAA;AAEzB,MAAI,WAAW,SAAS,WAAW,EAAG,QAAO;AAE7C,MAAI,UAAU;AACZ,eAAW,WAAW,UAAU;AAC9B,UAAI,QAAQ,YAAA,EAAc,SAAS,WAAW,EAAG,QAAO;AAAA,IAC1D;AAAA,EACF;AAEA,SAAO;AACT;AAyBA,MAAM,iBAAiB,MAAM,cAA0C,IAAI;AAE3E,SAAS,oBAAoB;AAC3B,QAAM,MAAM,MAAM,WAAW,cAAc;AAC3C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,sDAAsD;AAChF,SAAO;AACT;AAMA,SAAS,aAAa;AACpB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,QAC9B,oBAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,SAAQ,IAAG,QAAA,CAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGlD;AAMA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB;AAAA,EACA,SAAS;AAAA,EACT,OAAO;AAAA,EACP;AAAA,EACA,GAAG;AACL,GAAiB;AACf,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,MAAM,SAAS,aAAa;AAChF,QAAM,eAAe,qBAAqB;AAC1C,QAAM,SAAS,eAAe,mBAAmB;AAEjD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAwC,oBAAI,KAAK;AACjF,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAwB,IAAI;AAClE,QAAM,UAAU,MAAM,OAA8B,IAAI;AAExD,QAAM,YAAY,MAAM;AAAA,IACtB,CAAC,UAAkB;AACjB,UAAI,CAAC,cAAc;AACjB,8BAAsB,KAAK;AAAA,MAC7B;AACA,uDAAiB;AAAA,IACnB;AAAA,IACA,CAAC,cAAc,cAAc;AAAA,EAAA;AAG/B,QAAM,eAAe,MAAM,YAAY,CAAC,IAAY,iBAAmC;AACrF,aAAS,CAAC,SAAS;AACjB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,IAAI,IAAI,YAAY;AACzB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAA,CAAE;AAEL,QAAM,iBAAiB,MAAM,YAAY,CAAC,OAAe;AACvD,aAAS,CAAC,SAAS;AACjB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,OAAO,EAAE;AACd,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAA,CAAE;AAGL,QAAM,SAAS,MAAM,QAAQ,MAAM;AACjC,UAAM,6BAAa,IAAA;AACnB,eAAW,CAAC,IAAI,YAAY,KAAK,OAAO;AACtC,YAAM,QAAQ,OAAO,aAAa,OAAO,QAAQ,aAAa,QAAQ;AACtE,aAAO,IAAI,IAAI,KAAK;AAAA,IACtB;AACA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,QAAQ,MAAM,CAAC;AAE1B,QAAM,eAAe,MAAM,QAAQ,MAAM;AACvC,QAAI,QAAQ;AACZ,eAAW,SAAS,OAAO,UAAU;AACnC,UAAI,QAAQ,EAAG;AAAA,IACjB;AACA,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AAGX,QAAM,UAAU,MAAM;AACpB,gBAAY,IAAI;AAAA,EAClB,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,eAAe,MAAM;AAAA,IACzB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,CAAC,QAAQ,WAAW,QAAQ,QAAQ,cAAc,gBAAgB,UAAU,MAAM,YAAY;AAAA,EAAA;AAGhG,SACE,oBAAC,eAAe,UAAf,EAAwB,OAAO,cAC9B,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW,CAAC,OAAO,SAAS,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC/D,MAAK;AAAA,MAEJ;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,aAAgC;AACpE,QAAM,EAAE,QAAQ,WAAW,SAAS,aAAa,UAAU,KAAA,IAAS,kBAAA;AACpE,QAAM,WAAW,MAAM,OAAyB,IAAI;AAEpD,QAAM,kBAAkB,MAAM,YAAY,MAAM;AAC9C,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,KAAM,QAAO,CAAA;AAClB,WAAO,MAAM;AAAA,MACX,KAAK,iBAA8B,iDAAiD;AAAA,IAAA,EACpF,OAAO,CAAC,OAAO,GAAG,MAAM,YAAY,MAAM;AAAA,EAC9C,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,gBAAgB,CAAC,UAAiD;;AACtE,oBAAU,cAAV,mCAAsB;AACtB,QAAI,MAAM,iBAAkB;AAE5B,UAAM,QAAQ,gBAAA;AACd,QAAI,MAAM,WAAW,EAAG;AAExB,UAAM,eAAe,WACjB,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,IAC9C;AAEJ,YAAQ,MAAM,KAAA;AAAA,MACZ,KAAK,aAAa;AAChB,cAAM,eAAA;AACN,YAAI,eAAe,GAAG;AACpB,sBAAY,MAAM,CAAC,EAAE,EAAE;AAAA,QACzB,WAAW,eAAe,MAAM,SAAS,GAAG;AAC1C,sBAAY,MAAM,eAAe,CAAC,EAAE,EAAE;AAAA,QACxC,WAAW,MAAM;AACf,sBAAY,MAAM,CAAC,EAAE,EAAE;AAAA,QACzB;AACA;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,cAAM,eAAA;AACN,YAAI,eAAe,GAAG;AACpB,sBAAY,MAAM,MAAM,SAAS,CAAC,EAAE,EAAE;AAAA,QACxC,WAAW,eAAe,GAAG;AAC3B,sBAAY,MAAM,eAAe,CAAC,EAAE,EAAE;AAAA,QACxC,WAAW,MAAM;AACf,sBAAY,MAAM,MAAM,SAAS,CAAC,EAAE,EAAE;AAAA,QACxC;AACA;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,eAAA;AACN,oBAAY,MAAM,CAAC,EAAE,EAAE;AACvB;AAAA,MACF;AAAA,MACA,KAAK,OAAO;AACV,cAAM,eAAA;AACN,oBAAY,MAAM,MAAM,SAAS,CAAC,EAAE,EAAE;AACtC;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,eAAA;AACN,YAAI,UAAU;AACZ,gBAAM,aAAa,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ;AAC5D,cAAI,YAAY;AACd,uBAAW,MAAA;AAAA,UACb;AAAA,QACF;AACA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAA,EAAI,WAAW,OAAO,cACrB,UAAA;AAAA,IAAA,oBAAC,YAAA,EAAW;AAAA,IACZ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,iBAAc;AAAA,QACd,qBAAkB;AAAA,QAClB,yBAAuB,YAAY;AAAA,QACnC,cAAa;AAAA,QACb,aAAY;AAAA,QACZ,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,QACzC,WAAW;AAAA,QACX,WAAW,CAAC,OAAO,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAC5D,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EACN,GACF;AAEJ;AAEA,SAAS,YAAY,EAAE,UAAU,WAAW,GAAG,aAA+B;AAC5E,QAAM,EAAE,QAAA,IAAY,kBAAA;AAEpB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,IAAG;AAAA,MACH,MAAK;AAAA,MACL,WAAW,CAAC,OAAO,MAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC3D,GAAG;AAAA,MAEH;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,QAAM,EAAE,QAAQ,cAAc,gBAAgB,UAAU,YAAA,IAAgB,kBAAA;AACxE,QAAM,cAAc,MAAM,MAAA;AAC1B,QAAM,SAAU,UAAU,MAA6B,gBAAgB,WAAW;AAClF,QAAM,UAAU,MAAM,OAAuB,IAAI;AAGjD,QAAM,YAAY,MAAM,QAAQ,MAAM;AACpC,QAAI,UAAW,QAAO;AACtB,QAAI,OAAO,aAAa,SAAU,QAAO;AACzC,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,QAAQ,CAAC;AAGxB,QAAM,UAAU,MAAM;AACpB,iBAAa,QAAQ,EAAE,OAAO,WAAW,UAAU;AACnD,WAAO,MAAM,eAAe,MAAM;AAAA,EACpC,GAAG,CAAC,QAAQ,WAAW,UAAU,cAAc,cAAc,CAAC;AAE9D,QAAM,QAAQ,OAAO,IAAI,MAAM,KAAK;AACpC,QAAM,YAAY,QAAQ;AAC1B,QAAM,WAAW,aAAa;AAG9B,QAAM,UAAU,MAAM;AACpB,QAAI,YAAY,QAAQ,SAAS;AAC/B,cAAQ,QAAQ,eAAe,EAAE,OAAO,WAAW;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,cAAc,MAAM;AACxB,QAAI,SAAU;AACd;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM;AAC7B,QAAI,CAAC,UAAU;AACb,kBAAY,MAAM;AAAA,IACpB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACJ,GAAG;AAAA,MACJ,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,qBAAkB;AAAA,MAClB,eAAa,YAAY;AAAA,MACzB,iBAAe,YAAY;AAAA,MAC3B,SAAS;AAAA,MACT,WAAW,CAAC,MAAM;AAAE,YAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AAAE,YAAE,eAAA;AAAkB,sBAAA;AAAA,QAAe;AAAA,MAAE;AAAA,MACnG,cAAc;AAAA,MACd,WAAW;AAAA,QACT,OAAO;AAAA,QACP,YAAY,OAAO;AAAA,QACnB,YAAY,OAAO;AAAA,QACnB;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,OAAO,EAAE,SAAS,YAAY,SAAY,OAAA;AAAA,MAEzC;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAAS,aAAa,EAAE,UAAU,SAAS,WAAW,GAAG,aAAgC;AACvF,QAAM,UAAU,MAAM,MAAA;AACtB,QAAM,WAAW,MAAM,OAAuB,IAAI;AAClD,QAAM,EAAE,OAAA,IAAW,kBAAA;AACnB,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,MAAM,SAAS,IAAI;AAGvE,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,SAAS,QAAS;AACvB,UAAM,QAAQ,SAAS,QAAQ,iBAA8B,qBAAqB;AAClF,UAAM,aAAa,MAAM,KAAK,KAAK,EAAE,KAAK,CAAC,SAAS,KAAK,MAAM,YAAY,MAAM;AACjF,0BAAsB,UAAU;AAAA,EAClC,GAAG,CAAC,MAAM,CAAC;AAEX,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACJ,GAAG;AAAA,MACJ,MAAK;AAAA,MACL,mBAAiB,UAAU,UAAU;AAAA,MACrC,WAAW,CAAC,OAAO,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC7D,OAAO,EAAE,SAAS,qBAAqB,SAAY,OAAA;AAAA,MAElD,UAAA;AAAA,QAAA,+BACE,OAAA,EAAI,IAAI,SAAS,WAAW,OAAO,cACjC,UAAA,QAAA,CACH;AAAA,QAED;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAAS,aAAa,EAAE,UAAU,WAAW,GAAG,aAAgC;AAC9E,QAAM,EAAE,aAAA,IAAiB,kBAAA;AAEzB,MAAI,eAAe,EAAG,QAAO;AAE7B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,MAAK;AAAA,MACL,iBAAc;AAAA,MACd,iBAAc;AAAA,MACd,WAAW,CAAC,OAAO,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAE5D;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAAS,iBAAiB,EAAE,WAAW,GAAG,aAAoC;AAC5E,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,MAAK;AAAA,MACL,WAAW,CAAC,OAAO,WAAW,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAAA;AAAA,EAAA;AAGvE;AAMO,MAAM,UAAU,OAAO,OAAO,aAAa;AAAA,EAChD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,WAAW;AACb,CAAC;"}
|
|
@@ -43,6 +43,26 @@ function loadTableDeps() {
|
|
|
43
43
|
_tableFailed = true;
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
+
function getColumnSizeStyle(column) {
|
|
47
|
+
const { size, minSize, maxSize } = column.columnDef;
|
|
48
|
+
const hasExplicitSize = size !== void 0 || minSize !== void 0 || maxSize !== void 0;
|
|
49
|
+
if (!hasExplicitSize) {
|
|
50
|
+
return void 0;
|
|
51
|
+
}
|
|
52
|
+
const resolvedSize = column.getSize();
|
|
53
|
+
return {
|
|
54
|
+
width: resolvedSize,
|
|
55
|
+
minWidth: minSize ?? resolvedSize,
|
|
56
|
+
maxWidth: maxSize ?? resolvedSize
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function isInteractiveTarget(target, currentTarget) {
|
|
60
|
+
if (!(target instanceof Element)) return false;
|
|
61
|
+
const interactiveElement = target.closest(
|
|
62
|
+
'button, a, input, select, textarea, [role="button"], [role="link"], [role="checkbox"], [role="switch"]'
|
|
63
|
+
);
|
|
64
|
+
return Boolean(interactiveElement && currentTarget.contains(interactiveElement));
|
|
65
|
+
}
|
|
46
66
|
function DataTableRoot({
|
|
47
67
|
columns: userColumns,
|
|
48
68
|
data,
|
|
@@ -110,6 +130,12 @@ function DataTableRoot({
|
|
|
110
130
|
};
|
|
111
131
|
return [checkboxColumn, ...userColumns];
|
|
112
132
|
}, [userColumns, showCheckbox, selectable]);
|
|
133
|
+
const hasExplicitColumnSizing = React__namespace.useMemo(
|
|
134
|
+
() => columns.some(
|
|
135
|
+
(column) => column.size !== void 0 || column.minSize !== void 0 || column.maxSize !== void 0
|
|
136
|
+
),
|
|
137
|
+
[columns]
|
|
138
|
+
);
|
|
113
139
|
if (_tableFailed || !_useReactTable) {
|
|
114
140
|
if (_tableFailed && process.env.NODE_ENV === "development") {
|
|
115
141
|
console.warn(
|
|
@@ -140,12 +166,6 @@ function DataTableRoot({
|
|
|
140
166
|
enableExpanding: hasSubRows
|
|
141
167
|
});
|
|
142
168
|
const isEmpty = data.length === 0;
|
|
143
|
-
const hasExplicitColumnSizing = React__namespace.useMemo(
|
|
144
|
-
() => columns.some(
|
|
145
|
-
(column) => column.size !== void 0 || column.minSize !== void 0 || column.maxSize !== void 0
|
|
146
|
-
),
|
|
147
|
-
[columns]
|
|
148
|
-
);
|
|
149
169
|
const rootClasses = [
|
|
150
170
|
DataTable_module.default.table,
|
|
151
171
|
hasExplicitColumnSizing && DataTable_module.default.fixedLayout,
|
|
@@ -153,29 +173,9 @@ function DataTableRoot({
|
|
|
153
173
|
striped && DataTable_module.default.striped,
|
|
154
174
|
className
|
|
155
175
|
].filter(Boolean).join(" ");
|
|
156
|
-
const getColumnSizeStyle = (column) => {
|
|
157
|
-
const { size: size2, minSize, maxSize } = column.columnDef;
|
|
158
|
-
const hasExplicitSize = size2 !== void 0 || minSize !== void 0 || maxSize !== void 0;
|
|
159
|
-
if (!hasExplicitSize) {
|
|
160
|
-
return void 0;
|
|
161
|
-
}
|
|
162
|
-
const resolvedSize = column.getSize();
|
|
163
|
-
return {
|
|
164
|
-
width: resolvedSize,
|
|
165
|
-
minWidth: minSize ?? resolvedSize,
|
|
166
|
-
maxWidth: maxSize ?? resolvedSize
|
|
167
|
-
};
|
|
168
|
-
};
|
|
169
176
|
if (isEmpty) {
|
|
170
177
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: DataTable_module.default.emptyState, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: DataTable_module.default.emptyMessage, children: emptyMessage }) });
|
|
171
178
|
}
|
|
172
|
-
const isInteractiveTarget = (target, currentTarget) => {
|
|
173
|
-
if (!(target instanceof Element)) return false;
|
|
174
|
-
const interactiveElement = target.closest(
|
|
175
|
-
'button, a, input, select, textarea, [role="button"], [role="link"], [role="checkbox"], [role="switch"]'
|
|
176
|
-
);
|
|
177
|
-
return Boolean(interactiveElement && currentTarget.contains(interactiveElement));
|
|
178
|
-
};
|
|
179
179
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: [DataTable_module.default.wrapper, bordered && DataTable_module.default.bordered].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
180
180
|
"table",
|
|
181
181
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/DataTable/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n// Import globals to ensure CSS variables are defined\nimport '../../styles/globals.scss';\nimport styles from './DataTable.module.scss';\nimport { Checkbox } from '../Checkbox';\n\n// ============================================\n// Types (self-owned — no external dependency for types)\n// ============================================\n\n/** Column definition compatible with @tanstack/react-table */\nexport type ColumnDef<TData = unknown, TValue = unknown> = {\n id?: string;\n accessorKey?: string;\n accessorFn?: (row: TData) => TValue;\n header?: string | ((context: any) => React.ReactNode);\n cell?: string | ((context: any) => React.ReactNode);\n size?: number;\n minSize?: number;\n maxSize?: number;\n enableSorting?: boolean;\n [key: string]: unknown;\n};\n\nexport type SortingState = Array<{ id: string; desc: boolean }>;\nexport type RowSelectionState = Record<string, boolean>;\nexport type ExpandedState = true | Record<string, boolean>;\ntype OnChangeFn<T> = ((updaterOrValue: T | ((prev: T) => T)) => void);\n\nexport type DataTableColumn<T> = ColumnDef<T, unknown>;\n\n// ============================================\n// Lazy-loaded dependency (@tanstack/react-table)\n// ============================================\n\nlet _useReactTable: any = null;\nlet _getCoreRowModel: any = null;\nlet _getSortedRowModel: any = null;\nlet _getExpandedRowModel: any = null;\nlet _flexRender: any = null;\nlet _tableLoaded = false;\nlet _tableFailed = false;\n\nfunction loadTableDeps() {\n if (_tableLoaded) return;\n _tableLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rt = require('@tanstack/react-table');\n _useReactTable = rt.useReactTable;\n _getCoreRowModel = rt.getCoreRowModel;\n _getSortedRowModel = rt.getSortedRowModel;\n _getExpandedRowModel = rt.getExpandedRowModel;\n _flexRender = rt.flexRender;\n } catch {\n _tableFailed = true;\n }\n}\n\nexport interface DataTableProps<T> extends Omit<React.HTMLAttributes<HTMLTableElement>, 'onClick'> {\n /** Column definitions */\n columns: DataTableColumn<T>[];\n /** Data array */\n data: T[];\n /** Unique key extractor for each row */\n getRowId?: (row: T) => string;\n /** Enable sorting */\n sortable?: boolean;\n /** Controlled sorting state */\n sorting?: SortingState;\n /** Sorting change handler */\n onSortingChange?: OnChangeFn<SortingState>;\n /** Enable row selection */\n selectable?: boolean;\n /** Show checkbox column for row selection */\n showCheckbox?: boolean;\n /** Controlled selection state */\n rowSelection?: RowSelectionState;\n /** Selection change handler */\n onRowSelectionChange?: OnChangeFn<RowSelectionState>;\n /** Row click handler */\n onRowClick?: (row: T) => void;\n /** Extract sub-rows from a row for expandable tree tables */\n getSubRows?: (row: T) => T[] | undefined;\n /** Controlled expanded state */\n expanded?: ExpandedState;\n /** Expanded state change handler */\n onExpandedChange?: OnChangeFn<ExpandedState>;\n /** Empty state message */\n emptyMessage?: string;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Visible caption for the table (recommended for accessibility) */\n caption?: string;\n /** Hide the caption visually but keep it for screen readers */\n captionHidden?: boolean;\n /** Show alternating row backgrounds */\n striped?: boolean;\n /** Wrap table in a bordered container */\n bordered?: boolean;\n}\n\nfunction DataTableRoot<T>({\n columns: userColumns,\n data,\n getRowId,\n sortable = false,\n sorting: controlledSorting,\n onSortingChange,\n selectable = false,\n showCheckbox = false,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n onRowClick,\n getSubRows,\n expanded: controlledExpanded,\n onExpandedChange,\n emptyMessage = 'No data available',\n size = 'md',\n className,\n caption,\n captionHidden = false,\n striped = false,\n bordered = false,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n ...htmlProps\n}: DataTableProps<T>) {\n loadTableDeps();\n\n // Internal sorting state when uncontrolled\n const [internalSorting, setInternalSorting] = React.useState<SortingState>([]);\n const sorting = controlledSorting ?? internalSorting;\n const handleSortingChange = onSortingChange ?? setInternalSorting;\n\n // Internal selection state when uncontrolled\n const [internalRowSelection, setInternalRowSelection] = React.useState<RowSelectionState>({});\n const rowSelection = controlledRowSelection ?? internalRowSelection;\n const handleRowSelectionChange = onRowSelectionChange ?? setInternalRowSelection;\n\n // Internal expanded state when uncontrolled\n const [internalExpanded, setInternalExpanded] = React.useState<ExpandedState>({});\n const expanded = controlledExpanded ?? internalExpanded;\n const handleExpandedChange = onExpandedChange ?? setInternalExpanded;\n\n // Build columns with optional checkbox prepended\n const columns = React.useMemo(() => {\n if (!showCheckbox || !selectable) return userColumns;\n\n const checkboxColumn: DataTableColumn<T> = {\n id: '__checkbox',\n size: 40,\n minSize: 40,\n maxSize: 40,\n enableSorting: false,\n header: ({ table }: any) => (\n <Checkbox\n size=\"sm\"\n checked={table.getIsAllRowsSelected()}\n indeterminate={table.getIsSomeRowsSelected()}\n onCheckedChange={() => table.toggleAllRowsSelected()}\n aria-label=\"Select all rows\"\n />\n ),\n cell: ({ row }: any) => (\n <Checkbox\n size=\"sm\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onCheckedChange={() => row.toggleSelected()}\n aria-label={`Select row ${row.id}`}\n />\n ),\n };\n\n return [checkboxColumn, ...userColumns];\n }, [userColumns, showCheckbox, selectable]);\n\n if (_tableFailed || !_useReactTable) {\n if (_tableFailed && process.env.NODE_ENV === 'development') {\n console.warn(\n '[@fragments-sdk/ui] DataTable: @tanstack/react-table is not installed. ' +\n 'Install it with: npm install @tanstack/react-table'\n );\n }\n return null;\n }\n\n const hasSubRows = !!getSubRows;\n\n const table = _useReactTable({\n data,\n columns,\n getRowId,\n getSubRows: getSubRows as any,\n getCoreRowModel: _getCoreRowModel(),\n getSortedRowModel: sortable ? _getSortedRowModel() : undefined,\n getExpandedRowModel: hasSubRows && _getExpandedRowModel ? _getExpandedRowModel() : undefined,\n state: {\n sorting: sortable ? sorting : undefined,\n rowSelection: selectable ? rowSelection : undefined,\n expanded: hasSubRows ? expanded : undefined,\n },\n onSortingChange: sortable ? handleSortingChange : undefined,\n onRowSelectionChange: selectable ? handleRowSelectionChange : undefined,\n onExpandedChange: hasSubRows ? handleExpandedChange : undefined,\n enableRowSelection: selectable,\n enableSorting: sortable,\n enableExpanding: hasSubRows,\n });\n\n const isEmpty = data.length === 0;\n\n const hasExplicitColumnSizing = React.useMemo(\n () =>\n columns.some((column) =>\n column.size !== undefined ||\n column.minSize !== undefined ||\n column.maxSize !== undefined\n ),\n [columns]\n );\n\n const rootClasses = [\n styles.table,\n hasExplicitColumnSizing && styles.fixedLayout,\n styles[size],\n striped && styles.striped,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const getColumnSizeStyle = (\n column: {\n getSize: () => number;\n columnDef: { size?: number; minSize?: number; maxSize?: number };\n }\n ): React.CSSProperties | undefined => {\n const { size, minSize, maxSize } = column.columnDef;\n const hasExplicitSize = size !== undefined || minSize !== undefined || maxSize !== undefined;\n\n if (!hasExplicitSize) {\n return undefined;\n }\n\n const resolvedSize = column.getSize();\n\n return {\n width: resolvedSize,\n minWidth: minSize ?? resolvedSize,\n maxWidth: maxSize ?? resolvedSize,\n };\n };\n\n if (isEmpty) {\n return (\n <div className={styles.emptyState}>\n <span className={styles.emptyMessage}>{emptyMessage}</span>\n </div>\n );\n }\n\n const isInteractiveTarget = (\n target: EventTarget | null,\n currentTarget: HTMLTableRowElement\n ) => {\n if (!(target instanceof Element)) return false;\n\n const interactiveElement = target.closest(\n 'button, a, input, select, textarea, [role=\"button\"], [role=\"link\"], [role=\"checkbox\"], [role=\"switch\"]'\n );\n\n return Boolean(interactiveElement && currentTarget.contains(interactiveElement));\n };\n\n return (\n <div className={[styles.wrapper, bordered && styles.bordered].filter(Boolean).join(' ')}>\n <table\n {...htmlProps}\n className={rootClasses}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {caption && (\n <caption className={captionHidden ? styles.captionHidden : styles.caption}>\n {caption}\n </caption>\n )}\n <thead className={styles.thead}>\n {table.getHeaderGroups().map((headerGroup: any) => (\n <tr key={headerGroup.id} className={styles.headerRow}>\n {headerGroup.headers.map((header: any) => {\n const canSort = sortable && header.column.getCanSort();\n const sortDirection = header.column.getIsSorted();\n const toggleSorting = canSort ? header.column.getToggleSortingHandler() : undefined;\n\n return (\n <th\n key={header.id}\n className={[styles.th, canSort && styles.thSortable].filter(Boolean).join(' ')}\n style={getColumnSizeStyle(header.column)}\n scope=\"col\"\n aria-sort={\n sortDirection\n ? sortDirection === 'asc'\n ? 'ascending'\n : 'descending'\n : canSort\n ? 'none'\n : undefined\n }\n >\n {canSort ? (\n <button\n type=\"button\"\n className={styles.sortButton}\n onClick={toggleSorting}\n >\n <span className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </span>\n <span className={styles.sortIndicator} aria-hidden=\"true\">\n {sortDirection === 'asc' ? (\n <SortAscIcon />\n ) : sortDirection === 'desc' ? (\n <SortDescIcon />\n ) : (\n <SortIcon />\n )}\n </span>\n </button>\n ) : (\n <div className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </div>\n )}\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n <tbody className={styles.tbody}>\n {table.getRowModel().rows.map((row: any) => {\n const isClickable = !!onRowClick;\n const isSelected = selectable ? row.getIsSelected() : false;\n const depth: number = row.depth ?? 0;\n const canExpand = hasSubRows && row.getCanExpand();\n const handleRowClick = (event: React.MouseEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n onRowClick(row.original);\n };\n\n const handleRowKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onRowClick(row.original);\n }\n };\n\n return (\n <tr\n key={row.id}\n className={[\n styles.row,\n isClickable && styles.clickable,\n isSelected && styles.selected,\n depth > 0 && styles.subRow,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={isClickable ? handleRowClick : undefined}\n onKeyDown={isClickable ? handleRowKeyDown : undefined}\n tabIndex={isClickable ? 0 : undefined}\n data-selected={isSelected || undefined}\n data-depth={depth > 0 ? depth : undefined}\n >\n {row.getVisibleCells().map((cell: any, cellIndex: number) => {\n const isFirstDataCell = hasSubRows && cellIndex === (showCheckbox && selectable ? 1 : 0);\n return (\n <td\n key={cell.id}\n className={styles.td}\n style={{\n ...getColumnSizeStyle(cell.column),\n ...(isFirstDataCell && depth > 0 ? { paddingLeft: `${depth * 24 + 12}px` } : undefined),\n }}\n >\n {isFirstDataCell && canExpand ? (\n <span className={styles.expandCell}>\n <button\n type=\"button\"\n className={styles.expandButton}\n onClick={row.getToggleExpandedHandler()}\n aria-label={row.getIsExpanded() ? 'Collapse row' : 'Expand row'}\n aria-expanded={row.getIsExpanded()}\n >\n <ExpandIcon expanded={row.getIsExpanded()} />\n </button>\n {_flexRender(cell.column.columnDef.cell, cell.getContext())}\n </span>\n ) : (\n _flexRender(cell.column.columnDef.cell, cell.getContext())\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n// Expand/collapse icon for sub-rows\nfunction ExpandIcon({ expanded }: { expanded: boolean }) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n style={{\n transform: expanded ? 'rotate(90deg)' : undefined,\n transition: 'transform 150ms ease',\n }}\n >\n <path d=\"M4.5 2.5L8 6L4.5 9.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\n// Sort icons - minimal and functional\nfunction SortIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 2L8.5 5H3.5L6 2Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n <path\n d=\"M6 10L3.5 7H8.5L6 10Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n </svg>\n );\n}\n\nfunction SortAscIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 2L8.5 5H3.5L6 2Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SortDescIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 10L3.5 7H8.5L6 10Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// Helper to create simple columns without TanStack's createColumnHelper\nexport function createColumns<T>(\n columns: Array<{\n key: string;\n header: string;\n width?: number;\n cell?: (row: T) => React.ReactNode;\n }>\n): DataTableColumn<T>[] {\n return columns.map((col) => ({\n id: col.key,\n accessorKey: col.key,\n header: col.header,\n size: col.width,\n minSize: col.width,\n maxSize: col.width,\n cell: col.cell\n ? ({ row }) => col.cell!(row.original)\n : ({ getValue }) => getValue() ?? '--',\n }));\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Root: DataTableRoot,\n Columns: createColumns,\n});\n"],"names":["React","table","jsx","Checkbox","styles","size","jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/DataTable/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n// Import globals to ensure CSS variables are defined\nimport '../../styles/globals.scss';\nimport styles from './DataTable.module.scss';\nimport { Checkbox } from '../Checkbox';\n\n// ============================================\n// Types (self-owned — no external dependency for types)\n// ============================================\n\n/** Column definition compatible with @tanstack/react-table */\nexport type ColumnDef<TData = unknown, TValue = unknown> = {\n id?: string;\n accessorKey?: string;\n accessorFn?: (row: TData) => TValue;\n header?: string | ((context: any) => React.ReactNode);\n cell?: string | ((context: any) => React.ReactNode);\n size?: number;\n minSize?: number;\n maxSize?: number;\n enableSorting?: boolean;\n [key: string]: unknown;\n};\n\nexport type SortingState = Array<{ id: string; desc: boolean }>;\nexport type RowSelectionState = Record<string, boolean>;\nexport type ExpandedState = true | Record<string, boolean>;\ntype OnChangeFn<T> = ((updaterOrValue: T | ((prev: T) => T)) => void);\n\nexport type DataTableColumn<T> = ColumnDef<T, unknown>;\n\n// ============================================\n// Lazy-loaded dependency (@tanstack/react-table)\n// ============================================\n\nlet _useReactTable: any = null;\nlet _getCoreRowModel: any = null;\nlet _getSortedRowModel: any = null;\nlet _getExpandedRowModel: any = null;\nlet _flexRender: any = null;\nlet _tableLoaded = false;\nlet _tableFailed = false;\n\nfunction loadTableDeps() {\n if (_tableLoaded) return;\n _tableLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rt = require('@tanstack/react-table');\n _useReactTable = rt.useReactTable;\n _getCoreRowModel = rt.getCoreRowModel;\n _getSortedRowModel = rt.getSortedRowModel;\n _getExpandedRowModel = rt.getExpandedRowModel;\n _flexRender = rt.flexRender;\n } catch {\n _tableFailed = true;\n }\n}\n\nexport interface DataTableProps<T> extends Omit<React.HTMLAttributes<HTMLTableElement>, 'onClick'> {\n /** Column definitions */\n columns: DataTableColumn<T>[];\n /** Data array */\n data: T[];\n /** Unique key extractor for each row */\n getRowId?: (row: T) => string;\n /** Enable sorting */\n sortable?: boolean;\n /** Controlled sorting state */\n sorting?: SortingState;\n /** Sorting change handler */\n onSortingChange?: OnChangeFn<SortingState>;\n /** Enable row selection */\n selectable?: boolean;\n /** Show checkbox column for row selection */\n showCheckbox?: boolean;\n /** Controlled selection state */\n rowSelection?: RowSelectionState;\n /** Selection change handler */\n onRowSelectionChange?: OnChangeFn<RowSelectionState>;\n /** Row click handler */\n onRowClick?: (row: T) => void;\n /** Extract sub-rows from a row for expandable tree tables */\n getSubRows?: (row: T) => T[] | undefined;\n /** Controlled expanded state */\n expanded?: ExpandedState;\n /** Expanded state change handler */\n onExpandedChange?: OnChangeFn<ExpandedState>;\n /** Empty state message */\n emptyMessage?: string;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Visible caption for the table (recommended for accessibility) */\n caption?: string;\n /** Hide the caption visually but keep it for screen readers */\n captionHidden?: boolean;\n /** Show alternating row backgrounds */\n striped?: boolean;\n /** Wrap table in a bordered container */\n bordered?: boolean;\n}\n\nfunction getColumnSizeStyle(\n column: {\n getSize: () => number;\n columnDef: { size?: number; minSize?: number; maxSize?: number };\n }\n): React.CSSProperties | undefined {\n const { size, minSize, maxSize } = column.columnDef;\n const hasExplicitSize = size !== undefined || minSize !== undefined || maxSize !== undefined;\n\n if (!hasExplicitSize) {\n return undefined;\n }\n\n const resolvedSize = column.getSize();\n\n return {\n width: resolvedSize,\n minWidth: minSize ?? resolvedSize,\n maxWidth: maxSize ?? resolvedSize,\n };\n}\n\nfunction isInteractiveTarget(\n target: EventTarget | null,\n currentTarget: HTMLTableRowElement\n) {\n if (!(target instanceof Element)) return false;\n\n const interactiveElement = target.closest(\n 'button, a, input, select, textarea, [role=\"button\"], [role=\"link\"], [role=\"checkbox\"], [role=\"switch\"]'\n );\n\n return Boolean(interactiveElement && currentTarget.contains(interactiveElement));\n}\n\nfunction DataTableRoot<T>({\n columns: userColumns,\n data,\n getRowId,\n sortable = false,\n sorting: controlledSorting,\n onSortingChange,\n selectable = false,\n showCheckbox = false,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n onRowClick,\n getSubRows,\n expanded: controlledExpanded,\n onExpandedChange,\n emptyMessage = 'No data available',\n size = 'md',\n className,\n caption,\n captionHidden = false,\n striped = false,\n bordered = false,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n ...htmlProps\n}: DataTableProps<T>) {\n loadTableDeps();\n\n // Internal sorting state when uncontrolled\n const [internalSorting, setInternalSorting] = React.useState<SortingState>([]);\n const sorting = controlledSorting ?? internalSorting;\n const handleSortingChange = onSortingChange ?? setInternalSorting;\n\n // Internal selection state when uncontrolled\n const [internalRowSelection, setInternalRowSelection] = React.useState<RowSelectionState>({});\n const rowSelection = controlledRowSelection ?? internalRowSelection;\n const handleRowSelectionChange = onRowSelectionChange ?? setInternalRowSelection;\n\n // Internal expanded state when uncontrolled\n const [internalExpanded, setInternalExpanded] = React.useState<ExpandedState>({});\n const expanded = controlledExpanded ?? internalExpanded;\n const handleExpandedChange = onExpandedChange ?? setInternalExpanded;\n\n // Build columns with optional checkbox prepended\n const columns = React.useMemo(() => {\n if (!showCheckbox || !selectable) return userColumns;\n\n const checkboxColumn: DataTableColumn<T> = {\n id: '__checkbox',\n size: 40,\n minSize: 40,\n maxSize: 40,\n enableSorting: false,\n header: ({ table }: any) => (\n <Checkbox\n size=\"sm\"\n checked={table.getIsAllRowsSelected()}\n indeterminate={table.getIsSomeRowsSelected()}\n onCheckedChange={() => table.toggleAllRowsSelected()}\n aria-label=\"Select all rows\"\n />\n ),\n cell: ({ row }: any) => (\n <Checkbox\n size=\"sm\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onCheckedChange={() => row.toggleSelected()}\n aria-label={`Select row ${row.id}`}\n />\n ),\n };\n\n return [checkboxColumn, ...userColumns];\n }, [userColumns, showCheckbox, selectable]);\n\n const hasExplicitColumnSizing = React.useMemo(\n () =>\n columns.some((column) =>\n column.size !== undefined ||\n column.minSize !== undefined ||\n column.maxSize !== undefined\n ),\n [columns]\n );\n\n if (_tableFailed || !_useReactTable) {\n if (_tableFailed && process.env.NODE_ENV === 'development') {\n console.warn(\n '[@fragments-sdk/ui] DataTable: @tanstack/react-table is not installed. ' +\n 'Install it with: npm install @tanstack/react-table'\n );\n }\n return null;\n }\n\n const hasSubRows = !!getSubRows;\n\n const table = _useReactTable({\n data,\n columns,\n getRowId,\n getSubRows: getSubRows as any,\n getCoreRowModel: _getCoreRowModel(),\n getSortedRowModel: sortable ? _getSortedRowModel() : undefined,\n getExpandedRowModel: hasSubRows && _getExpandedRowModel ? _getExpandedRowModel() : undefined,\n state: {\n sorting: sortable ? sorting : undefined,\n rowSelection: selectable ? rowSelection : undefined,\n expanded: hasSubRows ? expanded : undefined,\n },\n onSortingChange: sortable ? handleSortingChange : undefined,\n onRowSelectionChange: selectable ? handleRowSelectionChange : undefined,\n onExpandedChange: hasSubRows ? handleExpandedChange : undefined,\n enableRowSelection: selectable,\n enableSorting: sortable,\n enableExpanding: hasSubRows,\n });\n\n const isEmpty = data.length === 0;\n\n const rootClasses = [\n styles.table,\n hasExplicitColumnSizing && styles.fixedLayout,\n styles[size],\n striped && styles.striped,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n if (isEmpty) {\n return (\n <div className={styles.emptyState}>\n <span className={styles.emptyMessage}>{emptyMessage}</span>\n </div>\n );\n }\n\n return (\n <div className={[styles.wrapper, bordered && styles.bordered].filter(Boolean).join(' ')}>\n <table\n {...htmlProps}\n className={rootClasses}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {caption && (\n <caption className={captionHidden ? styles.captionHidden : styles.caption}>\n {caption}\n </caption>\n )}\n <thead className={styles.thead}>\n {table.getHeaderGroups().map((headerGroup: any) => (\n <tr key={headerGroup.id} className={styles.headerRow}>\n {headerGroup.headers.map((header: any) => {\n const canSort = sortable && header.column.getCanSort();\n const sortDirection = header.column.getIsSorted();\n const toggleSorting = canSort ? header.column.getToggleSortingHandler() : undefined;\n\n return (\n <th\n key={header.id}\n className={[styles.th, canSort && styles.thSortable].filter(Boolean).join(' ')}\n style={getColumnSizeStyle(header.column)}\n scope=\"col\"\n aria-sort={\n sortDirection\n ? sortDirection === 'asc'\n ? 'ascending'\n : 'descending'\n : canSort\n ? 'none'\n : undefined\n }\n >\n {canSort ? (\n <button\n type=\"button\"\n className={styles.sortButton}\n onClick={toggleSorting}\n >\n <span className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </span>\n <span className={styles.sortIndicator} aria-hidden=\"true\">\n {sortDirection === 'asc' ? (\n <SortAscIcon />\n ) : sortDirection === 'desc' ? (\n <SortDescIcon />\n ) : (\n <SortIcon />\n )}\n </span>\n </button>\n ) : (\n <div className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </div>\n )}\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n <tbody className={styles.tbody}>\n {table.getRowModel().rows.map((row: any) => {\n const isClickable = !!onRowClick;\n const isSelected = selectable ? row.getIsSelected() : false;\n const depth: number = row.depth ?? 0;\n const canExpand = hasSubRows && row.getCanExpand();\n const handleRowClick = (event: React.MouseEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n onRowClick(row.original);\n };\n\n const handleRowKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onRowClick(row.original);\n }\n };\n\n return (\n <tr\n key={row.id}\n className={[\n styles.row,\n isClickable && styles.clickable,\n isSelected && styles.selected,\n depth > 0 && styles.subRow,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={isClickable ? handleRowClick : undefined}\n onKeyDown={isClickable ? handleRowKeyDown : undefined}\n tabIndex={isClickable ? 0 : undefined}\n data-selected={isSelected || undefined}\n data-depth={depth > 0 ? depth : undefined}\n >\n {row.getVisibleCells().map((cell: any, cellIndex: number) => {\n const isFirstDataCell = hasSubRows && cellIndex === (showCheckbox && selectable ? 1 : 0);\n return (\n <td\n key={cell.id}\n className={styles.td}\n style={{\n ...getColumnSizeStyle(cell.column),\n ...(isFirstDataCell && depth > 0 ? { paddingLeft: `${depth * 24 + 12}px` } : undefined),\n }}\n >\n {isFirstDataCell && canExpand ? (\n <span className={styles.expandCell}>\n <button\n type=\"button\"\n className={styles.expandButton}\n onClick={row.getToggleExpandedHandler()}\n aria-label={row.getIsExpanded() ? 'Collapse row' : 'Expand row'}\n aria-expanded={row.getIsExpanded()}\n >\n <ExpandIcon expanded={row.getIsExpanded()} />\n </button>\n {_flexRender(cell.column.columnDef.cell, cell.getContext())}\n </span>\n ) : (\n _flexRender(cell.column.columnDef.cell, cell.getContext())\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n// Expand/collapse icon for sub-rows\nfunction ExpandIcon({ expanded }: { expanded: boolean }) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n style={{\n transform: expanded ? 'rotate(90deg)' : undefined,\n transition: 'transform 150ms ease',\n }}\n >\n <path d=\"M4.5 2.5L8 6L4.5 9.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\n// Sort icons - minimal and functional\nfunction SortIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 2L8.5 5H3.5L6 2Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n <path\n d=\"M6 10L3.5 7H8.5L6 10Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n </svg>\n );\n}\n\nfunction SortAscIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 2L8.5 5H3.5L6 2Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SortDescIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 10L3.5 7H8.5L6 10Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// Helper to create simple columns without TanStack's createColumnHelper\nexport function createColumns<T>(\n columns: Array<{\n key: string;\n header: string;\n width?: number;\n cell?: (row: T) => React.ReactNode;\n }>\n): DataTableColumn<T>[] {\n return columns.map((col) => ({\n id: col.key,\n accessorKey: col.key,\n header: col.header,\n size: col.width,\n minSize: col.width,\n maxSize: col.width,\n cell: col.cell\n ? ({ row }) => col.cell!(row.original)\n : ({ getValue }) => getValue() ?? '--',\n }));\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Root: DataTableRoot,\n Columns: createColumns,\n});\n"],"names":["React","table","jsx","Checkbox","styles","jsxs"],"mappings":"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"}
|