react-os-shell 3.14.2 → 3.16.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.
Files changed (52) hide show
  1. package/dist/Browser-AE2WHAYI.js +7 -0
  2. package/dist/{Browser-XFQRBIF2.js.map → Browser-AE2WHAYI.js.map} +1 -1
  3. package/dist/{Calculator-V7OU5TSD.js → Calculator-H4KYTCO5.js} +4 -4
  4. package/dist/{Calculator-V7OU5TSD.js.map → Calculator-H4KYTCO5.js.map} +1 -1
  5. package/dist/{CurrencyConverter-SUSY6HRW.js → CurrencyConverter-P3EJI7TF.js} +4 -4
  6. package/dist/{CurrencyConverter-SUSY6HRW.js.map → CurrencyConverter-P3EJI7TF.js.map} +1 -1
  7. package/dist/{Documents-GEBFR23U.js → Documents-GGHKOFB4.js} +4 -4
  8. package/dist/{Documents-GEBFR23U.js.map → Documents-GGHKOFB4.js.map} +1 -1
  9. package/dist/Files-4CZWNM2F.js +12 -0
  10. package/dist/{Files-PZ3XY3QV.js.map → Files-4CZWNM2F.js.map} +1 -1
  11. package/dist/{Notepad-QLWMRFXJ.js → Notepad-5JWZD3N7.js} +4 -4
  12. package/dist/{Notepad-QLWMRFXJ.js.map → Notepad-5JWZD3N7.js.map} +1 -1
  13. package/dist/{PomodoroTimer-KCKA254T.js → PomodoroTimer-LIY2CGDW.js} +5 -5
  14. package/dist/{PomodoroTimer-KCKA254T.js.map → PomodoroTimer-LIY2CGDW.js.map} +1 -1
  15. package/dist/Preview-HERAKHAA.js +8 -0
  16. package/dist/{Preview-XSENQ2JX.js.map → Preview-HERAKHAA.js.map} +1 -1
  17. package/dist/Spreadsheet-QPR7ILT3.js +7 -0
  18. package/dist/{Spreadsheet-VE2FEXFK.js.map → Spreadsheet-QPR7ILT3.js.map} +1 -1
  19. package/dist/{Stock-YRQMQXTG.js → Stock-JGDOQ5EN.js} +4 -4
  20. package/dist/{Stock-YRQMQXTG.js.map → Stock-JGDOQ5EN.js.map} +1 -1
  21. package/dist/{Weather-RWEAJS36.js → Weather-6TODHHAE.js} +4 -4
  22. package/dist/{Weather-RWEAJS36.js.map → Weather-6TODHHAE.js.map} +1 -1
  23. package/dist/{WorldClock-E6MSOW5A.js → WorldClock-UOIFY5IB.js} +4 -4
  24. package/dist/{WorldClock-E6MSOW5A.js.map → WorldClock-UOIFY5IB.js.map} +1 -1
  25. package/dist/apps/index.js +19 -19
  26. package/dist/{chunk-H564CUGN.js → chunk-2BGWCS3L.js} +3 -3
  27. package/dist/{chunk-H564CUGN.js.map → chunk-2BGWCS3L.js.map} +1 -1
  28. package/dist/{chunk-ZGLERMDX.js → chunk-5Z57WKMX.js} +16 -14
  29. package/dist/chunk-5Z57WKMX.js.map +1 -0
  30. package/dist/{chunk-GYAP4IBA.js → chunk-64CGRR3M.js} +4 -4
  31. package/dist/{chunk-GYAP4IBA.js.map → chunk-64CGRR3M.js.map} +1 -1
  32. package/dist/{chunk-7GSHFSWI.js → chunk-DAODUEDD.js} +4 -4
  33. package/dist/{chunk-7GSHFSWI.js.map → chunk-DAODUEDD.js.map} +1 -1
  34. package/dist/{chunk-7E7UQYFL.js → chunk-DDE3E4KL.js} +4 -4
  35. package/dist/{chunk-7E7UQYFL.js.map → chunk-DDE3E4KL.js.map} +1 -1
  36. package/dist/{chunk-FKZTCOOQ.js → chunk-MMDTMBXD.js} +4 -4
  37. package/dist/{chunk-FKZTCOOQ.js.map → chunk-MMDTMBXD.js.map} +1 -1
  38. package/dist/{chunk-KHKPAF5R.js → chunk-OLOSK32J.js} +3 -3
  39. package/dist/{chunk-KHKPAF5R.js.map → chunk-OLOSK32J.js.map} +1 -1
  40. package/dist/{chunk-6GVIP3TJ.js → chunk-POTG7N3E.js} +4 -4
  41. package/dist/{chunk-6GVIP3TJ.js.map → chunk-POTG7N3E.js.map} +1 -1
  42. package/dist/{chunk-ATLWPGXH.js → chunk-WCFUBMAG.js} +5 -5
  43. package/dist/{chunk-ATLWPGXH.js.map → chunk-WCFUBMAG.js.map} +1 -1
  44. package/dist/index.d.ts +27 -4
  45. package/dist/index.js +143 -56
  46. package/dist/index.js.map +1 -1
  47. package/package.json +1 -1
  48. package/dist/Browser-XFQRBIF2.js +0 -7
  49. package/dist/Files-PZ3XY3QV.js +0 -12
  50. package/dist/Preview-XSENQ2JX.js +0 -8
  51. package/dist/Spreadsheet-VE2FEXFK.js +0 -7
  52. package/dist/chunk-ZGLERMDX.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,22 +1,22 @@
