najm-kit 2.11.23 → 2.12.1

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 (34) hide show
  1. package/CHANGELOG.md +26 -12
  2. package/README.md +28 -1
  3. package/dist/NIcon-D73-C51g.d.ts +21 -0
  4. package/dist/{NNotFoundState-BmGDW2Bx.d.ts → NNotFoundState-Z2n2gbhS.d.ts} +1 -16
  5. package/dist/{NajmUIProvider-BwL5HFIV.d.ts → NajmUIProvider-C9IJW1ya.d.ts} +2 -19
  6. package/dist/adapters/app.d.ts +6 -4
  7. package/dist/adapters/app.mjs +9 -6
  8. package/dist/adapters/next.d.ts +2 -1
  9. package/dist/adapters/next.mjs +5 -3
  10. package/dist/chunk-5UY7U2ED.mjs +9 -0
  11. package/dist/chunk-A34LRQYI.mjs +7 -0
  12. package/dist/chunk-BFFTC7LD.mjs +66 -0
  13. package/dist/{chunk-5ZTOCWRA.mjs → chunk-F32O3WRX.mjs} +7 -197
  14. package/dist/chunk-FZX3DONZ.mjs +200 -0
  15. package/dist/{chunk-BDQK6ECA.mjs → chunk-LMW4DM5L.mjs} +43 -101
  16. package/dist/{chunk-DKHIQFXX.mjs → chunk-QDFLHSWO.mjs} +1 -1
  17. package/dist/{chunk-5JVFMOLI.mjs → chunk-QJ22WAQY.mjs} +2 -28
  18. package/dist/{chunk-LK3SMYUP.mjs → chunk-TZRTOQCC.mjs} +1 -6
  19. package/dist/chunk-VKSJ2V3O.mjs +2205 -0
  20. package/dist/chunk-VZXMMC72.mjs +31 -0
  21. package/dist/{chunk-M5VGBZ7R.mjs → chunk-WHGRN7PP.mjs} +2 -1
  22. package/dist/formFill-CQkTA0JS.d.ts +17 -0
  23. package/dist/index.d.ts +23 -437
  24. package/dist/index.mjs +338 -1950
  25. package/dist/json.mjs +5 -3
  26. package/dist/location/google.d.ts +14 -0
  27. package/dist/location/google.mjs +184 -0
  28. package/dist/location/index.d.ts +33 -0
  29. package/dist/location/index.mjs +9 -0
  30. package/dist/location/leaflet.d.ts +13 -0
  31. package/dist/location/leaflet.mjs +168 -0
  32. package/dist/theme.css +23 -2
  33. package/dist/types-BQBx0RZd.d.ts +578 -0
  34. package/package.json +30 -3
