@blaze-dev/ui 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/data/filter-section.d.ts +42 -0
  2. package/dist/data/filter-section.d.ts.map +1 -0
  3. package/dist/data/filter-section.js +21 -0
  4. package/dist/data/filter-section.js.map +1 -0
  5. package/dist/data/index.d.ts +2 -0
  6. package/dist/data/index.d.ts.map +1 -1
  7. package/dist/data/index.js +2 -0
  8. package/dist/data/index.js.map +1 -1
  9. package/dist/data/info-row.d.ts +3 -2
  10. package/dist/data/info-row.d.ts.map +1 -1
  11. package/dist/data/info-row.js +5 -2
  12. package/dist/data/info-row.js.map +1 -1
  13. package/dist/data/results-count.d.ts +11 -0
  14. package/dist/data/results-count.d.ts.map +1 -0
  15. package/dist/data/results-count.js +8 -0
  16. package/dist/data/results-count.js.map +1 -0
  17. package/dist/feedback/app-error-boundary.d.ts +21 -0
  18. package/dist/feedback/app-error-boundary.d.ts.map +1 -0
  19. package/dist/feedback/app-error-boundary.js +80 -0
  20. package/dist/feedback/app-error-boundary.js.map +1 -0
  21. package/dist/feedback/async-state.d.ts +18 -0
  22. package/dist/feedback/async-state.d.ts.map +1 -0
  23. package/dist/feedback/async-state.js +24 -0
  24. package/dist/feedback/async-state.js.map +1 -0
  25. package/dist/feedback/confirm-modal.d.ts +14 -0
  26. package/dist/feedback/confirm-modal.d.ts.map +1 -0
  27. package/dist/feedback/confirm-modal.js +19 -0
  28. package/dist/feedback/confirm-modal.js.map +1 -0
  29. package/dist/feedback/index.d.ts +3 -0
  30. package/dist/feedback/index.d.ts.map +1 -1
  31. package/dist/feedback/index.js +3 -0
  32. package/dist/feedback/index.js.map +1 -1
  33. package/dist/hooks/index.d.ts +8 -0
  34. package/dist/hooks/index.d.ts.map +1 -1
  35. package/dist/hooks/index.js +8 -0
  36. package/dist/hooks/index.js.map +1 -1
  37. package/dist/hooks/use-confirm.d.ts +36 -0
  38. package/dist/hooks/use-confirm.d.ts.map +1 -0
  39. package/dist/hooks/use-confirm.js +49 -0
  40. package/dist/hooks/use-confirm.js.map +1 -0
  41. package/dist/hooks/use-debounced-search.d.ts +10 -0
  42. package/dist/hooks/use-debounced-search.d.ts.map +1 -0
  43. package/dist/hooks/use-debounced-search.js +18 -0
  44. package/dist/hooks/use-debounced-search.js.map +1 -0
  45. package/dist/hooks/use-infinite-scroll.d.ts +12 -0
  46. package/dist/hooks/use-infinite-scroll.d.ts.map +1 -0
  47. package/dist/hooks/use-infinite-scroll.js +22 -0
  48. package/dist/hooks/use-infinite-scroll.js.map +1 -0
  49. package/dist/hooks/use-modal-state.d.ts +20 -0
  50. package/dist/hooks/use-modal-state.d.ts.map +1 -0
  51. package/dist/hooks/use-modal-state.js +22 -0
  52. package/dist/hooks/use-modal-state.js.map +1 -0
  53. package/dist/hooks/use-mutation-toast.d.ts +25 -0
  54. package/dist/hooks/use-mutation-toast.d.ts.map +1 -0
  55. package/dist/hooks/use-mutation-toast.js +48 -0
  56. package/dist/hooks/use-mutation-toast.js.map +1 -0
  57. package/dist/hooks/use-page-title.d.ts +5 -0
  58. package/dist/hooks/use-page-title.d.ts.map +1 -0
  59. package/dist/hooks/use-page-title.js +10 -0
  60. package/dist/hooks/use-page-title.js.map +1 -0
  61. package/dist/hooks/use-persisted-state.d.ts +7 -0
  62. package/dist/hooks/use-persisted-state.d.ts.map +1 -0
  63. package/dist/hooks/use-persisted-state.js +34 -0
  64. package/dist/hooks/use-persisted-state.js.map +1 -0
  65. package/dist/hooks/use-theme.d.ts +8 -0
  66. package/dist/hooks/use-theme.d.ts.map +1 -0
  67. package/dist/hooks/use-theme.js +26 -0
  68. package/dist/hooks/use-theme.js.map +1 -0
  69. package/dist/index.d.ts +14 -0
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +14 -0
  72. package/dist/index.js.map +1 -1
  73. package/dist/tabs.d.ts +15 -0
  74. package/dist/tabs.d.ts.map +1 -0
  75. package/dist/tabs.js +8 -0
  76. package/dist/tabs.js.map +1 -0
  77. package/dist/utils/date-utils.d.ts +31 -0
  78. package/dist/utils/date-utils.d.ts.map +1 -0
  79. package/dist/utils/date-utils.js +78 -0
  80. package/dist/utils/date-utils.js.map +1 -0
  81. package/dist/utils/index.d.ts +2 -0
  82. package/dist/utils/index.d.ts.map +1 -0
  83. package/dist/utils/index.js +2 -0
  84. package/dist/utils/index.js.map +1 -0
  85. package/package.json +19 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-infinite-scroll.d.ts","sourceRoot":"","sources":["../../src/hooks/use-infinite-scroll.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,WAAW,EAAE,OAAO,GAAG,SAAS,CAAA;IAChC,kBAAkB,EAAE,OAAO,CAAA;IAC3B,aAAa,EAAE,MAAM,IAAI,CAAA;CAC1B;;EAkBA"}