1
- import { subscribePomo, getPomoSnapshot } from './chunk-KHKPAF5R.js';
2
- export { setShellTodoProvider } from './chunk-KHKPAF5R.js';
3
- import { PREVIEW_OPENED_EVENT, publishDesktopFolders, requestFilesTrashView, FolderGlyph, openPreviewFile, requestFilesDesktopFolderView, FileIconTile, hashGradient } from './chunk-GYAP4IBA.js';
4
- export { Breadcrumbs } from './chunk-GYAP4IBA.js';
1
+ import { subscribePomo, getPomoSnapshot } from './chunk-OLOSK32J.js';
2
+ export { setShellTodoProvider } from './chunk-OLOSK32J.js';
3
+ import { PREVIEW_OPENED_EVENT, publishDesktopFolders, requestFilesTrashView, FolderGlyph, openPreviewFile, requestFilesDesktopFolderView, FileIconTile, hashGradient } from './chunk-64CGRR3M.js';
4
+ export { Breadcrumbs } from './chunk-64CGRR3M.js';
5
5
  import { SidebarLayout } from './chunk-YG45DAUT.js';
6
6
  export { SidebarLayout } from './chunk-YG45DAUT.js';
7
7
  import { playNotification, playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, setSoundForType, previewSound, setAllSounds, playLogout } from './chunk-D7PYW2QS.js';
8
- import { setPdfPreview } from './chunk-6GVIP3TJ.js';
9
- export { ImageAnnotator_default as ImageAnnotator } from './chunk-6GVIP3TJ.js';
8
+ import { setPdfPreview } from './chunk-POTG7N3E.js';
9
+ export { ImageAnnotator_default as ImageAnnotator } from './chunk-POTG7N3E.js';
10
10
  import { toast_default } from './chunk-VENYVK3L.js';
11
11
  export { toast_default as toast } from './chunk-VENYVK3L.js';
12
- import { EditableGrid } from './chunk-FKZTCOOQ.js';
13
- export { EditableGrid } from './chunk-FKZTCOOQ.js';
12
+ import { EditableGrid } from './chunk-MMDTMBXD.js';
13
+ export { EditableGrid } from './chunk-MMDTMBXD.js';
14
14
  import { useAuth, useShellAuth } from './chunk-ADJ3CERD.js';
