@dimaan/ui 0.0.31 → 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.d.cts CHANGED
@@ -535,7 +535,7 @@ declare const datePickerTriggerVariantClass: Record<DatePickerVariant, string>;
535
535
  * Logical properties keep RTL working free.
536
536
  */
537
537
  declare const datePickerTriggerSizeClass: Record<DatePickerSize, string>;
538
- declare const 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";
538
+ declare const 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";
539
539
  /** Empty-state trigger text (placeholder color). */
540
540
  declare const datePickerPlaceholderClass = "truncate text-muted-foreground";
541
541
  /** Filled-state trigger text. */
@@ -1374,7 +1374,7 @@ type InputVariant = 'default' | 'filled' | 'ghost';
1374
1374
  type InputSize = 'sm' | 'md' | 'lg';
1375
1375
  declare const inputVariantClass: Record<InputVariant, string>;
1376
1376
  declare const inputSizeClass: Record<InputSize, string>;
1377
- declare const 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";
1377
+ declare const 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";
1378
1378
 
1379
1379
  interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {
1380
1380
  variant?: InputVariant;
@@ -1602,7 +1602,7 @@ declare const selectVariantClass: Record<SelectVariant, string>;
1602
1602
  * properties keep RTL working free.
1603
1603
  */
1604
1604
  declare const selectSizeClass: Record<SelectSize, string>;
1605
- declare const 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";
1605
+ declare const 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";
1606
1606
 
1607
1607
  interface SelectOption {
1608
1608
  value: string;
@@ -2431,7 +2431,7 @@ type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';
2431
2431
  declare const textareaVariantClass: Record<TextareaVariant, string>;
2432
2432
  declare const textareaSizeClass: Record<TextareaSize, string>;
2433
2433
  declare const textareaResizeClass: Record<TextareaResize, string>;
2434
- declare const 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";
2434
+ declare const 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";
2435
2435
 
2436
2436
  interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {
2437
2437
  variant?: TextareaVariant;
package/dist/index.d.ts CHANGED
@@ -535,7 +535,7 @@ declare const datePickerTriggerVariantClass: Record<DatePickerVariant, string>;
535
535
  * Logical properties keep RTL working free.
536
536
  */
537
537
  declare const datePickerTriggerSizeClass: Record<DatePickerSize, string>;
538
- declare const 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";
538
+ declare const 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";
539
539
  /** Empty-state trigger text (placeholder color). */
540
540
  declare const datePickerPlaceholderClass = "truncate text-muted-foreground";
541
541
  /** Filled-state trigger text. */
@@ -1374,7 +1374,7 @@ type InputVariant = 'default' | 'filled' | 'ghost';
1374
1374
  type InputSize = 'sm' | 'md' | 'lg';
1375
1375
  declare const inputVariantClass: Record<InputVariant, string>;
1376
1376
  declare const inputSizeClass: Record<InputSize, string>;
1377
- declare const 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";
1377
+ declare const 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";
1378
1378
 
1379
1379
  interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {
1380
1380
  variant?: InputVariant;
@@ -1602,7 +1602,7 @@ declare const selectVariantClass: Record<SelectVariant, string>;
1602
1602
  * properties keep RTL working free.
1603
1603
  */
1604
1604
  declare const selectSizeClass: Record<SelectSize, string>;
1605
- declare const 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";
1605
+ declare const 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";
1606
1606
 
1607
1607
  interface SelectOption {
1608
1608
  value: string;
@@ -2431,7 +2431,7 @@ type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';
2431
2431
  declare const textareaVariantClass: Record<TextareaVariant, string>;
2432
2432
  declare const textareaSizeClass: Record<TextareaSize, string>;
2433
2433
  declare const textareaResizeClass: Record<TextareaResize, string>;
2434
- declare const 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";
2434
+ declare const 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";
2435
2435
 
2436
2436
  interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {
2437
2437
  variant?: TextareaVariant;
package/dist/index.js CHANGED
@@ -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",
@@ -2476,182 +2476,180 @@ function Table(props) {
2476
2476
  children: bulkActions(selectedRowsInData)
2477
2477
  }
2478
2478
  ),
2479
- /* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden rounded-xl border border-border bg-card shadow-[var(--shadow-card)]", children: [
2480
- /* @__PURE__ */ jsx(
2481
- "span",
2482
- {
2483
- "aria-hidden": "true",
2484
- "data-testid": "table-accent",
2485
- className: "pointer-events-none absolute inset-x-0 top-0 z-20 h-[3px] bg-gradient-table"
2486
- }
2487
- ),
2488
- /* @__PURE__ */ jsx(
2489
- "div",
2490
- {
2491
- className: cn("overflow-x-auto", maxHeight !== void 0 && "overflow-y-auto"),
2492
- style: maxHeight !== void 0 ? { maxHeight } : void 0,
2493
- children: /* @__PURE__ */ jsxs(
2494
- "table",
2479
+ /* @__PURE__ */ jsxs(
2480
+ "div",
2481
+ {
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",
2495
2487
  {
2496
- ref: tableRef,
2497
- "aria-label": ariaLabel,
2498
- "aria-labelledby": ariaLabelledBy,
2499
- "aria-rowcount": totalRowCount,
2500
- className: cn(tableBaseClass, "text-sm text-foreground", tableClassName),
2501
- children: [
2502
- caption ? /* @__PURE__ */ jsx("caption", { className: "sr-only", children: caption }) : null,
2503
- /* @__PURE__ */ jsx(
2504
- "thead",
2505
- {
2506
- className: cn(
2507
- // Clean opaque header (so a sticky header fully hides the rows
2508
- // scrolling underneath it) with a hairline bottom rule drawn via an
2509
- // inset shadow — it stays attached to the sticky header instead of
2510
- // collapsing into the first row's border.
2511
- // Opaque header background so a sticky header fully hides the rows
2512
- // scrolling underneath it (a translucent tint would let them bleed through).
2513
- "bg-muted text-muted-foreground shadow-[inset_0_-1px_0_var(--color-border)]",
2514
- maxHeight !== void 0 && "sticky top-0 z-10"
2515
- ),
2516
- children: /* @__PURE__ */ jsxs("tr", { children: [
2517
- enableRowSelection ? /* @__PURE__ */ jsx("th", { scope: "col", className: cn("w-10", sizeClasses.head), children: /* @__PURE__ */ jsx(
2518
- Checkbox,
2519
- {
2520
- "aria-label": "Select all rows on this page",
2521
- checked: allOnPageSelected,
2522
- indeterminate: someOnPageSelected,
2523
- disabled: selectableRowIds.length === 0,
2524
- onCheckedChange: toggleHeader
2525
- }
2526
- ) }) : null,
2527
- columns.map((column) => {
2528
- const isSorted = effectiveSort.columnId === column.id;
2529
- const ariaSort = isSorted ? effectiveSort.direction === "asc" ? "ascending" : "descending" : "none";
2530
- return /* @__PURE__ */ jsx(
2531
- "th",
2532
- {
2533
- scope: "col",
2534
- "aria-sort": column.sortable ? ariaSort : void 0,
2535
- className: cn(
2536
- sizeClasses.head,
2537
- alignClass[column.align ?? "start"],
2538
- column.className,
2539
- isSorted && "text-primary"
2540
- ),
2541
- children: column.sortable ? /* @__PURE__ */ jsxs(
2542
- "button",
2543
- {
2544
- type: "button",
2545
- onClick: () => handleSortClick(column.id),
2546
- 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",
2547
- "aria-label": sortAriaLabel(column, effectiveSort),
2548
- children: [
2549
- /* @__PURE__ */ jsx("span", { children: renderHeader(column.header) }),
2550
- /* @__PURE__ */ jsx(
2551
- SortIndicator,
2552
- {
2553
- active: isSorted,
2554
- direction: isSorted ? effectiveSort.direction : null
2555
- }
2556
- )
2557
- ]
2558
- }
2559
- ) : renderHeader(column.header)
2560
- },
2561
- column.id
2562
- );
2563
- })
2564
- ] })
2565
- }
2566
- ),
2567
- /* @__PURE__ */ jsx("tbody", { children: loading ? /* @__PURE__ */ jsx(
2568
- SkeletonRows,
2569
- {
2570
- rowCount: skeletonCount,
2571
- columnCount: totalColumnCount,
2572
- cellClassName: sizeClasses.cell
2573
- }
2574
- ) : data.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
2575
- "td",
2576
- {
2577
- colSpan: totalColumnCount,
2578
- className: cn(sizeClasses.cell, "py-10 text-center text-muted-foreground"),
2579
- children: emptyState ?? "No data"
2580
- }
2581
- ) }) : data.map((row, rowIndex) => {
2582
- const id = getRowId(row, rowIndex);
2583
- const isSelected = selected.has(id);
2584
- const rowSelectable = isRowSelectable ? isRowSelectable(row) : true;
2585
- const accent = getRowAccent?.(row, rowIndex);
2586
- return /* @__PURE__ */ jsxs(
2587
- "tr",
2588
- {
2589
- "data-selected": isSelected ? "true" : void 0,
2590
- "aria-selected": enableRowSelection ? isSelected : void 0,
2591
- className: cn(
2592
- "border-b border-border/60 last:border-b-0 transition-colors",
2593
- "hover:bg-muted/60",
2594
- striped && rowIndex % 2 === 1 && "bg-muted/20",
2595
- isSelected && selectedRowClass,
2596
- onRowClick && "cursor-pointer"
2597
- ),
2598
- onClick: onRowClick ? () => onRowClick(row, rowIndex) : void 0,
2599
- children: [
2600
- enableRowSelection ? /* @__PURE__ */ jsxs("td", { className: cn(sizeClasses.cell, "relative w-10"), children: [
2601
- accent ? /* @__PURE__ */ jsx(RowAccent, { color: accent }) : null,
2602
- /* @__PURE__ */ jsx(
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",
2492
+ {
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",
2502
+ {
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(
2603
2514
  Checkbox,
2604
2515
  {
2605
- "aria-label": `Select row ${rowIndex + 1}`,
2606
- checked: isSelected,
2607
- disabled: !rowSelectable,
2608
- onCheckedChange: (next) => toggleRow(id, next),
2609
- onClick: stopRowClickPropagation
2516
+ "aria-label": "Select all rows on this page",
2517
+ checked: allOnPageSelected,
2518
+ indeterminate: someOnPageSelected,
2519
+ disabled: selectableRowIds.length === 0,
2520
+ onCheckedChange: toggleHeader
2610
2521
  }
2611
- )
2612
- ] }) : null,
2613
- columns.map((column, colIndex) => {
2614
- const isFirst = colIndex === 0 && !enableRowSelection;
2615
- return /* @__PURE__ */ jsxs(
2616
- "td",
2617
- {
2618
- className: cn(
2619
- sizeClasses.cell,
2620
- alignClass[column.align ?? "start"],
2621
- column.className,
2622
- isFirst && "relative"
2623
- ),
2624
- children: [
2625
- isFirst && accent ? /* @__PURE__ */ jsx(RowAccent, { color: accent }) : null,
2626
- renderCell(column, row, rowIndex)
2627
- ]
2628
- },
2629
- column.id
2630
- );
2631
- })
2632
- ]
2633
- },
2634
- id
2635
- );
2636
- }) })
2637
- ]
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",
2539
+ {
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
+ ]
2554
+ }
2555
+ ) : renderHeader(column.header)
2556
+ },
2557
+ column.id
2558
+ );
2559
+ })
2560
+ ] })
2561
+ }
2562
+ ),
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",
2584
+ {
2585
+ "data-selected": isSelected ? "true" : void 0,
2586
+ "aria-selected": enableRowSelection ? isSelected : void 0,
2587
+ className: cn(
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"
2593
+ ),
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
+ ]
2629
+ },
2630
+ id
2631
+ );
2632
+ }) })
2633
+ ]
2634
+ }
2635
+ )
2638
2636
  }
