@dimaan/ui 0.0.14 → 0.0.17

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
@@ -1,18 +1,23 @@
1
1
  import * as React10 from 'react';
2
- import React10__default, { createContext, forwardRef, Children, isValidElement, cloneElement, useRef, useImperativeHandle, useLayoutEffect, useId, useState, useMemo, useCallback, createElement, useEffect, useContext } from 'react';
2
+ import React10__default, { forwardRef, Children, isValidElement, cloneElement, createContext, useRef, useImperativeHandle, useLayoutEffect, useId, useState, useMemo, useCallback, createElement, useEffect, useContext } from 'react';
3
3
  import * as ReactDOM from 'react-dom';
4
- import { DirectionProvider } from '@radix-ui/react-direction';
4
+ import * as RadixAlertDialog from '@radix-ui/react-alert-dialog';
5
5
  import { clsx } from 'clsx';
6
6
  import { twMerge } from 'tailwind-merge';
7
- import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
8
- import { Loader2, Check, Minus, Calendar, X, ChevronLeft, ChevronRight, ChevronDown, ChevronUp, ArrowLeft, Menu, ChevronsUpDown, Search, RefreshCw, Inbox, SearchX } from 'lucide-react';
7
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
+ import { Loader2, Check, Minus, Calendar, X, ChevronLeft, ChevronRight, ChevronDown, ChevronUp, ArrowLeft, Menu, FileQuestion, ChevronsUpDown, Search, RefreshCw, Inbox, SearchX } from 'lucide-react';
9
+ import { DirectionProvider } from '@radix-ui/react-direction';
9
10
  import * as RadixPopover from '@radix-ui/react-popover';
10
11
  import { DayPicker } from 'react-day-picker';
12
+ import * as RadixDialog from '@radix-ui/react-dialog';
11
13
  import * as RadixDropdown from '@radix-ui/react-dropdown-menu';
12
14
  import { useFormContext, Controller } from 'react-hook-form';
13
15
  import * as RadixSelect from '@radix-ui/react-select';
14
16
  import * as RadixRadioGroup from '@radix-ui/react-radio-group';
15
17
  import * as RadixSwitch from '@radix-ui/react-switch';
18
+ import { Toaster as Toaster$1 } from 'sonner';
19
+ export { toast } from 'sonner';
20
+ import * as RadixTooltip from '@radix-ui/react-tooltip';
16
21
 
17
22
  var __create = Object.create;
18
23
  var __defProp = Object.defineProperty;
@@ -401,7 +406,7 @@ function createBrowserURLImpl(to, isAbsolute = false) {
401
406
  }
402
407
  return new URL(href2, base);
403
408
  }