@@ -0,0 +1,200 @@
1
+ import { useResolvedFeedbackLabels } from './chunk-BFFTC7LD.mjs';
2
+ import { useNajmDesign } from './chunk-TZRTOQCC.mjs';
3
+ import { cn } from './chunk-5UY7U2ED.mjs';
4
+ import { LoaderCircleIcon, LoaderPinwheelIcon, LoaderIcon } from 'lucide-react';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ var Default = ({ className, ...props }) => /* @__PURE__ */ jsx(LoaderIcon, { className: cn("animate-spin", className), ...props });
8
+ var Circle = ({ className, ...props }) => /* @__PURE__ */ jsx(LoaderCircleIcon, { className: cn("animate-spin", className), ...props });
9
+ var Pinwheel = ({ className, ...props }) => /* @__PURE__ */ jsx(LoaderPinwheelIcon, { className: cn("animate-spin", className), ...props });
10
+ var CircleFilled = ({ className, size = 24, ...props }) => /* @__PURE__ */ jsxs("div", { className: "relative", style: { width: size, height: size }, children: [
11
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 rotate-180", children: /* @__PURE__ */ jsx(LoaderCircleIcon, { className: cn("animate-spin", className, "text-foreground opacity-20"), size, ...props }) }),
12
+ /* @__PURE__ */ jsx(LoaderCircleIcon, { className: cn("relative animate-spin", className), size, ...props })
13
+ ] });
14
+ var Ellipsis = ({ size = 24, ...props }) => /* @__PURE__ */ jsxs("svg", { height: size, viewBox: "0 0 24 24", width: size, xmlns: "http://www.w3.org/2000/svg", ...props, children: [
15
+ /* @__PURE__ */ jsx("title", { children: "Loading..." }),
16
+ /* @__PURE__ */ jsx("circle", { cx: "4", cy: "12", fill: "currentColor", r: "2", children: /* @__PURE__ */ jsx("animate", { attributeName: "cy", begin: "0;ellipsis3.end+0.25s", calcMode: "spline", dur: "0.6s", id: "ellipsis1", keySplines: ".33,.66,.66,1;.33,0,.66,.33", values: "12;6;12" }) }),
17
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", fill: "currentColor", r: "2", children: /* @__PURE__ */ jsx("animate", { attributeName: "cy", begin: "ellipsis1.begin+0.1s", calcMode: "spline", dur: "0.6s", keySplines: ".33,.66,.66,1;.33,0,.66,.33", values: "12;6;12" }) }),
18
+ /* @__PURE__ */ jsx("circle", { cx: "20", cy: "12", fill: "currentColor", r: "2", children: /* @__PURE__ */ jsx("animate", { attributeName: "cy", begin: "ellipsis1.begin+0.2s", calcMode: "spline", dur: "0.6s", id: "ellipsis3", keySplines: ".33,.66,.66,1;.33,0,.66,.33", values: "12;6;12" }) })
19
+ ] });
20
+ var Ring = ({ size = 24, ...props }) => /* @__PURE__ */ jsxs("svg", { height: size, stroke: "currentColor", viewBox: "0 0 44 44", width: size, xmlns: "http://www.w3.org/2000/svg", ...props, children: [
21
+ /* @__PURE__ */ jsx("title", { children: "Loading..." }),
22
+ /* @__PURE__ */ jsxs("g", { fill: "none", fillRule: "evenodd", strokeWidth: "2", children: [
23
+ /* @__PURE__ */ jsxs("circle", { cx: "22", cy: "22", r: "1", children: [
24
+ /* @__PURE__ */ jsx("animate", { attributeName: "r", begin: "0s", calcMode: "spline", dur: "1.8s", keySplines: "0.165, 0.84, 0.44, 1", keyTimes: "0; 1", repeatCount: "indefinite", values: "1; 20" }),
25
+ /* @__PURE__ */ jsx("animate", { attributeName: "stroke-opacity", begin: "0s", calcMode: "spline", dur: "1.8s", keySplines: "0.3, 0.61, 0.355, 1", keyTimes: "0; 1", repeatCount: "indefinite", values: "1; 0" })
26
+ ] }),
27
+ /* @__PURE__ */ jsxs("circle", { cx: "22", cy: "22", r: "1", children: [
28
+ /* @__PURE__ */ jsx("animate", { attributeName: "r", begin: "-0.9s", calcMode: "spline", dur: "1.8s", keySplines: "0.165, 0.84, 0.44, 1", keyTimes: "0; 1", repeatCount: "indefinite", values: "1; 20" }),
29
+ /* @__PURE__ */ jsx("animate", { attributeName: "stroke-opacity", begin: "-0.9s", calcMode: "spline", dur: "1.8s", keySplines: "0.3, 0.61, 0.355, 1", keyTimes: "0; 1", repeatCount: "indefinite", values: "1; 0" })
30
+ ] })
31
+ ] })
32
+ ] });
33
+ var Bars = ({ size = 24, ...props }) => /* @__PURE__ */ jsxs("svg", { height: size, viewBox: "0 0 24 24", width: size, xmlns: "http://www.w3.org/2000/svg", ...props, children: [
34
+ /* @__PURE__ */ jsx("title", { children: "Loading..." }),
35
+ /* @__PURE__ */ jsx("rect", { fill: "currentColor", height: "4", rx: "1", width: "4", x: "1", y: "10", children: /* @__PURE__ */ jsx("animate", { attributeName: "opacity", begin: "0s", dur: "0.6s", keyTimes: "0;0.5;1", repeatCount: "indefinite", values: "1;0.3;1" }) }),
36
+ /* @__PURE__ */ jsx("rect", { fill: "currentColor", height: "4", rx: "1", width: "4", x: "10", y: "10", children: /* @__PURE__ */ jsx("animate", { attributeName: "opacity", begin: "0.1s", dur: "0.6s", keyTimes: "0;0.5;1", repeatCount: "indefinite", values: "1;0.3;1" }) }),
37
+ /* @__PURE__ */ jsx("rect", { fill: "currentColor", height: "4", rx: "1", width: "4", x: "19", y: "10", children: /* @__PURE__ */ jsx("animate", { attributeName: "opacity", begin: "0.2s", dur: "0.6s", keyTimes: "0;0.5;1", repeatCount: "indefinite", values: "1;0.3;1" }) })
38
+ ] });
39
+ var Infinite = ({ size = 24, ...props }) => /* @__PURE__ */ jsxs(
40
+ "svg",
41
+ {
42
+ height: size,
43
+ preserveAspectRatio: "xMidYMid",
44
+ viewBox: "0 0 100 100",
45
+ width: size,
46
+ xmlns: "http://www.w3.org/2000/svg",
47
+ ...props,
48
+ children: [
49
+ /* @__PURE__ */ jsx("title", { children: "Loading..." }),
50
+ /* @__PURE__ */ jsx(
51
+ "path",
52
+ {
53
+ d: "M24.3 30C11.4 30 5 43.3 5 50s6.4 20 19.3 20c19.3 0 32.1-40 51.4-40 C88.6 30 95 43.3 95 50s-6.4 20-19.3 20C56.4 70 43.6 30 24.3 30z",
54
+ fill: "none",
55
+ stroke: "currentColor",
56
+ strokeDasharray: "205.271142578125 51.317785644531256",
57
+ strokeLinecap: "round",
58
+ strokeWidth: "10",
59
+ style: { transform: "scale(0.8)", transformOrigin: "50px 50px" },
60
+ children: /* @__PURE__ */ jsx(
61
+ "animate",
62
+ {
63
+ attributeName: "stroke-dashoffset",
64
+ dur: "2s",
65
+ keyTimes: "0;1",
66
+ repeatCount: "indefinite",
67
+ values: "0;256.58892822265625"
68
+ }
69
+ )
70
+ }
71
+ )
72
+ ]
73
+ }
74
+ );
75
+ var spinnerVariants = {
76
+ default: Default,
77
+ circle: Circle,
78
+ pinwheel: Pinwheel,
79
+ "circle-filled": CircleFilled,
80
+ ellipsis: Ellipsis,
81
+ ring: Ring,
82
+ bars: Bars,
83
+ infinite: Infinite
84
+ };
85
+ function NSpinner({ variant = "default", size = 24, className, ...props }) {
86
+ const Component = spinnerVariants[variant] || Default;
87
+ return /* @__PURE__ */ jsx(Component, { className, size, ...props });
88
+ }
89
+ function NPageLayout({
90
+ as: Comp = "main",
91
+ className,
92
+ style,
93
+ ...props
94
+ }) {
95
+ const { layout } = useNajmDesign();
96
+ const pageGutter = layout?.pageGutter ?? "var(--page-gutter, 24px)";
97
+ const sectionGap = layout?.sectionGap ?? "var(--section-gap, 20px)";
98
+ return /* @__PURE__ */ jsx(
99
+ Comp,
100
+ {
101
+ className: cn("flex min-w-0 flex-col", className),
102
+ style: {
103
+ /**
104
+ * Published so descendants can cancel the page padding exactly. A
105
+ * full-bleed child (a non-card NPageHeader) cannot guess these: the
106
+ * design config resolves them to literals, not to the `--page-gutter`
107
+ * / `--section-gap` fallbacks.
108
+ */
109
+ "--najm-page-gutter": pageGutter,
110
+ "--najm-section-gap": sectionGap,
111
+ gap: sectionGap,
112
+ paddingInline: pageGutter,
113
+ paddingBlock: sectionGap,
114
+ ...style
115
+ },
116
+ ...props
117
+ }
118
+ );
119
+ }
120
+ var INLINE_PADDING = {
121
+ loading: "py-8",
122
+ error: "py-8",
123
+ empty: "py-12"
124
+ };
125
+ var PANEL_BASE = "flex min-h-64 w-full flex-col items-center justify-center gap-3";
126
+ var PAGE_MIN = "min-h-[60vh]";
127
+ function NFeedbackStateFrame({
128
+ surface = "inline",
129
+ spacing = "empty",
130
+ className,
131
+ children,
132
+ ...rest
133
+ }) {
134
+ if (surface === "page") {
135
+ return /* @__PURE__ */ jsx(
136
+ NPageLayout,
137
+ {
138
+ as: "div",
139
+ className: cn(
140
+ "items-center justify-center text-center",
141
+ PAGE_MIN,
142
+ className
143
+ ),
144
+ ...rest,
145
+ children
146
+ }
147
+ );
148
+ }
149
+ if (surface === "panel") {
150
+ return /* @__PURE__ */ jsx("div", { className: cn(PANEL_BASE, className), ...rest, children });
151
+ }
152
+ return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col items-center justify-center gap-3", INLINE_PADDING[spacing], className), ...rest, children });
153
+ }
154
+ function useLoadingLabel(explicit) {
155
+ const labels = useResolvedFeedbackLabels();
156
+ if (explicit !== void 0) return explicit;
157
+ return labels.loadingLabel;
158
+ }
159
+ function NLoadingState({
160
+ label,
161
+ className,
162
+ fullScreen = false,
163
+ spinnerVariant = "circle",
164
+ spinnerSize = 32,
165
+ surface = "inline"
166
+ }) {
167
+ const resolvedLabel = useLoadingLabel(label);
168
+ if (fullScreen) {
169
+ return /* @__PURE__ */ jsxs(
170
+ "div",
171
+ {
172
+ className: cn(
173
+ "fixed inset-0 z-50 bg-background/80 backdrop-blur-sm flex flex-col items-center justify-center gap-3 py-8",
174
+ className
175
+ ),
176
+ children: [
177
+ /* @__PURE__ */ jsx(NSpinner, { variant: spinnerVariant, size: spinnerSize }),
178
+ resolvedLabel && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: resolvedLabel })
179
+ ]
180
+ }
181
+ );
182
+ }
183
+ return /* @__PURE__ */ jsxs(
184
+ NFeedbackStateFrame,
185
+ {
186
+ surface,
187
+ spacing: "loading",
188
+ role: "status",
189
+ "aria-live": "polite",
190
+ "aria-busy": "true",
191
+ className,
192
+ children: [
193
+ /* @__PURE__ */ jsx(NSpinner, { variant: spinnerVariant, size: spinnerSize }),
194
+ resolvedLabel && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: resolvedLabel })
195
+ ]
196
+ }
197
+ );
198
+ }
199
+
200
+ export { NFeedbackStateFrame, NLoadingState, NPageLayout, NSpinner };
@@ -1,6 +1,8 @@
1
- import { NajmDesignProvider, cn } from './chunk-LK3SMYUP.mjs';
2
- import * as React3 from 'react';
3
- import React3__default from 'react';
1
+ import { resolveFeedbackDefaultsValue, NFeedbackDefaultsProvider } from './chunk-BFFTC7LD.mjs';
2
+ import { NajmDesignProvider } from './chunk-TZRTOQCC.mjs';
3
+ import { cn } from './chunk-5UY7U2ED.mjs';
4
+ import * as React2 from 'react';
5
+ import React2__default from 'react';
4
6
  import { jsx } from 'react/jsx-runtime';