@@ -0,0 +1,22 @@
1
+ import { useEffect, useRef } from 'react';
2
+ /**
3
+ * Auto-trigger `fetchNextPage` when a sentinel element enters the viewport.
4
+ * Attach `loadMoreRef` to a div at the bottom of your list.
5
+ */
6
+ export function useInfiniteScroll(opts) {
7
+ const loadMoreRef = useRef(null);
8
+ useEffect(() => {
9
+ const el = loadMoreRef.current;
10
+ if (!el)
11
+ return;
12
+ const observer = new IntersectionObserver(([entry]) => {
13
+ if (entry.isIntersecting && opts.hasNextPage && !opts.isFetchingNextPage) {
14
+ opts.fetchNextPage();
15
+ }
16
+ });
17
+ observer.observe(el);
18
+ return () => observer.disconnect();
19
+ }, [opts.hasNextPage, opts.isFetchingNextPage, opts.fetchNextPage]);
20
+ return { loadMoreRef };
21
+ }
22
+ //# sourceMappingURL=use-infinite-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-infinite-scroll.js","sourceRoot":"","sources":["../../src/hooks/use-infinite-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEzC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAIjC;IACC,MAAM,WAAW,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAA;IAEvD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAA;QAC9B,IAAI,CAAC,EAAE;YAAE,OAAM;QAEf,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE;YACpD,IAAI,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACzE,IAAI,CAAC,aAAa,EAAE,CAAA;YACtB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACpB,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAA;IACpC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnE,OAAO,EAAE,WAAW,EAAE,CAAA;AACxB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Simple boolean modal state (open/close).
3
+ */
4
+ export declare function useModalState(): {
5
+ readonly isOpen: boolean;
6
+ readonly open: () => void;
7
+ readonly close: () => void;
8
+ readonly setIsOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
9
+ };
10
+ /**
11
+ * Modal state with an associated item (e.g. editing an entity).
12
+ * Opening sets both isOpen=true and the item; closing clears both.
13
+ */
14
+ export declare function useItemModal<T>(): {
15
+ readonly isOpen: boolean;
16
+ readonly item: T | null;
17
+ readonly open: (value: T) => void;
18
+ readonly close: () => void;
19
+ };
20
+ //# sourceMappingURL=use-modal-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-modal-state.d.ts","sourceRoot":"","sources":["../../src/hooks/use-modal-state.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,aAAa;;;;;EAK5B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC;;;2BAGK,CAAC;;EAGnC"}
@@ -0,0 +1,22 @@
1
+ import { useCallback, useState } from 'react';
2
+ /**
3
+ * Simple boolean modal state (open/close).
4
+ */
5
+ export function useModalState() {
6
+ const [isOpen, setIsOpen] = useState(false);
7
+ const open = useCallback(() => setIsOpen(true), []);
8
+ const close = useCallback(() => setIsOpen(false), []);
9
+ return { isOpen, open, close, setIsOpen };
10
+ }
11
+ /**
12
+ * Modal state with an associated item (e.g. editing an entity).
13
+ * Opening sets both isOpen=true and the item; closing clears both.
14
+ */
15
+ export function useItemModal() {
16
+ const [item, setItem] = useState(null);
17
+ const isOpen = item !== null;
18
+ const open = useCallback((value) => setItem(value), []);
19
+ const close = useCallback(() => setItem(null), []);
20
+ return { isOpen, item, open, close };
21
+ }
22
+ //# sourceMappingURL=use-modal-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-modal-state.js","sourceRoot":"","sources":["../../src/hooks/use-modal-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE7C;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IACnD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;IACrD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAW,CAAA;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAW,IAAI,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,KAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAClD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAW,CAAA;AAC/C,CAAC"}
@@ -0,0 +1,25 @@
1
+ interface MutateOptions<TData, TError, TVariables> {
2
+ onSuccess?: (data: TData, variables: TVariables, context: unknown) => void | Promise<void>;
3
+ onError?: (error: TError, variables: TVariables, context: unknown) => void | Promise<void>;
4
+ }
5
+ interface MutationLike<TData, TError, TVariables> {
6
+ mutate: (variables: TVariables, options?: MutateOptions<TData, TError, TVariables>) => void;
7
+ mutateAsync: (variables: TVariables, options?: MutateOptions<TData, TError, TVariables>) => Promise<TData>;
8
+ }
9
+ export interface MutationToastOptions<TData = unknown, TError = Error, TVariables = unknown> {
10
+ successMessage?: string | ((data: TData, variables: TVariables) => string);
11
+ errorMessage?: string | ((error: TError) => string);
12
+ invalidateQueries?: () => void | Promise<void>;
13
+ onSuccess?: (data: TData, variables: TVariables) => void | Promise<void>;
14
+ onError?: (error: TError, variables: TVariables) => void | Promise<void>;
15
+ }
16
+ /**
17
+ * Wrap a tRPC (or any compatible) mutation to automatically show toast
18
+ * notifications on success/error and optionally invalidate queries.
19
+ */
20
+ export declare function useMutationToast<TData = unknown, TError = Error, TVariables = void, TMutation extends MutationLike<TData, TError, TVariables> = MutationLike<TData, TError, TVariables>>(mutation: TMutation, options?: MutationToastOptions<TData, TError, TVariables>): Omit<TMutation, 'mutate' | 'mutateAsync'> & {
21
+ mutate: (variables: TVariables) => void;
22
+ mutateAsync: (variables: TVariables) => Promise<TData>;
23
+ };
24
+ export {};
25
+ //# sourceMappingURL=use-mutation-toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-mutation-toast.d.ts","sourceRoot":"","sources":["../../src/hooks/use-mutation-toast.ts"],"names":[],"mappings":"AAEA,UAAU,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU;IAC/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1F,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3F;AAED,UAAU,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU;IAC9C,MAAM,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,CAAA;IAC3F,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;CAC3G;AAED,MAAM,WAAW,oBAAoB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,UAAU,GAAG,OAAO;IACzF,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,KAAK,MAAM,CAAC,CAAA;IAC1E,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAA;IACnD,iBAAiB,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACzE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,GAAG,OAAO,EACf,MAAM,GAAG,KAAK,EACd,UAAU,GAAG,IAAI,EACjB,SAAS,SAAS,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAEnG,QAAQ,EAAE,SAAS,EACnB,OAAO,GAAE,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAM,GAC5D,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,aAAa,CAAC,GAAG;IAC7C,MAAM,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,IAAI,CAAA;IACvC,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;CACvD,CAgDA"}
@@ -0,0 +1,48 @@
1
+ import { useToast } from '../feedback/toast-provider.js';
2
+ /**
3
+ * Wrap a tRPC (or any compatible) mutation to automatically show toast
4
+ * notifications on success/error and optionally invalidate queries.
5
+ */
6
+ export function useMutationToast(mutation, options = {}) {
7
+ const { addToast } = useToast();
8
+ const { successMessage, errorMessage, invalidateQueries, onSuccess, onError } = options;
9
+ const handleSuccess = async (data, variables) => {
10
+ if (invalidateQueries) {
11
+ try {
12
+ await invalidateQueries();
13
+ }
14
+ catch {
15
+ addToast('Operation succeeded, but display may be out of date. Please refresh.', 'warning');
16
+ }
17
+ }
18
+ if (successMessage) {
19
+ const message = typeof successMessage === 'function' ? successMessage(data, variables) : successMessage;
20
+ addToast(message, 'success');
21
+ }
22
+ await onSuccess?.(data, variables);
23
+ };
24
+ const handleError = async (error, variables) => {
25
+ const message = errorMessage
26
+ ? typeof errorMessage === 'function'
27
+ ? errorMessage(error)
28
+ : errorMessage
29
+ : `Error: ${error.message}`;
30
+ addToast(message, 'error');
31
+ await onError?.(error, variables);
32
+ };
33
+ const mutate = (variables) => {
34
+ mutation.mutate(variables, {
35
+ onSuccess: (data, vars) => { handleSuccess(data, vars); },
36
+ onError: (error, vars) => { handleError(error, vars); },
37
+ });
38
+ };
39
+ const mutateAsync = async (variables) => {
40
+ return mutation.mutateAsync(variables, {
41
+ onSuccess: (data, vars) => { handleSuccess(data, vars); },
42
+ onError: (error, vars) => { handleError(error, vars); },
43
+ });
44
+ };
45
+ const { mutate: _m, mutateAsync: _ma, ...rest } = mutation;
46
+ return { ...rest, mutate, mutateAsync };
47
+ }
48
+ //# sourceMappingURL=use-mutation-toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-mutation-toast.js","sourceRoot":"","sources":["../../src/hooks/use-mutation-toast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAoBxD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAM9B,QAAmB,EACnB,UAA2D,EAAE;IAK7D,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAA;IAC/B,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAEvF,MAAM,aAAa,GAAG,KAAK,EAAE,IAAW,EAAE,SAAqB,EAAE,EAAE;QACjE,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,iBAAiB,EAAE,CAAA;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,CAAC,sEAAsE,EAAE,SAAS,CAAC,CAAA;YAC7F,CAAC;QACH,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,OAAO,cAAc,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAA;YACvG,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QAC9B,CAAC;QAED,MAAM,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACpC,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,KAAK,EAAE,KAAa,EAAE,SAAqB,EAAE,EAAE;QACjE,MAAM,OAAO,GAAG,YAAY;YAC1B,CAAC,CAAC,OAAO,YAAY,KAAK,UAAU;gBAClC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC;gBACrB,CAAC,CAAC,YAAY;YAChB,CAAC,CAAC,UAAW,KAAe,CAAC,OAAO,EAAE,CAAA;QAExC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC1B,MAAM,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACnC,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,CAAC,SAAqB,EAAE,EAAE;QACvC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE;YACzB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;SACvD,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,KAAK,EAAE,SAAqB,EAAE,EAAE;QAClD,OAAO,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE;YACrC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;SACvD,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAA;IAC1D,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;AACzC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Set `document.title` to "{title} - {appName}" or just {appName} if title is empty.
3
+ */
4
+ export declare function usePageTitle(title: string, appName?: string): void;
5
+ //# sourceMappingURL=use-page-title.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-page-title.d.ts","sourceRoot":"","sources":["../../src/hooks/use-page-title.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAQ,QAI1D"}
@@ -0,0 +1,10 @@
1
+ import { useEffect } from 'react';
2
+ /**
3
+ * Set `document.title` to "{title} - {appName}" or just {appName} if title is empty.
4
+ */
5
+ export function usePageTitle(title, appName = 'App') {
6
+ useEffect(() => {
7
+ document.title = title ? `${title} - ${appName}` : appName;
8
+ }, [title, appName]);
9
+ }
10
+ //# sourceMappingURL=use-page-title.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-page-title.js","sourceRoot":"","sources":["../../src/hooks/use-page-title.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,OAAO,GAAG,KAAK;IACzD,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;IAC5D,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;AACtB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * A drop-in replacement for useState that persists the value in localStorage.
3
+ * Uses JSON serialization. Falls back to defaultValue if localStorage is
4
+ * unavailable or the stored value can't be parsed.
5
+ */
6
+ export declare function usePersistedState<T>(key: string, defaultValue: T): readonly [T, (next: T | ((prev: T) => T)) => void];
7
+ //# sourceMappingURL=use-persisted-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-persisted-state.d.ts","sourceRoot":"","sources":["../../src/hooks/use-persisted-state.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,uBActD,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,WAe9B"}
@@ -0,0 +1,34 @@
1
+ import { useCallback, useState } from 'react';
2
+ /**
3
+ * A drop-in replacement for useState that persists the value in localStorage.
4
+ * Uses JSON serialization. Falls back to defaultValue if localStorage is
5
+ * unavailable or the stored value can't be parsed.
6
+ */
7
+ export function usePersistedState(key, defaultValue) {
8
+ const [value, setValue] = useState(() => {
9
+ try {
10
+ const stored = localStorage.getItem(key);
11
+ if (stored !== null) {
12
+ return JSON.parse(stored);
13
+ }
14
+ }
15
+ catch {
16
+ // ignore parse errors, use default
17
+ }
18
+ return defaultValue;
19
+ });
20
+ const setPersisted = useCallback((next) => {
21
+ setValue((prev) => {
22
+ const resolved = typeof next === 'function' ? next(prev) : next;
23
+ try {
24
+ localStorage.setItem(key, JSON.stringify(resolved));
25
+ }
26
+ catch {
27
+ // ignore quota errors
28
+ }
29
+ return resolved;
30
+ });
31
+ }, [key]);
32
+ return [value, setPersisted];
33
+ }
34
+ //# sourceMappingURL=use-persisted-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-persisted-state.js","sourceRoot":"","sources":["../../src/hooks/use-persisted-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE7C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAI,GAAW,EAAE,YAAe;IAC/D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAI,GAAG,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACxC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAM,CAAA;YAChC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;QACD,OAAO,YAAY,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,IAA0B,EAAE,EAAE;QAC7B,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE;YAChB,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAE,IAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACnF,IAAI,CAAC;gBACH,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;YACD,OAAO,QAAQ,CAAA;QACjB,CAAC,CAAC,CAAA;IACJ,CAAC,EACD,CAAC,GAAG,CAAC,CACN,CAAA;IAED,OAAO,CAAC,KAAK,EAAE,YAAY,CAAU,CAAA;AACvC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Manage DaisyUI theme via localStorage and `data-theme` attribute.
3
+ */
4
+ export declare function useTheme(defaultTheme?: string): {
5
+ readonly theme: string;
6
+ readonly setTheme: (newTheme: string) => void;
7
+ };
8
+ //# sourceMappingURL=use-theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-theme.d.ts","sourceRoot":"","sources":["../../src/hooks/use-theme.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,YAAY,SAAS;;kCAU/B,MAAM;EAapB"}
@@ -0,0 +1,26 @@
1
+ import { useCallback, useState } from 'react';
2
+ /**
3
+ * Manage DaisyUI theme via localStorage and `data-theme` attribute.
4
+ */
5
+ export function useTheme(defaultTheme = 'dark') {
6
+ const [theme, setThemeState] = useState(() => {
7
+ try {
8
+ return localStorage.getItem('theme') ?? defaultTheme;
9
+ }
10
+ catch {
11
+ return defaultTheme;
12
+ }
13
+ });
14
+ const setTheme = useCallback((newTheme) => {
15
+ setThemeState(newTheme);
16
+ try {
17
+ localStorage.setItem('theme', newTheme);
18
+ }
19
+ catch {
20
+ // ignore
21
+ }
22
+ document.documentElement.setAttribute('data-theme', newTheme);
23
+ }, []);
24
+ return { theme, setTheme };
25
+ }
26
+ //# sourceMappingURL=use-theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-theme.js","sourceRoot":"","sources":["../../src/hooks/use-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE7C;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,YAAY,GAAG,MAAM;IAC5C,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC3C,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,YAAY,CAAA;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,YAAY,CAAA;QACrB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,QAAgB,EAAE,EAAE;QACnB,aAAa,CAAC,QAAQ,CAAC,CAAA;QACvB,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;IAC/D,CAAC,EACD,EAAE,CACH,CAAA;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAW,CAAA;AACrC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -3,19 +3,33 @@ export { PageHeader } from './page-header.js';
3
3
  export { Breadcrumbs } from './breadcrumbs.js';
