@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,42 @@
1
+ import type { ReactNode } from 'react';
2
+ interface FilterSectionProps {
3
+ children: ReactNode;
4
+ onClear?: () => void;
5
+ showClear?: boolean;
6
+ }
7
+ export declare function FilterSection({ children, onClear, showClear }: FilterSectionProps): import("react/jsx-runtime").JSX.Element;
8
+ interface FilterLabelProps {
9
+ htmlFor: string;
10
+ children: string;
11
+ }
12
+ export declare function FilterLabel({ htmlFor, children }: FilterLabelProps): import("react/jsx-runtime").JSX.Element;
13
+ interface FilterInputProps {
14
+ id: string;
15
+ label: string;
16
+ type?: 'text' | 'search';
17
+ value: string;
18
+ onChange: (value: string) => void;
19
+ placeholder?: string;
20
+ }
21
+ export declare function FilterInput({ id, label, type, value, onChange, placeholder, }: FilterInputProps): import("react/jsx-runtime").JSX.Element;
22
+ interface FilterDateInputProps {
23
+ id: string;
24
+ label: string;
25
+ value: string;
26
+ onChange: (value: string) => void;
27
+ }
28
+ export declare function FilterDateInput({ id, label, value, onChange }: FilterDateInputProps): import("react/jsx-runtime").JSX.Element;
29
+ interface FilterSelectProps {
30
+ id: string;
31
+ label: string;
32
+ value: string;
33
+ onChange: (value: string) => void;
34
+ options: Array<{
35
+ value: string;
36
+ label: string;
37
+ }>;
38
+ placeholder?: string;
39
+ }
40
+ export declare function FilterSelect({ id, label, value, onChange, options, placeholder, }: FilterSelectProps): import("react/jsx-runtime").JSX.Element;
41
+ export {};
42
+ //# sourceMappingURL=filter-section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-section.d.ts","sourceRoot":"","sources":["../../src/data/filter-section.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAiB,EAAE,EAAE,kBAAkB,2CAwBzF;AAED,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CAMlE;AAED,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,WAAW,CAAC,EAC1B,EAAE,EACF,KAAK,EACL,IAAa,EACb,KAAK,EACL,QAAQ,EACR,WAAW,GACZ,EAAE,gBAAgB,2CAclB;AAED,UAAU,oBAAoB;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAClC;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAanF;AAED,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAChD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,YAAY,CAAC,EAC3B,EAAE,EACF,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAW,GACZ,EAAE,iBAAiB,2CAmBnB"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Children } from 'react';
3
+ export function FilterSection({ children, onClear, showClear = false }) {
4
+ const validChildren = Children.toArray(children).filter(Boolean);
5
+ const childCount = validChildren.length;
6
+ const gridCols = showClear ? `repeat(${childCount}, 1fr) auto` : `repeat(${childCount}, 1fr)`;
7
+ return (_jsx("div", { className: 'card bg-base-200 border border-base-300 p-4 mb-6', children: _jsxs("div", { className: 'flex flex-col md:grid gap-4 items-stretch md:items-end', style: { gridTemplateColumns: gridCols }, children: [children, showClear && onClear && (_jsx("button", { type: 'button', className: 'btn btn-secondary whitespace-nowrap w-full md:w-auto', onClick: onClear, children: "Clear Filters" }))] }) }));
8
+ }
9
+ export function FilterLabel({ htmlFor, children }) {
10
+ return (_jsx("label", { htmlFor: htmlFor, className: 'block mb-2', children: _jsx("span", { className: 'text-sm font-semibold', children: children }) }));
11
+ }
12
+ export function FilterInput({ id, label, type = 'text', value, onChange, placeholder, }) {
13
+ return (_jsxs("div", { className: 'form-control w-full', children: [_jsx(FilterLabel, { htmlFor: id, children: label }), _jsx("input", { id: id, type: type, value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder, className: 'input input-bordered w-full' })] }));
14
+ }
15
+ export function FilterDateInput({ id, label, value, onChange }) {
16
+ return (_jsxs("div", { className: 'form-control w-full', children: [_jsx(FilterLabel, { htmlFor: id, children: label }), _jsx("input", { id: id, type: 'date', value: value, onChange: (e) => onChange(e.target.value), className: 'input input-bordered w-full' })] }));
17
+ }
18
+ export function FilterSelect({ id, label, value, onChange, options, placeholder, }) {
19
+ return (_jsxs("div", { className: 'form-control w-full', children: [_jsx(FilterLabel, { htmlFor: id, children: label }), _jsxs("select", { id: id, className: 'select select-bordered w-full', value: value, onChange: (e) => onChange(e.target.value), children: [placeholder && _jsx("option", { value: '', children: placeholder }), options.map((option) => (_jsx("option", { value: option.value, children: option.label }, option.value)))] })] }));
20
+ }
21
+ //# sourceMappingURL=filter-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-section.js","sourceRoot":"","sources":["../../src/data/filter-section.tsx"],"names":[],"mappings":"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"}
@@ -2,4 +2,6 @@ export { StatCard } from './stat-card.js';
2
2
  export { DataTable } from './data-table.js';