15
15
  export { ShellAuthProvider, setShellAuthBridge, useShellAuth } from './chunk-ADJ3CERD.js';
16
- import { APP_VERSION, VERSION } from './chunk-7GSHFSWI.js';
17
- export { VERSION } from './chunk-7GSHFSWI.js';
18
- import { useWindowManager, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, WINDOW_REGISTRY, isPageEntry, Modal, useShellPrefs, useIsMobile, ModalActions, useModalActive, client_default, LoadingSpinner, CancelButton, setWindowPosition, ThumbCard, activateModal } from './chunk-ZGLERMDX.js';
19
- export { CancelButton, CopyButton, DocFavStar, Modal, ModalActions, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, ShellPrefsProvider, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowTitle, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isEntityEntry, isPageEntry, registerModalEscapeInterceptor, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toggleExposeMode, useLocalStoragePrefs, useModalActive, useShellPrefs, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-ZGLERMDX.js';
16
+ import { APP_VERSION, VERSION } from './chunk-DAODUEDD.js';
17
+ export { VERSION } from './chunk-DAODUEDD.js';
18
+ import { useWindowManager, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, WINDOW_REGISTRY, isPageEntry, Modal, useShellPrefs, useIsMobile, ModalActions, useModalActive, client_default, LoadingSpinner, CancelButton, setWindowPosition, ThumbCard, activateModal } from './chunk-5Z57WKMX.js';
19
+ export { CancelButton, CopyButton, DocFavStar, Modal, ModalActions, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, ShellPrefsProvider, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowTitle, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isEntityEntry, isPageEntry, registerModalEscapeInterceptor, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toggleExposeMode, useLocalStoragePrefs, useModalActive, useShellPrefs, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-5Z57WKMX.js';
20
20
  export { ConfirmProvider, confirm, confirmDestructive, prompt } from './chunk-UBN4IUDE.js';
21
21
  import { glassStyle, startMenuCategories, navSections, isSection, GLASS_INPUT_BG, navIcons, sectionIcons } from './chunk-ZF6AYO4G.js';
22
22
  export { GLASS_DIVIDER, GLASS_INPUT_BG, glassStyle, setShellNavIcons } from './chunk-ZF6AYO4G.js';
@@ -2781,6 +2781,7 @@ function StartMenu({
2781
2781
  taskbarPosition,
2782
2782
  taskbarH,
2783
2783
  taskbarW = 0,
2784
+ taskbarGap = 4,
2784
2785
  size = "medium",
2785
2786
  navSections: navSections2 = navSections,
2786
2787
  navIcons: navIcons2 = navIcons,
@@ -2949,7 +2950,7 @@ function StartMenu({
2949
2950
  }),
2950
2951
  ...footerItems.flatMap((item) => matchTree(item, ""))
2951
2952
  ] : [];
2952
- const posStyle = taskbarPosition === "top" ? { top: taskbarH + 8, left: 8 } : taskbarPosition === "left" ? { top: 8, left: taskbarW + 8 } : taskbarPosition === "right" ? { top: 8, right: taskbarW + 8 } : { bottom: taskbarH + 8, left: 8 };
2953
+ const posStyle = taskbarPosition === "top" ? { top: taskbarH + taskbarGap, left: 8 } : taskbarPosition === "left" ? { top: 8, left: taskbarW + taskbarGap } : taskbarPosition === "right" ? { top: 8, right: taskbarW + taskbarGap } : { bottom: taskbarH + taskbarGap, left: 8 };
2953
2954
  const iconEl = (path) => {
2954
2955
  const icon = navIcons2[path];
2955
2956
  if (icon && isValidElement(icon)) return cloneElement(icon, { className: "h-4 w-4" });
@@ -2964,8 +2965,13 @@ function StartMenu({
2964
2965
  const hoveredData = hoveredVirtual ? null : hoveredSection ? [...erpSections, ...systemSections, ...footerSections].find((s) => s.label === hoveredSection) : null;
2965
2966
  const flyoutItems = hoveredVirtual ? hoveredVirtual.items : hoveredData ? getVisibleItems(hoveredData) : [];
2966
2967
  const menuDensity = typeof document !== "undefined" ? getComputedStyle(document.documentElement).getPropertyValue("--menu-density")?.trim() || "normal" : "normal";
2967
- const tight = menuDensity === "tight";
2968
- const sizeConfig = tight ? { small: { w: "w-52", fw: "w-44", text: "text-xs", py: "py-1", px: "px-3", mw: 208, itemH: 24 }, medium: { w: "w-56", fw: "w-48", text: "text-xs", py: "py-1", px: "px-3", mw: 224, itemH: 26 }, large: { w: "w-64", fw: "w-52", text: "text-sm", py: "py-1.5", px: "px-3", mw: 256, itemH: 30 } }[size] : { small: { w: "w-56", fw: "w-48", text: "text-xs", py: "py-1.5", px: "px-3", mw: 224, itemH: 30 }, medium: { w: "w-64", fw: "w-56", text: "text-sm", py: "py-2", px: "px-4", mw: 256, itemH: 36 }, large: { w: "w-72", fw: "w-60", text: "text-sm", py: "py-2.5", px: "px-4", mw: 288, itemH: 40 } }[size];
2968
+ const density = menuDensity === "tight" || menuDensity === "large" ? menuDensity : "normal";
2969
+ const sizeConfigByDensity = {
2970
+ tight: { small: { w: "w-52", fw: "w-44", text: "text-xs", py: "py-1", px: "px-3", mw: 208, itemH: 24 }, medium: { w: "w-56", fw: "w-48", text: "text-xs", py: "py-1", px: "px-3", mw: 224, itemH: 26 }, large: { w: "w-64", fw: "w-52", text: "text-sm", py: "py-1.5", px: "px-3", mw: 256, itemH: 30 } },
2971
+ normal: { small: { w: "w-56", fw: "w-48", text: "text-xs", py: "py-1.5", px: "px-3", mw: 224, itemH: 30 }, medium: { w: "w-64", fw: "w-56", text: "text-sm", py: "py-1.5", px: "px-4", mw: 256, itemH: 32 }, large: { w: "w-72", fw: "w-60", text: "text-sm", py: "py-2", px: "px-4", mw: 288, itemH: 36 } },
2972
+ large: { small: { w: "w-56", fw: "w-48", text: "text-xs", py: "py-2", px: "px-3", mw: 224, itemH: 32 }, medium: { w: "w-64", fw: "w-56", text: "text-sm", py: "py-2", px: "px-4", mw: 256, itemH: 36 }, large: { w: "w-72", fw: "w-60", text: "text-sm", py: "py-2", px: "px-4", mw: 288, itemH: 36 } }
2973
+ };
2974
+ const sizeConfig = sizeConfigByDensity[density][size];
2969
2975
  const menuGlass = glassStyle();
2970
2976
  const itemCls = `w-full flex items-center gap-2 rounded-lg ${sizeConfig.px} ${sizeConfig.py} ${sizeConfig.text}`;
2971
2977
  const flyoutEstH = flyoutItems.length * sizeConfig.itemH + 12;
@@ -4320,9 +4326,10 @@ function Layout({
4320
4326
  const taskbarSize = prefs.taskbar_size || "medium";
4321
4327
  const desktopDblClick = prefs.desktop_dblclick || "deactivate";
4322
4328
  const isVerticalTaskbar = taskbarPosition === "left" || taskbarPosition === "right";
4323
- const taskbarH = isVerticalTaskbar ? 0 : taskbarSize === "small" ? 40 : taskbarSize === "large" ? 72 : 56;
4329
+ const taskbarH = isVerticalTaskbar ? 0 : taskbarSize === "small" ? 42 : taskbarSize === "large" ? 72 : 56;
4324
4330
  const taskbarW = isVerticalTaskbar ? taskbarSize === "small" ? 180 : taskbarSize === "large" ? 260 : 220 : 0;
4325
- const taskbarHClass = taskbarSize === "small" ? "h-10" : taskbarSize === "large" ? "h-[72px]" : "h-14";
4331
+ const taskbarGap = taskbarSize === "small" ? 2 : taskbarSize === "large" ? 6 : 4;
4332
+ const taskbarHClass = taskbarSize === "small" ? "h-[42px]" : taskbarSize === "large" ? "h-[72px]" : "h-14";
4326
4333
  const taskbarWClass = taskbarSize === "small" ? "w-[180px]" : taskbarSize === "large" ? "w-[260px]" : "w-[220px]";
4327
4334
  const taskbarOpacity = (prefs.transparency_taskbar ?? 70) / 100;
4328
4335
  const menuOpacity = (prefs.transparency_start_menu ?? 95) / 100;
@@ -4478,6 +4485,7 @@ function Layout({
4478
4485
  taskbarPosition,
4479
4486
  taskbarH,
4480
4487
  taskbarW,
4488
+ taskbarGap,
4481
4489
  size: prefs.start_menu_size || "medium",
4482
4490
  navSections: navSections2,
4483
4491
  navIcons: navIcons2,
@@ -5050,7 +5058,8 @@ function Customization({ omit, section } = {}) {
5050
5058
  /* @__PURE__ */ jsx("span", { className: "text-sm text-gray-700 w-24 shrink-0", children: "Density" }),
5051
5059
  /* @__PURE__ */ jsx("div", { className: "flex gap-2", children: [
5052
5060
  { key: "tight", label: "Tight" },
5053
- { key: "normal", label: "Normal" }
5061
+ { key: "normal", label: "Normal" },
5062
+ { key: "large", label: "Large" }
5054
5063
  ].map((s) => /* @__PURE__ */ jsx(
5055
5064
  "button",
5056
5065
  {
@@ -5907,8 +5916,13 @@ function EntityList(props) {
5907
5916
  footerExtra,
5908
5917
  sentinelRef,
5909
5918
  isFetchingNextPage,
5910
- saveDefaultPerms
5919
+ saveDefaultPerms,
5920
+ exportEndpoint,
5921
+ exportFilename = "export.csv",
5922
+ contextActions
5911
5923
  } = props;
5924
+ const [menu, setMenu] = useState(null);
5925
+ const hasMenu = !!exportEndpoint || !!contextActions;
5912
5926
  const toggleItem = (item) => {
5913
5927
  setSelected((prev) => {
5914
5928
  const next = new Set(prev);
@@ -5929,6 +5943,48 @@ function EntityList(props) {
5929
5943
  });
5930
5944
  };
5931
5945
  const focusIdx = useTableNav(items, onRowClick, toggleItem, toggleAll, selectRange);
5946
+ const handleRowContextMenu = (e, item) => {
5947
+ if (!hasMenu) return;
5948
+ e.preventDefault();
5949
+ const id = getRowId(item);
5950
+ if (!selected.has(id)) setSelected(/* @__PURE__ */ new Set([id]));
5951
+ setMenu({ x: e.clientX, y: e.clientY });
5952
+ };
5953
+ const selectedItems = items.filter((i) => selected.has(getRowId(i)));
5954
+ const colsParam = () => {
5955
+ const labelByKey = new Map(columns.map((c) => [c.key, c.label]));
5956
+ try {
5957
+ const raw = localStorage.getItem(`col-config-${tableId}`);
5958
+ if (raw) {
5959
+ const parsed = JSON.parse(raw);
5960
+ const cols = parsed.filter((c) => !c.hidden && c.key !== "_select" && labelByKey.has(c.key)).map((c) => `${c.key}|${labelByKey.get(c.key)}`);
5961
+ if (cols.length) return cols.join(",");
5962
+ }
5963
+ } catch {
5964
+ }
5965
+ return columns.filter((c) => !c.defaultHidden).map((c) => `${c.key}|${c.label}`).join(",");
5966
+ };
5967
+ const exportSelected = async () => {
5968
+ setMenu(null);
5969
+ const ids = [...selected];
5970
+ if (!ids.length || !exportEndpoint) return;
5971
+ const p = new URLSearchParams({ ids: ids.join(",") });
5972
+ const cols = colsParam();
5973
+ if (cols) p.set("cols", cols);
5974
+ const sep = exportEndpoint.includes("?") ? "&" : "?";
5975
+ try {
5976
+ const res = await client_default.get(`${exportEndpoint}${sep}${p}`, { responseType: "blob" });
5977
+ const url = window.URL.createObjectURL(new Blob([res.data], { type: "text/csv" }));
5978
+ const a = document.createElement("a");
5979
+ a.href = url;
5980
+ a.download = exportFilename;
5981
+ a.click();
5982
+ window.URL.revokeObjectURL(url);
5983
+ toast_default.success(`Exported ${ids.length} ${ids.length === 1 ? "row" : "rows"}.`);
5984
+ } catch {
5985
+ toast_default.error("CSV export failed.");
5986
+ }
5987
+ };
5932
5988
  if (isLoading) return /* @__PURE__ */ jsx(LoadingSpinner, {});
5933
5989
  if (items.length === 0) return /* @__PURE__ */ jsx(Fragment, { children: emptyState });
5934
5990
  const allSelected = items.length > 0 && selected.size === items.length;
@@ -5965,44 +6021,75 @@ function EntityList(props) {
5965
6021
  /* @__PURE__ */ jsx("div", { ref: sentinelRef }),
5966
6022
  isFetchingNextPage && /* @__PURE__ */ jsx("div", { className: "text-center py-3", children: /* @__PURE__ */ jsx("span", { className: "text-sm text-gray-500", children: "Loading more..." }) })
5967
6023
  ] }) : void 0;
5968
- return /* @__PURE__ */ jsx("div", { className: "flex-1 flex flex-col mb-1 bg-white rounded-lg shadow overflow-hidden", children: /* @__PURE__ */ jsx("div", { className: "flex-1 min-h-0 flex flex-col", children: /* @__PURE__ */ jsx(
5969
- ResizableTable,
5970
- {
5971
- tableId,
5972
- columns: fullColumns,
5973
- sort,
5974
- onSort,
5975
- footer,
5976
- afterBody,
5977
- saveDefaultPerms,
5978
- children: (cols) => /* @__PURE__ */ jsx("tbody", { className: "divide-y divide-gray-100", children: items.map((item, rowIdx) => {
5979
- const id = getRowId(item);
5980
- return /* @__PURE__ */ jsx(
5981
- "tr",
6024
+ const actions = menu && contextActions ? contextActions(selectedItems) : [];
6025
+ return /* @__PURE__ */ jsxs("div", { className: "flex-1 flex flex-col mb-1 bg-white rounded-lg shadow overflow-hidden", children: [
6026
+ /* @__PURE__ */ jsx("div", { className: "flex-1 min-h-0 flex flex-col", children: /* @__PURE__ */ jsx(
6027
+ ResizableTable,
6028
+ {
6029
+ tableId,
6030
+ columns: fullColumns,
6031
+ sort,
6032
+ onSort,
6033
+ footer,
6034
+ afterBody,
6035
+ saveDefaultPerms,
6036
+ children: (cols) => /* @__PURE__ */ jsx("tbody", { className: "divide-y divide-gray-100", children: items.map((item, rowIdx) => {
6037
+ const id = getRowId(item);
6038
+ return /* @__PURE__ */ jsx(
6039
+ "tr",
6040
+ {
6041
+ "data-row-idx": rowIdx,
6042
+ className: `cursor-pointer ${focusIdx === rowIdx ? "bg-blue-50 ring-1 ring-inset ring-blue-300" : selected.has(id) ? "bg-blue-50 hover:bg-blue-100" : "hover:bg-gray-50"} ${getRowClassName?.(item) ?? ""}`,
6043
+ onClick: () => onRowClick(item),
6044
+ onContextMenu: hasMenu ? (e) => handleRowContextMenu(e, item) : void 0,
6045
+ onMouseEnter: onRowHover ? () => onRowHover(item) : void 0,
6046
+ children: cols.map((col) => /* @__PURE__ */ jsx("td", { className: "px-4 py-3 whitespace-nowrap text-sm overflow-hidden", children: col.key === "_select" ? /* @__PURE__ */ jsx(
6047
+ "input",
6048
+ {
6049
+ type: "checkbox",
6050
+ checked: selected.has(id),
6051
+ onClick: (e) => {
6052
+ e.stopPropagation();
6053
+ toggleItem(item);
6054
+ },
6055
+ readOnly: true,
6056
+ className: "h-3.5 w-3.5 rounded border-gray-300 text-blue-600"
6057
+ }
6058
+ ) : renderCell(item, col.key) }, col.key))
6059
+ },
6060
+ id
6061
+ );
6062
+ }) })
6063
+ }
6064
+ ) }),
6065
+ menu && /* @__PURE__ */ jsxs(PopupMenu, { portal: true, style: { left: menu.x, top: menu.y }, onClose: () => setMenu(null), minWidth: 210, children: [
6066
+ /* @__PURE__ */ jsxs(PopupMenuLabel, { children: [
6067
+ selected.size,
6068
+ " selected"
6069
+ ] }),
6070
+ exportEndpoint && /* @__PURE__ */ jsx(PopupMenuItem, { onClick: exportSelected, children: "Export selected to CSV" }),
6071
+ actions.map((a, i) => /* @__PURE__ */ jsxs("div", { children: [
6072
+ a.divider && /* @__PURE__ */ jsx(PopupMenuDivider, {}),
6073
+ /* @__PURE__ */ jsx(
6074
+ PopupMenuItem,
5982
6075
  {
5983
- "data-row-idx": rowIdx,
5984
- className: `cursor-pointer ${focusIdx === rowIdx ? "bg-blue-50 ring-1 ring-inset ring-blue-300" : selected.has(id) ? "bg-blue-50 hover:bg-blue-100" : "hover:bg-gray-50"} ${getRowClassName?.(item) ?? ""}`,
5985
- onClick: () => onRowClick(item),
5986
- onMouseEnter: onRowHover ? () => onRowHover(item) : void 0,
5987
- children: cols.map((col) => /* @__PURE__ */ jsx("td", { className: "px-4 py-3 whitespace-nowrap text-sm overflow-hidden", children: col.key === "_select" ? /* @__PURE__ */ jsx(
5988
- "input",
5989
- {
5990
- type: "checkbox",
5991
- checked: selected.has(id),
5992
- onClick: (e) => {
5993
- e.stopPropagation();
5994
- toggleItem(item);
5995
- },
5996
- readOnly: true,
5997
- className: "h-3.5 w-3.5 rounded border-gray-300 text-blue-600"
5998
- }
5999
- ) : renderCell(item, col.key) }, col.key))
6000
- },
6001
- id
6002
- );
6003
- }) })
6004
- }
6005
- ) }) });
6076
+ danger: a.danger,
6077
+ disabled: a.disabled,
6078
+ onClick: () => {
6079
+ setMenu(null);
6080
+ a.onClick(selectedItems);
6081
+ },
6082
+ children: a.label
6083
+ }
6084
+ )
6085
+ ] }, i)),
6086
+ /* @__PURE__ */ jsx(PopupMenuDivider, {}),
6087
+ /* @__PURE__ */ jsx(PopupMenuItem, { onClick: () => {
6088
+ setMenu(null);
6089
+ setSelected(/* @__PURE__ */ new Set());
6090
+ }, children: "Clear selection" })
6091
+ ] })
6092
+ ] });
6006
6093
  }
6007
6094
  function Kanban({
6008
6095
  items,