4
4
  export { DangerZone } from './danger-zone.js';
5
5
  export { ContextMenu } from './context-menu.js';
6
+ export { Tabs, type TabItem, type TabsProps } from './tabs.js';
6
7
  export { LoadingSpinner } from './feedback/loading-spinner.js';
7
8
  export { ErrorBox } from './feedback/error-box.js';
8
9
  export { EmptyState } from './feedback/empty-state.js';
9
10
  export { InfoAlert } from './feedback/info-alert.js';
10
11
  export { ToastProvider, useToast, type Toast, type ToastType } from './feedback/toast-provider.js';
12
+ export { AsyncState, type AsyncStateProps } from './feedback/async-state.js';
13
+ export { ConfirmModal, type ConfirmModalProps } from './feedback/confirm-modal.js';
14
+ export { AppErrorBoundary } from './feedback/app-error-boundary.js';
11
15
  export { StatCard } from './data/stat-card.js';
12
16
  export { DataTable } from './data/data-table.js';
13
17
  export { InfoRow } from './data/info-row.js';
14
18
  export { StatsGrid } from './data/stats-grid.js';
19
+ export { ResultsCount } from './data/results-count.js';
20
+ export { FilterSection, FilterLabel, FilterInput, FilterDateInput, FilterSelect } from './data/filter-section.js';
15
21
  export { ActionButton } from './action-button.js';