3
3
  export { InfoRow } from './info-row.js';
4
4
  export { StatsGrid } from './stats-grid.js';
5
+ export { ResultsCount } from './results-count.js';
6
+ export { FilterSection, FilterLabel, FilterInput, FilterDateInput, FilterSelect } from './filter-section.js';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA"}
@@ -2,4 +2,6 @@ export { StatCard } from './stat-card.js';
2
2
  export { DataTable } from './data-table.js';
3
3
  export { InfoRow } from './info-row.js';
4
4
  export { StatsGrid } from './stats-grid.js';
5
+ export { ResultsCount } from './results-count.js';
6
+ export { FilterSection, FilterLabel, FilterInput, FilterDateInput, FilterSelect } from './filter-section.js';
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA"}
@@ -1,9 +1,10 @@
1
1
  import type { ReactNode } from 'react';
2
2
  interface InfoRowProps {
3
3
  label: string;
4
- value?: ReactNode;
4
+ value?: string | number | ReactNode;
5
+ formatValue?: (value: string | number) => string;
5
6
  className?: string;
6
7
  }
7
- export declare function InfoRow({ label, value, className }: InfoRowProps): import("react/jsx-runtime").JSX.Element;
8
+ export declare function InfoRow({ label, value, formatValue, className }: InfoRowProps): import("react/jsx-runtime").JSX.Element;
8
9
  export {};
9
10
  //# sourceMappingURL=info-row.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"info-row.d.ts","sourceRoot":"","sources":["../../src/data/info-row.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAc,EAAE,EAAE,YAAY,2CAOrE"}
