@almadar/ui 5.8.0 → 5.9.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.
@@ -2,6 +2,8 @@ import React from 'react';
2
2
  export type RevealTrigger = 'scroll' | 'hover' | 'manual';
3
3
  export type RevealAnimation = 'fade-up' | 'fade-down' | 'fade-in' | 'fade-left' | 'fade-right' | 'scale' | 'scale-up' | 'none';
4
4
  export interface AnimatedRevealProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
5
+ /** Additional CSS classes applied to the root element. */
6
+ className?: string;
5
7
  /** What triggers the animation */
6
8
  trigger?: RevealTrigger;
7
9
  /** Built-in animation preset */
@@ -2,6 +2,8 @@ import React from "react";
2
2
  export type BadgeVariant = "default" | "primary" | "secondary" | "success" | "warning" | "danger" | "error" | "info" | "neutral";
3
3
  export type BadgeSize = "sm" | "md" | "lg";
4
4
  export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
5
+ /** Additional CSS classes applied to the root element. */
6
+ className?: string;
5
7
  variant?: BadgeVariant;
6
8
  size?: BadgeSize;
7
9
  /** Numeric count or amount to display in badge */
@@ -12,6 +12,8 @@ export type BoxBg = "transparent" | "primary" | "secondary" | "muted" | "accent"
12
12
  export type BoxRounded = "none" | "sm" | "md" | "lg" | "xl" | "2xl" | "full";
13
13
  export type BoxShadow = "none" | "sm" | "md" | "lg" | "xl";