16
22
  export { CopyButton } from './copy-button.js';
17
23
  export { StatusBadge } from './status-badge.js';
18
24
  export { useCopyToClipboard } from './hooks/use-copy-to-clipboard.js';
25
+ export { useMutationToast, type MutationToastOptions } from './hooks/use-mutation-toast.js';
26
+ export { useModalState, useItemModal } from './hooks/use-modal-state.js';
27
+ export { useDebouncedSearch } from './hooks/use-debounced-search.js';
28
+ export { usePersistedState } from './hooks/use-persisted-state.js';
29
+ export { usePageTitle } from './hooks/use-page-title.js';
30
+ export { useTheme } from './hooks/use-theme.js';
31
+ export { useConfirm, type ConfirmOptions, type ConfirmModalState } from './hooks/use-confirm.js';
32
+ export { useInfiniteScroll } from './hooks/use-infinite-scroll.js';
19
33
  export { FormField } from './forms/form-field.js';
20
34
  export { FormSelect } from './forms/form-select.js';
21
35
  export { FormTextarea } from './forms/form-textarea.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAGlG,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AAGrE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAA;AAG9D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAClG,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAGnE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAGjH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAC3F,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAGlE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA"}
package/dist/index.js CHANGED
@@ -4,23 +4,37 @@ export { PageHeader } from './page-header.js';
4
4
  export { Breadcrumbs } from './breadcrumbs.js';