1
+ {"version":3,"file":"info-row.d.ts","sourceRoot":"","sources":["../../src/data/info-row.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACnC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAA;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAc,EAAE,EAAE,YAAY,2CAWlF"}
@@ -1,5 +1,8 @@
1
1
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- export function InfoRow({ label, value, className = '' }) {
3
- return (_jsxs("div", { className: `flex flex-col sm:flex-row sm:gap-2 min-w-0 ${className}`, children: [_jsxs("span", { className: 'text-base-content/60 shrink-0 text-sm', children: [label, ":"] }), _jsx("span", { className: 'text-base-content/70 min-w-0 break-words text-sm', children: value ?? '' })] }));
2
+ export function InfoRow({ label, value, formatValue, className = '' }) {
3
+ const displayValue = formatValue && (typeof value === 'string' || typeof value === 'number')
4
+ ? formatValue(value)
5
+ : value;
6
+ return (_jsxs("div", { className: `flex flex-col sm:flex-row sm:gap-2 min-w-0 ${className}`, children: [_jsxs("span", { className: 'text-base-content/60 shrink-0 text-sm', children: [label, ":"] }), _jsx("span", { className: 'text-base-content/70 min-w-0 break-words text-sm', children: displayValue ?? '—' })] }));
4
7
  }
5
8
  //# sourceMappingURL=info-row.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"info-row.js","sourceRoot":"","sources":["../../src/data/info-row.tsx"],"names":[],"mappings":";AAQA,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,GAAG,EAAE,EAAgB;IACpE,OAAO,CACL,eAAK,SAAS,EAAE,8CAA8C,SAAS,EAAE,aACvE,gBAAM,SAAS,EAAC,uCAAuC,aAAE,KAAK,SAAS,EACvE,eAAM,SAAS,EAAC,kDAAkD,YAAE,KAAK,IAAI,GAAG,GAAQ,IACpF,CACP,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"info-row.js","sourceRoot":"","sources":["../../src/data/info-row.tsx"],"names":[],"mappings":";AASA,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,GAAG,EAAE,EAAgB;IACjF,MAAM,YAAY,GAAG,WAAW,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;QAC1F,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC;QACpB,CAAC,CAAC,KAAK,CAAA;IAET,OAAO,CACL,eAAK,SAAS,EAAE,8CAA8C,SAAS,EAAE,aACvE,gBAAM,SAAS,EAAC,uCAAuC,aAAE,KAAK,SAAS,EACvE,eAAM,SAAS,EAAC,kDAAkD,YAAE,YAAY,IAAI,GAAG,GAAQ,IAC3F,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ interface ResultsCountProps {
2
+ count: number;
3
+ label: string;
4
+ isLoading?: boolean;
5
+ loadingText?: string;
6
+ isRefreshing?: boolean;
7
+ showLoadingMore?: boolean;
8
+ }
9
+ export declare function ResultsCount({ count, label, isLoading, loadingText, isRefreshing, showLoadingMore, }: ResultsCountProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=results-count.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"results-count.d.ts","sourceRoot":"","sources":["../../src/data/results-count.tsx"],"names":[],"mappings":"AAAA,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,SAAiB,EACjB,WAAW,EACX,YAAoB,EACpB,eAAuB,GACxB,EAAE,iBAAiB,2CAcnB"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function ResultsCount({ count, label, isLoading = false, loadingText, isRefreshing = false, showLoadingMore = false, }) {
3
+ if (isLoading && loadingText) {
4
+ return _jsx("div", { className: 'text-sm text-base-content/60 mb-4', children: loadingText });
5
+ }
6
+ return (_jsxs("div", { className: 'flex items-center justify-between text-sm text-base-content/60 mb-4', children: [_jsxs("span", { children: ["Showing ", count, " ", label, showLoadingMore ? ' (loading more...)' : ''] }), isRefreshing && _jsx("span", { className: 'text-xs uppercase tracking-wide', children: "Refreshing\u2026" })] }));
7
+ }
8
+ //# sourceMappingURL=results-count.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"results-count.js","sourceRoot":"","sources":["../../src/data/results-count.tsx"],"names":[],"mappings":";AASA,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,WAAW,EACX,YAAY,GAAG,KAAK,EACpB,eAAe,GAAG,KAAK,GACL;IAClB,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC;QAC7B,OAAO,cAAK,SAAS,EAAC,mCAAmC,YAAE,WAAW,GAAO,CAAA;IAC/E,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,qEAAqE,aAClF,uCACW,KAAK,OAAG,KAAK,EACrB,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,IACvC,EACN,YAAY,IAAI,eAAM,SAAS,EAAC,iCAAiC,iCAAmB,IACjF,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Component, type ReactNode } from 'react';
2
+ interface Props {
3
+ children: ReactNode;
4
+ }
5
+ interface State {
6
+ hasError: boolean;
7
+ error: Error | null;
8
+ }
9
+ /**
10
+ * Full-page error boundary with retry and navigation.
11
+ * Uses inline styles intentionally — error boundaries must not depend on CSS
12
+ * since the CSS may be the thing that's broken.
13
+ */
14
+ export declare class AppErrorBoundary extends Component<Props, State> {
15
+ constructor(props: Props);
16
+ static getDerivedStateFromError(error: Error): State;
17
+ handleReset: () => void;
18
+ render(): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=app-error-boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-error-boundary.d.ts","sourceRoot":"","sources":["../../src/feedback/app-error-boundary.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjD,UAAU,KAAK;IACb,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,UAAU,KAAK;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpB;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;gBAC/C,KAAK,EAAE,KAAK;IAKxB,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK;IAIpD,WAAW,aAEV;IAED,MAAM;CAoHP"}
@@ -0,0 +1,80 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Component } from 'react';
3
+ /**
4
+ * Full-page error boundary with retry and navigation.
5
+ * Uses inline styles intentionally — error boundaries must not depend on CSS
6
+ * since the CSS may be the thing that's broken.
7
+ */
8
+ export class AppErrorBoundary extends Component {
9
+ constructor(props) {
10
+ super(props);
11
+ this.state = { hasError: false, error: null };
12
+ }
13
+ static getDerivedStateFromError(error) {
14
+ return { hasError: true, error };
15
+ }
16
+ handleReset = () => {
17
+ this.setState({ hasError: false, error: null });
18
+ };
19
+ render() {
20
+ if (!this.state.hasError) {
21
+ return this.props.children;
22
+ }
23
+ const { error } = this.state;
24
+ return (_jsx("div", { style: {
25
+ minHeight: '100vh',
26
+ display: 'flex',
27
+ alignItems: 'center',
28
+ justifyContent: 'center',
29
+ padding: '24px',
30
+ fontFamily: 'system-ui, -apple-system, sans-serif',
31
+ background: '#1d232a',
32
+ color: '#a6adba',
33
+ }, children: _jsxs("div", { style: {
34
+ maxWidth: '480px',
35
+ width: '100%',
36
+ background: '#2a323c',
37
+ borderRadius: '16px',
38
+ padding: '32px',
39
+ textAlign: 'center',
40
+ }, children: [_jsx("h1", { style: { fontSize: '20px', fontWeight: 700, color: '#fff', margin: '0 0 8px' }, children: "Something went wrong" }), _jsx("p", { style: { fontSize: '14px', margin: '0 0 24px', opacity: 0.6 }, children: "The application encountered an unexpected error." }), _jsxs("div", { style: { display: 'flex', gap: '8px', justifyContent: 'center' }, children: [_jsx("button", { type: 'button', onClick: this.handleReset, style: {
41
+ padding: '8px 20px',
42
+ borderRadius: '8px',
43
+ border: 'none',
44
+ background: '#661ae6',
45
+ color: '#fff',
46
+ fontWeight: 600,
47
+ fontSize: '14px',
48
+ cursor: 'pointer',
49
+ }, children: "Try Again" }), _jsx("button", { type: 'button', onClick: () => { window.location.href = '/'; }, style: {
50
+ padding: '8px 20px',
51
+ borderRadius: '8px',
52
+ border: '1px solid rgba(255,255,255,0.1)',
53
+ background: 'transparent',
54
+ color: '#a6adba',
55
+ fontWeight: 600,
56
+ fontSize: '14px',
57
+ cursor: 'pointer',
58
+ }, children: "Go Home" })] }), _jsxs("details", { style: { marginTop: '24px', textAlign: 'left' }, children: [_jsx("summary", { style: { cursor: 'pointer', fontSize: '12px', opacity: 0.4, textAlign: 'center' }, children: "Show error details" }), _jsxs("div", { style: {
59
+ marginTop: '8px',
60
+ background: '#1d232a',
61
+ borderRadius: '8px',
62
+ padding: '12px',
63
+ overflow: 'auto',
64
+ }, children: [_jsx("p", { style: {
65
+ fontSize: '12px',
66
+ fontFamily: 'monospace',
67
+ color: '#ef4444',
68
+ margin: '0 0 8px',
69
+ wordBreak: 'break-all',
70
+ }, children: error?.message }), error?.stack && (_jsx("pre", { style: {
71
+ fontSize: '10px',
72
+ fontFamily: 'monospace',
73
+ opacity: 0.5,
74
+ margin: 0,
75
+ whiteSpace: 'pre-wrap',
76
+ wordBreak: 'break-all',
77
+ }, children: error.stack }))] })] })] }) }));
78
+ }
79
+ }
80
+ //# sourceMappingURL=app-error-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-error-boundary.js","sourceRoot":"","sources":["../../src/feedback/app-error-boundary.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface AsyncStateProps {
3
+ isLoading: boolean;
4
+ error?: Error | string | {
5
+ message?: string;
6
+ } | null;
7
+ onRetry?: () => void;
8
+ loadingText?: string;
9
+ children: ReactNode;
10
+ /**
11
+ * When true, keeps showing the previous children while loading new data
12
+ * instead of replacing content with a spinner. Only shows the spinner
13
+ * on the very first load when no content has been rendered yet.
14
+ */
15
+ keepContentOnRefetch?: boolean;
16
+ }
17
+ export declare function AsyncState({ isLoading, error, onRetry, loadingText, children, keepContentOnRefetch, }: AsyncStateProps): import("react/jsx-runtime").JSX.Element;
18
+ //# sourceMappingURL=async-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-state.d.ts","sourceRoot":"","sources":["../../src/feedback/async-state.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAA;AAI9C,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACpD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,SAAS,CAAA;IACnB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,KAAK,EACL,OAAO,EACP,WAAW,EACX,QAAQ,EACR,oBAA4B,GAC7B,EAAE,eAAe,2CA8BjB"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useRef } from 'react';
3
+ import { ErrorBox } from './error-box.js';
4
+ import { LoadingSpinner } from './loading-spinner.js';
5
+ export function AsyncState({ isLoading, error, onRetry, loadingText, children, keepContentOnRefetch = false, }) {
6
+ const previousChildrenRef = useRef(null);
7
+ if (!isLoading && !error) {
8
+ previousChildrenRef.current = children;
9
+ }
10
+ if (error) {
11
+ previousChildrenRef.current = null;
12
+ }
13
+ if (isLoading) {
14
+ if (keepContentOnRefetch && previousChildrenRef.current != null) {
15
+ return (_jsxs("div", { className: 'relative', children: [_jsx("div", { className: 'opacity-60 pointer-events-none', children: previousChildrenRef.current }), _jsx("div", { className: 'absolute inset-x-0 top-8 flex justify-center', children: _jsx(LoadingSpinner, { size: 'sm', text: loadingText }) })] }));
16
+ }
17
+ return _jsx(LoadingSpinner, { text: loadingText });
18
+ }
19
+ if (error) {
20
+ return _jsx(ErrorBox, { error: error, onRetry: onRetry });
21
+ }
22
+ return _jsx(_Fragment, { children: children });
23
+ }
24
+ //# sourceMappingURL=async-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-state.js","sourceRoot":"","sources":["../../src/feedback/async-state.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,MAAM,EAAE,MAAM,OAAO,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAgBrD,MAAM,UAAU,UAAU,CAAC,EACzB,SAAS,EACT,KAAK,EACL,OAAO,EACP,WAAW,EACX,QAAQ,EACR,oBAAoB,GAAG,KAAK,GACZ;IAChB,MAAM,mBAAmB,GAAG,MAAM,CAAY,IAAI,CAAC,CAAA;IAEnD,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,mBAAmB,CAAC,OAAO,GAAG,QAAQ,CAAA;IACxC,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAA;IACpC,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,oBAAoB,IAAI,mBAAmB,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAChE,OAAO,CACL,eAAK,SAAS,EAAC,UAAU,aACvB,cAAK,SAAS,EAAC,gCAAgC,YAAE,mBAAmB,CAAC,OAAO,GAAO,EACnF,cAAK,SAAS,EAAC,8CAA8C,YAC3D,KAAC,cAAc,IAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAE,WAAW,GAAI,GAC3C,IACF,CACP,CAAA;QACH,CAAC;QACD,OAAO,KAAC,cAAc,IAAC,IAAI,EAAE,WAAW,GAAI,CAAA;IAC9C,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAI,CAAA;IACrD,CAAC;IAED,OAAO,4BAAG,QAAQ,GAAI,CAAA;AACxB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface ConfirmModalProps {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ onConfirm: () => void | Promise<void>;
6
+ title?: string;
7
+ message: ReactNode;
8
+ confirmLabel?: string;
9
+ cancelLabel?: string;
10
+ variant?: 'danger' | 'warning' | 'default';
11
+ isLoading?: boolean;
12
+ }
13
+ export declare function ConfirmModal({ isOpen, onClose, onConfirm, title, message, confirmLabel, cancelLabel, variant, isLoading: externalLoading, }: ConfirmModalProps): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=confirm-modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-modal.d.ts","sourceRoot":"","sources":["../../src/feedback/confirm-modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAA;AAGhD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,SAAS,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,OAAO,EACP,SAAS,EACT,KAAiB,EACjB,OAAO,EACP,YAAwB,EACxB,WAAsB,EACtB,OAAmB,EACnB,SAAS,EAAE,eAAe,GAC3B,EAAE,iBAAiB,2CAmCnB"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { Modal } from '../modal.js';
4
+ export function ConfirmModal({ isOpen, onClose, onConfirm, title = 'Confirm', message, confirmLabel = 'Confirm', cancelLabel = 'Cancel', variant = 'default', isLoading: externalLoading, }) {
5
+ const [internalLoading, setInternalLoading] = useState(false);
6
+ const isLoading = externalLoading ?? internalLoading;
7
+ const handleConfirm = async () => {
8
+ setInternalLoading(true);
9
+ try {
10
+ await onConfirm();
11
+ }
12
+ finally {
13
+ setInternalLoading(false);
14
+ }
15
+ };
16
+ const btnClass = variant === 'danger' ? 'btn-error' : variant === 'warning' ? 'btn-warning' : 'btn-primary';
17
+ return (_jsxs(Modal, { isOpen: isOpen, onClose: onClose, title: title, children: [_jsx("div", { className: 'py-2', children: typeof message === 'string' ? _jsx("p", { children: message }) : message }), _jsxs("div", { className: 'modal-action', children: [_jsx("button", { type: 'button', className: 'btn btn-ghost btn-sm', onClick: onClose, disabled: isLoading, children: cancelLabel }), _jsxs("button", { type: 'button', className: `btn ${btnClass} btn-sm`, onClick: handleConfirm, disabled: isLoading, children: [isLoading && _jsx("span", { className: 'loading loading-spinner loading-xs' }), confirmLabel] })] })] }));
18
+ }
19
+ //# sourceMappingURL=confirm-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-modal.js","sourceRoot":"","sources":["../../src/feedback/confirm-modal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAcnC,MAAM,UAAU,YAAY,CAAC,EAC3B,MAAM,EACN,OAAO,EACP,SAAS,EACT,KAAK,GAAG,SAAS,EACjB,OAAO,EACP,YAAY,GAAG,SAAS,EACxB,WAAW,GAAG,QAAQ,EACtB,OAAO,GAAG,SAAS,EACnB,SAAS,EAAE,eAAe,GACR;IAClB,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7D,MAAM,SAAS,GAAG,eAAe,IAAI,eAAe,CAAA;IAEpD,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACxB,IAAI,CAAC;YACH,MAAM,SAAS,EAAE,CAAA;QACnB,CAAC;gBAAS,CAAC;YACT,kBAAkB,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC,CAAA;IAED,MAAM,QAAQ,GACZ,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAA;IAE5F,OAAO,CACL,MAAC,KAAK,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,aACnD,cAAK,SAAS,EAAC,MAAM,YAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,sBAAI,OAAO,GAAK,CAAC,CAAC,CAAC,OAAO,GAAO,EACtF,eAAK,SAAS,EAAC,cAAc,aAC3B,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,sBAAsB,EAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,YACzF,WAAW,GACL,EACT,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,OAAO,QAAQ,SAAS,EACnC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,SAAS,aAElB,SAAS,IAAI,eAAM,SAAS,EAAC,oCAAoC,GAAG,EACpE,YAAY,IACN,IACL,IACA,CACT,CAAA;AACH,CAAC"}
@@ -3,4 +3,7 @@ export { ErrorBox } from './error-box.js';
3
3
  export { EmptyState } from './empty-state.js';
