@dimaan/ui 0.0.30 → 0.0.32

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 CHANGED
@@ -877,7 +877,7 @@ var badgeDotSizeClass = {
877
877
  md: "size-2"
878
878
  };
879
879
  var badgeBaseClass = "inline-flex shrink-0 items-center rounded-full border font-medium leading-none whitespace-nowrap select-none transition-colors";
880
- var Badge = forwardRef(function Badge2({ variant = "default", size = "md", tone = "solid", dot = false, className, children, ...props }, ref) {
880
+ var Badge = forwardRef(function Badge2({ variant = "default", size = "md", tone = "soft", dot = false, className, children, ...props }, ref) {
881
881
  const variantClass = tone === "soft" ? badgeSoftVariantClass[variant] : badgeVariantClass[variant];
882
882
  return /* @__PURE__ */ jsxs(
883
883
  "span",
@@ -1038,16 +1038,16 @@ var Checkbox = forwardRef(function Checkbox2({
1038
1038
 
1039
1039
  // src/components/date-picker/datePickerVariants.ts
1040
1040
  var datePickerTriggerVariantClass = {
1041
- default: "border border-input bg-background hover:border-ring",
1041
+ default: "border border-input bg-background shadow-xs hover:border-ring",
1042
1042
  filled: "border border-transparent bg-muted hover:bg-muted/80",
1043
1043
  ghost: "border border-transparent bg-transparent hover:bg-accent"
1044
1044
  };
1045
1045
  var datePickerTriggerSizeClass = {
1046
- sm: "h-8 rounded-md ps-2.5 pe-8 text-sm gap-1.5",
1047
- md: "h-9 rounded-md ps-3 pe-9 text-sm gap-2",
1048
- lg: "h-11 rounded-md ps-4 pe-10 text-base gap-2"
1046
+ sm: "h-8 rounded-lg ps-2.5 pe-8 text-sm gap-1.5",
1047
+ md: "h-10 rounded-lg ps-3 pe-9 text-sm gap-2",
1048
+ lg: "h-11 rounded-lg ps-4 pe-10 text-base gap-2"
1049
1049
  };
1050
- var datePickerTriggerBaseClass = "group/datepicker relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-visible:ring-[3px] focus-visible:ring-primary-glow aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-visible:ring-destructive/40 disabled:pointer-events-none disabled:opacity-50 cursor-pointer";
1050
+ var datePickerTriggerBaseClass = "group/datepicker relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary-glow aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-visible:border-destructive aria-[invalid=true]:focus-visible:ring-destructive/40 disabled:pointer-events-none disabled:opacity-50 cursor-pointer";
1051
1051
  var datePickerPlaceholderClass = "truncate text-muted-foreground";
1052
1052
  var datePickerValueClass = "truncate text-foreground";
1053
1053
  var datePickerContentClass = "z-50 overflow-hidden rounded-md border border-border bg-popover p-3 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95";
@@ -2102,16 +2102,16 @@ function FormPageSkeleton({ rowCount }) {
2102
2102
 
2103
2103
  // src/components/input/inputVariants.ts
2104
2104
  var inputVariantClass = {
2105
- default: "border border-input bg-background hover:border-ring",
2105
+ default: "border border-input bg-background shadow-xs hover:border-ring",
2106
2106
  filled: "border border-transparent bg-muted hover:bg-muted/80",
2107
2107
  ghost: "border border-transparent bg-transparent hover:bg-accent"
2108
2108
  };
2109
2109
  var inputSizeClass = {
2110
- sm: "h-8 rounded-md px-2.5 text-sm gap-1.5",
2111
- md: "h-9 rounded-md px-3 text-sm gap-2",
2112
- lg: "h-11 rounded-md px-4 text-base gap-2.5"
2110
+ sm: "h-8 rounded-lg px-2.5 text-sm gap-1.5",
2111
+ md: "h-10 rounded-lg px-3 text-sm gap-2",
2112
+ lg: "h-11 rounded-lg px-4 text-base gap-2.5"
2113
2113
  };
2114
- var inputBaseClass = "group/input relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-within:ring-[3px] focus-within:ring-primary-glow aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-within:ring-destructive/40 has-[input:disabled]:pointer-events-none has-[input:disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0";
2114
+ var inputBaseClass = "group/input relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-within:border-primary focus-within:ring-[3px] focus-within:ring-primary-glow aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-within:border-destructive aria-[invalid=true]:focus-within:ring-destructive/40 has-[input:disabled]:pointer-events-none has-[input:disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0";
2115
2115
  var Input = forwardRef(function Input2({
2116
2116
  variant = "default",
2117
2117
  inputSize = "md",
@@ -2293,9 +2293,9 @@ function Pagination({
2293
2293
  children: isRtl ? /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true", className: "size-3.5" }) : /* @__PURE__ */ jsx(ChevronLeft, { "aria-hidden": "true", className: "size-3.5" })
2294
2294
  }
2295
2295
  ),
2296
- /* @__PURE__ */ jsxs("span", { className: "px-1 text-foreground", children: [
2297
- pageIndex + 1,
2298
- " / ",
2296
+ /* @__PURE__ */ jsx("span", { className: "inline-flex min-w-7 items-center justify-center rounded-lg bg-gradient-table px-2.5 py-0.5 text-xs font-semibold text-white", children: pageIndex + 1 }),
2297
+ /* @__PURE__ */ jsxs("span", { className: "px-0.5 text-muted-foreground", children: [
2298
+ "/ ",
2299
2299
  pageCount
2300
2300
  ] }),
2301
2301
  /* @__PURE__ */ jsx(
@@ -2320,7 +2320,7 @@ function Toolbar({ count, onClear, renderLabel, clearLabel, children }) {
2320
2320
  {
2321
2321
  role: "toolbar",
2322
2322
  "aria-label": "Bulk actions",
2323
- className: "flex flex-wrap items-center gap-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-sm",
2323
+ className: "flex flex-wrap items-center gap-3 rounded-xl border border-border bg-muted/50 px-3.5 py-2.5 text-sm shadow-[var(--shadow-xs)]",
2324
2324
  children: [
2325
2325
  /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: renderLabel ? renderLabel(count) : `${count} selected` }),
2326
2326
  /* @__PURE__ */ jsxs("div", { className: "ms-auto flex flex-wrap items-center gap-2", children: [
@@ -2336,18 +2336,18 @@ function Toolbar({ count, onClear, renderLabel, clearLabel, children }) {
2336
2336
  var tableSizeClass = {
2337
2337
  sm: {
2338
2338
  row: "",
2339
- cell: "px-3 py-1.5 text-xs tabular-nums",
2340
- head: "whitespace-nowrap px-3 py-2 text-xs font-medium"
2339
+ cell: "px-3 py-2 text-xs tabular-nums",
2340
+ head: "whitespace-nowrap px-3 py-3 text-[11px] font-semibold uppercase tracking-wider"
2341
2341
  },
2342
2342
  md: {
2343
2343
  row: "",
2344
- cell: "px-4 py-2.5 text-sm tabular-nums",
2345
- head: "whitespace-nowrap px-4 py-2.5 text-xs font-medium uppercase tracking-wide"
2344
+ cell: "px-4 py-3.5 text-sm tabular-nums",
2345
+ head: "whitespace-nowrap px-4 py-4 text-xs font-semibold uppercase tracking-wider"
2346
2346
  },
2347
2347
  lg: {
2348
2348
  row: "",
2349
- cell: "px-5 py-3.5 text-sm tabular-nums",
2350
- head: "whitespace-nowrap px-5 py-3 text-sm font-medium"
2349
+ cell: "px-6 py-4 text-sm tabular-nums",
2350
+ head: "whitespace-nowrap px-6 py-5 text-[13px] font-semibold uppercase tracking-wider"
2351
2351
  }
2352
2352
  };
2353
2353
  var tableBaseClass = "w-full caption-bottom border-collapse";
@@ -2404,6 +2404,7 @@ function Table(props) {
2404
2404
  maxHeight,
2405
2405
  striped = false,
2406
2406
  onRowClick,
2407
+ getRowAccent,
2407
2408
  tableRef,
2408
2409
  pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,
2409
2410
  showPagination,
@@ -2475,166 +2476,196 @@ function Table(props) {
2475
2476
  children: bulkActions(selectedRowsInData)
2476
2477
  }
2477
2478
  ),
2478
- /* @__PURE__ */ jsx(
2479
+ /* @__PURE__ */ jsxs(
2479
2480
  "div",
2480
2481
  {
2481
- className: cn(
2482
- "overflow-x-auto rounded-xl border border-border bg-card shadow-[var(--shadow-card)]",
2483
- maxHeight !== void 0 && "overflow-y-auto"
2484
- ),
2485
- style: maxHeight !== void 0 ? { maxHeight } : void 0,
2486
- children: /* @__PURE__ */ jsxs(
2487
- "table",
2488
- {
2489
- ref: tableRef,
2490
- "aria-label": ariaLabel,
2491
- "aria-labelledby": ariaLabelledBy,
2492
- "aria-rowcount": totalRowCount,
2493
- className: cn(tableBaseClass, "text-sm text-foreground", tableClassName),
2494
- children: [
2495
- caption ? /* @__PURE__ */ jsx("caption", { className: "sr-only", children: caption }) : null,
2496
- /* @__PURE__ */ jsx(
2497
- "thead",
2482
+ "data-testid": "table-card",
2483
+ className: "overflow-hidden rounded-xl border border-border bg-card shadow-[var(--shadow-card)]",
2484
+ children: [
2485
+ /* @__PURE__ */ jsx(
2486
+ "div",
2487
+ {
2488
+ className: cn("overflow-x-auto", maxHeight !== void 0 && "overflow-y-auto"),
2489
+ style: maxHeight !== void 0 ? { maxHeight } : void 0,
2490
+ children: /* @__PURE__ */ jsxs(
2491
+ "table",
2498
2492
  {
2499
- className: cn(
2500
- // Clean opaque header (so a sticky header fully hides the rows
2501
- // scrolling underneath it) with a hairline bottom rule drawn via an
2502
- // inset shadow — it stays attached to the sticky header instead of
2503
- // collapsing into the first row's border.
2504
- "bg-card text-muted-foreground shadow-[inset_0_-1px_0_var(--color-border)]",
2505
- maxHeight !== void 0 && "sticky top-0 z-10"
2506
- ),
2507
- children: /* @__PURE__ */ jsxs("tr", { children: [
2508
- enableRowSelection ? /* @__PURE__ */ jsx("th", { scope: "col", className: cn("w-10", sizeClasses.head), children: /* @__PURE__ */ jsx(
2509
- Checkbox,
2493
+ ref: tableRef,
2494
+ "aria-label": ariaLabel,
2495
+ "aria-labelledby": ariaLabelledBy,
2496
+ "aria-rowcount": totalRowCount,
2497
+ className: cn(tableBaseClass, "text-sm text-foreground", tableClassName),
2498
+ children: [
2499
+ caption ? /* @__PURE__ */ jsx("caption", { className: "sr-only", children: caption }) : null,
2500
+ /* @__PURE__ */ jsx(
2501
+ "thead",
2510
2502
  {
2511
- "aria-label": "Select all rows on this page",
2512
- checked: allOnPageSelected,
2513
- indeterminate: someOnPageSelected,
2514
- disabled: selectableRowIds.length === 0,
2515
- onCheckedChange: toggleHeader
2516
- }
2517
- ) }) : null,
2518
- columns.map((column) => {
2519
- const isSorted = effectiveSort.columnId === column.id;
2520
- const ariaSort = isSorted ? effectiveSort.direction === "asc" ? "ascending" : "descending" : "none";
2521
- return /* @__PURE__ */ jsx(
2522
- "th",
2523
- {
2524
- scope: "col",
2525
- "aria-sort": column.sortable ? ariaSort : void 0,
2526
- className: cn(
2527
- sizeClasses.head,
2528
- alignClass[column.align ?? "start"],
2529
- column.className
2530
- ),
2531
- children: column.sortable ? /* @__PURE__ */ jsxs(
2532
- "button",
2503
+ className: cn(
2504
+ // Faint opaque teal header tint (--color-panel-header, shared with the
2505
+ // list-page filter panel) + a 2px teal bottom rule. The rule is an inset
2506
+ // shadow so it stays attached to a sticky header instead of collapsing
2507
+ // into the first row's border; the tint is opaque (mixed into
2508
+ // --color-card) so a sticky header fully hides the rows underneath.
2509
+ "bg-panel-header text-muted-foreground shadow-[inset_0_-2px_0_var(--color-primary)]",
2510
+ maxHeight !== void 0 && "sticky top-0 z-10"
2511
+ ),
2512
+ children: /* @__PURE__ */ jsxs("tr", { children: [
2513
+ enableRowSelection ? /* @__PURE__ */ jsx("th", { scope: "col", className: cn("w-10", sizeClasses.head), children: /* @__PURE__ */ jsx(
2514
+ Checkbox,
2533
2515
  {
2534
- type: "button",
2535
- onClick: () => handleSortClick(column.id),
2536
- className: "inline-flex items-center gap-1.5 font-inherit uppercase tracking-inherit text-inherit hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background",
2537
- "aria-label": sortAriaLabel(column, effectiveSort),
2538
- children: [
2539
- /* @__PURE__ */ jsx("span", { children: renderHeader(column.header) }),
2540
- /* @__PURE__ */ jsx(
2541
- SortIndicator,
2516
+ "aria-label": "Select all rows on this page",
2517
+ checked: allOnPageSelected,
2518
+ indeterminate: someOnPageSelected,
2519
+ disabled: selectableRowIds.length === 0,
2520
+ onCheckedChange: toggleHeader
2521
+ }
2522
+ ) }) : null,
2523
+ columns.map((column) => {
2524
+ const isSorted = effectiveSort.columnId === column.id;
2525
+ const ariaSort = isSorted ? effectiveSort.direction === "asc" ? "ascending" : "descending" : "none";
2526
+ return /* @__PURE__ */ jsx(
2527
+ "th",
2528
+ {
2529
+ scope: "col",
2530
+ "aria-sort": column.sortable ? ariaSort : void 0,
2531
+ className: cn(
2532
+ sizeClasses.head,
2533
+ alignClass[column.align ?? "start"],
2534
+ column.className,
2535
+ isSorted && "text-primary"
2536
+ ),
2537
+ children: column.sortable ? /* @__PURE__ */ jsxs(
2538
+ "button",
2542
2539
  {
2543
- active: isSorted,
2544
- direction: isSorted ? effectiveSort.direction : null
2540
+ type: "button",
2541
+ onClick: () => handleSortClick(column.id),
2542
+ className: "inline-flex items-center gap-1.5 font-inherit uppercase tracking-inherit text-inherit hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background",
2543
+ "aria-label": sortAriaLabel(column, effectiveSort),
2544
+ children: [
2545
+ /* @__PURE__ */ jsx("span", { children: renderHeader(column.header) }),
2546
+ /* @__PURE__ */ jsx(
2547
+ SortIndicator,
2548
+ {
2549
+ active: isSorted,
2550
+ direction: isSorted ? effectiveSort.direction : null
2551
+ }
2552
+ )
2553
+ ]
2545
2554
  }
2546
- )
2547
- ]
2548
- }
2549
- ) : renderHeader(column.header)
2550
- },
2551
- column.id
2552
- );
2553
- })
2554
- ] })
2555
- }
2556
- ),
2557
- /* @__PURE__ */ jsx("tbody", { children: loading ? /* @__PURE__ */ jsx(
2558
- SkeletonRows,
2559
- {
2560
- rowCount: skeletonCount,
2561
- columnCount: totalColumnCount,
2562
- cellClassName: sizeClasses.cell
2563
- }
2564
- ) : data.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
2565
- "td",
2566
- {
2567
- colSpan: totalColumnCount,
2568
- className: cn(sizeClasses.cell, "py-10 text-center text-muted-foreground"),
2569
- children: emptyState ?? "No data"
2570
- }
2571
- ) }) : data.map((row, rowIndex) => {
2572
- const id = getRowId(row, rowIndex);
2573
- const isSelected = selected.has(id);
2574
- const rowSelectable = isRowSelectable ? isRowSelectable(row) : true;
2575
- return /* @__PURE__ */ jsxs(
2576
- "tr",
2577
- {
2578
- "data-selected": isSelected ? "true" : void 0,
2579
- "aria-selected": enableRowSelection ? isSelected : void 0,
2580
- className: cn(
2581
- "border-t border-border/60 first:border-t-0 transition-colors",
2582
- "hover:bg-primary/5",
2583
- striped && rowIndex % 2 === 1 && "bg-muted/20",
2584
- isSelected && selectedRowClass,
2585
- onRowClick && "cursor-pointer"
2555
+ ) : renderHeader(column.header)
2556
+ },
2557
+ column.id
2558
+ );
2559
+ })
2560
+ ] })
2561
+ }
2586
2562
  ),
2587
- onClick: onRowClick ? () => onRowClick(row, rowIndex) : void 0,
2588
- children: [
2589
- enableRowSelection ? /* @__PURE__ */ jsx("td", { className: cn(sizeClasses.cell, "w-10"), children: /* @__PURE__ */ jsx(
2590
- Checkbox,
2591
- {
2592
- "aria-label": `Select row ${rowIndex + 1}`,
2593
- checked: isSelected,
2594
- disabled: !rowSelectable,
2595
- onCheckedChange: (next) => toggleRow(id, next),
2596
- onClick: stopRowClickPropagation
2597
- }
2598
- ) }) : null,
2599
- columns.map((column) => /* @__PURE__ */ jsx(
2600
- "td",
2563
+ /* @__PURE__ */ jsx("tbody", { children: loading ? /* @__PURE__ */ jsx(
2564
+ SkeletonRows,
2565
+ {
2566
+ rowCount: skeletonCount,
2567
+ columnCount: totalColumnCount,
2568
+ cellClassName: sizeClasses.cell
2569
+ }
2570
+ ) : data.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
2571
+ "td",
2572
+ {
2573
+ colSpan: totalColumnCount,
2574
+ className: cn(sizeClasses.cell, "py-10 text-center text-muted-foreground"),
2575
+ children: emptyState ?? "No data"
2576
+ }
2577
+ ) }) : data.map((row, rowIndex) => {
2578
+ const id = getRowId(row, rowIndex);
2579
+ const isSelected = selected.has(id);
2580
+ const rowSelectable = isRowSelectable ? isRowSelectable(row) : true;
2581
+ const accent = getRowAccent?.(row, rowIndex);
2582
+ return /* @__PURE__ */ jsxs(
2583
+ "tr",
2601
2584
  {
2585
+ "data-selected": isSelected ? "true" : void 0,
2586
+ "aria-selected": enableRowSelection ? isSelected : void 0,
2602
2587
  className: cn(
2603
- sizeClasses.cell,
2604
- alignClass[column.align ?? "start"],
2605
- column.className
2588
+ "border-b border-border/60 last:border-b-0 transition-colors",
2589
+ "hover:bg-muted/60",
2590
+ striped && rowIndex % 2 === 1 && "bg-muted/20",
2591
+ isSelected && selectedRowClass,
2592
+ onRowClick && "cursor-pointer"
2606
2593
  ),
2607
- children: renderCell(column, row, rowIndex)
2594
+ onClick: onRowClick ? () => onRowClick(row, rowIndex) : void 0,
2595
+ children: [
2596
+ enableRowSelection ? /* @__PURE__ */ jsxs("td", { className: cn(sizeClasses.cell, "relative w-10"), children: [
2597
+ accent ? /* @__PURE__ */ jsx(RowAccent, { color: accent }) : null,
2598
+ /* @__PURE__ */ jsx(
2599
+ Checkbox,
2600
+ {
2601
+ "aria-label": `Select row ${rowIndex + 1}`,
2602
+ checked: isSelected,
2603
+ disabled: !rowSelectable,
2604
+ onCheckedChange: (next) => toggleRow(id, next),
2605
+ onClick: stopRowClickPropagation
2606
+ }
2607
+ )
2608
+ ] }) : null,
2609
+ columns.map((column, colIndex) => {
2610
+ const isFirst = colIndex === 0 && !enableRowSelection;
2611
+ return /* @__PURE__ */ jsxs(
2612
+ "td",
2613
+ {
2614
+ className: cn(
2615
+ sizeClasses.cell,
2616
+ alignClass[column.align ?? "start"],
2617
+ column.className,
2618
+ isFirst && "relative"
2619
+ ),
2620
+ children: [
2621
+ isFirst && accent ? /* @__PURE__ */ jsx(RowAccent, { color: accent }) : null,
2622
+ renderCell(column, row, rowIndex)
2623
+ ]
2624
+ },
2625
+ column.id
2626
+ );
2627
+ })
2628
+ ]
2608
2629
  },
2609
- column.id
2610
- ))
2611
- ]
2612
- },
2613
- id
2614
- );
2615
- }) })
2616
- ]
2617
- }
2618
- )
2619
- }
2620
- ),
2621
- paginationVisible ? /* @__PURE__ */ jsx(
2622
- Pagination,
2623
- {
2624
- pageIndex,
2625
- pageSize,
2626
- pageCount,
2627
- totalRowCount,
2628
- pageSizeOptions,
2629
- onChange: handlePaginationChange,
2630
- labels
2630
+ id
2631
+ );
2632
+ }) })
2633
+ ]
2634
+ }
2635
+ )
2636
+ }
2637
+ ),
2638
+ paginationVisible ? /* @__PURE__ */ jsx("div", { className: "border-t border-border px-4 py-3", children: /* @__PURE__ */ jsx(
2639
+ Pagination,
2640
+ {
2641
+ pageIndex,
2642
+ pageSize,
2643
+ pageCount,
2644
+ totalRowCount,
2645
+ pageSizeOptions,
2646
+ onChange: handlePaginationChange,
2647
+ labels
2648
+ }
2649
+ ) }) : null
2650
+ ]
2631
2651
  }
2632
- ) : null
2652
+ )
2633
2653
  ] });
2634
2654
  }
2635
2655
  function renderHeader(header) {
2636
2656
  return typeof header === "function" ? header() : header;
2637
2657
  }
2658
+ function RowAccent({ color }) {
2659
+ return /* @__PURE__ */ jsx(
2660
+ "span",
2661
+ {
2662
+ "aria-hidden": "true",
2663
+ "data-testid": "row-accent",
2664
+ className: "pointer-events-none absolute inset-y-1 start-0 w-[3px] rounded-full",
2665
+ style: { background: color }
2666
+ }
2667
+ );
2668
+ }
2638
2669
  function renderCell(column, row, rowIndex) {
2639
2670
  if (column.render) return column.render(row, rowIndex);
2640
2671
  if (column.accessor !== void 0) {
@@ -2659,26 +2690,34 @@ function stopRowClickPropagation(event) {
2659
2690
  function SkeletonRows({ rowCount, columnCount, cellClassName }) {
2660
2691
  const rowKeys = Array.from({ length: Math.max(0, rowCount) }, (_, i) => `skeleton-row-${i}`);
2661
2692
  const colKeys = Array.from({ length: Math.max(1, columnCount) }, (_, i) => `skeleton-col-${i}`);
2662
- return /* @__PURE__ */ jsx(Fragment, { children: rowKeys.map((rowKey) => /* @__PURE__ */ jsx("tr", { className: "border-t border-border", "data-testid": "table-skeleton-row", children: colKeys.map((colKey) => /* @__PURE__ */ jsx("td", { className: cellClassName, children: /* @__PURE__ */ jsx("span", { className: "block h-3 w-full animate-pulse rounded bg-muted" }) }, `${rowKey}-${colKey}`)) }, rowKey)) });
2693
+ return /* @__PURE__ */ jsx(Fragment, { children: rowKeys.map((rowKey) => /* @__PURE__ */ jsx(
2694
+ "tr",
2695
+ {
2696
+ className: "border-b border-border/60 last:border-b-0",
2697
+ "data-testid": "table-skeleton-row",
2698
+ children: colKeys.map((colKey) => /* @__PURE__ */ jsx("td", { className: cellClassName, children: /* @__PURE__ */ jsx("span", { className: "block h-3 w-full animate-pulse rounded bg-muted" }) }, `${rowKey}-${colKey}`))
2699
+ },
2700
+ rowKey
2701
+ )) });
2663
2702
  }
2664
2703
  function SortIndicator({ active, direction }) {
2665
- const className = cn("size-3.5 shrink-0", active ? "text-foreground" : "text-muted-foreground");
2704
+ const className = cn("size-3.5 shrink-0", active ? "text-primary" : "text-muted-foreground");
2666
2705
  if (!active) return /* @__PURE__ */ jsx(ChevronsUpDown, { "aria-hidden": "true", className });
2667
2706
  return direction === "asc" ? /* @__PURE__ */ jsx(ChevronUp, { "aria-hidden": "true", className }) : /* @__PURE__ */ jsx(ChevronDown, { "aria-hidden": "true", className });
2668
2707
  }
2669
2708
 
2670
2709
  // src/components/select/selectVariants.ts
2671
2710
  var selectVariantClass = {
2672
- default: "border border-input bg-background hover:border-ring",
2711
+ default: "border border-input bg-background shadow-xs hover:border-ring",
2673
2712
  filled: "border border-transparent bg-muted hover:bg-muted/80",
2674
2713
  ghost: "border border-transparent bg-transparent hover:bg-accent"
2675
2714
  };
2676
2715
  var selectSizeClass = {
2677
- sm: "h-8 rounded-md ps-2.5 pe-8 text-sm",
2678
- md: "h-9 rounded-md ps-3 pe-9 text-sm",
2679
- lg: "h-11 rounded-md ps-4 pe-10 text-base"
2716
+ sm: "h-8 rounded-lg ps-2.5 pe-8 text-sm",
2717
+ md: "h-10 rounded-lg ps-3 pe-9 text-sm",
2718
+ lg: "h-11 rounded-lg ps-4 pe-10 text-base"
2680
2719
  };
2681
- var selectBaseClass = "group/select relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus:ring-[3px] focus:ring-primary-glow aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:ring-destructive/40 disabled:pointer-events-none disabled:opacity-50 cursor-pointer data-[placeholder]:text-muted-foreground";
2720
+ var selectBaseClass = "group/select relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus:border-primary focus:ring-[3px] focus:ring-primary-glow aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:border-destructive aria-[invalid=true]:focus:ring-destructive/40 disabled:pointer-events-none disabled:opacity-50 cursor-pointer data-[placeholder]:text-muted-foreground";
2682
2721
  var selectContentClass = "z-50 max-h-(--radix-select-content-available-height) min-w-(--radix-select-trigger-width) overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95";
2683
2722
  var selectViewportClass = "p-1";
2684
2723
  var selectItemClass = "relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
@@ -2689,9 +2728,9 @@ var selectStatusClass = "flex items-center justify-center gap-2 px-2 py-6 text-c
2689
2728
 
2690
2729
  // src/components/multi-select/multiSelectVariants.ts
2691
2730
  var multiSelectTriggerSizeClass = {
2692
- sm: "min-h-8 rounded-md ps-2.5 pe-8 py-1 text-sm",
2693
- md: "min-h-9 rounded-md ps-3 pe-9 py-1 text-sm",
2694
- lg: "min-h-11 rounded-md ps-4 pe-10 py-1.5 text-base"
2731
+ sm: "min-h-8 rounded-lg ps-2.5 pe-8 py-1 text-sm",
2732
+ md: "min-h-10 rounded-lg ps-3 pe-9 py-1 text-sm",
2733
+ lg: "min-h-11 rounded-lg ps-4 pe-10 py-1.5 text-base"
2695
2734
  };
2696
2735
  var multiSelectValueRowClass = "flex min-w-0 flex-1 flex-wrap items-center gap-1";
2697
2736
  var multiSelectChipClass = "max-w-full gap-1 pe-1";
@@ -3164,7 +3203,7 @@ function ListPageFilterBar({
3164
3203
  },
3165
3204
  filter.key
3166
3205
  )) });
3167
- const header = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-b border-border bg-primary/5 px-4 py-3", children: [
3206
+ const header = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-b-2 border-primary bg-panel-header px-4 py-3", children: [
3168
3207
  /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-foreground", children: labels.title ?? "Filters" }),
3169
3208
  activeCount > 0 ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center rounded-full bg-primary/10 px-2 py-0.5 text-xs font-semibold text-primary", children: [
3170
3209
  activeCount,
@@ -3176,7 +3215,7 @@ function ListPageFilterBar({
3176
3215
  labels.reset
3177
3216
  ] }) : null
3178
3217
  ] });
3179
- const cardClass = "overflow-hidden rounded-xl border border-border bg-card";
3218
+ const cardClass = "overflow-hidden rounded-xl border border-border bg-card shadow-[var(--shadow-card)]";
3180
3219
  if (manual) {
3181
3220
  return /* @__PURE__ */ jsxs("form", { "data-slot": "list-page-filter-bar", className: cardClass, onSubmit: apply, children: [
3182
3221
  header,
@@ -3660,14 +3699,14 @@ var Switch = forwardRef(function Switch2({
3660
3699
 
3661
3700
  // src/components/textarea/textareaVariants.ts
3662
3701
  var textareaVariantClass = {
3663
- default: "border border-input bg-background hover:border-ring",
3702
+ default: "border border-input bg-background shadow-xs hover:border-ring",
3664
3703
  filled: "border border-transparent bg-muted hover:bg-muted/80",
3665
3704
  ghost: "border border-transparent bg-transparent hover:bg-accent"
3666
3705
  };
3667
3706
  var textareaSizeClass = {
3668
- sm: "rounded-md px-2.5 py-1.5 text-sm",
3669
- md: "rounded-md px-3 py-2 text-sm",
3670
- lg: "rounded-md px-4 py-2.5 text-base"
3707
+ sm: "rounded-lg px-2.5 py-1.5 text-sm",
3708
+ md: "rounded-lg px-3 py-2 text-sm",
3709
+ lg: "rounded-lg px-4 py-2.5 text-base"
3671
3710
  };
3672
3711
  var textareaResizeClass = {
3673
3712
  none: "resize-none",
@@ -3675,7 +3714,7 @@ var textareaResizeClass = {
3675
3714
  horizontal: "resize-x",
3676
3715
  both: "resize"
3677
3716
  };
3678
- var textareaBaseClass = "group/textarea relative flex w-full text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-within:ring-[3px] focus-within:ring-primary-glow aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-within:ring-destructive/40 has-[textarea:disabled]:pointer-events-none has-[textarea:disabled]:opacity-50";
3717
+ var textareaBaseClass = "group/textarea relative flex w-full text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-within:border-primary focus-within:ring-[3px] focus-within:ring-primary-glow aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-within:border-destructive aria-[invalid=true]:focus-within:ring-destructive/40 has-[textarea:disabled]:pointer-events-none has-[textarea:disabled]:opacity-50";
3679
3718
  var Textarea = forwardRef(function Textarea2({
3680
3719
  variant = "default",
3681
3720
  textareaSize = "md",