2639
- )
2640
- }
2641
- ),
2642
- paginationVisible ? /* @__PURE__ */ jsx("div", { className: "border-t border-border px-4 py-3", children: /* @__PURE__ */ jsx(
2643
- Pagination,
2644
- {
2645
- pageIndex,
2646
- pageSize,
2647
- pageCount,
2648
- totalRowCount,
2649
- pageSizeOptions,
2650
- onChange: handlePaginationChange,
2651
- labels
2652
- }
2653
- ) }) : null
2654
- ] })
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
+ ]
2651
+ }
2652
+ )
2655
2653
  ] });
2656
2654
  }
2657
2655
  function renderHeader(header) {
@@ -2710,16 +2708,16 @@ function SortIndicator({ active, direction }) {
2710
2708
 
2711
2709
  // src/components/select/selectVariants.ts
2712
2710
  var selectVariantClass = {
2713
- default: "border border-input bg-background hover:border-ring",
2711
+ default: "border border-input bg-background shadow-xs hover:border-ring",
2714
2712
  filled: "border border-transparent bg-muted hover:bg-muted/80",
2715
2713
  ghost: "border border-transparent bg-transparent hover:bg-accent"
2716
2714
  };
2717
2715
  var selectSizeClass = {
2718
- sm: "h-8 rounded-md ps-2.5 pe-8 text-sm",
2719
- md: "h-9 rounded-md ps-3 pe-9 text-sm",
2720
- 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"
2721
2719
  };
2722
- 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";
2723
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";
2724
2722
  var selectViewportClass = "p-1";
2725
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";
@@ -2730,9 +2728,9 @@ var selectStatusClass = "flex items-center justify-center gap-2 px-2 py-6 text-c
2730
2728
 
2731
2729
  // src/components/multi-select/multiSelectVariants.ts
2732
2730
  var multiSelectTriggerSizeClass = {
2733
- sm: "min-h-8 rounded-md ps-2.5 pe-8 py-1 text-sm",
2734
- md: "min-h-9 rounded-md ps-3 pe-9 py-1 text-sm",
2735
- 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"
2736
2734
  };
2737
2735
  var multiSelectValueRowClass = "flex min-w-0 flex-1 flex-wrap items-center gap-1";
2738
2736
  var multiSelectChipClass = "max-w-full gap-1 pe-1";
@@ -3205,7 +3203,7 @@ function ListPageFilterBar({
3205
3203
  },
3206
3204
  filter.key
3207
3205
  )) });