5
7
  import { DirectionProvider } from '@radix-ui/react-direction';
6
8
 
@@ -74,7 +76,7 @@ function statusTextClass(status, statusMap, fallback) {
74
76
  const color = findStatusColor(status, statusMap) ?? fallback;
75
77
  return color ? colorTextClass(color) : "";
76
78
  }
77
- var NTableDefaultsContext = React3__default.createContext({});
79
+ var NTableDefaultsContext = React2__default.createContext({});
78
80
  function NTableDefaultsProvider({
79
81
  children,
80
82
  value
@@ -82,12 +84,12 @@ function NTableDefaultsProvider({
82
84
  return /* @__PURE__ */ jsx(NTableDefaultsContext.Provider, { value, children });
83
85
  }
84
86
  function useNTableDefaults() {
85
- return React3__default.useContext(NTableDefaultsContext);
87
+ return React2__default.useContext(NTableDefaultsContext);
86
88
  }
87
89
  function useResolvedPaginationLabels(own) {
88
90
  const defaults = useNTableDefaults();
89
91
  const inherited = defaults.paginationLabels;
90
- return React3__default.useMemo(
92
+ return React2__default.useMemo(
91
93
  () => ({ ...inherited, ...own }),
92
94
  [inherited, own]
93
95
  );
@@ -95,72 +97,12 @@ function useResolvedPaginationLabels(own) {
95
97
  function useResolvedToolbarLabels(own) {
96
98
  const defaults = useNTableDefaults();
97
99
  const inherited = defaults.toolbarLabels;
98
- return React3__default.useMemo(
100
+ return React2__default.useMemo(
99
101
  () => ({ ...inherited, ...own }),
100
102
  [inherited, own]
101
103
  );
102
104
  }
103
- var ENGLISH_FEEDBACK_LABELS = {
104
- loadingLabel: "Loading...",
105
- emptyTitle: "No data",
106
- errorTitle: "Something went wrong",
107
- retryLabel: "Try again",
108
- forbiddenTitle: "Access denied",
109
- forbiddenDescription: "You do not have permission to view this page.",
110
- notFoundTitle: "Page not found",
111
- notFoundDescription: "The requested page could not be found."
112
- };
113
- var NFeedbackDefaultsContext = React3.createContext(null);
114
- function NFeedbackDefaultsProvider({
115
- value,
116
- children
117
- }) {
118
- return /* @__PURE__ */ jsx(NFeedbackDefaultsContext.Provider, { value, children });
119
- }
120
- function useNFeedbackDefaults() {
121
- return React3.useContext(NFeedbackDefaultsContext);
122
- }
123
- var DEFAULT_FEEDBACK_KEY_PREFIX = "common.feedback";
124
- function useResolvedFeedbackLabels() {
125
- const ctx = useNFeedbackDefaults();
126
- return React3.useMemo(() => resolveFeedbackLabels(ctx), [ctx]);
127
- }
128
- function resolveFeedbackLabels(ctx) {
129
- const defaults = ctx?.defaults;
130
- const t = ctx?.t;
131
- const labels = defaults?.labels;
132
- const labelKeys = defaults?.labelKeys;
133
- const prefix = defaults?.prefix ?? DEFAULT_FEEDBACK_KEY_PREFIX;
134
- const translated = (key) => {
135
- if (!t) return void 0;
136
- const value = t(key);
137
- return value === key ? void 0 : value;
138
- };
139
- const pick = (field, hasFallback) => {
140
- const literal = labels?.[field];
141
- if (literal !== void 0) return literal;
142
- const key = labelKeys?.[field];
143
- const fromCatalog = translated(key ?? `${prefix}.${field}`);
144
- if (fromCatalog !== void 0) return fromCatalog;
145
- if (hasFallback) return ENGLISH_FEEDBACK_LABELS[field];
146
- return void 0;
147
- };
148
- return {
149
- loadingLabel: pick("loadingLabel", true) ?? ENGLISH_FEEDBACK_LABELS.loadingLabel,
150
- emptyTitle: pick("emptyTitle", true) ?? ENGLISH_FEEDBACK_LABELS.emptyTitle,
151
- errorTitle: pick("errorTitle", true) ?? ENGLISH_FEEDBACK_LABELS.errorTitle,
152
- errorMessage: pick("errorMessage", false),
153
- retryLabel: pick("retryLabel", true) ?? ENGLISH_FEEDBACK_LABELS.retryLabel,
154
- forbiddenTitle: pick("forbiddenTitle", true) ?? ENGLISH_FEEDBACK_LABELS.forbiddenTitle,
155
- forbiddenDescription: pick("forbiddenDescription", true) ?? ENGLISH_FEEDBACK_LABELS.forbiddenDescription,
156
- notFoundTitle: pick("notFoundTitle", true) ?? ENGLISH_FEEDBACK_LABELS.notFoundTitle,
157
- notFoundDescription: pick("notFoundDescription", true) ?? ENGLISH_FEEDBACK_LABELS.notFoundDescription
158
- };
159
- }
160
- function resolveFeedbackDefaultsValue(defaults, t) {
161
- return { defaults: defaults ?? {}, t };
162
- }
163
- var NajmPreferencesContext = React3.createContext(null);
105
+ var NajmPreferencesContext = React2.createContext(null);
164
106
  var DEFAULT_TIME_ZONE = "UTC";
165
107
  function isValidTimeZone(value) {
166
108
  try {
@@ -189,44 +131,44 @@ function NajmPreferencesProvider({
189
131
  onTimeZoneChange,
190
132
  normalizeTimeZone = defaultNormalizeTimeZone
191
133
  }) {
192
- const [theme, setThemeState] = React3.useState(initialTheme);
193
- const [timeZone, setTimeZoneState] = React3.useState(
134
+ const [theme, setThemeState] = React2.useState(initialTheme);
135
+ const [timeZone, setTimeZoneState] = React2.useState(
194
136
  () => normalizeTimeZone(initialTimeZone)
195
137
  );
196
- const onThemeChangeRef = React3.useRef(onThemeChange);
197
- const onTimeZoneChangeRef = React3.useRef(onTimeZoneChange);
198
- const normalizeRef = React3.useRef(normalizeTimeZone);
199
- React3.useEffect(() => {
138
+ const onThemeChangeRef = React2.useRef(onThemeChange);
139
+ const onTimeZoneChangeRef = React2.useRef(onTimeZoneChange);
140
+ const normalizeRef = React2.useRef(normalizeTimeZone);
141
+ React2.useEffect(() => {
200
142
  onThemeChangeRef.current = onThemeChange;
201
143
  onTimeZoneChangeRef.current = onTimeZoneChange;
202
144
  normalizeRef.current = normalizeTimeZone;
203
145
  });
204
- React3.useEffect(() => {
146
+ React2.useEffect(() => {
205
147
  applyTheme(theme);
206
148
  applyTimeZone(timeZone);
207
149
  }, []);
208
- const setTheme = React3.useCallback(async (next) => {
150
+ const setTheme = React2.useCallback(async (next) => {
209
151
  setThemeState(next);
210
152
  applyTheme(next);
211
153
  await onThemeChangeRef.current?.(next);
212
154
  }, []);
213
- const setTimeZone = React3.useCallback(async (next) => {
155
+ const setTimeZone = React2.useCallback(async (next) => {
214
156
  const normalized = normalizeRef.current(next);
215
157
  setTimeZoneState(normalized);
216
158
  applyTimeZone(normalized);
217
159
  await onTimeZoneChangeRef.current?.(normalized);
218
160
  }, []);
219
- const value = React3.useMemo(
161
+ const value = React2.useMemo(
220
162
  () => ({ theme, setTheme, timeZone, setTimeZone }),
221
163
  [theme, setTheme, timeZone, setTimeZone]
222
164
  );
223
165
  return /* @__PURE__ */ jsx(NajmPreferencesContext.Provider, { value, children });
224
166
  }
225
167
  function useNajmPreferencesContext() {
226
- return React3.useContext(NajmPreferencesContext);
168
+ return React2.useContext(NajmPreferencesContext);
227
169
  }
228
170
  function usePreferencesOrThrow(hook) {
229
- const value = React3.useContext(NajmPreferencesContext);
171
+ const value = React2.useContext(NajmPreferencesContext);
230
172
  if (!value) {
231
173
  throw new Error(
232
174
  `${hook} must be rendered under a NajmUIProvider or NajmPreferencesProvider.`
@@ -236,11 +178,11 @@ function usePreferencesOrThrow(hook) {
236
178
  }
237
179
  function useNajmTheme() {
238
180
  const { theme, setTheme } = usePreferencesOrThrow("useNajmTheme");
239
- return React3.useMemo(() => ({ theme, setTheme }), [theme, setTheme]);
181
+ return React2.useMemo(() => ({ theme, setTheme }), [theme, setTheme]);
240
182
  }
241
183
  function useNajmTimeZone() {
242
184
  const { timeZone, setTimeZone } = usePreferencesOrThrow("useNajmTimeZone");
243
- return React3.useMemo(
185
+ return React2.useMemo(
244
186
  () => ({ timeZone, setTimeZone }),
245
187
  [timeZone, setTimeZone]
246
188
  );
@@ -285,10 +227,10 @@ function buildToolbarLabels(t, prefix) {
285
227
  };
286
228
  }
287
229
  function useDocumentDirection(override) {
288
- const [direction, setDirection] = React3.useState(
230
+ const [direction, setDirection] = React2.useState(
289
231
  override ?? "ltr"
290
232
  );
291
- React3.useEffect(() => {
233
+ React2.useEffect(() => {
292
234
  if (override) {
293
235
  setDirection(override);
294
236
  return;
@@ -307,9 +249,9 @@ var EMPTY_DESIGN = Object.freeze({
307
249
  theme: {},
308
250
  components: {}
309
251
  });
310
- var NajmDesignEditorContext = React3.createContext(null);
252
+ var NajmDesignEditorContext = React2.createContext(null);
311
253
  function useNajmDesignEditor() {
312
- return React3.useContext(NajmDesignEditorContext);
254
+ return React2.useContext(NajmDesignEditorContext);
313
255
  }
314
256
  function cloneDesign(design) {
315
257
  return structuredClone(design);
@@ -319,29 +261,29 @@ function NajmDesignEditorProvider({
319
261
  design,
320
262
  initialDesign
321
263
  }) {
322
- const [state, setState] = React3.useState(() => ({
264
+ const [state, setState] = React2.useState(() => ({
323
265
  committed: initialDesign ?? design ?? EMPTY_DESIGN,
324
266
  draft: null
325
267
  }));
326
- const beginDraft = React3.useCallback(() => {
268
+ const beginDraft = React2.useCallback(() => {
327
269
  setState(
328
270
  (current) => current.draft ? current : { ...current, draft: cloneDesign(current.committed) }
329
271
  );
330
272
  }, []);
331
- const setDraft = React3.useCallback((next) => {
273
+ const setDraft = React2.useCallback((next) => {
332
274
  setState((current) => ({ ...current, draft: cloneDesign(next) }));
333
275
  }, []);
334
- const cancelDraft = React3.useCallback(() => {
276
+ const cancelDraft = React2.useCallback(() => {
335
277
  setState(
336
278
  (current) => current.draft === null ? current : { ...current, draft: null }
337
279
  );
338
280
  }, []);
339
- const setCommitted = React3.useCallback((next) => {
281
+ const setCommitted = React2.useCallback((next) => {
340
282
  setState(
341
283
  (current) => current.committed === next && current.draft === null ? current : { committed: next, draft: null }
342
284
  );
343
285
  }, []);
344
- const value = React3.useMemo(() => {
286
+ const value = React2.useMemo(() => {
345
287
  if (design) {
346
288
  return {
347
289
  design,
@@ -369,20 +311,20 @@ function NajmDesignEditorProvider({
369
311
  }
370
312
  function noop() {
371
313
  }
372
- var NBadgeDefaultsContext = React3.createContext(null);
314
+ var NBadgeDefaultsContext = React2.createContext(null);
373
315
  function NBadgeDefaultsProvider({
374
316
  defaults,
375
317
  t,
376
318
  children
377
319
  }) {
378
- const value = React3.useMemo(
320
+ const value = React2.useMemo(
379
321
  () => ({ defaults, t }),
380
322
  [defaults, t]
381
323
  );
382
324
  return /* @__PURE__ */ jsx(NBadgeDefaultsContext.Provider, { value, children });
383
325
  }
384
326
  function useNBadgeDefaults() {
385
- return React3.useContext(NBadgeDefaultsContext);
327
+ return React2.useContext(NBadgeDefaultsContext);
386
328
  }
387
329
  function resolveBadgeStatusLabel(status, defaults, t) {
388
330
  if (!defaults) return void 0;
@@ -411,7 +353,7 @@ function NajmUICore({
411
353
  const { theme } = useNajmTheme();
412
354
  const direction = useDocumentDirection(dir);
413
355
  const design = useNajmDesignEditor()?.design ?? EMPTY_DESIGN;
414
- const defaults = React3.useMemo(() => {
356
+ const defaults = React2.useMemo(() => {
415
357
  const translated = t ? buildPaginationLabels(t, paginationKeyPrefix) : void 0;
416
358
  const overrides = tableDefaults?.paginationLabels;
417
359
  const paginationLabels = translated || overrides ? { ...translated, ...overrides } : void 0;
@@ -420,7 +362,7 @@ function NajmUICore({
420
362
  const toolbarLabels = translatedToolbar || toolbarOverrides ? { ...translatedToolbar, ...toolbarOverrides } : void 0;
421
363
  return { ...tableDefaults, paginationLabels, toolbarLabels };
422
364
  }, [t, paginationKeyPrefix, toolbarKeyPrefix, tableDefaults]);
423
- const feedbackValue = React3.useMemo(
365
+ const feedbackValue = React2.useMemo(
424
366
  () => resolveFeedbackDefaultsValue(feedbackDefaults, t),
425
367
  [feedbackDefaults, t]
426
368
  );
@@ -505,7 +447,7 @@ function selectImageSource(sources, failed) {
505
447
  var NO_FAILURES = [];
506
448
  function useImageChain(sources) {
507
449
  const key = JSON.stringify(sources);
508
- const [state, setState] = React3.useState(() => ({
450
+ const [state, setState] = React2.useState(() => ({
509
451
  key,
510
452
  failed: NO_FAILURES,
511
453
  loaded: null
@@ -514,13 +456,13 @@ function useImageChain(sources) {
514
456
  const current = state.key === key ? state : fresh;
515
457
  if (state.key !== key) setState(fresh);
516
458
  const active = selectImageSource(sources, current.failed);
517
- const markLoaded = React3.useCallback(() => {
459
+ const markLoaded = React2.useCallback(() => {
518
460
  if (active === void 0) return;
519
461
  setState(
520
462
  (prev) => prev.key !== key || prev.loaded === active ? prev : { ...prev, loaded: active }
521
463
  );
522
464
  }, [key, active]);
523
- const markFailed = React3.useCallback(() => {
465
+ const markFailed = React2.useCallback(() => {
524
466
  if (active === void 0) return;
525
467
  setState((prev) => {
526
468
  if (prev.key !== key || prev.failed.includes(active)) return prev;
@@ -540,4 +482,4 @@ function useImageChain(sources) {
540
482
  };
541
483
  }
542
484
 
543
- export { DEFAULT_FEEDBACK_KEY_PREFIX, DEFAULT_PAGINATION_KEY_PREFIX, DEFAULT_TIME_ZONE, DEFAULT_TOOLBAR_KEY_PREFIX, EMPTY_DESIGN, NAJM_COLOR_TEXT_CLASSES, NAJM_STATUS_COLORS, NTableDefaultsProvider, NajmDesignEditorProvider, NajmPreferencesProvider, NajmUIProvider, buildPaginationLabels, buildToolbarLabels, colorTextClass, findStatusColor, mergeBadgeMaps, normalizeImageSources, normalizeStatusToken, resolveBadgeStatusLabel, resolveStatusColor, statusTextClass, useDocumentDirection, useImageChain, useNBadgeDefaults, useNTableDefaults, useNajmDesignEditor, useNajmPreferencesContext, useNajmTheme, useNajmTimeZone, useResolvedFeedbackLabels, useResolvedPaginationLabels, useResolvedToolbarLabels };
485
+ export { DEFAULT_PAGINATION_KEY_PREFIX, DEFAULT_TIME_ZONE, DEFAULT_TOOLBAR_KEY_PREFIX, EMPTY_DESIGN, NAJM_COLOR_TEXT_CLASSES, NAJM_STATUS_COLORS, NTableDefaultsProvider, NajmDesignEditorProvider, NajmPreferencesProvider, NajmUIProvider, buildPaginationLabels, buildToolbarLabels, colorTextClass, findStatusColor, mergeBadgeMaps, normalizeImageSources, normalizeStatusToken, resolveBadgeStatusLabel, resolveStatusColor, statusTextClass, useDocumentDirection, useImageChain, useNBadgeDefaults, useNTableDefaults, useNajmDesignEditor, useNajmPreferencesContext, useNajmTheme, useNajmTimeZone, useResolvedPaginationLabels, useResolvedToolbarLabels };
@@ -1,4 +1,4 @@
1
- import { useImageChain, normalizeImageSources, NajmUIProvider } from './chunk-BDQK6ECA.mjs';
1
+ import { useImageChain, normalizeImageSources, NajmUIProvider } from './chunk-LMW4DM5L.mjs';
2
2
  import React from 'react';
3
3
  import { useRouter } from 'next/navigation';
4
4
  import NextImage from 'next/image';
@@ -1,6 +1,5 @@
1
- import { cn } from './chunk-LK3SMYUP.mjs';
1
+ import { cn } from './chunk-5UY7U2ED.mjs';
2
2
  import * as React from 'react';
3
- import { createContext, useContext } from 'react';
4
3
  import { OverlayScrollbars } from 'overlayscrollbars';
5
4
  import { OverlayScrollbarsComponent } from 'overlayscrollbars-react';
6
5
  import { jsx } from 'react/jsx-runtime';
@@ -88,30 +87,5 @@ function NajmScroll({ className, axis = "y", autoHide = "never", viewportRef, ev
88
87
  }
89
88
  );
90
89
  }
91
- var TableStoreContext = createContext(null);
92
- var useTableStore = { use: {} };
93
- var handler = {
94
- get: (_, prop) => () => {
95
- const store = useContext(TableStoreContext);
96
- if (!store) throw new Error("useTableStore must be used within NTable");
97
- return store.use[prop]();
98
- }
99
- };
100
- useTableStore.use = new Proxy({}, handler);
101
- function formatJsonValue(value) {
102
- if (typeof value === "string") return value;
103
- try {
104
- return JSON.stringify(value ?? null, null, 2) ?? String(value);
105
- } catch {
106
- return String(value);
107
- }
108
- }
109
- function NTableJson() {
110
- const viewMode = useTableStore.use.viewMode();
111
- const renderJson = useTableStore.use.renderJson();
112
- const jsonValue = useTableStore.use.jsonValue();
113
- if (viewMode !== "json") return null;
114
- return /* @__PURE__ */ jsx("div", { className: "flex-1 flex flex-col min-h-0 overflow-hidden", children: renderJson?.() ?? /* @__PURE__ */ jsx(NajmScroll, { axis: "both", className: "h-full min-h-0 rounded-md border border-border bg-muted/40", children: /* @__PURE__ */ jsx("pre", { className: "p-4 font-mono text-xs leading-relaxed text-foreground", children: formatJsonValue(jsonValue) }) }) });
115
- }
116
90
 
117
- export { NTableJson, NajmScroll, TableStoreContext, useNajmScrollViewport, useTableStore };
91
+ export { NajmScroll, useNajmScrollViewport };
@@ -1,8 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { Slot } from '@radix-ui/react-slot';
3
3
  import { jsx } from 'react/jsx-runtime';
4
- import { clsx } from 'clsx';
5
- import { twMerge } from 'tailwind-merge';
6
4
 
7
5
  // src/theme/presets/modes.ts
8
6
  var lightMode = {
@@ -303,9 +301,6 @@ function NajmThemeProvider({
303
301
  }
304
302
  ) }) }) }) });
305
303
  }
306
- function cn(...inputs) {
307
- return twMerge(clsx(inputs));
308
- }
309
304
  var NajmDesignContext = React.createContext({
310
305
  components: {}
311
306
  });
@@ -368,4 +363,4 @@ function NajmDesignProvider({
368
363
  ) : children }) });
369
364
  }
370
365
 
371
- export { NajmDesignProvider, NajmThemeContainerCtx, NajmThemeProvider, cn, composePreset, resolvePreset, useNajmAppearance, useNajmComponentStyle, useNajmDesign, useNajmThemeMode };
366
+ export { NajmDesignProvider, NajmThemeContainerCtx, NajmThemeProvider, composePreset, resolvePreset, useNajmAppearance, useNajmComponentStyle, useNajmDesign, useNajmThemeMode };