@agile-team/mach-table-react 0.5.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/RobotGrid.tsx","../src/useMachGrid.ts","../src/adapters.ts","../src/index.ts"],"sourcesContent":["import {\n createElement,\n useEffect,\n useRef,\n type CSSProperties,\n type MutableRefObject\n} from \"react\";\nimport { createGrid, DIRECT_GRID_OPTION_KEYS, EVENT_TYPES } from \"@agile-team/mach-table\";\nimport type { GridApi, GridOptions } from \"@agile-team/mach-table\";\n\nexport type RobotGridReactProps<TData = any> = Omit<GridOptions<TData>, \"className\"> & {\n /** CSS class applied to the React host element. */\n className?: string;\n /** CSS class forwarded to MachTable's inner grid root. */\n gridClassName?: string;\n style?: CSSProperties;\n apiRef?: MutableRefObject<GridApi<TData> | null>;\n};\n\nconst UPDATABLE_KEYS = DIRECT_GRID_OPTION_KEYS.filter((key) => key !== \"className\");\n\nexport function RobotGrid<TData = any>(props: RobotGridReactProps<TData>) {\n const { className, style, apiRef } = props;\n const hostRef = useRef<HTMLDivElement | null>(null);\n const gridApiRef = useRef<GridApi<TData> | null>(null);\n const propsRef = useRef(props);\n propsRef.current = props;\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n const initial = propsRef.current;\n const options: Record<string, unknown> = {};\n for (const key of Object.keys(initial) as string[]) {\n if (key === \"className\" || key === \"gridClassName\" || key === \"style\" || key === \"apiRef\") continue;\n if (key.startsWith(\"on\")) continue;\n options[key] = (initial as Record<string, unknown>)[key];\n }\n if (initial.gridClassName !== undefined) options.className = initial.gridClassName;\n for (const eventType of EVENT_TYPES) {\n const handlerKey = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}`;\n options[handlerKey] = (event: unknown) => {\n const latest = propsRef.current as Record<string, unknown>;\n const handler = latest[handlerKey];\n if (typeof handler === \"function\") (handler as (event: unknown) => void)(event);\n };\n }\n\n const api = createGrid<TData>(host, options as GridOptions<TData>);\n gridApiRef.current = api;\n return () => {\n api.destroy();\n gridApiRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!apiRef) return;\n const assigned = gridApiRef.current;\n apiRef.current = assigned;\n return () => {\n if (apiRef.current === assigned) apiRef.current = null;\n };\n }, [apiRef]);\n\n const rowDataReady = useRef(false);\n useEffect(() => {\n if (!rowDataReady.current) {\n rowDataReady.current = true;\n return;\n }\n gridApiRef.current?.setRowData(props.rowData);\n }, [props.rowData]);\n\n const columnDefsReady = useRef(false);\n useEffect(() => {\n if (!columnDefsReady.current) {\n columnDefsReady.current = true;\n return;\n }\n gridApiRef.current?.setColumnDefs(props.columnDefs);\n }, [props.columnDefs]);\n\n const quickFilterReady = useRef(false);\n useEffect(() => {\n if (!quickFilterReady.current) {\n quickFilterReady.current = true;\n return;\n }\n gridApiRef.current?.setQuickFilter(props.quickFilterText);\n }, [props.quickFilterText]);\n\n const gridClassNameReady = useRef(false);\n useEffect(() => {\n if (!gridClassNameReady.current) {\n gridClassNameReady.current = true;\n return;\n }\n gridApiRef.current?.updateOptions({ className: props.gridClassName });\n }, [props.gridClassName]);\n\n const optionValues = UPDATABLE_KEYS.map((key) => props[key]);\n const previousOptionValues = useRef<readonly unknown[] | null>(null);\n useEffect(() => {\n const previous = previousOptionValues.current;\n previousOptionValues.current = optionValues;\n if (!previous) {\n return;\n }\n const changed: Record<string, unknown> = {};\n optionValues.forEach((value, index) => {\n if (!Object.is(value, previous[index])) changed[UPDATABLE_KEYS[index]] = value;\n });\n if (Object.keys(changed).length > 0) {\n gridApiRef.current?.updateOptions(changed as Partial<GridOptions<TData>>);\n }\n }, optionValues);\n\n return createElement(\"div\", {\n ref: hostRef,\n className: `mach-react-host ${className ?? \"\"}`.trim() || undefined,\n style\n });\n}\n","import { useMemo, useState, type MutableRefObject } from \"react\";\nimport type { GridApi } from \"@agile-team/mach-table\";\n\nexport interface UseMachGridReturn<TData = any> {\n apiRef: MutableRefObject<GridApi<TData> | null>;\n api: GridApi<TData> | null;\n}\n\nexport function useMachGrid<TData = any>(): UseMachGridReturn<TData> {\n const [api, setApi] = useState<GridApi<TData> | null>(null);\n const apiRef = useMemo(() => {\n let current: GridApi<TData> | null = null;\n return Object.defineProperty({}, \"current\", {\n enumerable: true,\n get: () => current,\n set: (next: GridApi<TData> | null) => {\n if (next === current) return;\n current = next;\n setApi(next);\n }\n }) as MutableRefObject<GridApi<TData> | null>;\n }, []);\n\n return { apiRef, api };\n}\n","import { createElement, isValidElement, type ComponentType, type ReactNode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { CellRendererParams, CellRendererFn, DetailRowRendererParams, GridApi, RowNode } from \"@agile-team/mach-table\";\n\nexport interface ReactCellRendererProps<TData = any, TValue = any> extends CellRendererParams<TData, TValue> {\n children?: ReactNode;\n}\n\nexport interface ReactDetailProps<TData = any> {\n data: TData | null;\n node: RowNode<TData>;\n api: GridApi<TData>;\n}\n\nexport function reactCellRenderer<TData = any, TValue = any>(\n Component: ComponentType<ReactCellRendererProps<TData, TValue>>\n): CellRendererFn {\n return (params) => {\n const host = document.createElement(\"div\");\n host.className = \"mach-cell-react\";\n host.style.width = \"100%\";\n const root = createRoot(host);\n root.render(createElement(Component, params as ReactCellRendererProps<TData, TValue>));\n let destroyed = false;\n return {\n el: host,\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n window.setTimeout(() => {\n root.unmount();\n }, 0);\n }\n };\n };\n}\n\nexport function reactDetailRenderer<TData = any>(\n Component: ComponentType<ReactDetailProps<TData>>\n): (params: DetailRowRendererParams<TData>) => { el: HTMLElement; destroy?: () => void } {\n return (params) => {\n const host = document.createElement(\"div\");\n host.style.height = \"100%\";\n const root = createRoot(host);\n root.render(createElement(Component, params));\n let destroyed = false;\n return {\n el: host,\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n window.setTimeout(() => {\n root.unmount();\n }, 0);\n }\n };\n };\n}\n\nexport function isReactElement(value: unknown): boolean {\n return isValidElement(value);\n}\n","import { RobotGrid } from \"./RobotGrid\";\n\nexport { RobotGrid };\nexport { RobotGrid as MachTable };\nexport type { RobotGridReactProps } from \"./RobotGrid\";\nexport { useMachGrid } from \"./useMachGrid\";\nexport type { UseMachGridReturn } from \"./useMachGrid\";\nexport { reactCellRenderer, reactDetailRenderer } from \"./adapters\";\nexport type { ReactCellRendererProps, ReactDetailProps } from \"./adapters\";\nexport * from \"@agile-team/mach-table\";\n\n/** Enables `React.lazy(() => import(\"@agile-team/mach-table-react\"))`. */\nexport default RobotGrid;\n"],"mappings":"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","names":["createElement"]}
1
+ {"version":3,"sources":["../src/MachTable.tsx","../src/defaults.tsx","../src/MachTableToolbar.tsx","../src/adapters.ts","../src/index.ts"],"sourcesContent":["import {\n createElement,\n useEffect,\n useRef,\n type CSSProperties,\n type MutableRefObject\n} from \"react\";\nimport { createGrid, GRID_OPTION_KEYS, EVENT_TYPES, resolveMachTableGridOptions } from \"@agile-team/mach-table\";\nimport type { GridApi, GridOptions, MachTablePresetSelection } from \"@agile-team/mach-table\";\nimport { useMachTableConfig } from \"./defaults\";\n\ntype AdapterOnlyGridOption = \"className\" | \"ariaLabel\" | \"ariaLabelledBy\" | \"ariaDescribedBy\";\n\nexport type MachTableReactProps<TData = any> = Omit<GridOptions<TData>, AdapterOnlyGridOption> & {\n /** Named application preset(s). Explicit component props still win. */\n preset?: MachTablePresetSelection;\n /** CSS class applied to the React host element. */\n className?: string;\n /** CSS class forwarded to MachTable's inner grid root. */\n gridClassName?: string;\n gridAriaLabel?: string;\n gridAriaLabelledBy?: string;\n gridAriaDescribedBy?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n style?: CSSProperties;\n apiRef?: MutableRefObject<GridApi<TData> | null>;\n};\n\nfunction collectGridOptions<TData>(\n props: MachTableReactProps<TData>,\n config: ReturnType<typeof useMachTableConfig>\n): GridOptions<TData> {\n const explicit: Record<string, unknown> = {};\n for (const key of GRID_OPTION_KEYS) {\n if (key === \"className\") continue;\n const value = key === \"ariaLabel\"\n ? props.gridAriaLabel\n : key === \"ariaLabelledBy\"\n ? props.gridAriaLabelledBy\n : key === \"ariaDescribedBy\"\n ? props.gridAriaDescribedBy\n : props[key];\n if (value !== undefined) explicit[key] = value;\n }\n if (props.gridClassName !== undefined) explicit.className = props.gridClassName;\n return resolveMachTableGridOptions(config, props.preset, explicit as Partial<GridOptions<TData>>).options;\n}\n\nexport function MachTable<TData = any>(props: MachTableReactProps<TData>) {\n const { className, style, apiRef } = props;\n const hostRef = useRef<HTMLDivElement | null>(null);\n const gridApiRef = useRef<GridApi<TData> | null>(null);\n const propsRef = useRef(props);\n propsRef.current = props;\n const config = useMachTableConfig();\n const effectiveInputs = [\n config,\n props.preset,\n ...GRID_OPTION_KEYS.map((key) => key === \"className\"\n ? props.gridClassName\n : key === \"ariaLabel\"\n ? props.gridAriaLabel\n : key === \"ariaLabelledBy\"\n ? props.gridAriaLabelledBy\n : key === \"ariaDescribedBy\"\n ? props.gridAriaDescribedBy\n : props[key])\n ];\n const effectiveCache = useRef<{ inputs: readonly unknown[]; options: GridOptions<TData> } | null>(null);\n if (\n !effectiveCache.current ||\n effectiveCache.current.inputs.length !== effectiveInputs.length ||\n effectiveInputs.some((value, index) => !Object.is(value, effectiveCache.current?.inputs[index]))\n ) {\n effectiveCache.current = { inputs: effectiveInputs, options: collectGridOptions(props, config) };\n }\n const effectiveOptions = effectiveCache.current.options;\n const effectiveRef = useRef(effectiveOptions);\n effectiveRef.current = effectiveOptions;\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n const options = { ...effectiveRef.current } as Record<string, unknown>;\n for (const eventType of EVENT_TYPES) {\n const handlerKey = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}`;\n options[handlerKey] = (event: unknown) => {\n const defaultHandler = (effectiveRef.current as Record<string, unknown>)[handlerKey];\n if (typeof defaultHandler === \"function\") (defaultHandler as (value: unknown) => void)(event);\n const latest = propsRef.current as Record<string, unknown>;\n const handler = latest[handlerKey];\n if (typeof handler === \"function\" && handler !== defaultHandler) {\n (handler as (value: unknown) => void)(event);\n }\n };\n }\n\n const api = createGrid<TData>(host, options);\n gridApiRef.current = api;\n return () => {\n api.destroy();\n gridApiRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!apiRef) return;\n const assigned = gridApiRef.current;\n apiRef.current = assigned;\n return () => {\n if (apiRef.current === assigned) apiRef.current = null;\n };\n }, [apiRef]);\n\n const optionValues = GRID_OPTION_KEYS.map((key) => effectiveOptions[key]);\n const previousOptionValues = useRef<readonly unknown[] | null>(null);\n useEffect(() => {\n const previous = previousOptionValues.current;\n previousOptionValues.current = optionValues;\n if (!previous) {\n return;\n }\n const changed: Record<string, unknown> = {};\n optionValues.forEach((value, index) => {\n if (Object.is(value, previous[index])) return;\n changed[GRID_OPTION_KEYS[index]] = value;\n });\n if (Object.keys(changed).length > 0) {\n gridApiRef.current?.updateOptions(changed);\n }\n }, optionValues);\n\n return createElement(\"div\", {\n ref: hostRef,\n className: `mach-react-host ${className ?? \"\"}`.trim() || undefined,\n style,\n \"aria-label\": props[\"aria-label\"],\n \"aria-labelledby\": props[\"aria-labelledby\"],\n \"aria-describedby\": props[\"aria-describedby\"]\n });\n}\n\n/** @deprecated Use MachTable. Kept as a source-compatible alias through 0.x. */\nexport const RobotGrid = MachTable;\n/** @deprecated Use MachTableReactProps. */\nexport type RobotGridReactProps<TData = any> = MachTableReactProps<TData>;\n","import { createContext, createElement, useContext, useMemo, type ReactNode } from \"react\";\nimport {\n mergeMachTableConfig,\n normalizeMachTableConfig,\n type GridOptions,\n type MachTableRuntimeConfig,\n type ResolvedMachTableConfig\n} from \"@agile-team/mach-table\";\n\nconst ROOT_CONFIG = normalizeMachTableConfig();\nconst MachTableConfigContext = createContext<ResolvedMachTableConfig>(ROOT_CONFIG);\n\nexport interface MachTableProviderProps<TData = any> {\n /** Full app/route configuration. Prefer importing this from mach-table.config.ts. */\n config?: MachTableRuntimeConfig;\n /** Backwards-compatible shorthand for config.defaults. */\n defaults?: Partial<GridOptions<TData>>;\n children?: ReactNode;\n}\n\n/** Supplies app-, route- or layout-scoped defaults without making tables eager. */\nexport function MachTableProvider<TData = any>({ config, defaults, children }: MachTableProviderProps<TData>) {\n const parent = useContext(MachTableConfigContext);\n const value = useMemo(\n () => mergeMachTableConfig(parent, { ...(config ?? {}), ...(defaults ? { defaults } : {}) }),\n [parent, config, defaults]\n );\n return createElement(MachTableConfigContext.Provider, { value }, children);\n}\n\nexport function useMachTableDefaults<TData = any>(): Partial<GridOptions<TData>> {\n return useContext(MachTableConfigContext).defaults as Partial<GridOptions<TData>>;\n}\n\nexport function useMachTableConfig(): ResolvedMachTableConfig {\n return useContext(MachTableConfigContext);\n}\n","import { createElement, type ChangeEvent, type MouseEvent as ReactMouseEvent, type ReactNode } from \"react\";\nimport type { GridApi, GridSize, MachTableCommands } from \"@agile-team/mach-table\";\n\nexport interface MachTableToolbarFeatures {\n search?: boolean;\n refresh?: boolean;\n columns?: boolean;\n density?: boolean;\n export?: boolean;\n undoRedo?: boolean;\n fullscreen?: boolean;\n}\n\nexport interface MachTableToolbarProps<TData = any> {\n api?: GridApi<TData> | null;\n commands?: MachTableCommands | null;\n search?: string;\n onSearchChange?(value: string): void;\n onRefresh?(): void;\n onClearSelection?(): void;\n loading?: boolean;\n selectedCount?: number;\n searchPlaceholder?: string;\n exportFilename?: string;\n features?: MachTableToolbarFeatures;\n start?: ReactNode;\n children?: ReactNode;\n end?: ReactNode;\n}\n\nconst DEFAULT_FEATURES: Required<MachTableToolbarFeatures> = {\n search: true, refresh: true, columns: true, density: true,\n export: true, undoRedo: false, fullscreen: false\n};\n\nfunction enabled(features: MachTableToolbarFeatures | undefined, key: keyof MachTableToolbarFeatures): boolean {\n return features?.[key] ?? DEFAULT_FEATURES[key];\n}\n\nfunction button(label: string, icon: string, onClick: (event: ReactMouseEvent<HTMLButtonElement>) => void, disabled = false) {\n return createElement(\"button\", {\n key: label, type: \"button\", className: \"mach-toolbar__button\", title: label, \"aria-label\": label, disabled, onClick\n }, icon);\n}\n\nfunction renderMain<TData>(props: MachTableToolbarProps<TData>): ReactNode[] {\n const main: ReactNode[] = [props.start];\n const placeholder = props.searchPlaceholder ?? \"搜索当前结果\";\n if (enabled(props.features, \"search\")) main.push(createElement(\"label\", { className: \"mach-toolbar__search\", key: \"search\" },\n createElement(\"span\", { className: \"mach-sr-only\" }, placeholder),\n createElement(\"span\", { \"aria-hidden\": true }, \"⌕\"),\n createElement(\"input\", {\n type: \"search\",\n value: props.search ?? \"\",\n placeholder,\n onChange: (event: ChangeEvent<HTMLInputElement>) => {\n const value = event.currentTarget.value;\n props.onSearchChange?.(value);\n if (!props.onSearchChange) {\n if (props.commands) props.commands.search(value || null);\n else props.api?.setQuickFilter(value || null);\n }\n }\n })\n ));\n if (enabled(props.features, \"refresh\")) main.push(button(\"刷新\", props.loading ? \"…\" : \"↻\", () => {\n props.onRefresh?.();\n if (!props.onRefresh) {\n if (props.commands) void props.commands.refresh();\n else if (props.api?.isInfinite()) void props.api.reload();\n else props.api?.refreshCells();\n }\n }, props.loading));\n if (enabled(props.features, \"columns\")) main.push(button(\"列设置\", \"☷\", (event) => {\n if (props.commands) props.commands.openColumns(event.currentTarget);\n else props.api?.openColumnWorkbench(event.currentTarget);\n }));\n if (enabled(props.features, \"density\")) main.push(createElement(\"select\", {\n key: \"density\",\n className: \"mach-toolbar__select\",\n value: props.api?.getGridOption(\"size\") ?? \"normal\",\n \"aria-label\": \"表格密度\",\n onChange: (event: ChangeEvent<HTMLSelectElement>) => {\n const size = event.currentTarget.value as GridSize;\n if (props.commands) props.commands.setDensity(size);\n else props.api?.setGridOption(\"size\", size);\n }\n }, createElement(\"option\", { value: \"compact\" }, \"紧凑\"), createElement(\"option\", { value: \"normal\" }, \"标准\"), createElement(\"option\", { value: \"large\" }, \"宽松\")));\n main.push(props.children);\n return main;\n}\n\nfunction runUndo<TData>(props: MachTableToolbarProps<TData>): void {\n if (props.commands) props.commands.undo();\n else props.api?.undo();\n}\n\nfunction runRedo<TData>(props: MachTableToolbarProps<TData>): void {\n if (props.commands) props.commands.redo();\n else props.api?.redo();\n}\n\nfunction renderAside<TData>(props: MachTableToolbarProps<TData>): ReactNode[] {\n const aside: ReactNode[] = [];\n if ((props.selectedCount ?? 0) > 0) aside.push(createElement(\"button\", {\n type: \"button\", className: \"mach-toolbar__selection\", onClick: () => props.onClearSelection?.()\n }, `已选 ${props.selectedCount} 项 ×`));\n if (enabled(props.features, \"undoRedo\")) {\n aside.push(button(\"撤销\", \"↶\", () => runUndo(props), props.commands ? !props.commands.canUndo() : !props.api?.canUndo()));\n aside.push(button(\"重做\", \"↷\", () => runRedo(props), props.commands ? !props.commands.canRedo() : !props.api?.canRedo()));\n }\n if (enabled(props.features, \"export\")) aside.push(button(\"导出 CSV\", \"⇩\", () => { props.commands?.exportCsv(props.exportFilename); }, !props.commands));\n if (enabled(props.features, \"fullscreen\")) aside.push(button(\"全屏\", \"⛶\", () => { void props.commands?.toggleFullscreen(); }, !props.commands));\n aside.push(props.end);\n return aside;\n}\n\nexport function MachTableToolbar<TData = any>(props: MachTableToolbarProps<TData>) {\n return createElement(\"div\", { className: \"mach-toolbar\", role: \"toolbar\", \"aria-label\": \"表格工具栏\" },\n createElement(\"div\", { className: \"mach-toolbar__main\" }, ...renderMain(props)),\n createElement(\"div\", { className: \"mach-toolbar__aside\" }, ...renderAside(props))\n );\n}\n","import { createElement, isValidElement, type ComponentType, type ReactNode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { CellRendererParams, CellRendererFn, DetailRowRendererParams, GridApi, RowNode } from \"@agile-team/mach-table\";\n\nexport interface ReactCellRendererProps<TData = any, TValue = any> extends CellRendererParams<TData, TValue> {\n children?: ReactNode;\n}\n\nexport interface ReactDetailProps<TData = any> {\n data: TData | null;\n node: RowNode<TData>;\n api: GridApi<TData>;\n}\n\nexport function reactCellRenderer<TData = any, TValue = any>(\n Component: ComponentType<ReactCellRendererProps<TData, TValue>>\n): CellRendererFn {\n return (params) => {\n const host = document.createElement(\"div\");\n host.className = \"mach-cell-react\";\n host.style.width = \"100%\";\n const root = createRoot(host);\n root.render(createElement(Component, params as ReactCellRendererProps<TData, TValue>));\n let destroyed = false;\n return {\n el: host,\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n window.setTimeout(() => {\n root.unmount();\n }, 0);\n }\n };\n };\n}\n\nexport function reactDetailRenderer<TData = any>(\n Component: ComponentType<ReactDetailProps<TData>>\n): (params: DetailRowRendererParams<TData>) => { el: HTMLElement; destroy?: () => void } {\n return (params) => {\n const host = document.createElement(\"div\");\n host.style.height = \"100%\";\n const root = createRoot(host);\n root.render(createElement(Component, params));\n let destroyed = false;\n return {\n el: host,\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n window.setTimeout(() => {\n root.unmount();\n }, 0);\n }\n };\n };\n}\n\nexport function isReactElement(value: unknown): boolean {\n return isValidElement(value);\n}\n","import { MachTable, RobotGrid } from \"./MachTable\";\n\nexport { MachTable, RobotGrid };\nexport type { MachTableReactProps, RobotGridReactProps } from \"./MachTable\";\nexport { useMachGrid } from \"./useMachGrid\";\nexport type { UseMachGridReturn } from \"./useMachGrid\";\nexport { useMachTableEditing } from \"./useMachTableEditing\";\nexport type { UseMachTableEditingOptions, UseMachTableEditingReturn } from \"./useMachTableEditing\";\nexport { useMachTableQuery } from \"./useMachTableQuery\";\nexport type {\n MachTablePageRequest,\n MachTablePageResult,\n MachTableQuerySource,\n MachTableRemoteSelectionState,\n UseMachTableQueryOptions,\n UseMachTableQueryReturn\n} from \"./useMachTableQuery\";\nexport { useMachTableController } from \"./useMachTableController\";\nexport type { UseMachTableControllerOptions, UseMachTableControllerReturn } from \"./useMachTableController\";\nexport { MachTableToolbar } from \"./MachTableToolbar\";\nexport type { MachTableToolbarFeatures, MachTableToolbarProps } from \"./MachTableToolbar\";\nexport { MachTableProvider, useMachTableConfig, useMachTableDefaults } from \"./defaults\";\nexport type { MachTableProviderProps } from \"./defaults\";\nexport { reactCellRenderer, reactDetailRenderer } from \"./adapters\";\nexport type { ReactCellRendererProps, ReactDetailProps } from \"./adapters\";\nexport * from \"@agile-team/mach-table\";\n\n/** Enables `React.lazy(() => import(\"@agile-team/mach-table-react\"))`. */\nexport default MachTable;\n"],"mappings":"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","names":["createElement","useEffect","useRef","createGrid","GRID_OPTION_KEYS","EVENT_TYPES","resolveMachTableGridOptions","createContext","createElement","useContext","useMemo","mergeMachTableConfig","normalizeMachTableConfig","ROOT_CONFIG","MachTableConfigContext","MachTableProvider","config","defaults","children","parent","value","useMachTableDefaults","useMachTableConfig","collectGridOptions","props","config","explicit","key","GRID_OPTION_KEYS","value","resolveMachTableGridOptions","MachTable","className","style","apiRef","hostRef","useRef","gridApiRef","propsRef","useMachTableConfig","effectiveInputs","effectiveCache","index","effectiveOptions","effectiveRef","useEffect","host","options","eventType","EVENT_TYPES","handlerKey","event","defaultHandler","handler","api","createGrid","assigned","optionValues","previousOptionValues","previous","changed","createElement","RobotGrid","createElement","DEFAULT_FEATURES","enabled","features","key","button","label","icon","onClick","disabled","renderMain","props","main","placeholder","event","value","size","runUndo","runRedo","renderAside","aside","MachTableToolbar","createElement","isValidElement","createRoot","reactCellRenderer","Component","params","host","root","destroyed","reactDetailRenderer","src_default","MachTable"]}
@@ -67,6 +67,113 @@
67
67
  font-variant-numeric: tabular-nums;