4
4
  export { InfoAlert } from './info-alert.js';
5
5
  export { ToastProvider, useToast, type Toast, type ToastType } from './toast-provider.js';
6
+ export { AsyncState, type AsyncStateProps } from './async-state.js';
7
+ export { ConfirmModal, type ConfirmModalProps } from './confirm-modal.js';
8
+ export { AppErrorBoundary } from './app-error-boundary.js';
6
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACzF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA"}
@@ -3,4 +3,7 @@ export { ErrorBox } from './error-box.js';
3
3
  export { EmptyState } from './empty-state.js';
4
4
  export { InfoAlert } from './info-alert.js';
5
5
  export { ToastProvider, useToast } from './toast-provider.js';
6
+ export { AsyncState } from './async-state.js';
7
+ export { ConfirmModal } from './confirm-modal.js';
8
+ export { AppErrorBoundary } from './app-error-boundary.js';
6
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAA8B,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAA8B,MAAM,qBAAqB,CAAA;AACzF,OAAO,EAAE,UAAU,EAAwB,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA"}
@@ -1,2 +1,10 @@
1
1
  export { useCopyToClipboard } from './use-copy-to-clipboard.js';
2
+ export { useMutationToast, type MutationToastOptions } from './use-mutation-toast.js';
3
+ export { useModalState, useItemModal } from './use-modal-state.js';
4
+ export { useDebouncedSearch } from './use-debounced-search.js';
5
+ export { usePersistedState } from './use-persisted-state.js';
6
+ export { usePageTitle } from './use-page-title.js';
7
+ export { useTheme } from './use-theme.js';
8
+ export { useConfirm, type ConfirmOptions, type ConfirmModalState } from './use-confirm.js';
9
+ export { useInfiniteScroll } from './use-infinite-scroll.js';
2
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACrF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -1,2 +1,10 @@
1
1
  export { useCopyToClipboard } from './use-copy-to-clipboard.js';
