@tonyarbor/components 0.9.0 → 0.9.2

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/Table.d.mts CHANGED
@@ -74,6 +74,7 @@ interface TableProps {
74
74
  * Table component - Arbor Design System
75
75
  *
76
76
  * A data table component with selectable rows and column headers.
77
+ * Use with TableContainer to wrap TableControls, Table, and TableFooterPagination together.
77
78
  */
78
79
  declare const Table: React.ForwardRefExoticComponent<TableProps & React.RefAttributes<HTMLTableElement>>;
79
80
 
package/dist/Table.d.ts CHANGED
@@ -74,6 +74,7 @@ interface TableProps {
74
74
  * Table component - Arbor Design System
75
75
  *
76
76
  * A data table component with selectable rows and column headers.
77
+ * Use with TableContainer to wrap TableControls, Table, and TableFooterPagination together.
77
78
  */
78
79
  declare const Table: React.ForwardRefExoticComponent<TableProps & React.RefAttributes<HTMLTableElement>>;
79
80
 
package/dist/Table.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Table/index.ts","../src/Table/Table.tsx","../src/Checkbox/Checkbox.tsx"],"sourcesContent":["export { Table } from './Table';\nexport type { TableProps, TableColumn, TableRow } from './Table';\n","import * as React from 'react';\nimport { clsx } from 'clsx';\nimport { MoreVertical } from 'lucide-react';\nimport { Checkbox } from '../Checkbox';\n\nexport interface TableColumn {\n /**\n * Unique key for the column\n */\n key: string;\n /**\n * Column header label\n */\n label: string;\n /**\n * Whether to show the menu icon in the header\n */\n showMenu?: boolean;\n /**\n * Custom width for the column\n */\n width?: string;\n}\n\nexport interface TableRow {\n /**\n * Unique ID for the row\n */\n id: string;\n /**\n * Cell data keyed by column key\n */\n cells: Record<string, React.ReactNode>;\n /**\n * Whether the row is selected\n */\n selected?: boolean;\n}\n\nexport interface TableProps {\n /**\n * Table columns configuration\n */\n columns: TableColumn[];\n /**\n * Table rows data\n */\n rows: TableRow[];\n /**\n * Callback when row selection changes\n */\n onRowSelectionChange?: (rowId: string, selected: boolean) => void;\n /**\n * Callback when select all is toggled\n */\n onSelectAllChange?: (selected: boolean) => void;\n /**\n * Whether all rows are selected\n */\n allSelected?: boolean;\n /**\n * Whether some rows are selected (indeterminate state)\n */\n someSelected?: boolean;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n}\n\nconst tableStyles: React.CSSProperties = {\n width: '100%',\n borderCollapse: 'separate',\n borderSpacing: 0,\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst headerCellStyles: React.CSSProperties = {\n height: '44px',\n paddingLeft: '16px',\n paddingRight: '16px',\n paddingTop: 0,\n paddingBottom: 0,\n backgroundColor: '#f8f8f8',\n borderBottom: '1px solid #efefef',\n fontSize: '13px',\n fontWeight: 600,\n color: '#2f2f2f',\n textAlign: 'left',\n position: 'relative',\n};\n\nconst checkboxCellStyles: React.CSSProperties = {\n width: '48px',\n paddingLeft: '16px',\n paddingRight: '8px',\n};\n\nconst bodyCellStyles: React.CSSProperties = {\n height: '41px',\n paddingLeft: '16px',\n paddingRight: '16px',\n paddingTop: '8px',\n paddingBottom: '8px',\n borderBottom: '1px solid #efefef',\n fontSize: '13px',\n color: '#2f2f2f',\n};\n\nconst menuButtonStyles: React.CSSProperties = {\n width: '24px',\n height: '24px',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n marginLeft: '8px',\n borderRadius: '4px',\n transition: 'background-color 0.2s ease-in-out',\n};\n\nconst rowStyles: React.CSSProperties = {\n transition: 'background-color 0.1s ease-in-out',\n};\n\n/**\n * Table component - Arbor Design System\n *\n * A data table component with selectable rows and column headers.\n */\nexport const Table = React.forwardRef<HTMLTableElement, TableProps>(\n (\n {\n columns,\n rows,\n onRowSelectionChange,\n onSelectAllChange,\n allSelected = false,\n someSelected = false,\n className,\n style,\n 'data-testid': dataTestId,\n },\n ref\n ) => {\n const [hoveredRow, setHoveredRow] = React.useState<string | null>(null);\n const [hoveredMenuButton, setHoveredMenuButton] = React.useState<string | null>(null);\n\n return (\n <table\n ref={ref}\n className={clsx('arbor-table', className)}\n style={{ ...tableStyles, ...style }}\n data-testid={dataTestId}\n >\n <thead>\n <tr>\n {/* Checkbox header cell */}\n <th style={{ ...headerCellStyles, ...checkboxCellStyles }}>\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={onSelectAllChange}\n aria-label=\"Select all rows\"\n />\n </th>\n\n {/* Column headers */}\n {columns.map((column) => (\n <th\n key={column.key}\n style={{\n ...headerCellStyles,\n ...(column.width ? { width: column.width } : {}),\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <span>{column.label}</span>\n {column.showMenu !== false && (\n <button\n type=\"button\"\n onMouseEnter={() => setHoveredMenuButton(`header-${column.key}`)}\n onMouseLeave={() => setHoveredMenuButton(null)}\n style={{\n ...menuButtonStyles,\n backgroundColor:\n hoveredMenuButton === `header-${column.key}` ? '#f5f5f5' : 'transparent',\n }}\n aria-label={`${column.label} options`}\n >\n <MoreVertical size={16} color=\"#595959\" />\n </button>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n\n <tbody>\n {rows.map((row, index) => {\n const isOdd = index % 2 === 0;\n const isHovered = hoveredRow === row.id;\n\n return (\n <tr\n key={row.id}\n onMouseEnter={() => setHoveredRow(row.id)}\n onMouseLeave={() => setHoveredRow(null)}\n style={{\n ...rowStyles,\n backgroundColor: isHovered\n ? '#fafafa'\n : isOdd\n ? 'white'\n : '#f8f8f8',\n }}\n >\n {/* Checkbox cell */}\n <td style={{ ...bodyCellStyles, ...checkboxCellStyles }}>\n <Checkbox\n checked={row.selected || false}\n onChange={(checked) => onRowSelectionChange?.(row.id, checked)}\n aria-label={`Select row ${row.id}`}\n />\n </td>\n\n {/* Data cells */}\n {columns.map((column) => (\n <td key={column.key} style={bodyCellStyles}>\n {row.cells[column.key]}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n }\n);\n\nTable.displayName = 'Table';\n","import * as React from 'react';\nimport { clsx } from 'clsx';\nimport { Check, Minus } from 'lucide-react';\n\nexport interface CheckboxProps {\n /**\n * The label for the checkbox\n */\n label?: string;\n /**\n * Whether the checkbox is checked\n */\n checked?: boolean;\n /**\n * Callback when checked state changes\n */\n onChange?: (checked: boolean) => void;\n /**\n * Whether the checkbox is disabled\n */\n disabled?: boolean;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n /**\n * Name attribute for form submission\n */\n name?: string;\n /**\n * Value attribute for form submission\n */\n value?: string;\n /**\n * Indeterminate state (shows minus icon)\n */\n indeterminate?: boolean;\n}\n\nconst checkboxStyles: React.CSSProperties = {\n width: '16px',\n height: '16px',\n border: '1px solid #7e7e7e', // grey-500\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n transition: 'all 0.2s ease-in-out',\n flexShrink: 0,\n backgroundColor: '#ffffff',\n};\n\nconst checkedStyles: React.CSSProperties = {\n backgroundColor: '#0e8a0e', // brand-600\n border: '1px solid #0e8a0e',\n};\n\nconst checkedHoverStyles: React.CSSProperties = {\n backgroundColor: '#005700', // brand-800\n border: '1px solid #005700',\n};\n\nconst uncheckedHoverStyles: React.CSSProperties = {\n border: '1px solid #474747', // grey-700\n};\n\nconst labelStyles: React.CSSProperties = {\n fontSize: '13px',\n color: '#2f2f2f',\n cursor: 'pointer',\n userSelect: 'none' as const,\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst wrapperStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n};\n\n/**\n * Checkbox component - Arbor Design System\n *\n * A checkbox input with label support.\n */\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n label,\n checked = false,\n onChange,\n disabled = false,\n className,\n style,\n 'data-testid': dataTestId,\n name,\n value,\n indeterminate = false,\n },\n ref\n ) => {\n const [isFocused, setIsFocused] = React.useState(false);\n const [isHovered, setIsHovered] = React.useState(false);\n const checkboxId = React.useId();\n const innerRef = React.useRef<HTMLInputElement | null>(null);\n\n // Merge refs\n React.useEffect(() => {\n const node = innerRef.current;\n if (node) {\n // Set indeterminate property on the native input element\n node.indeterminate = indeterminate;\n\n // Forward to external ref if provided\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n }\n }, [indeterminate, ref]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!disabled) {\n onChange?.(e.target.checked);\n }\n };\n\n const boxStyle: React.CSSProperties = {\n ...checkboxStyles,\n ...((checked || indeterminate) && !disabled && checkedStyles),\n ...(isHovered && !disabled && !(checked || indeterminate) && uncheckedHoverStyles),\n ...(isHovered && !disabled && (checked || indeterminate) && checkedHoverStyles),\n ...(disabled && !checked && !indeterminate && { backgroundColor: '#efefef', border: '1px solid #b3b3b3' }),\n ...(disabled && (checked || indeterminate) && { backgroundColor: '#b3b3b3', border: '1px solid #b3b3b3' }),\n ...(isFocused && !disabled && {\n boxShadow: '0px 0px 0px 3px #3cad51',\n }),\n };\n\n const checkmarkColor = '#ffffff';\n\n return (\n <div\n className={clsx('arbor-checkbox-wrapper', className)}\n style={{ ...wrapperStyles, ...style }}\n data-testid={dataTestId}\n >\n <input\n ref={innerRef}\n id={checkboxId}\n type=\"checkbox\"\n checked={checked}\n onChange={handleChange}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n disabled={disabled}\n name={name}\n value={value}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n }}\n aria-checked={indeterminate ? 'mixed' : checked}\n />\n <label\n htmlFor={checkboxId}\n onMouseEnter={() => !disabled && setIsHovered(true)}\n onMouseLeave={() => !disabled && setIsHovered(false)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n >\n <div style={boxStyle}>\n {(checked || indeterminate) && (\n indeterminate ? (\n <Minus size={12} color={checkmarkColor} strokeWidth={3} />\n ) : (\n <Check size={16} color={checkmarkColor} strokeWidth={3} />\n )\n )}\n </div>\n {label && (\n <span\n style={{\n ...labelStyles,\n color: disabled ? '#7e7e7e' : '#2f2f2f',\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n >\n {label}\n </span>\n )}\n </label>\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n"],"mappings":"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","names":["React","import_clsx","import_lucide_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/Table/index.ts","../src/Table/Table.tsx","../src/Checkbox/Checkbox.tsx"],"sourcesContent":["export { Table } from './Table';\nexport type { TableProps, TableColumn, TableRow } from './Table';\n","import * as React from 'react';\nimport { clsx } from 'clsx';\nimport { MoreVertical } from 'lucide-react';\nimport { Checkbox } from '../Checkbox';\n\nexport interface TableColumn {\n /**\n * Unique key for the column\n */\n key: string;\n /**\n * Column header label\n */\n label: string;\n /**\n * Whether to show the menu icon in the header\n */\n showMenu?: boolean;\n /**\n * Custom width for the column\n */\n width?: string;\n}\n\nexport interface TableRow {\n /**\n * Unique ID for the row\n */\n id: string;\n /**\n * Cell data keyed by column key\n */\n cells: Record<string, React.ReactNode>;\n /**\n * Whether the row is selected\n */\n selected?: boolean;\n}\n\nexport interface TableProps {\n /**\n * Table columns configuration\n */\n columns: TableColumn[];\n /**\n * Table rows data\n */\n rows: TableRow[];\n /**\n * Callback when row selection changes\n */\n onRowSelectionChange?: (rowId: string, selected: boolean) => void;\n /**\n * Callback when select all is toggled\n */\n onSelectAllChange?: (selected: boolean) => void;\n /**\n * Whether all rows are selected\n */\n allSelected?: boolean;\n /**\n * Whether some rows are selected (indeterminate state)\n */\n someSelected?: boolean;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n}\n\nconst tableStyles: React.CSSProperties = {\n width: '100%',\n borderCollapse: 'separate',\n borderSpacing: 0,\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst headerCellStyles: React.CSSProperties = {\n height: '44px',\n paddingLeft: '16px',\n paddingRight: '16px',\n paddingTop: 0,\n paddingBottom: 0,\n backgroundColor: '#f8f8f8',\n borderBottom: '1px solid #efefef',\n fontSize: '13px',\n fontWeight: 600,\n color: '#2f2f2f',\n textAlign: 'left',\n position: 'relative',\n};\n\nconst checkboxCellStyles: React.CSSProperties = {\n width: '48px',\n paddingLeft: '16px',\n paddingRight: '8px',\n};\n\nconst bodyCellStyles: React.CSSProperties = {\n height: '41px',\n paddingLeft: '16px',\n paddingRight: '16px',\n paddingTop: '8px',\n paddingBottom: '8px',\n borderBottom: '1px solid #efefef',\n fontSize: '13px',\n color: '#2f2f2f',\n};\n\nconst menuButtonStyles: React.CSSProperties = {\n width: '24px',\n height: '24px',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n marginLeft: '8px',\n borderRadius: '4px',\n transition: 'background-color 0.2s ease-in-out',\n};\n\nconst rowStyles: React.CSSProperties = {\n transition: 'background-color 0.1s ease-in-out',\n};\n\n/**\n * Table component - Arbor Design System\n *\n * A data table component with selectable rows and column headers.\n * Use with TableContainer to wrap TableControls, Table, and TableFooterPagination together.\n */\nexport const Table = React.forwardRef<HTMLTableElement, TableProps>(\n (\n {\n columns,\n rows,\n onRowSelectionChange,\n onSelectAllChange,\n allSelected = false,\n someSelected = false,\n className,\n style,\n 'data-testid': dataTestId,\n },\n ref\n ) => {\n const [hoveredRow, setHoveredRow] = React.useState<string | null>(null);\n const [hoveredMenuButton, setHoveredMenuButton] = React.useState<string | null>(null);\n\n return (\n <table\n ref={ref}\n className={clsx('arbor-table', className)}\n style={{ ...tableStyles, ...style }}\n data-testid={dataTestId}\n >\n <thead>\n <tr>\n {/* Checkbox header cell */}\n <th style={{ ...headerCellStyles, ...checkboxCellStyles }}>\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={onSelectAllChange}\n aria-label=\"Select all rows\"\n />\n </th>\n\n {/* Column headers */}\n {columns.map((column) => (\n <th\n key={column.key}\n style={{\n ...headerCellStyles,\n ...(column.width ? { width: column.width } : {}),\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <span>{column.label}</span>\n {column.showMenu !== false && (\n <button\n type=\"button\"\n onMouseEnter={() => setHoveredMenuButton(`header-${column.key}`)}\n onMouseLeave={() => setHoveredMenuButton(null)}\n style={{\n ...menuButtonStyles,\n backgroundColor:\n hoveredMenuButton === `header-${column.key}` ? '#f5f5f5' : 'transparent',\n }}\n aria-label={`${column.label} options`}\n >\n <MoreVertical size={16} color=\"#595959\" />\n </button>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n\n <tbody>\n {rows.map((row, index) => {\n const isOdd = index % 2 === 0;\n const isHovered = hoveredRow === row.id;\n\n return (\n <tr\n key={row.id}\n onMouseEnter={() => setHoveredRow(row.id)}\n onMouseLeave={() => setHoveredRow(null)}\n style={{\n ...rowStyles,\n backgroundColor: isHovered\n ? '#fafafa'\n : isOdd\n ? 'white'\n : '#f8f8f8',\n }}\n >\n {/* Checkbox cell */}\n <td style={{ ...bodyCellStyles, ...checkboxCellStyles }}>\n <Checkbox\n checked={row.selected || false}\n onChange={(checked) => onRowSelectionChange?.(row.id, checked)}\n aria-label={`Select row ${row.id}`}\n />\n </td>\n\n {/* Data cells */}\n {columns.map((column) => (\n <td key={column.key} style={bodyCellStyles}>\n {row.cells[column.key]}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n }\n);\n\nTable.displayName = 'Table';\n","import * as React from 'react';\nimport { clsx } from 'clsx';\nimport { Check, Minus } from 'lucide-react';\n\nexport interface CheckboxProps {\n /**\n * The label for the checkbox\n */\n label?: string;\n /**\n * Whether the checkbox is checked\n */\n checked?: boolean;\n /**\n * Callback when checked state changes\n */\n onChange?: (checked: boolean) => void;\n /**\n * Whether the checkbox is disabled\n */\n disabled?: boolean;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n /**\n * Name attribute for form submission\n */\n name?: string;\n /**\n * Value attribute for form submission\n */\n value?: string;\n /**\n * Indeterminate state (shows minus icon)\n */\n indeterminate?: boolean;\n}\n\nconst checkboxStyles: React.CSSProperties = {\n width: '16px',\n height: '16px',\n border: '1px solid #7e7e7e', // grey-500\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n transition: 'all 0.2s ease-in-out',\n flexShrink: 0,\n backgroundColor: '#ffffff',\n};\n\nconst checkedStyles: React.CSSProperties = {\n backgroundColor: '#0e8a0e', // brand-600\n border: '1px solid #0e8a0e',\n};\n\nconst checkedHoverStyles: React.CSSProperties = {\n backgroundColor: '#005700', // brand-800\n border: '1px solid #005700',\n};\n\nconst uncheckedHoverStyles: React.CSSProperties = {\n border: '1px solid #474747', // grey-700\n};\n\nconst labelStyles: React.CSSProperties = {\n fontSize: '13px',\n color: '#2f2f2f',\n cursor: 'pointer',\n userSelect: 'none' as const,\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst wrapperStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n};\n\n/**\n * Checkbox component - Arbor Design System\n *\n * A checkbox input with label support.\n */\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n label,\n checked = false,\n onChange,\n disabled = false,\n className,\n style,\n 'data-testid': dataTestId,\n name,\n value,\n indeterminate = false,\n },\n ref\n ) => {\n const [isFocused, setIsFocused] = React.useState(false);\n const [isHovered, setIsHovered] = React.useState(false);\n const checkboxId = React.useId();\n const innerRef = React.useRef<HTMLInputElement | null>(null);\n\n // Merge refs\n React.useEffect(() => {\n const node = innerRef.current;\n if (node) {\n // Set indeterminate property on the native input element\n node.indeterminate = indeterminate;\n\n // Forward to external ref if provided\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n }\n }, [indeterminate, ref]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!disabled) {\n onChange?.(e.target.checked);\n }\n };\n\n const boxStyle: React.CSSProperties = {\n ...checkboxStyles,\n ...((checked || indeterminate) && !disabled && checkedStyles),\n ...(isHovered && !disabled && !(checked || indeterminate) && uncheckedHoverStyles),\n ...(isHovered && !disabled && (checked || indeterminate) && checkedHoverStyles),\n ...(disabled && !checked && !indeterminate && { backgroundColor: '#efefef', border: '1px solid #b3b3b3' }),\n ...(disabled && (checked || indeterminate) && { backgroundColor: '#b3b3b3', border: '1px solid #b3b3b3' }),\n ...(isFocused && !disabled && {\n boxShadow: '0px 0px 0px 3px #3cad51',\n }),\n };\n\n const checkmarkColor = '#ffffff';\n\n return (\n <div\n className={clsx('arbor-checkbox-wrapper', className)}\n style={{ ...wrapperStyles, ...style }}\n data-testid={dataTestId}\n >\n <input\n ref={innerRef}\n id={checkboxId}\n type=\"checkbox\"\n checked={checked}\n onChange={handleChange}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n disabled={disabled}\n name={name}\n value={value}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n }}\n aria-checked={indeterminate ? 'mixed' : checked}\n />\n <label\n htmlFor={checkboxId}\n onMouseEnter={() => !disabled && setIsHovered(true)}\n onMouseLeave={() => !disabled && setIsHovered(false)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n >\n <div style={boxStyle}>\n {(checked || indeterminate) && (\n indeterminate ? (\n <Minus size={12} color={checkmarkColor} strokeWidth={3} />\n ) : (\n <Check size={16} color={checkmarkColor} strokeWidth={3} />\n )\n )}\n </div>\n {label && (\n <span\n style={{\n ...labelStyles,\n color: disabled ? '#7e7e7e' : '#2f2f2f',\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n >\n {label}\n </span>\n )}\n </label>\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n"],"mappings":"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","names":["React","import_clsx","import_lucide_react","import_jsx_runtime"]}
package/dist/Table.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Table
3
- } from "./chunk-AI2U34CF.mjs";
3
+ } from "./chunk-GDOCRKBF.mjs";
4
4
  import "./chunk-CUTYEIFE.mjs";
5
5
  export {
6
6
  Table
@@ -156,4 +156,4 @@ Table.displayName = "Table";
156
156
  export {
157
157
  Table
158
158
  };
159
- //# sourceMappingURL=chunk-AI2U34CF.mjs.map
159
+ //# sourceMappingURL=chunk-GDOCRKBF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Table/Table.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\nimport { MoreVertical } from 'lucide-react';\nimport { Checkbox } from '../Checkbox';\n\nexport interface TableColumn {\n /**\n * Unique key for the column\n */\n key: string;\n /**\n * Column header label\n */\n label: string;\n /**\n * Whether to show the menu icon in the header\n */\n showMenu?: boolean;\n /**\n * Custom width for the column\n */\n width?: string;\n}\n\nexport interface TableRow {\n /**\n * Unique ID for the row\n */\n id: string;\n /**\n * Cell data keyed by column key\n */\n cells: Record<string, React.ReactNode>;\n /**\n * Whether the row is selected\n */\n selected?: boolean;\n}\n\nexport interface TableProps {\n /**\n * Table columns configuration\n */\n columns: TableColumn[];\n /**\n * Table rows data\n */\n rows: TableRow[];\n /**\n * Callback when row selection changes\n */\n onRowSelectionChange?: (rowId: string, selected: boolean) => void;\n /**\n * Callback when select all is toggled\n */\n onSelectAllChange?: (selected: boolean) => void;\n /**\n * Whether all rows are selected\n */\n allSelected?: boolean;\n /**\n * Whether some rows are selected (indeterminate state)\n */\n someSelected?: boolean;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n}\n\nconst tableStyles: React.CSSProperties = {\n width: '100%',\n borderCollapse: 'separate',\n borderSpacing: 0,\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst headerCellStyles: React.CSSProperties = {\n height: '44px',\n paddingLeft: '16px',\n paddingRight: '16px',\n paddingTop: 0,\n paddingBottom: 0,\n backgroundColor: '#f8f8f8',\n borderBottom: '1px solid #efefef',\n fontSize: '13px',\n fontWeight: 600,\n color: '#2f2f2f',\n textAlign: 'left',\n position: 'relative',\n};\n\nconst checkboxCellStyles: React.CSSProperties = {\n width: '48px',\n paddingLeft: '16px',\n paddingRight: '8px',\n};\n\nconst bodyCellStyles: React.CSSProperties = {\n height: '41px',\n paddingLeft: '16px',\n paddingRight: '16px',\n paddingTop: '8px',\n paddingBottom: '8px',\n borderBottom: '1px solid #efefef',\n fontSize: '13px',\n color: '#2f2f2f',\n};\n\nconst menuButtonStyles: React.CSSProperties = {\n width: '24px',\n height: '24px',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n marginLeft: '8px',\n borderRadius: '4px',\n transition: 'background-color 0.2s ease-in-out',\n};\n\nconst rowStyles: React.CSSProperties = {\n transition: 'background-color 0.1s ease-in-out',\n};\n\n/**\n * Table component - Arbor Design System\n *\n * A data table component with selectable rows and column headers.\n * Use with TableContainer to wrap TableControls, Table, and TableFooterPagination together.\n */\nexport const Table = React.forwardRef<HTMLTableElement, TableProps>(\n (\n {\n columns,\n rows,\n onRowSelectionChange,\n onSelectAllChange,\n allSelected = false,\n someSelected = false,\n className,\n style,\n 'data-testid': dataTestId,\n },\n ref\n ) => {\n const [hoveredRow, setHoveredRow] = React.useState<string | null>(null);\n const [hoveredMenuButton, setHoveredMenuButton] = React.useState<string | null>(null);\n\n return (\n <table\n ref={ref}\n className={clsx('arbor-table', className)}\n style={{ ...tableStyles, ...style }}\n data-testid={dataTestId}\n >\n <thead>\n <tr>\n {/* Checkbox header cell */}\n <th style={{ ...headerCellStyles, ...checkboxCellStyles }}>\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={onSelectAllChange}\n aria-label=\"Select all rows\"\n />\n </th>\n\n {/* Column headers */}\n {columns.map((column) => (\n <th\n key={column.key}\n style={{\n ...headerCellStyles,\n ...(column.width ? { width: column.width } : {}),\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <span>{column.label}</span>\n {column.showMenu !== false && (\n <button\n type=\"button\"\n onMouseEnter={() => setHoveredMenuButton(`header-${column.key}`)}\n onMouseLeave={() => setHoveredMenuButton(null)}\n style={{\n ...menuButtonStyles,\n backgroundColor:\n hoveredMenuButton === `header-${column.key}` ? '#f5f5f5' : 'transparent',\n }}\n aria-label={`${column.label} options`}\n >\n <MoreVertical size={16} color=\"#595959\" />\n </button>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n\n <tbody>\n {rows.map((row, index) => {\n const isOdd = index % 2 === 0;\n const isHovered = hoveredRow === row.id;\n\n return (\n <tr\n key={row.id}\n onMouseEnter={() => setHoveredRow(row.id)}\n onMouseLeave={() => setHoveredRow(null)}\n style={{\n ...rowStyles,\n backgroundColor: isHovered\n ? '#fafafa'\n : isOdd\n ? 'white'\n : '#f8f8f8',\n }}\n >\n {/* Checkbox cell */}\n <td style={{ ...bodyCellStyles, ...checkboxCellStyles }}>\n <Checkbox\n checked={row.selected || false}\n onChange={(checked) => onRowSelectionChange?.(row.id, checked)}\n aria-label={`Select row ${row.id}`}\n />\n </td>\n\n {/* Data cells */}\n {columns.map((column) => (\n <td key={column.key} style={bodyCellStyles}>\n {row.cells[column.key]}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n }\n);\n\nTable.displayName = 'Table';\n"],"mappings":"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","names":[]}
package/dist/index.d.mts CHANGED
@@ -17,6 +17,7 @@ export { Pagination, PaginationProps } from './Pagination.mjs';
17
17
  export { TableFooterPagination, TableFooterPaginationProps } from './TableFooterPagination.mjs';
18
18
  export { TableControls, TableControlsProps } from './TableControls.mjs';
19
19
  export { Table, TableColumn, TableProps, TableRow } from './Table.mjs';
20
+ import * as React from 'react';
20
21
  export { Avatar, AvatarProps, AvatarSize } from './Avatar.mjs';
21
22
  export { SearchGlobal, SearchGlobalProps } from './SearchGlobal.mjs';
22
23
  export { SearchOnPage, SearchOnPageProps } from './SearchOnPage.mjs';
@@ -39,7 +40,42 @@ export { TopNavItem, TopNavItemProps } from './TopNavItem.mjs';
39
40
  export { NavItem, TopNavBar, TopNavBarProps } from './TopNavBar.mjs';
40
41
  export { SideNavButton, SideNavButtonIcon, SideNavButtonProps } from './SideNavButton.mjs';
41
42
  export { SideNavBar, SideNavBarIcon, SideNavBarProps } from './SideNavBar.mjs';
42
- import * as React from 'react';
43
+
44
+ interface TableContainerProps {
45
+ /**
46
+ * Children to render inside the container (TableControls, Table, TableFooterPagination)
47
+ */
48
+ children: React.ReactNode;
49
+ /**
50
+ * Custom className
51
+ */
52
+ className?: string;
53
+ /**
54
+ * Custom style
55
+ */
56
+ style?: React.CSSProperties;
57
+ /**
58
+ * Test ID for testing
59
+ */
60
+ 'data-testid'?: string;
61
+ }
62
+ /**
63
+ * TableContainer component - Arbor Design System
64
+ *
65
+ * A wrapper container for the full table experience.
66
+ * Use to wrap TableControls, Table, and TableFooterPagination together
67
+ * in a white box with 8px padding and 8px border radius.
68
+ *
69
+ * @example
70
+ * ```tsx
71
+ * <TableContainer>
72
+ * <TableControls {...controlsProps} />
73
+ * <Table {...tableProps} />
74
+ * <TableFooterPagination {...paginationProps} />
75
+ * </TableContainer>
76
+ * ```
77
+ */
78
+ declare const TableContainer: React.ForwardRefExoticComponent<TableContainerProps & React.RefAttributes<HTMLDivElement>>;
43
79
 
44
80
  type SideNavItemTier = 1 | 2 | 3 | 4 | 5;
45
81
  interface SideNavItemProps {
@@ -124,4 +160,4 @@ type ComboboxOption = {
124
160
  };
125
161
  type NumericInputState = 'default' | 'error' | 'success';
126
162
 
127
- export { type ButtonSize, type ButtonVariant, type CardPadding, type ComboboxOption, type ComboboxState, type InputSize, type NumericInputState, SideNavItem, type SideNavItemProps, type SideNavItemTier, type TagVariant, type ValidationState };
163
+ export { type ButtonSize, type ButtonVariant, type CardPadding, type ComboboxOption, type ComboboxState, type InputSize, type NumericInputState, SideNavItem, type SideNavItemProps, type SideNavItemTier, TableContainer, type TableContainerProps, type TagVariant, type ValidationState };
package/dist/index.d.ts CHANGED
@@ -17,6 +17,7 @@ export { Pagination, PaginationProps } from './Pagination.js';
17
17
  export { TableFooterPagination, TableFooterPaginationProps } from './TableFooterPagination.js';
18
18
  export { TableControls, TableControlsProps } from './TableControls.js';
19
19
  export { Table, TableColumn, TableProps, TableRow } from './Table.js';
20
+ import * as React from 'react';
20
21
  export { Avatar, AvatarProps, AvatarSize } from './Avatar.js';
21
22
  export { SearchGlobal, SearchGlobalProps } from './SearchGlobal.js';
22
23
  export { SearchOnPage, SearchOnPageProps } from './SearchOnPage.js';
@@ -39,7 +40,42 @@ export { TopNavItem, TopNavItemProps } from './TopNavItem.js';
39
40
  export { NavItem, TopNavBar, TopNavBarProps } from './TopNavBar.js';
40
41
  export { SideNavButton, SideNavButtonIcon, SideNavButtonProps } from './SideNavButton.js';
41
42
  export { SideNavBar, SideNavBarIcon, SideNavBarProps } from './SideNavBar.js';
42
- import * as React from 'react';
43
+
44
+ interface TableContainerProps {
45
+ /**
46
+ * Children to render inside the container (TableControls, Table, TableFooterPagination)
47
+ */
48
+ children: React.ReactNode;
49
+ /**
50
+ * Custom className
51
+ */
52
+ className?: string;
53
+ /**
54
+ * Custom style
55
+ */
56
+ style?: React.CSSProperties;
57
+ /**
58
+ * Test ID for testing
59
+ */
60
+ 'data-testid'?: string;
61
+ }
62
+ /**
63
+ * TableContainer component - Arbor Design System
64
+ *
65
+ * A wrapper container for the full table experience.
66
+ * Use to wrap TableControls, Table, and TableFooterPagination together
67
+ * in a white box with 8px padding and 8px border radius.
68
+ *
69
+ * @example
70
+ * ```tsx
71
+ * <TableContainer>
72
+ * <TableControls {...controlsProps} />
73
+ * <Table {...tableProps} />
74
+ * <TableFooterPagination {...paginationProps} />
75
+ * </TableContainer>
76
+ * ```
77
+ */
78
+ declare const TableContainer: React.ForwardRefExoticComponent<TableContainerProps & React.RefAttributes<HTMLDivElement>>;
43
79
 
44
80
  type SideNavItemTier = 1 | 2 | 3 | 4 | 5;
45
81
  interface SideNavItemProps {
@@ -124,4 +160,4 @@ type ComboboxOption = {
124
160
  };
125
161
  type NumericInputState = 'default' | 'error' | 'success';
126
162
 
127
- export { type ButtonSize, type ButtonVariant, type CardPadding, type ComboboxOption, type ComboboxState, type InputSize, type NumericInputState, SideNavItem, type SideNavItemProps, type SideNavItemTier, type TagVariant, type ValidationState };
163
+ export { type ButtonSize, type ButtonVariant, type CardPadding, type ComboboxOption, type ComboboxState, type InputSize, type NumericInputState, SideNavItem, type SideNavItemProps, type SideNavItemTier, TableContainer, type TableContainerProps, type TagVariant, type ValidationState };