5
5
  export { DangerZone } from './danger-zone.js';
6
6
  export { ContextMenu } from './context-menu.js';
7
+ export { Tabs } from './tabs.js';
7
8
  // Feedback
8
9
  export { LoadingSpinner } from './feedback/loading-spinner.js';
9
10
  export { ErrorBox } from './feedback/error-box.js';
10
11
  export { EmptyState } from './feedback/empty-state.js';
11
12
  export { InfoAlert } from './feedback/info-alert.js';
12
13
  export { ToastProvider, useToast } from './feedback/toast-provider.js';
14
+ export { AsyncState } from './feedback/async-state.js';
15
+ export { ConfirmModal } from './feedback/confirm-modal.js';
16
+ export { AppErrorBoundary } from './feedback/app-error-boundary.js';
13
17
  // Data
14
18
  export { StatCard } from './data/stat-card.js';
15
19
  export { DataTable } from './data/data-table.js';
16
20
  export { InfoRow } from './data/info-row.js';
17
21
  export { StatsGrid } from './data/stats-grid.js';
22
+ export { ResultsCount } from './data/results-count.js';
23
+ export { FilterSection, FilterLabel, FilterInput, FilterDateInput, FilterSelect } from './data/filter-section.js';
18
24
  // Buttons
19
25
  export { ActionButton } from './action-button.js';