404
- function createContext5(defaultValue) {
409
+ function createContext6(defaultValue) {
405
410
  return { defaultValue };
406
411
  }
407
412
  function isUnsupportedLazyRouteObjectKey(key) {
@@ -10479,7 +10484,7 @@ function encodeLocation(to) {
10479
10484
  hash: encoded.hash
10480
10485
  };
10481
10486
  }
10482
- var __typeError, __accessCheck, __privateGet, __privateAdd, __privateSet, Action, PopStateEventType, _map, RouterContextProvider, unsupportedLazyRouteObjectKeys, unsupportedLazyRouteFunctionKeys, paramRe, dynamicSegmentValue, indexRouteValue, emptySegmentValue, staticSegmentValue, splatPenalty, isSplat, ABSOLUTE_URL_REGEX, isAbsoluteUrl, removeDoubleSlashes, joinPaths, removeTrailingSlash, normalizePathname, normalizeSearch, normalizeHash, DataWithResponseInit, redirect, redirectDocument, replace, ErrorResponseImpl, isBrowser, UninstrumentedSymbol, objectProtoNames, validMutationMethodsArr, validMutationMethods, validRequestMethodsArr, validRequestMethods, redirectStatusCodes, redirectPreserveMethodStatusCodes, IDLE_NAVIGATION, IDLE_FETCHER, IDLE_BLOCKER, defaultMapRouteProperties, TRANSITIONS_STORAGE_KEY, ResetLoaderDataSymbol, _routes, _branches, _hmrRoutes, _hmrBranches, DataRoutes, lazyRoutePropertyCache, loadLazyRouteProperty, lazyRouteFunctionCache, invalidProtocols, DataRouterContext, DataRouterStateContext, RSCRouterContext, ViewTransitionContext, FetchersContext, AwaitContext, AwaitContextProvider, NavigationContext, LocationContext, RouteContext, RouteErrorContext, ENABLE_DEV_WARNINGS, ERROR_DIGEST_BASE, ERROR_DIGEST_REDIRECT, ERROR_DIGEST_ROUTE_ERROR_RESPONSE, navigateEffectWarning, OutletContext, defaultErrorElement, RenderErrorBoundary, errorRedirectHandledMap, blockerId, alreadyWarned, alreadyWarned2, USE_OPTIMISTIC, useOptimisticImpl, stableUseOptimisticSetter, hydrationRouteProperties, Deferred, MemoizedDataRoutes, AwaitErrorBoundary, createRoutesFromElements, defaultMethod, defaultEncType, _formDataSupportsSubmitter, supportedFormEncTypes, HOLE, NAN, NEGATIVE_INFINITY, NEGATIVE_ZERO, NULL, POSITIVE_INFINITY, UNDEFINED, TYPE_BIGINT, TYPE_DATE, TYPE_ERROR, TYPE_MAP, TYPE_NULL_OBJECT, TYPE_PROMISE, TYPE_REGEXP, TYPE_SET, TYPE_SYMBOL, TYPE_URL, TYPE_PREVIOUS_RESOLVED, SUPPORTED_ERROR_TYPES, Deferred2, TIME_LIMIT_MS, getNow, yieldToMain, objectProtoNames2, globalObj, ESCAPE_LOOKUP, ESCAPE_REGEX, SingleFetchRedirectSymbol, SingleFetchNoResultError, SINGLE_FETCH_REDIRECT_STATUS, NO_BODY_STATUS_CODES, _isPreloadSupported, nextPaths, discoveredPathsMaxSize, discoveredPaths, URL_LIMIT, MANIFEST_VERSION_STORAGE_KEY, FrameworkContext, CRITICAL_CSS_DATA_ATTRIBUTE, isHydrated, RemixErrorBoundary, isBrowser2, ABSOLUTE_URL_REGEX2, Link, NavLink, Form, fetcherId, getUniqueFetcherId, SCROLL_RESTORATION_STORAGE_KEY, savedScrollPositions, ABSOLUTE_URL_REGEX3;
10487
+ var __typeError, __accessCheck, __privateGet, __privateAdd, __privateSet, Action2, PopStateEventType, _map, RouterContextProvider, unsupportedLazyRouteObjectKeys, unsupportedLazyRouteFunctionKeys, paramRe, dynamicSegmentValue, indexRouteValue, emptySegmentValue, staticSegmentValue, splatPenalty, isSplat, ABSOLUTE_URL_REGEX, isAbsoluteUrl, removeDoubleSlashes, joinPaths, removeTrailingSlash, normalizePathname, normalizeSearch, normalizeHash, DataWithResponseInit, redirect, redirectDocument, replace, ErrorResponseImpl, isBrowser, UninstrumentedSymbol, objectProtoNames, validMutationMethodsArr, validMutationMethods, validRequestMethodsArr, validRequestMethods, redirectStatusCodes, redirectPreserveMethodStatusCodes, IDLE_NAVIGATION, IDLE_FETCHER, IDLE_BLOCKER, defaultMapRouteProperties, TRANSITIONS_STORAGE_KEY, ResetLoaderDataSymbol, _routes, _branches, _hmrRoutes, _hmrBranches, DataRoutes, lazyRoutePropertyCache, loadLazyRouteProperty, lazyRouteFunctionCache, invalidProtocols, DataRouterContext, DataRouterStateContext, RSCRouterContext, ViewTransitionContext, FetchersContext, AwaitContext, AwaitContextProvider, NavigationContext, LocationContext, RouteContext, RouteErrorContext, ENABLE_DEV_WARNINGS, ERROR_DIGEST_BASE, ERROR_DIGEST_REDIRECT, ERROR_DIGEST_ROUTE_ERROR_RESPONSE, navigateEffectWarning, OutletContext, defaultErrorElement, RenderErrorBoundary, errorRedirectHandledMap, blockerId, alreadyWarned, alreadyWarned2, USE_OPTIMISTIC, useOptimisticImpl, stableUseOptimisticSetter, hydrationRouteProperties, Deferred, MemoizedDataRoutes, AwaitErrorBoundary, createRoutesFromElements, defaultMethod, defaultEncType, _formDataSupportsSubmitter, supportedFormEncTypes, HOLE, NAN, NEGATIVE_INFINITY, NEGATIVE_ZERO, NULL, POSITIVE_INFINITY, UNDEFINED, TYPE_BIGINT, TYPE_DATE, TYPE_ERROR, TYPE_MAP, TYPE_NULL_OBJECT, TYPE_PROMISE, TYPE_REGEXP, TYPE_SET, TYPE_SYMBOL, TYPE_URL, TYPE_PREVIOUS_RESOLVED, SUPPORTED_ERROR_TYPES, Deferred2, TIME_LIMIT_MS, getNow, yieldToMain, objectProtoNames2, globalObj, ESCAPE_LOOKUP, ESCAPE_REGEX, SingleFetchRedirectSymbol, SingleFetchNoResultError, SINGLE_FETCH_REDIRECT_STATUS, NO_BODY_STATUS_CODES, _isPreloadSupported, nextPaths, discoveredPathsMaxSize, discoveredPaths, URL_LIMIT, MANIFEST_VERSION_STORAGE_KEY, FrameworkContext, CRITICAL_CSS_DATA_ATTRIBUTE, isHydrated, RemixErrorBoundary, isBrowser2, ABSOLUTE_URL_REGEX2, Link, NavLink, Form, fetcherId, getUniqueFetcherId, SCROLL_RESTORATION_STORAGE_KEY, savedScrollPositions, ABSOLUTE_URL_REGEX3;
10483
10488
  var init_chunk_5KNZJZUH = __esm({
10484
10489
  "node_modules/.pnpm/react-router@7.15.0_react-dom@19.2.6_react@19.2.6__react@19.2.6/node_modules/react-router/dist/development/chunk-5KNZJZUH.mjs"() {
10485
10490
  __typeError = (msg) => {
@@ -10489,12 +10494,12 @@ var init_chunk_5KNZJZUH = __esm({
10489
10494
  __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
10490
10495
  __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10491
10496
  __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
10492
- Action = /* @__PURE__ */ ((Action2) => {
10493
- Action2["Pop"] = "POP";
10494
- Action2["Push"] = "PUSH";
10495
- Action2["Replace"] = "REPLACE";
10496
- return Action2;
10497
- })(Action || {});
10497
+ Action2 = /* @__PURE__ */ ((Action22) => {
10498
+ Action22["Pop"] = "POP";
10499
+ Action22["Push"] = "PUSH";
10500
+ Action22["Replace"] = "REPLACE";
10501
+ return Action22;
10502
+ })(Action2 || {});
10498
10503
  PopStateEventType = "popstate";
10499
10504
  RouterContextProvider = class {
10500
10505
  /**
@@ -15119,7 +15124,7 @@ var init_dom_export = __esm({
15119
15124
  ssrInfo = null;
15120
15125
  router = null;
15121
15126
  defaultManifestPath2 = "/__manifest";
15122
- renderedRoutesContext = createContext5();
15127
+ renderedRoutesContext = createContext6();
15123
15128
  nextPaths2 = /* @__PURE__ */ new Set();
15124
15129
  discoveredPathsMaxSize2 = 1e3;
15125
15130
  discoveredPaths2 = /* @__PURE__ */ new Set();
@@ -15142,7 +15147,7 @@ __export(development_exports, {
15142
15147
  Meta: () => Meta,
15143
15148
  NavLink: () => NavLink,
15144
15149
  Navigate: () => Navigate,
15145
- NavigationType: () => Action,
15150
+ NavigationType: () => Action2,
15146
15151
  Outlet: () => Outlet,
15147
15152
  PrefetchPageLinks: () => PrefetchPageLinks,
15148
15153
  Route: () => Route,
@@ -15193,7 +15198,7 @@ __export(development_exports, {
15193
15198
  UNSAFE_withErrorBoundaryProps: () => withErrorBoundaryProps,
15194
15199
  UNSAFE_withHydrateFallbackProps: () => withHydrateFallbackProps,
15195
15200
  createBrowserRouter: () => createBrowserRouter,
15196
- createContext: () => createContext5,
15201
+ createContext: () => createContext6,
15197
15202
  createCookie: () => createCookie,
15198
15203
  createCookieSessionStorage: () => createCookieSessionStorage,
15199
15204
  createHashRouter: () => createHashRouter,
@@ -15298,6 +15303,225 @@ var require_dist2 = __commonJS({
15298
15303
  __reExport(index_exports, (init_development(), __toCommonJS(development_exports)), module.exports);
15299
15304
  }
15300
15305
  });
15306
+ function cn(...inputs) {
15307
+ return twMerge(clsx(inputs));
15308
+ }
15309
+
15310
+ // src/components/dialog/dialogVariants.ts
15311
+ var dialogOverlayClass = "fixed inset-0 z-50 bg-foreground/40 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0";
15312
+ var dialogContentClass = "fixed start-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 rounded-lg border border-border bg-background p-6 text-foreground shadow-lg outline-none rtl:translate-x-1/2 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";
15313
+ var dialogHeaderClass = "flex flex-col gap-1.5 text-start";
15314
+ var dialogTitleClass = "text-lg font-semibold text-foreground";
15315
+ var dialogDescriptionClass = "text-sm text-muted-foreground";
15316
+ var dialogFooterClass = "flex flex-col-reverse gap-2 sm:flex-row sm:items-center sm:justify-end";
15317
+ var dialogCloseButtonClass = "absolute end-4 top-4 inline-flex size-7 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none";
15318
+ var AlertDialog = RadixAlertDialog.Root;
15319
+ var AlertDialogTrigger = RadixAlertDialog.Trigger;
15320
+ var AlertDialogPortal = RadixAlertDialog.Portal;
15321
+ var AlertDialogAction = RadixAlertDialog.Action;
15322
+ var AlertDialogCancel = RadixAlertDialog.Cancel;
15323
+ var AlertDialogOverlay = forwardRef(function AlertDialogOverlay2({ className, ...props }, ref) {
15324
+ return /* @__PURE__ */ jsx(
15325
+ RadixAlertDialog.Overlay,
15326
+ {
15327
+ ref,
15328
+ "data-slot": "alert-dialog-overlay",
15329
+ className: cn(dialogOverlayClass, className),
15330
+ ...props
15331
+ }
15332
+ );
15333
+ });
15334
+ var AlertDialogContent = forwardRef(function AlertDialogContent2({ className, ...props }, ref) {
15335
+ return /* @__PURE__ */ jsxs(RadixAlertDialog.Portal, { children: [
15336
+ /* @__PURE__ */ jsx(AlertDialogOverlay, {}),
15337
+ /* @__PURE__ */ jsx(
15338
+ RadixAlertDialog.Content,
15339
+ {
15340
+ ref,
15341
+ "data-slot": "alert-dialog-content",
15342
+ className: cn(dialogContentClass, className),
15343
+ ...props
15344
+ }
15345
+ )
15346
+ ] });
15347
+ });
15348
+ function AlertDialogHeader({ className, ...props }) {
15349
+ return /* @__PURE__ */ jsx("div", { "data-slot": "alert-dialog-header", className: cn(dialogHeaderClass, className), ...props });
15350
+ }
15351
+ function AlertDialogFooter({ className, ...props }) {
15352
+ return /* @__PURE__ */ jsx("div", { "data-slot": "alert-dialog-footer", className: cn(dialogFooterClass, className), ...props });
15353
+ }
15354
+ var AlertDialogTitle = forwardRef(function AlertDialogTitle2({ className, ...props }, ref) {
15355
+ return /* @__PURE__ */ jsx(
15356
+ RadixAlertDialog.Title,
15357
+ {
15358
+ ref,
15359
+ "data-slot": "alert-dialog-title",
15360
+ className: cn(dialogTitleClass, className),
15361
+ ...props
15362
+ }
15363
+ );
15364
+ });
15365
+ var AlertDialogDescription = forwardRef(function AlertDialogDescription2({ className, ...props }, ref) {
15366
+ return /* @__PURE__ */ jsx(
15367
+ RadixAlertDialog.Description,
15368
+ {
15369
+ ref,
15370
+ "data-slot": "alert-dialog-description",
15371
+ className: cn(dialogDescriptionClass, className),
15372
+ ...props
15373
+ }
15374
+ );
15375
+ });
15376
+
15377
+ // src/components/button/buttonVariants.ts
15378
+ var buttonVariantClass = {
15379
+ primary: "bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 focus-visible:ring-primary/40",
15380
+ secondary: "bg-muted text-foreground hover:bg-muted/80 focus-visible:ring-muted-foreground/30",
15381
+ outline: "border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/40",
15382
+ ghost: "bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/40",
15383
+ destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90 focus-visible:ring-destructive/40",
15384
+ success: "bg-success text-success-foreground shadow-sm hover:bg-success/90 focus-visible:ring-success/40",
15385
+ warning: "bg-warning text-warning-foreground shadow-sm hover:bg-warning/90 focus-visible:ring-warning/40",
15386
+ link: "text-primary underline-offset-4 hover:underline focus-visible:ring-primary/40 px-0 shadow-none"
15387
+ };
15388
+ var buttonSizeClass = {
15389
+ sm: "h-8 gap-1.5 rounded-md px-3 text-sm",
15390
+ md: "h-9 gap-2 rounded-md px-4 text-sm",
15391
+ lg: "h-11 gap-2.5 rounded-md px-6 text-base",
15392
+ icon: "h-9 w-9 shrink-0 rounded-md p-0",
15393
+ "icon-sm": "h-8 w-8 shrink-0 rounded-md p-0"
15394
+ };
15395
+ var buttonBaseClass = "group/button relative inline-flex items-center justify-center font-medium select-none whitespace-nowrap outline-none transition-[background-color,color,box-shadow,opacity] focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0";
15396
+ var Button = forwardRef(function Button2({
15397
+ variant = "primary",
15398
+ size = "md",
15399
+ loading = false,
15400
+ loadingText,
15401
+ leadingIcon,
15402
+ trailingIcon,
15403
+ fullWidth = false,
15404
+ asChild = false,
15405
+ type,
15406
+ disabled,
15407
+ className,
15408
+ children,
15409
+ ...props
15410
+ }, ref) {
15411
+ const isDisabled = disabled || loading;
15412
+ const composedClass = cn(
15413
+ buttonBaseClass,
15414
+ buttonVariantClass[variant],
15415
+ buttonSizeClass[size],
15416
+ fullWidth && "w-full",
15417
+ className
15418
+ );
15419
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
15420
+ loading ? /* @__PURE__ */ jsx(Spinner, {}) : leadingIcon ? /* @__PURE__ */ jsx(Slot, { children: leadingIcon }) : null,
15421
+ loading && loadingText !== void 0 ? loadingText : children,
15422
+ !loading && trailingIcon ? /* @__PURE__ */ jsx(Slot, { children: trailingIcon }) : null
15423
+ ] });
15424
+ if (asChild) {
15425
+ const child = Children.only(children);
15426
+ if (!isValidElement(child)) {
15427
+ throw new Error("Button: `asChild` requires a single valid React element as a child.");
15428
+ }
15429
+ const mergedClassName = cn(composedClass, child.props.className);
15430
+ return cloneElement(child, {
15431
+ ...child.props,
15432
+ className: mergedClassName,
15433
+ "aria-disabled": isDisabled ? true : void 0,
15434
+ "data-loading": loading ? "true" : void 0,
15435
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [
15436
+ loading ? /* @__PURE__ */ jsx(Spinner, {}) : leadingIcon ? /* @__PURE__ */ jsx(Slot, { children: leadingIcon }) : null,
15437
+ loading && loadingText !== void 0 ? loadingText : child.props.children,
15438
+ !loading && trailingIcon ? /* @__PURE__ */ jsx(Slot, { children: trailingIcon }) : null
15439
+ ] })
15440
+ });
15441
+ }
15442
+ return /* @__PURE__ */ jsx(
15443
+ "button",
15444
+ {
15445
+ ref,
15446
+ type: type ?? "button",
15447
+ disabled: isDisabled,
15448
+ "data-loading": loading ? "true" : void 0,
15449
+ className: composedClass,
15450
+ ...props,
15451
+ children: content
15452
+ }
15453
+ );
15454
+ });
15455
+ function Slot({ children }) {
15456
+ return /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "inline-flex h-4 w-4 items-center justify-center", children });
15457
+ }
15458
+ function Spinner() {
15459
+ return /* @__PURE__ */ jsx(Loader2, { "aria-hidden": "true", className: "h-4 w-4 animate-spin", "data-testid": "button-spinner" });
15460
+ }
15461
+ var ConfirmDialogContext = createContext(null);
15462
+ function ConfirmDialogProvider({ labels, children }) {
15463
+ const [pending, setPending] = useState(null);
15464
+ const pendingRef = useRef(null);
15465
+ pendingRef.current = pending;
15466
+ const confirm = useCallback((options) => {
15467
+ return new Promise((resolve) => {
15468
+ const prior = pendingRef.current;
15469
+ if (prior) {
15470
+ prior.resolve(false);
15471
+ }
15472
+ setPending({ options, resolve });
15473
+ });
15474
+ }, []);
15475
+ const resolveWith = useCallback((value) => {
15476
+ const current = pendingRef.current;
15477
+ if (!current) return;
15478
+ current.resolve(value);
15479
+ setPending(null);
15480
+ }, []);
15481
+ const confirmLabel = pending?.options.confirmLabel ?? labels?.confirm ?? "Confirm";
15482
+ const cancelLabel = pending?.options.cancelLabel ?? labels?.cancel ?? "Cancel";
15483
+ return /* @__PURE__ */ jsxs(ConfirmDialogContext.Provider, { value: confirm, children: [
15484
+ children,
15485
+ /* @__PURE__ */ jsx(
15486
+ AlertDialog,
15487
+ {
15488
+ open: pending !== null,
15489
+ onOpenChange: (open) => {
15490
+ if (!open) resolveWith(false);
15491
+ },
15492
+ children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [
15493
+ /* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
15494
+ /* @__PURE__ */ jsx(AlertDialogTitle, { children: pending?.options.title }),
15495
+ pending?.options.description !== void 0 ? /* @__PURE__ */ jsx(AlertDialogDescription, { children: pending.options.description }) : (
15496
+ // Radix logs a warning when AlertDialogDescription is missing —
15497
+ // always render a node even if the consumer didn't supply text.
15498
+ /* @__PURE__ */ jsx(AlertDialogDescription, { className: "sr-only", children: pending?.options.title })
15499
+ )
15500
+ ] }),
15501
+ /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
15502
+ /* @__PURE__ */ jsx(AlertDialogCancel, { asChild: true, children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => resolveWith(false), children: cancelLabel }) }),
15503
+ /* @__PURE__ */ jsx(AlertDialogAction, { asChild: true, children: /* @__PURE__ */ jsx(
15504
+ Button,
15505
+ {
15506
+ type: "button",
15507
+ variant: pending?.options.destructive ? "destructive" : "primary",
15508
+ onClick: () => resolveWith(true),
15509
+ children: confirmLabel
15510
+ }
15511
+ ) })
15512
+ ] })
15513
+ ] })
15514
+ }
15515
+ )
15516
+ ] });
15517
+ }
15518
+ function useConfirm() {
15519
+ const fn = useContext(ConfirmDialogContext);
15520
+ if (!fn) {
15521
+ throw new Error("useConfirm() must be used inside <ConfirmDialogProvider>");
15522
+ }
15523
+ return useMemo(() => fn, [fn]);
15524
+ }
15301
15525
  function readDocumentDirection() {
15302
15526
  if (typeof document === "undefined") return "ltr";
15303
15527
  const dir = document.documentElement.getAttribute("dir");
@@ -15326,9 +15550,6 @@ function useDashboardLayout() {
15326
15550
  }
15327
15551
  return ctx;
15328
15552
  }