68
68
  }
69
69
 
70
+ .mach-root.mach-dom-layout--auto-height {
71
+ height: auto;
72
+ min-height: 0;
73
+ }
74
+
75
+ .mach-root.mach-dom-layout--auto-height .mach-body {
76
+ flex: none;
77
+ }
78
+
79
+ .mach-root.mach-dom-layout--auto-height .mach-body-viewport--scroll {
80
+ overflow-y: hidden;
81
+ }
82
+
83
+ .mach-toolbar {
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: space-between;
87
+ gap: 10px;
88
+ min-height: 44px;
89
+ padding: 6px 8px;
90
+ font: 13px/1.4 var(--mach-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);
91
+ color: var(--mach-body-fg, #26303f);
92
+ background: var(--mach-body-bg, #fff);
93
+ border: 1px solid var(--mach-border-color, #e6eaf0);
94
+ border-bottom: 0;
95
+ border-radius: var(--mach-radius-lg, 8px) var(--mach-radius-lg, 8px) 0 0;
96
+ }
97
+
98
+ .mach-toolbar__main,
99
+ .mach-toolbar__aside {
100
+ display: flex;
101
+ align-items: center;
102
+ gap: 6px;
103
+ min-width: 0;
104
+ }
105
+
106
+ .mach-toolbar__search {
107
+ display: flex;
108
+ align-items: center;
109
+ gap: 6px;
110
+ width: min(240px, 32vw);
111
+ height: 32px;
112
+ padding: 0 9px;
113
+ color: #64748b;
114
+ background: var(--mach-header-bg, #fafbfd);
115
+ border: 1px solid var(--mach-border-color, #e6eaf0);
116
+ border-radius: 6px;
117
+ transition: border-color var(--mach-transition, .15s ease), box-shadow var(--mach-transition, .15s ease);
118
+ }
119
+
120
+ .mach-toolbar__search:focus-within {
121
+ border-color: var(--mach-primary, #2563eb);
122
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--mach-primary, #2563eb) 12%, transparent);
123
+ }
124
+
125
+ .mach-toolbar__search input {
126
+ min-width: 0;
127
+ width: 100%;
128
+ color: inherit;
129
+ background: transparent;
130
+ border: 0;
131
+ outline: 0;
132
+ }
133
+
134
+ .mach-toolbar__button,
135
+ .mach-toolbar__select,
136
+ .mach-toolbar__selection {
137
+ height: 32px;
138
+ padding: 0 10px;
139
+ color: inherit;
140
+ background: var(--mach-body-bg, #fff);
141
+ border: 1px solid var(--mach-border-color, #e6eaf0);
142
+ border-radius: 6px;
143
+ cursor: pointer;
144
+ transition: color var(--mach-transition, .15s ease), border-color var(--mach-transition, .15s ease), background var(--mach-transition, .15s ease);
145
+ }
146
+
147
+ .mach-toolbar__button {
148
+ min-width: 32px;
149
+ padding: 0 8px;
150
+ font-size: 16px;
151
+ }
152
+
153
+ .mach-toolbar__button:hover:not(:disabled),
154
+ .mach-toolbar__select:hover {
155
+ color: var(--mach-primary, #2563eb);
156
+ border-color: var(--mach-primary, #2563eb);
157
+ }
158
+
159
+ .mach-toolbar__button:disabled {
160
+ cursor: not-allowed;
161
+ opacity: .45;
162
+ }
163
+
164
+ .mach-toolbar__selection {
165
+ color: var(--mach-primary, #2563eb);
166
+ background: var(--mach-primary-weak, #dbeafe);
167
+ border-color: transparent;
168
+ font-size: 12px;
169
+ }
170
+
171
+ @media (max-width: 640px) {
172
+ .mach-toolbar { align-items: stretch; flex-direction: column; }
173
+ .mach-toolbar__main, .mach-toolbar__aside { flex-wrap: wrap; }
174
+ .mach-toolbar__search { flex: 1; width: auto; }
175
+ }
176
+
70
177
  .mach-size--compact {
71
178
  --mach-font-size: 12px;
72
179
  --mach-cell-padding: 6px;
@@ -531,6 +638,23 @@ input.mach-select-all {
531
638
  transform: rotate(90deg);
532
639
  }
533
640
 
641
+ .mach-detail-toggle--loading {
642
+ animation: mach-tree-spin 0.8s linear infinite;
643
+ color: var(--mach-primary);
644
+ }
645
+
646
+ .mach-detail-toggle--error {
647
+ color: #dc2626;
648
+ }
649
+
650
+ @keyframes mach-tree-spin {
651
+ to { transform: rotate(360deg); }
652
+ }
653
+
654
+ @media (prefers-reduced-motion: reduce) {
655
+ .mach-detail-toggle--loading { animation: none; }
656
+ }
657
+
534
658
  .mach-cell--group {
535
659
  cursor: pointer;
536
660
  background: var(--mach-header-bg);
@@ -637,6 +761,11 @@ input.mach-select-all {
637
761
  box-shadow: 0 0 0 1px rgba(239, 68, 68, 0.35);
638
762
  }
639
763
 
764
+ .mach-editor-validating {
765
+ cursor: progress;
766
+ opacity: 0.72;
767
+ }
768
+
640
769
  .mach-footer {
641
770
  display: flex;
642
771
  flex-shrink: 0;
@@ -1025,11 +1154,33 @@ input.mach-select-all {
1025
1154
  }
1026
1155
 
1027
1156
  .mach-column-panel {
1028
- min-width: 200px;
1157
+ min-width: 220px;
1029
1158
  max-height: 70vh;
1030
1159
  overflow: auto;
1031
1160
  }
1032
1161
 
1162
+ .mach-column-panel[role="dialog"] {
1163
+ width: min(440px, calc(100vw - 16px));
1164
+ }
1165
+
1166
+ .mach-column-workbench-search {
1167
+ box-sizing: border-box;
1168
+ width: 100%;
1169
+ height: 30px;
1170
+ padding: 0 9px;
1171
+ border: 1px solid var(--mach-border-color);
1172
+ border-radius: var(--mach-radius);
1173
+ background: var(--mach-body-bg);
1174
+ color: var(--mach-body-fg);
1175
+ font: inherit;
1176
+ outline: none;
1177
+ }
1178
+
1179
+ .mach-column-workbench-search:focus {
1180
+ border-color: var(--mach-primary);
1181
+ box-shadow: 0 0 0 2px var(--mach-primary-weak);
1182
+ }
1183
+
1033
1184
  .mach-column-panel-title {
1034
1185
  font-weight: 600;
1035
1186
  color: var(--mach-header-fg);
@@ -1076,7 +1227,7 @@ input.mach-select-all {
1076
1227
  }
1077
1228
 
1078
1229
  .mach-column-panel-list {
1079
- max-height: 180px;
1230
+ max-height: 280px;
1080
1231
  overflow: auto;
1081
1232
  display: flex;
1082
1233
  flex-direction: column;
@@ -1086,6 +1237,54 @@ input.mach-select-all {
1086
1237
  padding: 4px;
1087
1238
  }
1088
1239
 
1240
+ .mach-column-workbench-item {
1241
+ display: grid;
1242
+ grid-template-columns: minmax(120px, 1fr) 108px 26px 26px;
1243
+ align-items: center;
1244
+ gap: 4px;
1245
+ min-height: 32px;
1246
+ padding: 2px 3px;
1247
+ border-radius: var(--mach-radius);
1248
+ }
1249
+
1250
+ .mach-column-workbench-item:hover {
1251
+ background: var(--mach-row-hover-bg);
1252
+ }
1253
+
1254
+ .mach-column-workbench-label {
1255
+ display: flex;
1256
+ min-width: 0;
1257
+ align-items: center;
1258
+ gap: 7px;
1259
+ cursor: pointer;
1260
+ }
1261
+
1262
+ .mach-column-workbench-name {
1263
+ overflow: hidden;
1264
+ text-overflow: ellipsis;
1265
+ white-space: nowrap;
1266
+ }
1267
+
1268
+ .mach-column-workbench-pin,
1269
+ .mach-column-workbench-move {
1270
+ height: 26px;
1271
+ border: 1px solid var(--mach-border-color);
1272
+ border-radius: var(--mach-radius);
1273
+ background: var(--mach-body-bg);
1274
+ color: inherit;
1275
+ font: inherit;
1276
+ }
1277
+
1278
+ .mach-column-workbench-move {
1279
+ padding: 0;
1280
+ cursor: pointer;
1281
+ }
1282
+
1283
+ .mach-column-workbench-move:disabled {
1284
+ cursor: not-allowed;
1285
+ opacity: 0.35;
1286
+ }
1287
+
1089
1288
  .mach-tag {
1090
1289
  display: inline-flex;
1091
1290
  align-items: center;
@@ -1177,6 +1376,18 @@ input.mach-select-all {
1177
1376
  gap: 2px;
1178
1377
  }
1179
1378
 
1379
+ .mach-sr-only {
1380
+ position: absolute !important;
1381
+ width: 1px !important;
1382
+ height: 1px !important;
1383
+ padding: 0 !important;
1384
+ margin: -1px !important;
1385
+ overflow: hidden !important;
1386
+ clip: rect(0, 0, 0, 0) !important;
1387
+ white-space: nowrap !important;
1388
+ border: 0 !important;
1389
+ }
1390
+
1180
1391
  .mach-action-btn {
1181
1392
  display: inline-flex;
1182
1393
  align-items: center;
@@ -1203,6 +1414,50 @@ input.mach-select-all {
1203
1414
  color: var(--mach-danger);
1204
1415
  }
1205
1416
 
1417
+ .mach-action-btn--primary {
1418
+ color: var(--mach-primary);
1419
+ }
1420
+
1421
+ .mach-action-btn--warning {
1422
+ color: var(--mach-warning);
1423
+ }
1424
+
1425
+ .mach-action-btn--success,
1426
+ .mach-edit-control--confirm {
1427
+ color: var(--mach-success);
1428
+ }
1429
+
1430
+ .mach-action-btn--danger {
1431
+ color: var(--mach-danger);
1432
+ }
1433
+
1434
+ .mach-action-btn:focus-visible,
1435
+ .mach-edit-control:focus-visible,
1436
+ .mach-cell-edit-trigger:focus-visible,
1437
+ .mach-action-drawer__close:focus-visible {
1438
+ outline: 2px solid color-mix(in srgb, var(--mach-primary) 65%, transparent);
1439
+ outline-offset: 1px;
1440
+ }
1441
+
1442
+ .mach-action-btn:disabled {
1443
+ cursor: not-allowed;
1444
+ opacity: 0.4;
1445
+ }
1446
+
1447
+ .mach-action-btn--loading svg {
1448
+ animation: mach-spin 0.8s linear infinite;
1449
+ }
1450
+
1451
+ .mach-dictionary-value--loading {
1452
+ color: var(--mach-header-fg);
1453
+ opacity: 0.72;
1454
+ }
1455
+
1456
+ .mach-dictionary-value--error {
1457
+ text-decoration: underline dotted;
1458
+ text-underline-offset: 3px;
1459
+ }
1460
+
1206
1461
  .mach-action-btn--icon {
1207
1462
  padding: 0;
1208
1463
  width: 24px;
@@ -1210,7 +1465,262 @@ input.mach-select-all {
1210
1465
 
1211
1466
  .mach-context-menu-item--danger {
1212
1467
  color: var(--mach-danger);
1213
- }
1468
+ }
1469
+
1470
+ .mach-context-menu-item,
1471
+ .mach-action-drawer__item {
1472
+ display: flex;
1473
+ align-items: center;
1474
+ gap: 9px;
1475
+ }
1476
+
1477
+ .mach-context-menu-item--primary,
1478
+ .mach-action-drawer__item--primary {
1479
+ color: var(--mach-primary);
1480
+ }
1481
+
1482
+ .mach-context-menu-item--warning,
1483
+ .mach-action-drawer__item--warning {
1484
+ color: var(--mach-warning);
1485
+ }
1486
+
1487
+ .mach-context-menu-item--success,
1488
+ .mach-action-drawer__item--success {
1489
+ color: var(--mach-success);
1490
+ }
1491
+
1492
+ .mach-context-menu-item--danger,
1493
+ .mach-action-drawer__item--danger {
1494
+ color: var(--mach-danger);
1495
+ }
1496
+
1497
+ .mach-action-drawer-backdrop {
1498
+ position: fixed;
1499
+ inset: 0;
1500
+ z-index: calc(var(--mach-z-menu) + 2);
1501
+ background: rgba(15, 23, 42, 0.2);
1502
+ backdrop-filter: blur(1px);
1503
+ }
1504
+
1505
+ .mach-action-drawer {
1506
+ position: absolute;
1507
+ top: 0;
1508
+ right: 0;
1509
+ display: flex;
1510
+ flex-direction: column;
1511
+ width: min(340px, calc(100vw - 24px));
1512
+ height: 100%;
1513
+ background: var(--mach-body-bg);
1514
+ color: var(--mach-body-fg);
1515
+ border-left: 1px solid var(--mach-border-color);
1516
+ box-shadow: -16px 0 40px rgba(15, 23, 42, 0.14);
1517
+ font-family: var(--mach-font-family);
1518
+ animation: mach-drawer-in 0.18s ease-out;
1519
+ }
1520
+
1521
+ .mach-action-drawer__header {
1522
+ display: flex;
1523
+ align-items: center;
1524
+ justify-content: space-between;
1525
+ min-height: 56px;
1526
+ padding: 0 16px 0 20px;
1527
+ border-bottom: 1px solid var(--mach-border-color);
1528
+ }
1529
+
1530
+ .mach-action-drawer__close {
1531
+ display: inline-flex;
1532
+ align-items: center;
1533
+ justify-content: center;
1534
+ width: 30px;
1535
+ height: 30px;
1536
+ padding: 0;
1537
+ border: 0;
1538
+ border-radius: var(--mach-radius);
1539
+ background: transparent;
1540
+ color: var(--mach-header-fg);
1541
+ cursor: pointer;
1542
+ }
1543
+
1544
+ .mach-action-drawer__close:hover {
1545
+ color: var(--mach-primary);
1546
+ background: var(--mach-row-hover-bg);
1547
+ }
1548
+
1549
+ .mach-action-drawer__body {
1550
+ display: flex;
1551
+ flex-direction: column;
1552
+ gap: 4px;
1553
+ padding: 12px;
1554
+ overflow: auto;
1555
+ }
1556
+
1557
+ .mach-action-drawer__item {
1558
+ width: 100%;
1559
+ min-height: 40px;
1560
+ padding: 0 12px;
1561
+ border: 0;
1562
+ border-radius: var(--mach-radius);
1563
+ background: transparent;
1564
+ font: inherit;
1565
+ text-align: left;
1566
+ cursor: pointer;
1567
+ }
1568
+
1569
+ .mach-action-drawer__item:hover:not(:disabled) {
1570
+ background: var(--mach-row-hover-bg);
1571
+ }
1572
+
1573
+ .mach-action-drawer__item:disabled {
1574
+ opacity: 0.4;
1575
+ cursor: not-allowed;
1576
+ }
1577
+
1578
+ @keyframes mach-drawer-in {
1579
+ from { transform: translateX(18px); opacity: 0; }
1580
+ to { transform: translateX(0); opacity: 1; }
1581
+ }
1582
+
1583
+ @media (max-width: 640px) {
1584
+ .mach-action-drawer {
1585
+ top: auto;
1586
+ bottom: 0;
1587
+ width: 100%;
1588
+ height: auto;
1589
+ max-height: min(70vh, 520px);
1590
+ border-top: 1px solid var(--mach-border-color);
1591
+ border-left: 0;
1592
+ border-radius: var(--mach-radius-lg) var(--mach-radius-lg) 0 0;
1593
+ animation-name: mach-drawer-up;
1594
+ }
1595
+ }
1596
+
1597
+ @keyframes mach-drawer-up {
1598
+ from { transform: translateY(18px); opacity: 0; }
1599
+ to { transform: translateY(0); opacity: 1; }
1600
+ }
1601
+
1602
+ .mach-cell:has(.mach-cell-edit-trigger) {
1603
+ padding-right: 29px;
1604
+ }
1605
+
1606
+ .mach-cell-edit-trigger {
1607
+ position: absolute;
1608
+ right: 5px;
1609
+ top: 50%;
1610
+ display: inline-flex;
1611
+ align-items: center;
1612
+ justify-content: center;
1613
+ width: 20px;
1614
+ height: 20px;
1615
+ padding: 0;
1616
+ transform: translateY(-50%);
1617
+ border: 0;
1618
+ border-radius: var(--mach-radius-sm);
1619
+ background: transparent;
1620
+ color: var(--mach-header-fg);
1621
+ cursor: pointer;
1622
+ opacity: 0;
1623
+ transition: opacity var(--mach-transition), color var(--mach-transition), background-color var(--mach-transition);
1624
+ }
1625
+
1626
+ .mach-cell-edit-trigger svg {
1627
+ width: 13px;
1628
+ height: 13px;
1629
+ }
1630
+
1631
+ .mach-cell:hover .mach-cell-edit-trigger--hover,
1632
+ .mach-cell:focus-within .mach-cell-edit-trigger--hover,
1633
+ .mach-cell-edit-trigger--always {
1634
+ opacity: 0.72;
1635
+ }
1636
+
1637
+ .mach-cell-edit-trigger:hover {
1638
+ opacity: 1;
1639
+ color: var(--mach-primary);
1640
+ background: color-mix(in srgb, var(--mach-primary) 9%, transparent);
1641
+ }
1642
+
1643
+ .mach-cell--editing {
1644
+ overflow: visible;
1645
+ z-index: 4;
1646
+ }
1647
+
1648
+ .mach-cell-editor-shell,
1649
+ .mach-row-editor-shell {
1650
+ display: flex;
1651
+ align-items: center;
1652
+ width: 100%;
1653
+ min-width: 0;
1654
+ gap: 5px;
1655
+ }
1656
+
1657
+ .mach-cell-editor-shell > .mach-editor-input,
1658
+ .mach-cell-editor-shell > .mach-editor-select,
1659
+ .mach-cell-editor-shell > :not(.mach-cell-editor-controls),
1660
+ .mach-row-editor-shell > * {
1661
+ flex: 1 1 auto;
1662
+ min-width: 0;
1663
+ }
1664
+
1665
+ .mach-cell-editor-controls {
1666
+ display: inline-flex;
1667
+ flex: 0 0 auto;
1668
+ align-items: center;
1669
+ padding: 2px;
1670
+ border: 1px solid var(--mach-border-color);
1671
+ border-radius: var(--mach-radius);
1672
+ background: var(--mach-body-bg);
1673
+ box-shadow: var(--mach-shadow-sm);
1674
+ }
1675
+
1676
+ .mach-edit-control {
1677
+ display: inline-flex;
1678
+ align-items: center;
1679
+ justify-content: center;
1680
+ width: 23px;
1681
+ height: 23px;
1682
+ padding: 0;
1683
+ border: 0;
1684
+ border-radius: var(--mach-radius-sm);
1685
+ background: transparent;
1686
+ color: var(--mach-header-fg);
1687
+ cursor: pointer;
1688
+ }
1689
+
1690
+ .mach-edit-control svg {
1691
+ width: 14px;
1692
+ height: 14px;
1693
+ }
1694
+
1695
+ .mach-edit-control--confirm {
1696
+ color: var(--mach-primary);
1697
+ }
1698
+
1699
+ .mach-edit-control:hover {
1700
+ background: var(--mach-row-hover-bg);
1701
+ }
1702
+
1703
+ .mach-edit-control:disabled {
1704
+ opacity: 0.35;
1705
+ cursor: wait;
1706
+ }
1707
+
1708
+ .mach-row--editing,
1709
+ .mach-row--editing .mach-cell {
1710
+ background: color-mix(in srgb, var(--mach-primary) 3%, var(--mach-body-bg));
1711
+ }
1712
+
1713
+ .mach-cell--row-editing .mach-editor-input,
1714
+ .mach-cell--row-editing .mach-editor-select {
1715
+ border-color: color-mix(in srgb, var(--mach-primary) 45%, var(--mach-border-color));
1716
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
1717
+ }
1718
+
1719
+ .mach-cell--row-editing .mach-editor-input:focus,
1720
+ .mach-cell--row-editing .mach-editor-select:focus {
1721
+ border-color: var(--mach-primary);
1722
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--mach-primary) 12%, transparent);
1723
+ }
1214
1724
 
1215
1725
  .mach-tooltip {
1216
1726
  position: fixed;
@@ -1381,4 +1891,8 @@ input.mach-select-all {
1381
1891
  animation-iteration-count: 1 !important;
1382
1892
  transition-duration: 0.01ms !important;
1383
1893
  }
1894
+
1895
+ .mach-action-drawer {
1896
+ animation: none !important;
1897
+ }
1384
1898
  }