react-os-shell 4.11.0 → 4.12.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.d.ts CHANGED
@@ -1793,6 +1793,12 @@ declare function EntityList<T>(props: EntityListProps<T>): react_jsx_runtime.JSX
1793
1793
  * `dragenter` (once per card crossed) so the line stays stable rather than
1794
1794
  * flickering. Pass `onAddItem` to give each column a "+ Add item" button at its
1795
1795
  * foot, revealed on column hover / keyboard focus.
1796
+ *
1797
+ * With no items the board is replaced by `emptyState` — right when the items
1798
+ * are the whole story, wrong when the columns are (a pipeline the user just
1799
+ * configured has a shape worth showing, and a board with no drop target can't
1800
+ * take its first card). Pass `showColumnsWhenEmpty` for that case and the
1801
+ * normal layout draws with every column on its `columnEmptyText` placeholder.
1796
1802
  */
1797
1803
  interface KanbanColumn {
1798
1804
  /** Stable column key — what `columnOf` returns and `onMove` receives. */
@@ -1822,8 +1828,16 @@ interface KanbanProps<T> {
1822
1828
  sortInColumn?: (a: T, b: T) => number;
1823
1829
  isLoading?: boolean;
1824
1830
  loadingText?: string;
1825
- /** Shown when there are no items at all. */
1831
+ /** Shown INSTEAD of the board when there are no items at all. */
1826
1832
  emptyState?: ReactNode;
1833
+ /**
1834
+ * Draw the board — headers, empty columns, drop targets — even with no items,
1835
+ * instead of replacing it with `emptyState`. Opt in when the columns are
1836
+ * themselves the information (a configurable pipeline the user just defined)
1837
+ * or when an empty board still needs somewhere to drop a card into. Default
1838
+ * `false` keeps the `emptyState` behaviour every existing caller relies on.
1839
+ */
1840
+ showColumnsWhenEmpty?: boolean;
1827
1841
  /** Placeholder text inside an empty column. */
1828
1842
  columnEmptyText?: string;
1829
1843
  /**
@@ -1834,7 +1848,7 @@ interface KanbanProps<T> {
1834
1848
  /** Label for the per-column add button. */
1835
1849
  addItemText?: string;
1836
1850
  }
1837
- declare function Kanban<T>({ items, columns, columnOf, getId, onMove, renderCard, onCardClick, sortInColumn, isLoading, loadingText, emptyState, columnEmptyText, onAddItem, addItemText, }: KanbanProps<T>): react_jsx_runtime.JSX.Element;
1851
+ declare function Kanban<T>({ items, columns, columnOf, getId, onMove, renderCard, onCardClick, sortInColumn, isLoading, loadingText, emptyState, showColumnsWhenEmpty, columnEmptyText, onAddItem, addItemText, }: KanbanProps<T>): react_jsx_runtime.JSX.Element;
1838
1852
 
1839
1853
  interface PaginatedResponse<T> {
1840
1854
  count: number;
package/dist/index.js CHANGED
@@ -12,11 +12,11 @@ import { setPdfPreview } from './chunk-BV6SQ46N.js';
12
12
  import { playNotification, playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, setSoundForType, previewSound, setAllSounds, playLogout } from './chunk-D7PYW2QS.js';
13
13
  import { useAuth } from './chunk-KILLK5UH.js';
14
14
  export { setShellAuthBridge } from './chunk-KILLK5UH.js';
15
- import { EditableGrid } from './chunk-GP4Y3VCB.js';
16
- export { EditableGrid } from './chunk-GP4Y3VCB.js';
15
+ import { withSpareRow, EditableGrid } from './chunk-DC6BYGZ6.js';
16
+ export { EditableGrid } from './chunk-DC6BYGZ6.js';
17
17
  import './chunk-4SQU5YV6.js';
18
- import { APP_VERSION, VERSION } from './chunk-VG2WSTEJ.js';
19
- export { VERSION } from './chunk-VG2WSTEJ.js';
18
+ import { APP_VERSION, VERSION } from './chunk-7Z2SUHZT.js';
19
+ export { VERSION } from './chunk-7Z2SUHZT.js';
20
20
  import { registerModalEscapeInterceptor, useIsMobile, cancelWindowFront, requestWindowFront, useWindowManager, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, WINDOW_REGISTRY, isPageEntry, Modal, setPerfCollecting, drainPerfEvents, useShellPrefs, markMenuOpen, SIDEBAR_STRIP_W, forgetMaximizedWindowBoxes, ModalActions, useModalActive, client_default, LoadingSpinner, isShellApiClientConfigured, useUndo, CancelButton, setWindowPosition } from './chunk-E2EGGV2Z.js';
21
21
  export { CancelButton, ConfirmProvider, CopyButton, DocFavStar, Modal, ModalActions, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, ShellPrefsProvider, UndoProvider, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowTitle, beginWindowGesture, commitExposeHighlight, confirm, confirmDestructive, exitExposeMode, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isEntityEntry, isPageEntry, markMenuOpen, prompt, registerModalEscapeInterceptor, requestWindowFront, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toggleExposeMode, useIsActiveWindow, useLocalStoragePrefs, useModalActive, useShellPrefs, useUndo, useUndoable, useUndoableState, useWidgetSettings, useWindowDirty, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-E2EGGV2Z.js';
22
22
  import { glassStyle, startMenuCategories, navSections, isSection, GLASS_INPUT_BG, navIcons, isReachable, sectionIcons, useShellAuth, visibleChildren } from './chunk-RVT2A2MO.js';
@@ -6365,6 +6365,7 @@ function Kanban({
6365
6365
  isLoading = false,
6366
6366
  loadingText = "Loading\u2026",
6367
6367
  emptyState,
6368
+ showColumnsWhenEmpty = false,
6368
6369
  columnEmptyText = "Drop here",
6369
6370
  onAddItem,
6370
6371
  addItemText = "Add item"
@@ -6436,7 +6437,7 @@ function Kanban({
6436
6437
  reset();
6437
6438
  };
6438
6439
  if (isLoading) return /* @__PURE__ */ jsx("div", { className: "text-sm text-gray-500 p-4", children: loadingText });
6439
- if (items.length === 0) {
6440
+ if (items.length === 0 && !showColumnsWhenEmpty) {
6440
6441
  return /* @__PURE__ */ jsx(Fragment, { children: emptyState ?? /* @__PURE__ */ jsx("div", { className: "text-sm text-gray-500 p-4", children: "No items." }) });
6441
6442
  }
6442
6443
  return /* @__PURE__ */ jsx("div", { ref: boardRef, className: "flex-1 overflow-x-auto grid-scroll", children: /* @__PURE__ */ jsx("div", { className: "flex gap-3 h-full min-w-max pb-2", children: columns.map((col) => {
@@ -9229,7 +9230,7 @@ function BulkImportGrid({ columns, onImport, description, mergeDuplicates = fals
9229
9230
  });
9230
9231
  });
9231
9232
  while (cleaned.length < 15) cleaned.push(Array(colCount).fill(""));
9232
- setGridData(cleaned);
9233
+ setGridData(withSpareRow(cleaned, colCount));
9233
9234
  }, [colCount, columns]);
9234
9235
  const handleCSV = (e) => {
9235
9236
  const file = e.target.files?.[0];