15329
- function cn(...inputs) {
15330
- return twMerge(clsx(inputs));
15331
- }
15332
15553
  function DashboardContent({ className, children, ...props }) {
15333
15554
  return /* @__PURE__ */ jsx(
15334
15555
  "main",
@@ -15426,91 +15647,6 @@ function DashboardHeader({ className, children, ...props }) {
15426
15647
  function HeaderActions({ className, children, ...props }) {
15427
15648
  return /* @__PURE__ */ jsx("div", { className: cn("ms-auto flex items-center gap-1", className), ...props, children });
15428
15649
  }
15429
-
15430
- // src/components/button/buttonVariants.ts
15431
- var buttonVariantClass = {
15432
- primary: "bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 focus-visible:ring-primary/40",
15433
- secondary: "bg-muted text-foreground hover:bg-muted/80 focus-visible:ring-muted-foreground/30",
15434
- outline: "border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/40",
15435
- ghost: "bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/40",
15436
- destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90 focus-visible:ring-destructive/40",
15437
- success: "bg-success text-success-foreground shadow-sm hover:bg-success/90 focus-visible:ring-success/40",
15438
- warning: "bg-warning text-warning-foreground shadow-sm hover:bg-warning/90 focus-visible:ring-warning/40",
15439
- link: "text-primary underline-offset-4 hover:underline focus-visible:ring-primary/40 px-0 shadow-none"
15440
- };
15441
- var buttonSizeClass = {
15442
- sm: "h-8 gap-1.5 rounded-md px-3 text-sm",
15443
- md: "h-9 gap-2 rounded-md px-4 text-sm",
15444
- lg: "h-11 gap-2.5 rounded-md px-6 text-base",
15445
- icon: "h-9 w-9 shrink-0 rounded-md p-0",
15446
- "icon-sm": "h-8 w-8 shrink-0 rounded-md p-0"
15447
- };
15448
- var buttonBaseClass = "group/button relative inline-flex items-center justify-center font-medium select-none whitespace-nowrap outline-none transition-[background-color,color,box-shadow,opacity] focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0";
15449
- var Button = forwardRef(function Button2({
15450
- variant = "primary",
15451
- size = "md",
15452
- loading = false,
15453
- loadingText,
15454
- leadingIcon,
15455
- trailingIcon,
15456
- fullWidth = false,
15457
- asChild = false,
15458
- type,
15459
- disabled,
15460
- className,
15461
- children,
15462
- ...props
15463
- }, ref) {
15464
- const isDisabled = disabled || loading;
15465
- const composedClass = cn(
15466
- buttonBaseClass,
15467
- buttonVariantClass[variant],
15468
- buttonSizeClass[size],
15469
- fullWidth && "w-full",
15470
- className
15471
- );
15472
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [
15473
- loading ? /* @__PURE__ */ jsx(Spinner, {}) : leadingIcon ? /* @__PURE__ */ jsx(Slot, { children: leadingIcon }) : null,
15474
- loading && loadingText !== void 0 ? loadingText : children,
15475
- !loading && trailingIcon ? /* @__PURE__ */ jsx(Slot, { children: trailingIcon }) : null
15476
- ] });
15477
- if (asChild) {
15478
- const child = Children.only(children);
15479
- if (!isValidElement(child)) {
15480
- throw new Error("Button: `asChild` requires a single valid React element as a child.");
15481
- }
15482
- const mergedClassName = cn(composedClass, child.props.className);
15483
- return cloneElement(child, {
15484
- ...child.props,
15485
- className: mergedClassName,
15486
- "aria-disabled": isDisabled ? true : void 0,
15487
- "data-loading": loading ? "true" : void 0,
15488
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
15489
- loading ? /* @__PURE__ */ jsx(Spinner, {}) : leadingIcon ? /* @__PURE__ */ jsx(Slot, { children: leadingIcon }) : null,
15490
- loading && loadingText !== void 0 ? loadingText : child.props.children,
15491
- !loading && trailingIcon ? /* @__PURE__ */ jsx(Slot, { children: trailingIcon }) : null
15492
- ] })
15493
- });
15494
- }
15495
- return /* @__PURE__ */ jsx(
15496
- "button",
15497
- {
15498
- ref,
15499
- type: type ?? "button",
15500
- disabled: isDisabled,
15501
- "data-loading": loading ? "true" : void 0,
15502
- className: composedClass,
15503
- ...props,
15504
- children: content
15505
- }
15506
- );
15507
- });
15508
- function Slot({ children }) {
15509
- return /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "inline-flex h-4 w-4 items-center justify-center", children });
15510
- }
15511
- function Spinner() {
15512
- return /* @__PURE__ */ jsx(Loader2, { "aria-hidden": "true", className: "h-4 w-4 animate-spin", "data-testid": "button-spinner" });
15513
- }
15514
15650
  function HeaderCollapseTrigger({
15515
15651
  icon,
15516
15652
  className,
@@ -16347,91 +16483,11 @@ function readDocumentLocale() {
16347
16483
  return lang || void 0;
16348
16484
  }
16349
16485
 
16350
- // src/components/dropdown-menu/dropdownMenuVariants.ts
16351
- var dropdownMenuContentClass = "z-50 min-w-32 overflow-hidden rounded-md border border-border bg-popover p-1 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";
16352
- var dropdownMenuItemBaseClass = "relative flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0";
16353
- var dropdownMenuItemVariantClass = {
16354
- default: "text-foreground data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground",
16355
- destructive: "text-destructive data-[highlighted]:bg-destructive data-[highlighted]:text-destructive-foreground"
16356
- };
16357
- var dropdownMenuItemInsetClass = "ps-8";
16358
- var dropdownMenuSeparatorClass = "-mx-1 my-1 h-px bg-border";
16359
- var dropdownMenuLabelClass = "px-2 py-1.5 text-xs font-semibold text-muted-foreground select-none";
16360
- var dropdownMenuShortcutClass = "ms-auto text-xs tracking-widest text-muted-foreground";
16361
- var DropdownMenu = RadixDropdown.Root;
16362
- var DropdownMenuTrigger = RadixDropdown.Trigger;
16363
- var DropdownMenuGroup = RadixDropdown.Group;
16364
- var DropdownMenuPortal = RadixDropdown.Portal;
16365
- var DropdownMenuContent = forwardRef(function DropdownMenuContent2({ className, sideOffset = 4, ...props }, ref) {
16366
- return /* @__PURE__ */ jsx(RadixDropdown.Portal, { children: /* @__PURE__ */ jsx(
16367
- RadixDropdown.Content,
16368
- {
16369
- ref,
16370
- sideOffset,
16371
- "data-slot": "dropdown-menu-content",
16372
- className: cn(dropdownMenuContentClass, className),
16373
- ...props
16374
- }
16375
- ) });
16376
- });
16377
- var DropdownMenuItem = forwardRef(function DropdownMenuItem2({ className, variant = "default", inset = false, ...props }, ref) {
16378
- return /* @__PURE__ */ jsx(
16379
- RadixDropdown.Item,
16380
- {
16381
- ref,
16382
- "data-slot": "dropdown-menu-item",
16383
- "data-variant": variant,
16384
- className: cn(
16385
- dropdownMenuItemBaseClass,
16386
- dropdownMenuItemVariantClass[variant],
16387
- inset && dropdownMenuItemInsetClass,
16388
- className
16389
- ),
16390
- ...props
16391
- }
16392
- );
16393
- });
16394
- var DropdownMenuSeparator = forwardRef(function DropdownMenuSeparator2({ className, ...props }, ref) {
16395
- return /* @__PURE__ */ jsx(
16396
- RadixDropdown.Separator,
16397
- {
16398
- ref,
16399
- "data-slot": "dropdown-menu-separator",
16400
- className: cn(dropdownMenuSeparatorClass, className),
16401
- ...props
16402
- }
16403
- );
16404
- });
16405
- var DropdownMenuLabel = forwardRef(function DropdownMenuLabel2({ className, inset = false, ...props }, ref) {
16406
- return /* @__PURE__ */ jsx(
16407
- RadixDropdown.Label,
16408
- {
16409
- ref,
16410
- "data-slot": "dropdown-menu-label",
16411
- className: cn(dropdownMenuLabelClass, inset && dropdownMenuItemInsetClass, className),
16412
- ...props
16413
- }
16414
- );
16415
- });
16416
- var DropdownMenuShortcut = forwardRef(
16417
- function DropdownMenuShortcut2({ className, ...props }, ref) {
16418
- return /* @__PURE__ */ jsx(
16419
- "span",
16420
- {
16421
- ref,
16422
- "data-slot": "dropdown-menu-shortcut",
16423
- className: cn(dropdownMenuShortcutClass, className),
16424
- ...props
16425
- }
16426
- );
16427
- }
16428
- );
16429
-
16430
- // src/components/empty-state/emptyStateVariants.ts
16431
- var emptyStateContainerSizeClass = {
16432
- sm: "py-8 gap-2",
16433
- md: "py-14 gap-3",
16434
- lg: "py-20 gap-4"
16486
+ // src/components/empty-state/emptyStateVariants.ts
16487
+ var emptyStateContainerSizeClass = {
16488
+ sm: "py-8 gap-2",
16489
+ md: "py-14 gap-3",
16490
+ lg: "py-20 gap-4"
16435
16491
  };
16436
16492
  var emptyStateIconWrapperSizeClass = {
16437
16493
  sm: "size-10 [&_svg]:size-5",
@@ -16506,6 +16562,294 @@ var EmptyState = forwardRef(function EmptyState2({ icon, title, description, act
16506
16562
  }
16507
16563
  );
16508
16564
  });
16565
+
16566
+ // src/components/page-header/PageHeader.tsx
16567
+ var import_react_router_dom2 = __toESM(require_dist2());
16568
+
16569
+ // src/components/page-header/pageHeaderVariants.ts
16570
+ var pageHeaderBaseClass = "flex w-full flex-col gap-3";
16571
+ var pageHeaderBorderedClass = "border-b border-border pb-4";
16572
+ var pageHeaderTitleRowClass = "flex flex-wrap items-start justify-between gap-3 sm:gap-4";
16573
+ var pageHeaderTitleBlockClass = "min-w-0 flex-1 space-y-1";
16574
+ var pageHeaderTitleClass = "text-2xl font-semibold tracking-tight text-foreground";
16575
+ var pageHeaderDescriptionClass = "text-sm text-muted-foreground";
16576
+ var pageHeaderActionsClass = "flex shrink-0 flex-wrap items-center gap-2";
16577
+ var pageHeaderBackClass = "inline-flex items-center gap-1.5 self-start text-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-md";
16578
+ var pageHeaderBackIconClass = "size-4 shrink-0 rtl:rotate-180";
16579
+ var pageHeaderBreadcrumbsClass = "text-xs text-muted-foreground";
16580
+ var PageHeader = forwardRef(function PageHeader2({
16581
+ title,
16582
+ description,
16583
+ breadcrumbs,
16584
+ back,
16585
+ actions,
16586
+ as = "h1",
16587
+ bordered = false,
16588
+ className,
16589
+ ...props
16590
+ }, ref) {
16591
+ return /* @__PURE__ */ jsxs(
16592
+ "header",
16593
+ {
16594
+ ref,
16595
+ "data-slot": "page-header",
16596
+ className: cn(pageHeaderBaseClass, bordered && pageHeaderBorderedClass, className),
16597
+ ...props,
16598
+ children: [
16599
+ breadcrumbs ? /* @__PURE__ */ jsx("div", { "data-slot": "page-header-breadcrumbs", className: pageHeaderBreadcrumbsClass, children: breadcrumbs }) : null,
16600
+ back ? /* @__PURE__ */ jsx(PageHeaderBack, { ...back }) : null,
16601
+ /* @__PURE__ */ jsxs("div", { "data-slot": "page-header-row", className: pageHeaderTitleRowClass, children: [
16602
+ /* @__PURE__ */ jsxs("div", { className: pageHeaderTitleBlockClass, children: [
16603
+ createElement(
16604
+ as,
16605
+ { "data-slot": "page-header-title", className: pageHeaderTitleClass },
16606
+ title
16607
+ ),
16608
+ description ? /* @__PURE__ */ jsx("p", { "data-slot": "page-header-description", className: pageHeaderDescriptionClass, children: description }) : null
16609
+ ] }),
16610
+ actions ? /* @__PURE__ */ jsx("div", { "data-slot": "page-header-actions", className: pageHeaderActionsClass, children: actions }) : null
16611
+ ] })
16612
+ ]
16613
+ }
16614
+ );
16615
+ });
16616
+ function PageHeaderBack({ label = "Back", to, onClick, render }) {
16617
+ const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
16618
+ /* @__PURE__ */ jsx(ArrowLeft, { className: pageHeaderBackIconClass, "aria-hidden": "true" }),
16619
+ /* @__PURE__ */ jsx("span", { children: label })
16620
+ ] });
16621
+ if (render) {
16622
+ return render({
16623
+ to,
16624
+ onClick,
16625
+ className: pageHeaderBackClass,
16626
+ children: inner
16627
+ });
16628
+ }
16629
+ if (to) {
16630
+ return /* @__PURE__ */ jsx(import_react_router_dom2.Link, { to, onClick, className: pageHeaderBackClass, children: inner });
16631
+ }
16632
+ return /* @__PURE__ */ jsx("button", { type: "button", onClick, className: pageHeaderBackClass, children: inner });
16633
+ }
16634
+
16635
+ // src/components/detail-page/detailPageVariants.ts
16636
+ var detailPageBaseClass = "flex w-full flex-col gap-6";
16637
+ var detailPageBodyClass = "flex flex-col gap-6";
16638
+ var detailPageSkeletonRowClass = "h-5 w-full animate-pulse rounded-md bg-muted";
16639
+ var detailPageEmptyClass = "rounded-md border border-border bg-card";
16640
+ var DEFAULT_LABELS = {
16641
+ notFoundTitle: "Not found",
16642
+ notFoundDescription: "The record you\u2019re looking for does not exist or has been removed."
16643
+ };
16644
+ var DEFAULT_SKELETON_ROW_COUNT = 6;
16645
+ function DetailPage({
16646
+ title,
16647
+ description,
16648
+ back,
16649
+ actions,
16650
+ bordered = true,
16651
+ isLoading = false,
16652
+ loadingRowCount = DEFAULT_SKELETON_ROW_COUNT,
16653
+ notFound = false,
16654
+ notFoundState,
16655
+ labels: labelsProp,
16656
+ children,
16657
+ className,
16658
+ bodyClassName
16659
+ }) {
16660
+ const labels = { ...DEFAULT_LABELS, ...labelsProp };
16661
+ return /* @__PURE__ */ jsxs(
16662
+ "div",
16663
+ {
16664
+ "data-slot": "detail-page",
16665
+ "data-state": isLoading ? "loading" : notFound ? "not-found" : "ready",
16666
+ "aria-busy": isLoading || void 0,
16667
+ className: cn(detailPageBaseClass, className),
16668
+ children: [
16669
+ /* @__PURE__ */ jsx(
16670
+ PageHeader,
16671
+ {
16672
+ title,
16673
+ description,
16674
+ back,
16675
+ actions,
16676
+ bordered
16677
+ }
16678
+ ),
16679
+ isLoading ? /* @__PURE__ */ jsx(DetailPageSkeleton, { rowCount: loadingRowCount }) : notFound ? /* @__PURE__ */ jsx("div", { "data-slot": "detail-page-empty", "data-state": "not-found", className: detailPageEmptyClass, children: /* @__PURE__ */ jsx(
16680
+ EmptyState,
16681
+ {
16682
+ size: "lg",
16683
+ icon: notFoundState?.icon ?? /* @__PURE__ */ jsx(FileQuestion, {}),
16684
+ title: notFoundState?.title ?? labels.notFoundTitle,
16685
+ description: notFoundState?.description ?? labels.notFoundDescription,
16686
+ action: notFoundState?.action ?? null
16687
+ }
16688
+ ) }) : /* @__PURE__ */ jsx("div", { "data-slot": "detail-page-body", className: cn(detailPageBodyClass, bodyClassName), children })
16689
+ ]
16690
+ }
16691
+ );
16692
+ }
16693
+ function DetailPageSkeleton({ rowCount }) {
16694
+ const rows = Array.from({ length: Math.max(1, rowCount) }, (_, i) => `detail-page-skeleton-${i}`);
16695
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4", "aria-hidden": "true", children: rows.map((key) => /* @__PURE__ */ jsx(
16696
+ "div",
16697
+ {
16698
+ "data-testid": "detail-page-skeleton-row",
16699
+ className: detailPageSkeletonRowClass
16700
+ },
16701
+ key
16702
+ )) });
16703
+ }
16704
+ var Dialog = RadixDialog.Root;
16705
+ var DialogTrigger = RadixDialog.Trigger;
16706
+ var DialogPortal = RadixDialog.Portal;
16707
+ var DialogClose = RadixDialog.Close;
16708
+ var DialogOverlay = forwardRef(function DialogOverlay2({ className, ...props }, ref) {
16709
+ return /* @__PURE__ */ jsx(
16710
+ RadixDialog.Overlay,
16711
+ {
16712
+ ref,
16713
+ "data-slot": "dialog-overlay",
16714
+ className: cn(dialogOverlayClass, className),
16715
+ ...props
16716
+ }
16717
+ );
16718
+ });
16719
+ var DialogContent = forwardRef(function DialogContent2({ className, children, showCloseButton = true, closeLabel = "Close", ...props }, ref) {
16720
+ return /* @__PURE__ */ jsxs(RadixDialog.Portal, { children: [
16721
+ /* @__PURE__ */ jsx(DialogOverlay, {}),
16722
+ /* @__PURE__ */ jsxs(
16723
+ RadixDialog.Content,
16724
+ {
16725
+ ref,
16726
+ "data-slot": "dialog-content",
16727
+ className: cn(dialogContentClass, className),
16728
+ ...props,
16729
+ children: [
16730
+ children,
16731
+ showCloseButton ? /* @__PURE__ */ jsx(
16732
+ RadixDialog.Close,
16733
+ {
16734
+ "aria-label": closeLabel,
16735
+ "data-slot": "dialog-close-button",
16736
+ className: dialogCloseButtonClass,
16737
+ children: /* @__PURE__ */ jsx(X, { className: "size-4", "aria-hidden": "true" })
16738
+ }
16739
+ ) : null
16740
+ ]
16741
+ }
16742
+ )
16743
+ ] });
16744
+ });
16745
+ function DialogHeader({ className, ...props }) {
16746
+ return /* @__PURE__ */ jsx("div", { "data-slot": "dialog-header", className: cn(dialogHeaderClass, className), ...props });
16747
+ }
16748
+ function DialogFooter({ className, ...props }) {
16749
+ return /* @__PURE__ */ jsx("div", { "data-slot": "dialog-footer", className: cn(dialogFooterClass, className), ...props });
16750
+ }
16751
+ var DialogTitle = forwardRef(function DialogTitle2({ className, ...props }, ref) {
16752
+ return /* @__PURE__ */ jsx(
16753
+ RadixDialog.Title,
16754
+ {
16755
+ ref,
16756
+ "data-slot": "dialog-title",
16757
+ className: cn(dialogTitleClass, className),
16758
+ ...props
16759
+ }
16760
+ );
16761
+ });
16762
+ var DialogDescription = forwardRef(function DialogDescription2({ className, ...props }, ref) {
16763
+ return /* @__PURE__ */ jsx(
16764
+ RadixDialog.Description,
16765
+ {
16766
+ ref,
16767
+ "data-slot": "dialog-description",
16768
+ className: cn(dialogDescriptionClass, className),
16769
+ ...props
16770
+ }
16771
+ );
16772
+ });
16773
+
16774
+ // src/components/dropdown-menu/dropdownMenuVariants.ts
16775
+ var dropdownMenuContentClass = "z-50 min-w-32 overflow-hidden rounded-md border border-border bg-popover p-1 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";
16776
+ var dropdownMenuItemBaseClass = "relative flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0";
16777
+ var dropdownMenuItemVariantClass = {
16778
+ default: "text-foreground data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground",
16779
+ destructive: "text-destructive data-[highlighted]:bg-destructive data-[highlighted]:text-destructive-foreground"
16780
+ };
16781
+ var dropdownMenuItemInsetClass = "ps-8";
16782
+ var dropdownMenuSeparatorClass = "-mx-1 my-1 h-px bg-border";
16783
+ var dropdownMenuLabelClass = "px-2 py-1.5 text-xs font-semibold text-muted-foreground select-none";
16784
+ var dropdownMenuShortcutClass = "ms-auto text-xs tracking-widest text-muted-foreground";
16785
+ var DropdownMenu = RadixDropdown.Root;
16786
+ var DropdownMenuTrigger = RadixDropdown.Trigger;
16787
+ var DropdownMenuGroup = RadixDropdown.Group;
16788
+ var DropdownMenuPortal = RadixDropdown.Portal;
16789
+ var DropdownMenuContent = forwardRef(function DropdownMenuContent2({ className, sideOffset = 4, ...props }, ref) {
16790
+ return /* @__PURE__ */ jsx(RadixDropdown.Portal, { children: /* @__PURE__ */ jsx(
16791
+ RadixDropdown.Content,
16792
+ {
16793
+ ref,
16794
+ sideOffset,
16795
+ "data-slot": "dropdown-menu-content",
16796
+ className: cn(dropdownMenuContentClass, className),
16797
+ ...props
16798
+ }
16799
+ ) });
16800
+ });
16801
+ var DropdownMenuItem = forwardRef(function DropdownMenuItem2({ className, variant = "default", inset = false, ...props }, ref) {
16802
+ return /* @__PURE__ */ jsx(
16803
+ RadixDropdown.Item,
16804
+ {
16805
+ ref,
16806
+ "data-slot": "dropdown-menu-item",
16807
+ "data-variant": variant,
16808
+ className: cn(
16809
+ dropdownMenuItemBaseClass,
16810
+ dropdownMenuItemVariantClass[variant],
16811
+ inset && dropdownMenuItemInsetClass,
16812
+ className
16813
+ ),
16814
+ ...props
16815
+ }
16816
+ );
16817
+ });
16818
+ var DropdownMenuSeparator = forwardRef(function DropdownMenuSeparator2({ className, ...props }, ref) {
16819
+ return /* @__PURE__ */ jsx(
16820
+ RadixDropdown.Separator,
16821
+ {
16822
+ ref,
16823
+ "data-slot": "dropdown-menu-separator",
16824
+ className: cn(dropdownMenuSeparatorClass, className),
16825
+ ...props
16826
+ }
16827
+ );
16828
+ });
16829
+ var DropdownMenuLabel = forwardRef(function DropdownMenuLabel2({ className, inset = false, ...props }, ref) {
16830
+ return /* @__PURE__ */ jsx(
16831
+ RadixDropdown.Label,
16832
+ {
16833
+ ref,
16834
+ "data-slot": "dropdown-menu-label",
16835
+ className: cn(dropdownMenuLabelClass, inset && dropdownMenuItemInsetClass, className),
16836
+ ...props
16837
+ }
16838
+ );
16839
+ });
16840
+ var DropdownMenuShortcut = forwardRef(
16841
+ function DropdownMenuShortcut2({ className, ...props }, ref) {
16842
+ return /* @__PURE__ */ jsx(
16843
+ "span",
16844
+ {
16845
+ ref,
16846
+ "data-slot": "dropdown-menu-shortcut",
16847
+ className: cn(dropdownMenuShortcutClass, className),
16848
+ ...props
16849
+ }
16850
+ );
16851
+ }
16852
+ );
16509
16853
  function Field(props) {
16510
16854
  const formContext = useFormContext();
16511
16855
  if (props.name !== void 0) {
@@ -16635,81 +16979,12 @@ function mergeRefs2(...refs) {
16635
16979
  };
16636
16980
  }
16637
16981
 
16638
- // src/components/page-header/PageHeader.tsx
16639
- var import_react_router_dom2 = __toESM(require_dist2());
16640
-
16641
- // src/components/page-header/pageHeaderVariants.ts
16642
- var pageHeaderBaseClass = "flex w-full flex-col gap-3";
16643
- var pageHeaderBorderedClass = "border-b border-border pb-4";
16644
- var pageHeaderTitleRowClass = "flex flex-wrap items-start justify-between gap-3 sm:gap-4";
16645
- var pageHeaderTitleBlockClass = "min-w-0 flex-1 space-y-1";
16646
- var pageHeaderTitleClass = "text-2xl font-semibold tracking-tight text-foreground";
16647
- var pageHeaderDescriptionClass = "text-sm text-muted-foreground";
16648
- var pageHeaderActionsClass = "flex shrink-0 flex-wrap items-center gap-2";
16649
- var pageHeaderBackClass = "inline-flex items-center gap-1.5 self-start text-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-md";
16650
- var pageHeaderBackIconClass = "size-4 shrink-0 rtl:rotate-180";
16651
- var pageHeaderBreadcrumbsClass = "text-xs text-muted-foreground";
16652
- var PageHeader = forwardRef(function PageHeader2({
16653
- title,
16654
- description,
16655
- breadcrumbs,
16656
- back,
16657
- actions,
16658
- as = "h1",
16659
- bordered = false,
16660
- className,
16661
- ...props
16662
- }, ref) {
16663
- return /* @__PURE__ */ jsxs(
16664
- "header",
16665
- {
16666
- ref,
16667
- "data-slot": "page-header",
16668
- className: cn(pageHeaderBaseClass, bordered && pageHeaderBorderedClass, className),
16669
- ...props,
16670
- children: [
16671
- breadcrumbs ? /* @__PURE__ */ jsx("div", { "data-slot": "page-header-breadcrumbs", className: pageHeaderBreadcrumbsClass, children: breadcrumbs }) : null,
16672
- back ? /* @__PURE__ */ jsx(PageHeaderBack, { ...back }) : null,
16673
- /* @__PURE__ */ jsxs("div", { "data-slot": "page-header-row", className: pageHeaderTitleRowClass, children: [
16674
- /* @__PURE__ */ jsxs("div", { className: pageHeaderTitleBlockClass, children: [
16675
- createElement(
16676
- as,
16677
- { "data-slot": "page-header-title", className: pageHeaderTitleClass },
16678
- title
16679
- ),
16680
- description ? /* @__PURE__ */ jsx("p", { "data-slot": "page-header-description", className: pageHeaderDescriptionClass, children: description }) : null
16681
- ] }),
16682
- actions ? /* @__PURE__ */ jsx("div", { "data-slot": "page-header-actions", className: pageHeaderActionsClass, children: actions }) : null
16683
- ] })
16684
- ]
16685
- }
16686
- );
16687
- });
16688
- function PageHeaderBack({ label = "Back", to, onClick, render }) {
16689
- const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
16690
- /* @__PURE__ */ jsx(ArrowLeft, { className: pageHeaderBackIconClass, "aria-hidden": "true" }),
16691
- /* @__PURE__ */ jsx("span", { children: label })
16692
- ] });
16693
- if (render) {
16694
- return render({
16695
- to,
16696
- onClick,
16697
- className: pageHeaderBackClass,
16698
- children: inner
16699
- });
16700
- }
16701
- if (to) {
16702
- return /* @__PURE__ */ jsx(import_react_router_dom2.Link, { to, onClick, className: pageHeaderBackClass, children: inner });
16703
- }
16704
- return /* @__PURE__ */ jsx("button", { type: "button", onClick, className: pageHeaderBackClass, children: inner });
16705
- }
16706
-
16707
16982
  // src/components/form-page/formPageVariants.ts