20
26
  export { CopyButton } from './copy-button.js';
21
27
  export { StatusBadge } from './status-badge.js';
22
28
  // Hooks
23
29
  export { useCopyToClipboard } from './hooks/use-copy-to-clipboard.js';
30
+ export { useMutationToast } from './hooks/use-mutation-toast.js';
31
+ export { useModalState, useItemModal } from './hooks/use-modal-state.js';
32
+ export { useDebouncedSearch } from './hooks/use-debounced-search.js';
33
+ export { usePersistedState } from './hooks/use-persisted-state.js';
34
+ export { usePageTitle } from './hooks/use-page-title.js';
35
+ export { useTheme } from './hooks/use-theme.js';
36
+ export { useConfirm } from './hooks/use-confirm.js';
37
+ export { useInfiniteScroll } from './hooks/use-infinite-scroll.js';
24
38
  // Forms
25
39
  export { FormField } from './forms/form-field.js';
26
40
  export { FormSelect } from './forms/form-select.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAA8B,MAAM,8BAA8B,CAAA;AAElG,OAAO;AACP,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAEhD,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,QAAQ;AACR,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AAErE,QAAQ;AACR,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAgC,MAAM,WAAW,CAAA;AAE9D,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAA8B,MAAM,8BAA8B,CAAA;AAClG,OAAO,EAAE,UAAU,EAAwB,MAAM,2BAA2B,CAAA;AAC5E,OAAO,EAAE,YAAY,EAA0B,MAAM,6BAA6B,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAEnE,OAAO;AACP,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEjH,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,QAAQ;AACR,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAA6B,MAAM,+BAA+B,CAAA;AAC3F,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAA+C,MAAM,wBAAwB,CAAA;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAElE,QAAQ;AACR,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA"}