3208
- 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: [
3209
3207
  /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-foreground", children: labels.title ?? "Filters" }),
3210
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: [
3211
3209
  activeCount,
@@ -3217,7 +3215,7 @@ function ListPageFilterBar({
3217
3215
  labels.reset
3218
3216
  ] }) : null
3219
3217
  ] });
3220
- 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)]";
3221
3219
  if (manual) {
3222
3220
  return /* @__PURE__ */ jsxs("form", { "data-slot": "list-page-filter-bar", className: cardClass, onSubmit: apply, children: [
3223
3221
  header,
@@ -3701,14 +3699,14 @@ var Switch = forwardRef(function Switch2({
3701
3699
 
3702
3700
  // src/components/textarea/textareaVariants.ts
3703
3701
  var textareaVariantClass = {
3704
- default: "border border-input bg-background hover:border-ring",
3702
+ default: "border border-input bg-background shadow-xs hover:border-ring",
3705
3703
  filled: "border border-transparent bg-muted hover:bg-muted/80",
3706
3704
  ghost: "border border-transparent bg-transparent hover:bg-accent"
3707
3705
  };
3708
3706
  var textareaSizeClass = {
3709
- sm: "rounded-md px-2.5 py-1.5 text-sm",
3710
- md: "rounded-md px-3 py-2 text-sm",
3711
- 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"
3712
3710
  };
3713
3711
  var textareaResizeClass = {
3714
3712
  none: "resize-none",
@@ -3716,7 +3714,7 @@ var textareaResizeClass = {
3716
3714
  horizontal: "resize-x",
3717
3715
  both: "resize"
3718
3716
  };
3719
- 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";
3720
3718
  var Textarea = forwardRef(function Textarea2({
3721
3719
  variant = "default",
3722
3720
  textareaSize = "md",