14
14
  export interface BoxProps extends React.HTMLAttributes<HTMLDivElement> {
15
+ /** Additional CSS classes applied to the root element. */
16
+ className?: string;
15
17
  /** Padding on all sides */
16
18
  padding?: BoxPadding;
17
19
  /** Horizontal padding (overrides padding for x-axis) */
@@ -4,6 +4,8 @@ import { type LucideIcon } from "lucide-react";
4
4
  export type ButtonVariant = "primary" | "secondary" | "ghost" | "danger" | "success" | "warning" | "default";
5
5
  export type ButtonSize = "sm" | "md" | "lg";
6
6
  export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
7
+ /** Additional CSS classes applied to the root element. */
8
+ className?: string;
7
9
  variant?: ButtonVariant;
8
10
  size?: ButtonSize;
9
11
  isLoading?: boolean;
@@ -6,6 +6,8 @@ export type CardShadow = "none" | "sm" | "md" | "lg";
6
6
  */
7
7
  export type CardLook = "elevated" | "flat-bordered" | "borderless-divider" | "ticket" | "invoice" | "chip" | "tile-image-first";
8
8
  export interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
9
+ /** Additional CSS classes applied to the root element. */
10
+ className?: string;
9
11
  variant?: "default" | "bordered" | "elevated" | "interactive";
10
12
  padding?: "none" | "sm" | "md" | "lg";
11
13
  /** Card title - renders in header if provided */
@@ -1,5 +1,7 @@
1
1
  import React from "react";
2
2
  export interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "type"> {
3
+ /** Additional CSS classes applied to the root element. */
4
+ className?: string;
3
5
  /** Whether the checkbox is checked */
4
6
  checked?: boolean;
5
7
  /** Default checked state (uncontrolled) */
@@ -3,6 +3,8 @@ import type { EventEmit } from "@almadar/core";
3
3
  export type FilterPillVariant = "default" | "primary" | "secondary" | "success" | "warning" | "danger" | "info" | "neutral";
4
4
  export type FilterPillSize = "sm" | "md" | "lg";
5
5
  export interface FilterPillProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "onClick"> {
6
+ /** Additional CSS classes applied to the root element. */
7
+ className?: string;
6
8
  variant?: FilterPillVariant;
7
9
  size?: FilterPillSize;
8
10
  /** Pill label text (alternative to children for schema-driven rendering). */
@@ -6,6 +6,8 @@ export interface SelectOption {
6
6
  label: string;
7
7
  }
8
8
  export interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange"> {
9
+ /** Additional CSS classes applied to the root element. */
10
+ className?: string;
9
11
  /** Placeholder text */
10
12
  placeholder?: string;
11
13
  /** Current value */
@@ -1,5 +1,7 @@
1
1
  import React from "react";
2
2
  export interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {
3
+ /** Additional CSS classes applied to the root element. */
4
+ className?: string;
3
5
  /** Label text content */
4
6
  text?: string;
5
7
  /** Associated input element ID */
@@ -6,6 +6,8 @@
6
6
  import React from "react";
7
7
  import type { EventKey } from "@almadar/core";
8
8
  export interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "type" | "size"> {
9
+ /** Additional CSS classes applied to the root element. */
10
+ className?: string;
9
11
  /** Radio options (string array or SelectOption array) */
10
12
  options?: string[];
11
13
  /** Current selected value */
@@ -2,6 +2,8 @@ import React from "react";
2
2
  import type { EventKey, EventPayload } from "@almadar/core";
3
3
  export type RangeSliderSize = "sm" | "md" | "lg";
4
4
  export interface RangeSliderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
5
+ /** Additional CSS classes applied to the root element. */
6
+ className?: string;
5
7
  /** Minimum value */
6
8
  min?: number;
7
9
  /** Maximum value */
@@ -6,6 +6,8 @@ export interface SelectOption {
6
6
  disabled?: boolean;
7
7
  }
8
8
  export interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, "children"> {
9
+ /** Additional CSS classes applied to the root element. */
10
+ className?: string;
9
11
  /** Select options */
10
12
  options: SelectOption[];
11
13
  /** Placeholder text */
@@ -1,6 +1,8 @@
1
1
  import React from "react";
2
2
  export type SpinnerSize = "xs" | "sm" | "md" | "lg";
3
3
  export interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {
4
+ /** Additional CSS classes applied to the root element. */
5
+ className?: string;
4
6
  size?: SpinnerSize;
5
7
  }
6
8
  export declare const Spinner: React.ForwardRefExoticComponent<SpinnerProps & React.RefAttributes<HTMLDivElement>>;
@@ -2,6 +2,8 @@ import React from "react";
2
2
  export type StatusDotStatus = "online" | "offline" | "away" | "busy" | "warning" | "critical";
3
3
  export type StatusDotSize = "sm" | "md" | "lg";
4
4
  export interface StatusDotProps extends React.HTMLAttributes<HTMLSpanElement> {
5
+ /** Additional CSS classes applied to the root element. */
6
+ className?: string;
5
7
  /** Status determines the dot color */
6
8
  status?: StatusDotStatus;
7
9
  /** Enable pulse animation for active/critical states */
@@ -1,6 +1,8 @@
1
1
  import React from "react";
2
2
  import type { EventKey } from "@almadar/core";
3
3
  export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
4
+ /** Additional CSS classes applied to the root element. */
5
+ className?: string;
4
6
  /** Placeholder text */
5
7
  placeholder?: string;
6
8
  /** Number of visible rows */
@@ -2,6 +2,8 @@ import React from "react";
2
2
  export type TrendDirection = "up" | "down" | "flat";
3
3
  export type TrendIndicatorSize = "sm" | "md" | "lg";
4
4
  export interface TrendIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {
5
+ /** Additional CSS classes applied to the root element. */
6
+ className?: string;
5
7
  /** Numeric value to display (e.g., 12.5 for +12.5%) */
6
8
  value?: number;
7
9
  /** Override automatic direction detection (positive=up, negative=down, zero=flat) */
@@ -28283,6 +28283,311 @@ var init_Lightbox = __esm({
28283
28283
  exports.Lightbox.displayName = "Lightbox";
28284
28284
  }
28285
28285
  });
28286
+ function columnLabel(col) {
28287
+ return col.header ?? col.label ?? col.key.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[_-]/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
28288
+ }
28289
+ function statusVariant4(value) {
28290
+ const v = value.toLowerCase();
28291
+ if (["active", "completed", "done", "approved", "published", "resolved", "open", "online", "ok"].includes(v)) return "success";
28292
+ if (["pending", "in_progress", "in-progress", "review", "draft", "processing", "warn", "warning"].includes(v)) return "warning";
28293
+ if (["inactive", "deleted", "rejected", "failed", "error", "blocked", "closed", "offline"].includes(v)) return "error";
28294
+ if (["new", "created", "scheduled", "queued", "info"].includes(v)) return "info";
28295
+ return "default";
28296
+ }
28297
+ function formatCell(value, format) {
28298
+ if (value === void 0 || value === null) return "";
28299
+ switch (format) {
28300
+ case "date": {
28301
+ const d = new Date(String(value));
28302
+ return isNaN(d.getTime()) ? String(value) : d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
28303
+ }
28304
+ case "currency":
28305
+ return typeof value === "number" ? `$${value.toFixed(2)}` : String(value);
28306
+ case "number":
28307
+ return typeof value === "number" ? value.toLocaleString() : String(value);
28308
+ case "percent":
28309
+ return typeof value === "number" ? `${Math.round(value)}%` : String(value);
28310
+ case "boolean":
28311
+ return value ? "Yes" : "No";
28312
+ default:
28313
+ return String(value);
28314
+ }
28315
+ }
28316
+ function groupData2(items, field) {
28317
+ const groups = /* @__PURE__ */ new Map();
28318
+ for (const item of items) {
28319
+ const key = String(getNestedValue(item, field) ?? "");
28320
+ const group = groups.get(key);
28321
+ if (group) group.push(item);
28322
+ else groups.set(key, [item]);
28323
+ }
28324
+ return Array.from(groups.entries()).map(([label, groupItems]) => ({ label, items: groupItems }));
28325
+ }
28326
+ function TableView({
28327
+ entity,
28328
+ columns,
28329
+ fields,
28330
+ itemActions,
28331
+ selectable = false,
28332
+ selectEvent,
28333
+ selectedIds,
28334
+ sortEvent,
28335
+ sortColumn,
28336
+ sortDirection,
28337
+ className,
28338
+ emptyMessage,
28339
+ isLoading = false,
28340
+ error = null,
28341
+ groupBy,
28342
+ pageSize = 0,
28343
+ children,
28344
+ renderItem: _schemaRenderItem,
28345
+ look = "dense",
28346
+ // DnD props consumed by useDataDnd.
28347
+ dragGroup,
28348
+ accepts,
28349
+ sortable,
28350
+ dropEvent,
28351
+ reorderEvent,
28352
+ positionEvent,
28353
+ dndItemIdField,
28354
+ dndRoot
28355
+ }) {
28356
+ const eventBus = useEventBus();
28357
+ const { t } = useTranslate();
28358
+ const [visibleCount, setVisibleCount] = React80__namespace.default.useState(pageSize > 0 ? pageSize : Infinity);
28359
+ const [localSelected, setLocalSelected] = React80__namespace.default.useState(/* @__PURE__ */ new Set());
28360
+ const colDefs = columns ?? fields ?? [];
28361
+ const allDataRaw = Array.isArray(entity) ? entity : entity ? [entity] : [];
28362
+ const dnd = useDataDnd({
28363
+ items: allDataRaw,
28364
+ layout: "list",
28365
+ dragGroup,
28366
+ accepts,
28367
+ sortable,
28368
+ dropEvent,
28369
+ reorderEvent,
28370
+ positionEvent,
28371
+ dndItemIdField,
28372
+ dndRoot
28373
+ });
28374
+ const ordered = dnd.orderedItems;
28375
+ const data = pageSize > 0 ? ordered.slice(0, visibleCount) : ordered;
28376
+ const hasMore = pageSize > 0 && visibleCount < ordered.length;
28377
+ const hasRenderProp = typeof children === "function";
28378
+ const idField = dndItemIdField ?? "id";
28379
+ const selected = selectedIds ? new Set(selectedIds) : localSelected;
28380
+ const emitSelection = (next) => {
28381
+ if (!selectedIds) setLocalSelected(next);
28382
+ if (selectEvent) {
28383
+ const payload = { selectedIds: Array.from(next) };
28384
+ eventBus.emit(`UI:${selectEvent}`, payload);
28385
+ }
28386
+ };
28387
+ const allSelected = selectable && data.length > 0 && data.every((r, i) => selected.has(String(r[idField] ?? i)));
28388
+ const toggleAll = () => {
28389
+ if (allSelected) emitSelection(/* @__PURE__ */ new Set());
28390
+ else emitSelection(new Set(data.map((r, i) => String(r[idField] ?? i))));
28391
+ };
28392
+ const toggleRow = (id) => {
28393
+ const next = new Set(selected);
28394
+ if (next.has(id)) next.delete(id);
28395
+ else next.add(id);
28396
+ emitSelection(next);
28397
+ };
28398
+ const handleSort = (col) => {
28399
+ if (!col.sortable || !sortEvent) return;
28400
+ const dir = sortColumn === (col.field ?? col.key) && sortDirection === "asc" ? "desc" : "asc";
28401
+ eventBus.emit(`UI:${sortEvent}`, { column: col.field ?? col.key, direction: dir });
28402
+ };
28403
+ const handleActionClick = (action, row) => (e) => {
28404
+ e.stopPropagation();
28405
+ const payload = {
28406
+ id: row.id,
28407
+ row
28408
+ };
28409
+ eventBus.emit(`UI:${action.event}`, payload);
28410
+ };
28411
+ if (isLoading) {
28412
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "text-center py-8", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", color: "secondary", children: t("loading.items") || "Loading\u2026" }) });
28413
+ }
28414
+ if (error) {
28415
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "text-center py-8", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", color: "error", children: error.message }) });
28416
+ }
28417
+ if (data.length === 0) {
28418
+ const emptyNode = /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "text-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", color: "secondary", children: emptyMessage || t("empty.noItems") || "No records" }) });
28419
+ return dnd.enabled ? /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: dnd.wrapContainer(emptyNode) }) : emptyNode;
28420
+ }
28421
+ const lk = LOOKS[look];
28422
+ const header = /* @__PURE__ */ jsxRuntime.jsxs(
28423
+ exports.Box,
28424
+ {
28425
+ role: "row",
28426
+ className: cn(
28427
+ "flex items-center gap-3 sticky top-0 z-10",
28428
+ "bg-[var(--color-surface-subtle)] border-b border-[var(--color-table-border)]",
28429
+ "text-[var(--color-text-muted)] uppercase text-xs font-semibold tracking-wide",
28430
+ lk.headPad
28431
+ ),
28432
+ children: [
28433
+ selectable && /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "w-8 flex-shrink-0 flex items-center", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Checkbox, { checked: allSelected, onChange: toggleAll, "aria-label": "Select all rows" }) }),
28434
+ colDefs.map((col) => {
28435
+ const active = sortColumn === (col.field ?? col.key);
28436
+ return /* @__PURE__ */ jsxRuntime.jsxs(
28437
+ exports.Box,
28438
+ {
28439
+ role: "columnheader",
28440
+ onClick: () => handleSort(col),
28441
+ className: cn(
28442
+ "flex items-center gap-1 min-w-0",
28443
+ col.width ?? "flex-1",
28444
+ alignClass[col.align ?? "left"],
28445
+ col.sortable && sortEvent && "cursor-pointer select-none hover:text-foreground"
28446
+ ),
28447
+ children: [
28448
+ col.icon && /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: col.icon, size: "xs" }),
28449
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: columnLabel(col) }),
28450
+ col.sortable && sortEvent && /* @__PURE__ */ jsxRuntime.jsx(
28451
+ exports.Icon,
28452
+ {
28453
+ name: active ? sortDirection === "asc" ? "chevron-up" : "chevron-down" : "chevrons-up-down",
28454
+ size: "xs",
28455
+ className: cn("flex-shrink-0", active ? "text-foreground" : "opacity-40")
28456
+ }
28457
+ )
28458
+ ]
28459
+ },
28460
+ col.key
28461
+ );
28462
+ }),
28463
+ itemActions && itemActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "w-px flex-shrink-0", "aria-hidden": true })
28464
+ ]
28465
+ }
28466
+ );
28467
+ const renderRow = (row, index) => {
28468
+ const id = String(row[idField] ?? index);
28469
+ const rowInner = /* @__PURE__ */ jsxRuntime.jsxs(
28470
+ exports.Box,
28471
+ {
28472
+ role: "row",
28473
+ "data-entity-row": true,
28474
+ "data-entity-id": id,
28475
+ className: cn(
28476
+ "group flex items-center gap-3 transition-colors duration-fast",
28477
+ lk.rowPad,
28478
+ lk.divider && "border-b border-[var(--color-table-border)]",
28479
+ lk.striped && index % 2 === 1 && "bg-[var(--color-surface-subtle)]",
28480
+ "hover:bg-[var(--color-surface-subtle)]",
28481
+ look === "bordered" && "[&>*]:border-r [&>*]:border-[var(--color-table-border)] [&>*:last-child]:border-r-0"
28482
+ ),
28483
+ children: [
28484
+ selectable && /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "w-8 flex-shrink-0 flex items-center", children: /* @__PURE__ */ jsxRuntime.jsx(
28485
+ exports.Checkbox,
28486
+ {
28487
+ checked: selected.has(id),
28488
+ onChange: () => toggleRow(id),
28489
+ "aria-label": `Select row ${id}`
28490
+ }
28491
+ ) }),
28492
+ hasRenderProp ? /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
28493
+ const raw = getNestedValue(row, col.field ?? col.key);
28494
+ const cellBase = cn(
28495
+ "flex items-center min-w-0",
28496
+ col.width ?? "flex-1",
28497
+ alignClass[col.align ?? "left"],
28498
+ weightClass[col.weight ?? "normal"],
28499
+ col.className
28500
+ );
28501
+ if (col.format === "badge" && raw != null && raw !== "") {
28502
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { role: "cell", className: cellBase, children: /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: statusVariant4(String(raw)), size: "sm", children: String(raw) }) }, col.key);
28503
+ }
28504
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { role: "cell", className: cn(cellBase, "truncate block"), children: formatCell(raw, col.format) }, col.key);
28505
+ }),
28506
+ itemActions && itemActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(exports.HStack, { gap: "xs", className: "flex-shrink-0 opacity-60 group-hover:opacity-100 transition-opacity", children: itemActions.map((action, i) => /* @__PURE__ */ jsxRuntime.jsxs(
28507
+ exports.Button,
28508
+ {
28509
+ variant: action.variant ?? "ghost",
28510
+ size: "sm",
28511
+ onClick: handleActionClick(action, row),
28512
+ "data-testid": `action-${action.event}`,
28513
+ "data-row-id": String(row.id),
28514
+ className: cn(action.variant === "danger" && "text-error hover:bg-error/10"),
28515
+ children: [
28516
+ action.icon && /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: action.icon, size: "xs", className: "mr-1" }),
28517
+ action.label
28518
+ ]
28519
+ },
28520
+ i
28521
+ )) })
28522
+ ]
28523
+ }
28524
+ );
28525
+ return dnd.isZone ? /* @__PURE__ */ jsxRuntime.jsx(dnd.SortableItem, { id: row[idField] ?? id, children: rowInner }, id) : /* @__PURE__ */ jsxRuntime.jsx(React80__namespace.default.Fragment, { children: rowInner }, id);
28526
+ };
28527
+ const items = data.map((row) => row);
28528
+ const groups = groupBy ? groupData2(items, groupBy) : [{ label: "", items }];
28529
+ let runningIndex = 0;
28530
+ const body = /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { role: "rowgroup", children: groups.map((group, gi) => /* @__PURE__ */ jsxRuntime.jsxs(React80__namespace.default.Fragment, { children: [
28531
+ group.label && /* @__PURE__ */ jsxRuntime.jsx(exports.Divider, { label: group.label, className: gi > 0 ? "mt-3" : "mt-0" }),
28532
+ group.items.map((row) => renderRow(row, runningIndex++))
28533
+ ] }, gi)) });
28534
+ return /* @__PURE__ */ jsxRuntime.jsxs(
28535
+ exports.Box,
28536
+ {
28537
+ role: "table",
28538
+ className: cn("w-full text-sm", className),
28539
+ children: [
28540
+ header,
28541
+ dnd.wrapContainer(body),
28542
+ hasMore && /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "flex justify-center py-3", children: /* @__PURE__ */ jsxRuntime.jsxs(exports.Button, { variant: "ghost", size: "sm", onClick: () => setVisibleCount((p2) => p2 + (pageSize || 5)), children: [
28543
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "chevron-down", size: "xs", className: "mr-1" }),
28544
+ t("common.showMore"),
28545
+ " (",
28546
+ ordered.length - visibleCount,
28547
+ " remaining)"
28548
+ ] }) })
28549
+ ]
28550
+ }
28551
+ );
28552
+ }
28553
+ var alignClass, weightClass, LOOKS;
28554
+ var init_TableView = __esm({
28555
+ "components/molecules/TableView.tsx"() {
28556
+ "use client";
28557
+ init_cn();
28558
+ init_getNestedValue();
28559
+ init_useEventBus();
28560
+ init_useTranslate();
28561
+ init_Box();
28562
+ init_Stack();
28563
+ init_Typography();
28564
+ init_Badge();
28565
+ init_Button();
28566
+ init_Icon();
28567
+ init_Checkbox();
28568
+ init_Divider();
28569
+ init_useDataDnd();
28570
+ logger.createLogger("almadar:ui:table-view");
28571
+ alignClass = {
28572
+ left: "justify-start text-left",
28573
+ center: "justify-center text-center",
28574
+ right: "justify-end text-right"
28575
+ };
28576
+ weightClass = {
28577
+ normal: "",
28578
+ medium: "font-medium",
28579
+ semibold: "font-semibold"
28580
+ };
28581
+ LOOKS = {
28582
+ dense: { rowPad: "px-3 py-2", headPad: "px-3 py-2", striped: false, divider: true },
28583
+ spacious: { rowPad: "px-5 py-4", headPad: "px-5 py-3", striped: false, divider: true },
28584
+ striped: { rowPad: "px-3 py-2", headPad: "px-3 py-2", striped: true, divider: false },
28585
+ borderless: { rowPad: "px-3 py-2", headPad: "px-3 py-2", striped: false, divider: false },
28586
+ bordered: { rowPad: "px-3 py-2", headPad: "px-3 py-2", striped: false, divider: true }
28587
+ };
28588
+ TableView.displayName = "TableView";
28589
+ }
28590
+ });
28286
28591
  function formatNumber(value, format) {
28287
28592
  if (value == null) return "0";
28288
28593
  const v = typeof value === "number" ? value : value;
@@ -33973,6 +34278,7 @@ var init_molecules = __esm({
33973
34278
  init_Lightbox();
33974
34279
  init_DataGrid();
33975
34280
  init_DataList();
34281
+ init_TableView();
33976
34282
  init_StatDisplay();
33977
34283
  init_Meter();
33978
34284
  init_SwipeableRow();
@@ -41435,7 +41741,7 @@ function VerifyModePanel({
41435
41741
  }
41436
41742
  prevCountRef.current = transitions.length;
41437
41743
  }, [transitions.length, expanded]);
41438
- const hudBottom = typeof document !== "undefined" ? document.getElementById("runtime-debugger-portal") ?? document.getElementById("slot-hud-bottom") : null;
41744
+ const hudBottom = typeof document !== "undefined" ? document.getElementById("runtime-debugger-portal") : null;
41439
41745
  const panel = /* @__PURE__ */ jsxRuntime.jsxs(
41440
41746
  "div",
41441
41747
  {
@@ -45974,6 +46280,7 @@ var init_component_registry_generated = __esm({
45974
46280
  init_Switch();
45975
46281
  init_TabbedContainer();
45976
46282
  init_Table();
46283
+ init_TableView();
45977
46284
  init_Tabs();
45978
46285
  init_TagCloud();
45979
46286
  init_TagInput();
@@ -46291,6 +46598,7 @@ var init_component_registry_generated = __esm({
46291
46598
  "Switch": exports.Switch,
46292
46599
  "TabbedContainer": exports.TabbedContainer,
46293
46600
  "Table": exports.Table,
46601
+ "TableView": TableView,
46294
46602
  "Tabs": exports.Tabs,
46295
46603
  "TagCloud": exports.TagCloud,
46296
46604
  "TagInput": exports.TagInput,
@@ -47407,7 +47715,7 @@ var FormActions = ({
47407
47715
  align = "right",
47408
47716
  className
47409
47717
  }) => {
47410
- const alignClass = {
47718
+ const alignClass2 = {
47411
47719
  left: "justify-start",
47412
47720
  right: "justify-end",
47413
47721
  between: "justify-between",
@@ -47420,7 +47728,7 @@ var FormActions = ({
47420
47728
  align: "center",
47421
47729
  className: cn(
47422
47730
  "pt-6 border-t border-border",
47423
- alignClass,
47731
+ alignClass2,
47424
47732
  sticky && "sticky bottom-0 bg-card py-4 -mx-6 px-6 shadow-[0_-4px_6px_-1px_rgb(0,0,0,0.05)]",
47425
47733
  className
47426
47734
  ),
@@ -50297,6 +50605,7 @@ exports.StateNode = StateNode2;
50297
50605
  exports.StatusBar = StatusBar;
50298
50606
  exports.StatusEffect = StatusEffect;
50299
50607
  exports.TERRAIN_COLORS = TERRAIN_COLORS;
50608
+ exports.TableView = TableView;
50300
50609
  exports.TerrainPalette = TerrainPalette;
50301
50610
  exports.TimeSlotCell = TimeSlotCell;
50302
50611
  exports.TimerDisplay = TimerDisplay;