package/dist/tabs.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface TabItem {
3
+ id: string;
4
+ label: ReactNode;
5
+ content: ReactNode;
6
+ }
7
+ export interface TabsProps {
8
+ tabs: TabItem[];
9
+ defaultTab?: string;
10
+ variant?: 'bordered' | 'lifted' | 'boxed';
11
+ size?: 'xs' | 'sm' | 'md' | 'lg';
12
+ className?: string;
13
+ }
14
+ export declare function Tabs({ tabs, defaultTab, variant, size, className }: TabsProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../src/tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAA;AAEhD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,SAAS,CAAA;IAChB,OAAO,EAAE,SAAS,CAAA;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAA;IACzC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,2CAuB1F"}
package/dist/tabs.js ADDED
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ export function Tabs({ tabs, defaultTab, variant = 'bordered', size, className }) {
4
+ const [activeTab, setActiveTab] = useState(defaultTab ?? tabs[0]?.id ?? '');
5
+ const sizeClass = size ? `tabs-${size}` : '';
6
+ return (_jsxs("div", { className: className, children: [_jsx("div", { role: 'tablist', className: `tabs tabs-${variant} ${sizeClass}`, children: tabs.map((tab) => (_jsx("button", { type: 'button', role: 'tab', className: `tab ${activeTab === tab.id ? 'tab-active' : ''}`, onClick: () => setActiveTab(tab.id), children: tab.label }, tab.id))) }), tabs.find((t) => t.id === activeTab)?.content] }));
7
+ }
8
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../src/tabs.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,QAAQ,EAAE,MAAM,OAAO,CAAA;AAgBhD,MAAM,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,GAAG,UAAU,EAAE,IAAI,EAAE,SAAS,EAAa;IACzF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAE3E,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAE5C,OAAO,CACL,eAAK,SAAS,EAAE,SAAS,aACvB,cAAK,IAAI,EAAC,SAAS,EAAC,SAAS,EAAE,aAAa,OAAO,IAAI,SAAS,EAAE,YAC/D,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACjB,iBAEE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,KAAK,EACV,SAAS,EAAE,OAAO,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EAC5D,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,YAElC,GAAG,CAAC,KAAK,IANL,GAAG,CAAC,EAAE,CAOJ,CACV,CAAC,GACE,EACL,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,OAAO,IAC1C,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ /** "Jan 5, 2025" */
2
+ export declare function formatDateShort(date: string | Date): string;
3
+ /** "January 5, 2025" */
4
+ export declare function formatDateLong(date: string | Date): string;
5
+ /** "Jan 5, 2025, 14:30" */
6
+ export declare function formatDateTime(date: string | Date): string;
7
+ /** "14:30" */
8
+ export declare function formatTime(date: string | Date): string;
9
+ /** "2 hours ago" */
10
+ export declare function formatRelativeTime(date: string | Date): string;
11
+ /** "2 hours" */
12
+ export declare function formatTimeBetween(dateLeft: string | Date, dateRight: string | Date): string;
13
+ /** "2025-01-05" */
14
+ export declare function formatDateForInput(date: string | Date): string;
15
+ /** "2025-01-05T14:30" */
16
+ export declare function formatDateTimeForInput(date: string | Date): string;
17
+ /** "Jan 5, 2025, 14:30:45" */
18
+ export declare function formatFullTimestamp(date: string | Date): string;
19
+ /** "01/05/25 14:30" */
20
+ export declare function formatCompactTimestamp(date: string | Date): string;
21
+ /** "Jan 5" */
22
+ export declare function formatMonthDay(date: string | Date): string;
23
+ /** "Jan 5 - Jan 12, 2025" (collapses year when same) */
24
+ export declare function formatDateRange(start: string | Date, end: string | Date): string;
25
+ /** "Friday, January 3, 2025" */
26
+ export declare function formatWeekdayLong(date: string | Date): string;
27
+ /** "14:30:05" */
28
+ export declare function formatTimeWithSeconds(date: string | Date): string;
29
+ /** 1.5 -> "1h 30m", 0.5 -> "30m", 6 -> "6h" */
30
+ export declare function formatDuration(hours: number): string;
31
+ //# sourceMappingURL=date-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../../src/utils/date-utils.ts"],"names":[],"mappings":"AAMA,oBAAoB;AACpB,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE3D;AAED,wBAAwB;AACxB,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE1D;AAED,2BAA2B;AAC3B,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE1D;AAED,cAAc;AACd,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEtD;AAED,oBAAoB;AACpB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE9D;AAED,gBAAgB;AAChB,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE3F;AAED,mBAAmB;AACnB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE9D;AAED,yBAAyB;AACzB,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAElE;AAED,8BAA8B;AAC9B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE/D;AAED,uBAAuB;AACvB,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAElE;AAED,cAAc;AACd,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE1D;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMhF;AAED,gCAAgC;AAChC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE7D;AAED,iBAAiB;AACjB,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEjE;AAED,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOpD"}
@@ -0,0 +1,78 @@
1
+ import { format, formatDistance, formatDistanceToNow, parseISO } from 'date-fns';
2
+ function toDate(date) {
3
+ return typeof date === 'string' ? parseISO(date) : date;
4
+ }
5
+ /** "Jan 5, 2025" */
6
+ export function formatDateShort(date) {
7
+ return format(toDate(date), 'MMM d, yyyy');
8
+ }
9
+ /** "January 5, 2025" */
10
+ export function formatDateLong(date) {
11
+ return format(toDate(date), 'MMMM d, yyyy');
12
+ }
13
+ /** "Jan 5, 2025, 14:30" */
14
+ export function formatDateTime(date) {
15
+ return format(toDate(date), 'MMM d, yyyy, HH:mm');
16
+ }
17
+ /** "14:30" */
18
+ export function formatTime(date) {
19
+ return format(toDate(date), 'HH:mm');
20
+ }
21
+ /** "2 hours ago" */
22
+ export function formatRelativeTime(date) {
23
+ return formatDistanceToNow(toDate(date), { addSuffix: true });
24
+ }
25
+ /** "2 hours" */
26
+ export function formatTimeBetween(dateLeft, dateRight) {
27
+ return formatDistance(toDate(dateLeft), toDate(dateRight));
28
+ }
29
+ /** "2025-01-05" */
30
+ export function formatDateForInput(date) {
31
+ return format(toDate(date), 'yyyy-MM-dd');
32
+ }
33
+ /** "2025-01-05T14:30" */
34
+ export function formatDateTimeForInput(date) {
35
+ return format(toDate(date), "yyyy-MM-dd'T'HH:mm");
36
+ }
37
+ /** "Jan 5, 2025, 14:30:45" */
38
+ export function formatFullTimestamp(date) {
39
+ return format(toDate(date), 'MMM d, yyyy, HH:mm:ss');
40
+ }
41
+ /** "01/05/25 14:30" */
42
+ export function formatCompactTimestamp(date) {
43
+ return format(toDate(date), 'MM/dd/yy HH:mm');
44
+ }
45
+ /** "Jan 5" */
46
+ export function formatMonthDay(date) {
47
+ return format(toDate(date), 'MMM d');
48
+ }
49
+ /** "Jan 5 - Jan 12, 2025" (collapses year when same) */
50
+ export function formatDateRange(start, end) {
51
+ const s = toDate(start);
52
+ const e = toDate(end);
53
+ if (s.getTime() === e.getTime())
54
+ return format(e, 'MMM d, yyyy');
55
+ if (s.getFullYear() === e.getFullYear())
56
+ return `${format(s, 'MMM d')} - ${format(e, 'MMM d, yyyy')}`;
57
+ return `${format(s, 'MMM d, yyyy')} - ${format(e, 'MMM d, yyyy')}`;
58
+ }
59
+ /** "Friday, January 3, 2025" */
60
+ export function formatWeekdayLong(date) {
61
+ return format(toDate(date), 'EEEE, MMMM d, yyyy');
62
+ }
63
+ /** "14:30:05" */
64
+ export function formatTimeWithSeconds(date) {
65
+ return format(toDate(date), 'HH:mm:ss');
66
+ }
67
+ /** 1.5 -> "1h 30m", 0.5 -> "30m", 6 -> "6h" */
68
+ export function formatDuration(hours) {
69
+ const totalMinutes = Math.round(hours * 60);
70
+ const h = Math.floor(totalMinutes / 60);
71
+ const m = totalMinutes % 60;
72
+ if (h === 0)
73
+ return `${m}m`;
74
+ if (m === 0)
75
+ return `${h}h`;
76
+ return `${h}h ${m}m`;
77
+ }
78
+ //# sourceMappingURL=date-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-utils.js","sourceRoot":"","sources":["../../src/utils/date-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { formatDateShort, formatDateLong, formatDateTime, formatTime, formatRelativeTime, formatTimeBetween, formatDateForInput, formatDateTimeForInput, formatFullTimestamp, formatCompactTimestamp, formatMonthDay, formatDateRange, formatWeekdayLong, formatTimeWithSeconds, formatDuration, } from './date-utils.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,cAAc,EACd,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { formatDateShort, formatDateLong, formatDateTime, formatTime, formatRelativeTime, formatTimeBetween, formatDateForInput, formatDateTimeForInput, formatFullTimestamp, formatCompactTimestamp, formatMonthDay, formatDateRange, formatWeekdayLong, formatTimeWithSeconds, formatDuration, } from './date-utils.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,cAAc,EACd,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAA"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "type": "git",
5
5
  "url": "https://github.com/blaze-it/ui"
6
6
  },