16708
16983
  var formPageBaseClass = "flex w-full flex-col gap-6";
16709
16984
  var formPageBodyClass = "flex-1";
16710
16985
  var formPageActionsBarClass = "sticky bottom-0 -mx-6 -mb-6 mt-6 flex items-center justify-end gap-2 border-t border-border bg-background/95 px-6 py-3 backdrop-blur supports-[backdrop-filter]:bg-background/80";
16711
16986
  var formPageSkeletonRowClass = "h-10 w-full animate-pulse rounded-md bg-muted";
16712
- var DEFAULT_SKELETON_ROW_COUNT = 6;
16987
+ var DEFAULT_SKELETON_ROW_COUNT2 = 6;
16713
16988
  function FormPage({
16714
16989
  title,
16715
16990
  description,
@@ -16717,7 +16992,7 @@ function FormPage({
16717
16992
  bordered = true,
16718
16993
  onSubmit,
16719
16994
  isLoading = false,
16720
- loadingRowCount = DEFAULT_SKELETON_ROW_COUNT,
16995
+ loadingRowCount = DEFAULT_SKELETON_ROW_COUNT2,
16721
16996
  actions,
16722
16997
  children,
16723
16998
  className,
@@ -17482,7 +17757,7 @@ function SortIndicator({ active, direction }) {
17482
17757
  if (!active) return /* @__PURE__ */ jsx(ChevronsUpDown, { "aria-hidden": "true", className });
17483
17758
  return direction === "asc" ? /* @__PURE__ */ jsx(ChevronUp, { "aria-hidden": "true", className }) : /* @__PURE__ */ jsx(ChevronDown, { "aria-hidden": "true", className });
17484
17759
  }
17485
- var DEFAULT_LABELS = {
17760
+ var DEFAULT_LABELS2 = {
17486
17761
  searchPlaceholder: "Search\u2026",
17487
17762
  searchAriaLabel: "Search",
17488
17763
  reset: "Reset filters",
@@ -17515,7 +17790,7 @@ function ListPage({
17515
17790
  labels: labelsProp,
17516
17791
  className
17517
17792
  }) {
17518
- const labels = { ...DEFAULT_LABELS, ...labelsProp };
17793
+ const labels = { ...DEFAULT_LABELS2, ...labelsProp };
17519
17794
  const initialFilterValues = useMemo(() => {
17520
17795
  const init = {};
17521
17796
  for (const f of filters ?? []) {
@@ -17914,6 +18189,101 @@ var Textarea = forwardRef(function Textarea2({
17914
18189
  }
17915
18190
  );
17916
18191
  });
18192
+
18193
+ // src/components/toast/toastVariants.ts
18194
+ var toastClassNames = {
18195
+ toast: "group/toast pointer-events-auto flex w-full items-start gap-3 rounded-md border border-border bg-popover p-4 text-sm text-popover-foreground shadow-lg",
18196
+ title: "text-sm font-medium text-foreground",
18197
+ description: "text-xs text-muted-foreground",
18198
+ actionButton: "inline-flex h-7 items-center justify-center rounded-sm bg-primary px-2 text-xs font-medium text-primary-foreground hover:bg-primary/90",
18199
+ cancelButton: "inline-flex h-7 items-center justify-center rounded-sm border border-border bg-background px-2 text-xs font-medium text-foreground hover:bg-accent",
18200
+ closeButton: "group-hover/toast:opacity-100 absolute end-2 top-2 inline-flex size-5 items-center justify-center rounded-sm text-muted-foreground hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40",
18201
+ icon: "shrink-0",
18202
+ content: "flex flex-col gap-0.5 min-w-0",
18203
+ success: "[--normal-bg:var(--color-popover)] [--normal-border:var(--color-success)]",
18204
+ error: "[--normal-bg:var(--color-popover)] [--normal-border:var(--color-destructive)]",
18205
+ warning: "[--normal-bg:var(--color-popover)] [--normal-border:var(--color-warning)]",
18206
+ info: "[--normal-bg:var(--color-popover)] [--normal-border:var(--color-primary)]"
18207
+ };
18208
+ function Toaster(props) {
18209
+ const dir = useDirection();
18210
+ const defaultPosition = dir === "rtl" ? "bottom-left" : "bottom-right";
18211
+ return /* @__PURE__ */ jsx(
18212
+ Toaster$1,
18213
+ {
18214
+ dir,
18215
+ position: props.position ?? defaultPosition,
18216
+ richColors: props.richColors ?? true,
18217
+ closeButton: props.closeButton ?? true,
18218
+ ...props,
18219
+ toastOptions: {
18220
+ ...props.toastOptions,
18221
+ classNames: {
18222
+ ...toastClassNames,
18223
+ ...props.toastOptions?.classNames ?? {}
18224
+ }
18225
+ }
18226
+ }
18227
+ );
18228
+ }
18229
+
18230
+ // src/components/tooltip/tooltipVariants.ts
18231
+ var tooltipContentClass = "z-50 max-w-xs rounded-md bg-foreground px-2.5 py-1.5 text-xs font-medium text-background 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";
18232
+ var tooltipArrowClass = "fill-foreground";
18233
+ function TooltipProvider({
18234
+ delayDuration = 200,
18235
+ skipDelayDuration = 300,
18236
+ ...props
18237
+ }) {
18238
+ return /* @__PURE__ */ jsx(
18239
+ RadixTooltip.Provider,
18240
+ {
18241
+ delayDuration,
18242
+ skipDelayDuration,
18243
+ ...props
18244
+ }
18245
+ );
18246
+ }
18247
+ function Tooltip({
18248
+ content,
18249
+ children,
18250
+ side = "top",
18251
+ align = "center",
18252
+ delayDuration,
18253
+ disabled = false,
18254
+ open,
18255
+ defaultOpen,
18256
+ onOpenChange,
18257
+ className,
18258
+ sideOffset = 6
18259
+ }) {
18260
+ if (disabled || content === null || content === void 0 || content === false) {
18261
+ return children;
18262
+ }
18263
+ return /* @__PURE__ */ jsxs(
18264
+ RadixTooltip.Root,
18265
+ {
18266
+ open,
18267
+ defaultOpen,
18268
+ onOpenChange,
18269
+ delayDuration,
18270
+ children: [
18271
+ /* @__PURE__ */ jsx(RadixTooltip.Trigger, { asChild: true, children }),
18272
+ /* @__PURE__ */ jsx(RadixTooltip.Portal, { children: /* @__PURE__ */ jsx(
18273
+ RadixTooltip.Content,
18274
+ {
18275
+ side,
18276
+ align,
18277
+ sideOffset,
18278
+ "data-slot": "tooltip-content",
18279
+ className: cn(tooltipContentClass, className),
18280
+ children: content
18281
+ }
18282
+ ) })
18283
+ ]
18284
+ }
18285
+ );
18286
+ }
17917
18287
  /*! Bundled license information:
17918
18288
 
17919
18289
  react-router/dist/development/chunk-5KNZJZUH.mjs:
@@ -17944,6 +18314,6 @@ react-router-dom/dist/index.js:
17944
18314
  *)
17945
18315
  */
17946
18316
 
17947
- export { AppShell, Avatar, Badge, Button, Checkbox, DashboardContent, DashboardHeader, DashboardLayout, DashboardMain, DatePicker, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, EmptyState, Field, FormPage, HeaderActions, HeaderCollapseTrigger, HeaderMobileTrigger, HeaderSearch, HeaderTitle, Input, LanguageSwitcher, ListPage, PageHeader, RadioGroup, RadioGroupItem, Select, Sidebar, SidebarFooter, SidebarGroup, SidebarHeader, SidebarNav, SidebarNavGroup, SidebarNavItem, Switch, Table, Textarea, badgeBaseClass, badgeDotSizeClass, badgeSizeClass, badgeVariantClass, buttonBaseClass, buttonSizeClass, buttonVariantClass, cn, datePickerCalendarClass, datePickerCaptionClass, datePickerContentClass, datePickerDayBaseClass, datePickerDayWrapperClass, datePickerDisabledClass, datePickerMonthClass, datePickerMonthGridClass, datePickerMonthsClass, datePickerNavButtonClass, datePickerNavClass, datePickerOutsideClass, datePickerPlaceholderClass, datePickerSelectedClass, datePickerTodayClass, datePickerTriggerBaseClass, datePickerTriggerSizeClass, datePickerTriggerVariantClass, datePickerValueClass, datePickerWeekClass, datePickerWeekdayClass, datePickerWeekdaysClass, dropdownMenuContentClass, dropdownMenuItemBaseClass, dropdownMenuItemInsetClass, dropdownMenuItemVariantClass, dropdownMenuLabelClass, dropdownMenuSeparatorClass, dropdownMenuShortcutClass, emptyStateActionsSpacingClass, emptyStateBaseClass, emptyStateContainerSizeClass, emptyStateDescriptionSizeClass, emptyStateIconWrapperBaseClass, emptyStateIconWrapperSizeClass, emptyStateTitleSizeClass, formPageActionsBarClass, formPageBaseClass, formPageBodyClass, formPageSkeletonRowClass, inputBaseClass, inputSizeClass, inputVariantClass, pageHeaderActionsClass, pageHeaderBackClass, pageHeaderBackIconClass, pageHeaderBaseClass, pageHeaderBorderedClass, pageHeaderBreadcrumbsClass, pageHeaderDescriptionClass, pageHeaderTitleBlockClass, pageHeaderTitleClass, pageHeaderTitleRowClass, radioGroupBaseClass, radioGroupOrientationClass, radioIndicatorBaseClass, radioIndicatorDotClass, radioIndicatorSizeClass, radioItemBaseClass, radioItemSizeClass, radioLabelSizeClass, radioOptionRowClass, selectBaseClass, selectSizeClass, selectVariantClass, switchThumbBaseClass, switchThumbClass, switchTrackBaseClass, switchTrackClass, alignClass as tableAlignClass, tableBaseClass, selectedRowClass as tableSelectedRowClass, tableSizeClass, sortIconClass as tableSortIconClass, textareaBaseClass, textareaResizeClass, textareaSizeClass, textareaVariantClass, useDashboardLayout, useDirection };
18317
+ export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AppShell, Avatar, Badge, Button, Checkbox, ConfirmDialogProvider, DashboardContent, DashboardHeader, DashboardLayout, DashboardMain, DatePicker, DetailPage, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, EmptyState, Field, FormPage, HeaderActions, HeaderCollapseTrigger, HeaderMobileTrigger, HeaderSearch, HeaderTitle, Input, LanguageSwitcher, ListPage, PageHeader, RadioGroup, RadioGroupItem, Select, Sidebar, SidebarFooter, SidebarGroup, SidebarHeader, SidebarNav, SidebarNavGroup, SidebarNavItem, Switch, Table, Textarea, Toaster, Tooltip, TooltipProvider, badgeBaseClass, badgeDotSizeClass, badgeSizeClass, badgeVariantClass, buttonBaseClass, buttonSizeClass, buttonVariantClass, cn, datePickerCalendarClass, datePickerCaptionClass, datePickerContentClass, datePickerDayBaseClass, datePickerDayWrapperClass, datePickerDisabledClass, datePickerMonthClass, datePickerMonthGridClass, datePickerMonthsClass, datePickerNavButtonClass, datePickerNavClass, datePickerOutsideClass, datePickerPlaceholderClass, datePickerSelectedClass, datePickerTodayClass, datePickerTriggerBaseClass, datePickerTriggerSizeClass, datePickerTriggerVariantClass, datePickerValueClass, datePickerWeekClass, datePickerWeekdayClass, datePickerWeekdaysClass, detailPageBaseClass, detailPageBodyClass, detailPageEmptyClass, detailPageSkeletonRowClass, dialogCloseButtonClass, dialogContentClass, dialogDescriptionClass, dialogFooterClass, dialogHeaderClass, dialogOverlayClass, dialogTitleClass, dropdownMenuContentClass, dropdownMenuItemBaseClass, dropdownMenuItemInsetClass, dropdownMenuItemVariantClass, dropdownMenuLabelClass, dropdownMenuSeparatorClass, dropdownMenuShortcutClass, emptyStateActionsSpacingClass, emptyStateBaseClass, emptyStateContainerSizeClass, emptyStateDescriptionSizeClass, emptyStateIconWrapperBaseClass, emptyStateIconWrapperSizeClass, emptyStateTitleSizeClass, formPageActionsBarClass, formPageBaseClass, formPageBodyClass, formPageSkeletonRowClass, inputBaseClass, inputSizeClass, inputVariantClass, pageHeaderActionsClass, pageHeaderBackClass, pageHeaderBackIconClass, pageHeaderBaseClass, pageHeaderBorderedClass, pageHeaderBreadcrumbsClass, pageHeaderDescriptionClass, pageHeaderTitleBlockClass, pageHeaderTitleClass, pageHeaderTitleRowClass, radioGroupBaseClass, radioGroupOrientationClass, radioIndicatorBaseClass, radioIndicatorDotClass, radioIndicatorSizeClass, radioItemBaseClass, radioItemSizeClass, radioLabelSizeClass, radioOptionRowClass, selectBaseClass, selectSizeClass, selectVariantClass, switchThumbBaseClass, switchThumbClass, switchTrackBaseClass, switchTrackClass, alignClass as tableAlignClass, tableBaseClass, selectedRowClass as tableSelectedRowClass, tableSizeClass, sortIconClass as tableSortIconClass, textareaBaseClass, textareaResizeClass, textareaSizeClass, textareaVariantClass, toastClassNames, tooltipArrowClass, tooltipContentClass, useConfirm, useDashboardLayout, useDirection };
17948
18318
  //# sourceMappingURL=index.js.map
17949
18319
  //# sourceMappingURL=index.js.map