2
+ export { useMutationToast } from './use-mutation-toast.js';
3
+ export { useModalState, useItemModal } from './use-modal-state.js';
4
+ export { useDebouncedSearch } from './use-debounced-search.js';
5
+ export { usePersistedState } from './use-persisted-state.js';
6
+ export { usePageTitle } from './use-page-title.js';
7
+ export { useTheme } from './use-theme.js';
8
+ export { useConfirm } from './use-confirm.js';
9
+ export { useInfiniteScroll } from './use-infinite-scroll.js';
2
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAA6B,MAAM,yBAAyB,CAAA;AACrF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAA+C,MAAM,kBAAkB,CAAA;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,36 @@
1
+ export interface ConfirmOptions {
2
+ title?: string;
3
+ message: string;
4
+ confirmLabel?: string;
5
+ variant?: 'danger' | 'warning' | 'default';
6
+ }
7
+ export interface ConfirmModalState {
8
+ isOpen: boolean;
9
+ title?: string;
10
+ message: string;
11
+ confirmLabel?: string;
12
+ variant?: 'danger' | 'warning' | 'default';
13
+ onClose: () => void;
14
+ onConfirm: () => void;
15
+ }
16
+ /**
17
+ * Promise-based confirmation dialog hook.
18
+ * Returns `confirm(options)` and `confirmProps` to spread onto `<ConfirmModal>`.
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * const { confirm, confirmProps } = useConfirm()
23
+ *
24
+ * const handleDelete = async () => {
25
+ * const ok = await confirm({ message: 'Delete this item?', variant: 'danger' })
26
+ * if (ok) deleteMutation.mutate(id)
27
+ * }
28
+ *
29
+ * return <ConfirmModal {...confirmProps} />
30
+ * ```
31
+ */
32
+ export declare function useConfirm(): {
33
+ readonly confirm: (options: ConfirmOptions) => Promise<boolean>;
34
+ readonly confirmProps: ConfirmModalState;
35
+ };
36
+ //# sourceMappingURL=use-confirm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-confirm.d.ts","sourceRoot":"","sources":["../../src/hooks/use-confirm.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU;gCASc,cAAc,KAAG,OAAO,CAAC,OAAO,CAAC;;EA8BxE"}
@@ -0,0 +1,49 @@
1
+ import { useCallback, useState } from 'react';
2
+ /**
3
+ * Promise-based confirmation dialog hook.
4
+ * Returns `confirm(options)` and `confirmProps` to spread onto `<ConfirmModal>`.
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * const { confirm, confirmProps } = useConfirm()
9
+ *
10
+ * const handleDelete = async () => {
11
+ * const ok = await confirm({ message: 'Delete this item?', variant: 'danger' })
12
+ * if (ok) deleteMutation.mutate(id)
13
+ * }
14
+ *
15
+ * return <ConfirmModal {...confirmProps} />
16
+ * ```
17
+ */
18
+ export function useConfirm() {
19
+ const [state, setState] = useState(null);
20
+ const confirm = useCallback((options) => {
21
+ return new Promise((resolve) => {
22
+ setState({ ...options, resolve });
23
+ });
24
+ }, []);
25
+ const confirmProps = state
26
+ ? {
27
+ isOpen: true,
28
+ message: state.message,
29
+ title: state.title,
30
+ confirmLabel: state.confirmLabel,
31
+ variant: state.variant,
32
+ onClose: () => {
33
+ state.resolve(false);
34
+ setState(null);
35
+ },
36
+ onConfirm: () => {
37
+ state.resolve(true);
38
+ setState(null);
39
+ },
40
+ }
41
+ : {
42
+ isOpen: false,
43
+ message: '',
44
+ onClose: () => { },
45
+ onConfirm: () => { },
46
+ };
47
+ return { confirm, confirmProps };
48
+ }
49
+ //# sourceMappingURL=use-confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-confirm.js","sourceRoot":"","sources":["../../src/hooks/use-confirm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAmB7C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAMxB,IAAI,CAAC,CAAA;IAEf,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,OAAuB,EAAoB,EAAE;QACxE,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACtC,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,YAAY,GAAsB,KAAK;QAC3C,CAAC,CAAC;YACE,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBACpB,QAAQ,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC;YACD,SAAS,EAAE,GAAG,EAAE;gBACd,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;gBACnB,QAAQ,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC;SACF;QACH,CAAC,CAAC;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;YACjB,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;SACpB,CAAA;IAEL,OAAO,EAAE,OAAO,EAAE,YAAY,EAAW,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Returns a search input state and a debounced version.
3
+ * The `debouncedSearch` value updates after the delay elapses.
4
+ */
5
+ export declare function useDebouncedSearch(delay?: number): {
6
+ readonly searchInput: string;
7
+ readonly setSearchInput: import("react").Dispatch<import("react").SetStateAction<string>>;
8
+ readonly debouncedSearch: string;
9
+ };
10
+ //# sourceMappingURL=use-debounced-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-debounced-search.d.ts","sourceRoot":"","sources":["../../src/hooks/use-debounced-search.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,SAAsB;;;;EAY7D"}
@@ -0,0 +1,18 @@
1
+ import { useEffect, useState } from 'react';
2
+ const DEFAULT_DEBOUNCE_MS = 300;
3
+ /**
4
+ * Returns a search input state and a debounced version.
5
+ * The `debouncedSearch` value updates after the delay elapses.
6
+ */
7
+ export function useDebouncedSearch(delay = DEFAULT_DEBOUNCE_MS) {
8
+ const [searchInput, setSearchInput] = useState('');
9
+ const [debouncedSearch, setDebouncedSearch] = useState('');
10
+ useEffect(() => {
11
+ const handle = window.setTimeout(() => {
12
+ setDebouncedSearch(searchInput.trim());
13
+ }, delay);
14
+ return () => window.clearTimeout(handle);
15
+ }, [searchInput, delay]);
16
+ return { searchInput, setSearchInput, debouncedSearch };
17
+ }
18
+ //# sourceMappingURL=use-debounced-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-debounced-search.js","sourceRoot":"","sources":["../../src/hooks/use-debounced-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3C,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAE/B;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAK,GAAG,mBAAmB;IAC5D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAClD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAE1D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACpC,kBAAkB,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAA;QACxC,CAAC,EAAE,KAAK,CAAC,CAAA;QACT,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAA;IAExB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAW,CAAA;AAClE,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Auto-trigger `fetchNextPage` when a sentinel element enters the viewport.
3
+ * Attach `loadMoreRef` to a div at the bottom of your list.
4
+ */
5
+ export declare function useInfiniteScroll(opts: {
6
+ hasNextPage: boolean | undefined;
7
+ isFetchingNextPage: boolean;
8
+ fetchNextPage: () => void;
9
+ }): {
10
+ loadMoreRef: import("react").RefObject<HTMLDivElement | null>;
11
+ };
12
+ //# sourceMappingURL=use-infinite-scroll.d.ts.map