7
- "version": "0.4.0",
7
+ "version": "0.6.0",
8
8
  "private": false,
9
9
  "description": "Shared React + DaisyUI component library for Blaze projects",
10
10
  "type": "module",
@@ -28,6 +28,10 @@
28
28
  "./hooks": {
29
29
  "types": "./dist/hooks/index.d.ts",
30
30
  "default": "./dist/hooks/index.js"
31
+ },
32
+ "./utils": {
33
+ "types": "./dist/utils/index.d.ts",
34
+ "default": "./dist/utils/index.js"
31
35
  }
32
36
  },
33
37
  "types": "./dist/index.d.ts",
@@ -38,11 +42,24 @@
38
42
  "react": ">=18.0.0",
39
43
  "react-dom": ">=18.0.0",
40
44
  "@tanstack/react-table": ">=8.0.0",
41
- "react-hook-form": ">=7.0.0"
45
+ "react-hook-form": ">=7.0.0",
46
+ "date-fns": ">=3.0.0"
47
+ },
48
+ "peerDependenciesMeta": {
49
+ "@tanstack/react-table": {
50
+ "optional": true
51
+ },
52
+ "react-hook-form": {
53
+ "optional": true
54
+ },
55
+ "date-fns": {
56
+ "optional": true
57
+ }
42
58
  },
43
59
  "devDependencies": {
44
60
  "@tanstack/react-table": "^8.21.0",
45
61
  "@types/react": "^19.0.0",
62
+ "date-fns": "^4.0.0",
46
63
  "react": "^19.0.0",
47
64
  "react-dom": "^19.0.0",
48
65
  "react-hook-form": "^7.54.0",