@almadar/ui 1.0.30 → 1.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/KaTeX_AMS-Regular-CYEKBG2K.woff +0 -0
  2. package/dist/KaTeX_AMS-Regular-JKX5W2C4.ttf +0 -0
  3. package/dist/KaTeX_AMS-Regular-U6PRYMIZ.woff2 +0 -0
  4. package/dist/KaTeX_Caligraphic-Bold-5QL5CMTE.woff2 +0 -0
  5. package/dist/KaTeX_Caligraphic-Bold-WZ3QSGD3.woff +0 -0
  6. package/dist/KaTeX_Caligraphic-Bold-ZTS3R3HK.ttf +0 -0
  7. package/dist/KaTeX_Caligraphic-Regular-3LKEU76G.woff +0 -0
  8. package/dist/KaTeX_Caligraphic-Regular-A7XRTZ5Q.ttf +0 -0
  9. package/dist/KaTeX_Caligraphic-Regular-KX5MEWCF.woff2 +0 -0
  10. package/dist/KaTeX_Fraktur-Bold-2QVFK6NQ.woff2 +0 -0
  11. package/dist/KaTeX_Fraktur-Bold-T4SWXBMT.woff +0 -0
  12. package/dist/KaTeX_Fraktur-Bold-WGHVTYOR.ttf +0 -0
  13. package/dist/KaTeX_Fraktur-Regular-2PEIFJSJ.woff2 +0 -0
  14. package/dist/KaTeX_Fraktur-Regular-5U4OPH2X.ttf +0 -0
  15. package/dist/KaTeX_Fraktur-Regular-PQMHCIK6.woff +0 -0
  16. package/dist/KaTeX_Main-Bold-2GA4IZIN.woff +0 -0
  17. package/dist/KaTeX_Main-Bold-W5FBVCZM.ttf +0 -0
  18. package/dist/KaTeX_Main-Bold-YP5VVQRP.woff2 +0 -0
  19. package/dist/KaTeX_Main-BoldItalic-4P4C7HJH.woff +0 -0
  20. package/dist/KaTeX_Main-BoldItalic-N4V3DX7S.woff2 +0 -0
  21. package/dist/KaTeX_Main-BoldItalic-ODMLBJJQ.ttf +0 -0
  22. package/dist/KaTeX_Main-Italic-I43T2HSR.ttf +0 -0
  23. package/dist/KaTeX_Main-Italic-RELBIK7M.woff2 +0 -0
  24. package/dist/KaTeX_Main-Italic-SASNQFN2.woff +0 -0
  25. package/dist/KaTeX_Main-Regular-ARRPAO67.woff2 +0 -0
  26. package/dist/KaTeX_Main-Regular-P5I74A2A.woff +0 -0
  27. package/dist/KaTeX_Main-Regular-W74P5G27.ttf +0 -0
  28. package/dist/KaTeX_Math-BoldItalic-6EBV3DK5.woff +0 -0
  29. package/dist/KaTeX_Math-BoldItalic-K4WTGH3J.woff2 +0 -0
  30. package/dist/KaTeX_Math-BoldItalic-VB447A4D.ttf +0 -0
  31. package/dist/KaTeX_Math-Italic-6KGCHLFN.woff2 +0 -0
  32. package/dist/KaTeX_Math-Italic-KKK3USB2.woff +0 -0
  33. package/dist/KaTeX_Math-Italic-SON4MRCA.ttf +0 -0
  34. package/dist/KaTeX_SansSerif-Bold-RRNVJFFW.woff2 +0 -0
  35. package/dist/KaTeX_SansSerif-Bold-STQ6RXC7.ttf +0 -0
  36. package/dist/KaTeX_SansSerif-Bold-X5M5EMOD.woff +0 -0
  37. package/dist/KaTeX_SansSerif-Italic-HMPFTM52.woff2 +0 -0
  38. package/dist/KaTeX_SansSerif-Italic-PSN4QKYX.woff +0 -0
  39. package/dist/KaTeX_SansSerif-Italic-WTBAZBGY.ttf +0 -0
  40. package/dist/KaTeX_SansSerif-Regular-2TL3USAE.ttf +0 -0
  41. package/dist/KaTeX_SansSerif-Regular-OQCII6EP.woff +0 -0
  42. package/dist/KaTeX_SansSerif-Regular-XIQ62X4E.woff2 +0 -0
  43. package/dist/KaTeX_Script-Regular-72OLXYNA.ttf +0 -0
  44. package/dist/KaTeX_Script-Regular-A5IFOEBS.woff +0 -0
  45. package/dist/KaTeX_Script-Regular-APUWIHLP.woff2 +0 -0
  46. package/dist/KaTeX_Size1-Regular-4HRHTS65.woff +0 -0
  47. package/dist/KaTeX_Size1-Regular-5LRUTBFT.woff2 +0 -0
  48. package/dist/KaTeX_Size1-Regular-7K6AASVL.ttf +0 -0
  49. package/dist/KaTeX_Size2-Regular-222HN3GT.ttf +0 -0
  50. package/dist/KaTeX_Size2-Regular-K5ZHAIS6.woff +0 -0
  51. package/dist/KaTeX_Size2-Regular-LELKET5D.woff2 +0 -0
  52. package/dist/KaTeX_Size3-Regular-TLFPAHDE.woff +0 -0
  53. package/dist/KaTeX_Size3-Regular-UFCO6WCA.ttf +0 -0
  54. package/dist/KaTeX_Size3-Regular-WQRQ47UD.woff2 +0 -0
  55. package/dist/KaTeX_Size4-Regular-7PGNVPQK.ttf +0 -0
  56. package/dist/KaTeX_Size4-Regular-CDMV7U5C.woff2 +0 -0
  57. package/dist/KaTeX_Size4-Regular-PKMWZHNC.woff +0 -0
  58. package/dist/KaTeX_Typewriter-Regular-3F5K6SQ6.ttf +0 -0
  59. package/dist/KaTeX_Typewriter-Regular-MJMFSK64.woff +0 -0
  60. package/dist/KaTeX_Typewriter-Regular-VBYJ4NRC.woff2 +0 -0
  61. package/dist/{ThemeContext-lI5bo85E.d.ts → ThemeContext-D9xUORq5.d.ts} +2 -0
  62. package/dist/chunk-45CTDYBT.js +174 -0
  63. package/dist/{chunk-4UFNDD6B.js → chunk-BTXQJGFB.js} +41 -8
  64. package/dist/chunk-N6DJVKZ6.js +747 -0
  65. package/dist/chunk-PE2H3NAW.js +383 -0
  66. package/dist/{chunk-7IYF4RUG.js → chunk-RFD6G3ZR.js} +23 -68
  67. package/dist/chunk-UCXZS2YJ.js +9501 -0
  68. package/dist/chunk-YXZM3WCF.js +222 -0
  69. package/dist/cn-BoBXsxuX.d.ts +194 -0
  70. package/dist/components/index.css +1154 -0
  71. package/dist/components/index.d.ts +1082 -673
  72. package/dist/components/index.js +8935 -16486
  73. package/dist/components/organisms/game/three/index.css +315 -0
  74. package/dist/components/organisms/game/three/index.d.ts +1162 -0
  75. package/dist/components/organisms/game/three/index.js +2378 -0
  76. package/dist/context/index.d.ts +4 -4
  77. package/dist/context/index.js +2 -3
  78. package/dist/{event-bus-types-8-cjyMxw.d.ts → event-bus-types-CjJduURa.d.ts} +8 -0
  79. package/dist/hooks/index.d.ts +120 -106
  80. package/dist/hooks/index.js +4 -3
  81. package/dist/isometric-ynNHVPZx.d.ts +111 -0
  82. package/dist/lib/index.d.ts +117 -153
  83. package/dist/lib/index.js +4 -683
  84. package/dist/providers/index.css +1154 -0
  85. package/dist/providers/index.d.ts +84 -4
  86. package/dist/providers/index.js +165 -8
  87. package/dist/{useUISlots-mnggE9X9.d.ts → useUISlots-D0mttBSP.d.ts} +0 -20
  88. package/package.json +32 -11
  89. package/dist/chunk-HY5EFCOK.js +0 -419
  90. package/dist/chunk-W5YTXLXL.js +0 -29
  91. package/dist/cn-mqkxz8Sd.d.ts +0 -9
@@ -1,419 +0,0 @@
1
- import React2, { createContext, useContext, useRef, useEffect, useCallback, useMemo, useState } from 'react';
2
- import { jsx } from 'react/jsx-runtime';
3
-
4
- // providers/EventBusProvider.tsx
5
- function setGlobalEventBus(bus) {
6
- if (typeof window !== "undefined") {
7
- window.__kflowEventBus = bus;
8
- }
9
- }
10
- function getGlobalEventBus() {
11
- if (typeof window !== "undefined") {
12
- return window.__kflowEventBus ?? null;
13
- }
14
- return null;
15
- }
16
- var fallbackListeners = /* @__PURE__ */ new Map();
17
- var fallbackEventBus = {
18
- emit: (type, payload) => {
19
- const event = {
20
- type,
21
- payload,
22
- timestamp: Date.now()
23
- };
24
- const handlers = fallbackListeners.get(type);
25
- if (handlers) {
26
- handlers.forEach((handler) => {
27
- try {
28
- handler(event);
29
- } catch (error) {
30
- console.error(`[EventBus] Error in listener for '${type}':`, error);
31
- }
32
- });
33
- }
34
- },
35
- on: (type, listener) => {
36
- if (!fallbackListeners.has(type)) {
37
- fallbackListeners.set(type, /* @__PURE__ */ new Set());
38
- }
39
- fallbackListeners.get(type).add(listener);
40
- return () => {
41
- const handlers = fallbackListeners.get(type);
42
- if (handlers) {
43
- handlers.delete(listener);
44
- if (handlers.size === 0) {
45
- fallbackListeners.delete(type);
46
- }
47
- }
48
- };
49
- },
50
- once: (type, listener) => {
51
- const wrappedListener = (event) => {
52
- fallbackListeners.get(type)?.delete(wrappedListener);
53
- listener(event);
54
- };
55
- return fallbackEventBus.on(type, wrappedListener);
56
- },
57
- hasListeners: (type) => {
58
- const handlers = fallbackListeners.get(type);
59
- return handlers !== void 0 && handlers.size > 0;
60
- }
61
- };
62
- function useEventBus() {
63
- const context = useContext(EventBusContext);
64
- return context ?? getGlobalEventBus() ?? fallbackEventBus;
65
- }
66
- function useEventListener(event, handler) {
67
- const eventBus = useEventBus();
68
- const handlerRef = useRef(handler);
69
- handlerRef.current = handler;
70
- useEffect(() => {
71
- const wrappedHandler = (evt) => {
72
- handlerRef.current(evt);
73
- };
74
- const unsub = eventBus.on(event, wrappedHandler);
75
- return () => {
76
- if (typeof unsub === "function") unsub();
77
- };
78
- }, [event, eventBus]);
79
- }
80
- function useEmitEvent() {
81
- const eventBus = useEventBus();
82
- return useCallback(
83
- (type, payload) => {
84
- eventBus.emit(type, payload);
85
- },
86
- [eventBus]
87
- );
88
- }
89
- var EventBusContext = createContext(null);
90
- function EventBusProvider({ children, debug = false }) {
91
- const listenersRef = useRef(/* @__PURE__ */ new Map());
92
- const deprecationWarningShown = useRef(false);
93
- const getSelectedEntity = useCallback(() => {
94
- if (!deprecationWarningShown.current) {
95
- console.warn(
96
- "[EventBus] getSelectedEntity is deprecated. Use SelectionProvider and useSelection hook instead. See SelectionProvider.tsx for migration guide."
97
- );
98
- deprecationWarningShown.current = true;
99
- }
100
- return null;
101
- }, []);
102
- const clearSelectedEntity = useCallback(() => {
103
- if (!deprecationWarningShown.current) {
104
- console.warn(
105
- "[EventBus] clearSelectedEntity is deprecated. Use SelectionProvider and useSelection hook instead. See SelectionProvider.tsx for migration guide."
106
- );
107
- deprecationWarningShown.current = true;
108
- }
109
- }, []);
110
- const emit = useCallback((type, payload) => {
111
- const event = {
112
- type,
113
- payload,
114
- timestamp: Date.now()
115
- };
116
- const listeners = listenersRef.current.get(type);
117
- const listenerCount = listeners?.size ?? 0;
118
- if (debug) {
119
- if (listenerCount > 0) {
120
- console.log(`[EventBus] Emit: ${type} \u2192 ${listenerCount} listener(s)`, payload);
121
- } else {
122
- console.warn(`[EventBus] Emit: ${type} (NO LISTENERS - event may be lost!)`, payload);
123
- }
124
- }
125
- if (listeners) {
126
- const listenersCopy = Array.from(listeners);
127
- for (const listener of listenersCopy) {
128
- try {
129
- listener(event);
130
- } catch (error) {
131
- console.error(`[EventBus] Error in listener for '${type}':`, error);
132
- }
133
- }
134
- }
135
- }, [debug]);
136
- const on = useCallback((type, listener) => {
137
- if (!listenersRef.current.has(type)) {
138
- listenersRef.current.set(type, /* @__PURE__ */ new Set());
139
- }
140
- const listeners = listenersRef.current.get(type);
141
- listeners.add(listener);
142
- if (debug) {
143
- console.log(`[EventBus] Subscribed to '${type}', total: ${listeners.size}`);
144
- }
145
- return () => {
146
- listeners.delete(listener);
147
- if (debug) {
148
- console.log(`[EventBus] Unsubscribed from '${type}', remaining: ${listeners.size}`);
149
- }
150
- if (listeners.size === 0) {
151
- listenersRef.current.delete(type);
152
- }
153
- };
154
- }, [debug]);
155
- const once = useCallback((type, listener) => {
156
- const wrappedListener = (event) => {
157
- listenersRef.current.get(type)?.delete(wrappedListener);
158
- listener(event);
159
- };
160
- return on(type, wrappedListener);
161
- }, [on]);
162
- const hasListeners = useCallback((type) => {
163
- const listeners = listenersRef.current.get(type);
164
- return listeners !== void 0 && listeners.size > 0;
165
- }, []);
166
- const contextValue = useMemo(
167
- () => ({
168
- emit,
169
- on,
170
- once,
171
- hasListeners,
172
- getSelectedEntity,
173
- clearSelectedEntity
174
- }),
175
- [emit, on, once, hasListeners, getSelectedEntity, clearSelectedEntity]
176
- );
177
- useEffect(() => {
178
- setGlobalEventBus(contextValue);
179
- return () => {
180
- setGlobalEventBus(null);
181
- };
182
- }, [contextValue]);
183
- return /* @__PURE__ */ jsx(EventBusContext.Provider, { value: contextValue, children });
184
- }
185
- var EntityDataContext = createContext(null);
186
- function EntityDataProvider({
187
- adapter,
188
- children
189
- }) {
190
- return React2.createElement(
191
- EntityDataContext.Provider,
192
- { value: adapter },
193
- children
194
- );
195
- }
196
- function useEntityDataAdapter() {
197
- return useContext(EntityDataContext);
198
- }
199
- var entityDataKeys = {
200
- all: ["entities"],
201
- lists: () => [...entityDataKeys.all, "list"],
202
- list: (entity, filters) => [...entityDataKeys.lists(), entity, filters],
203
- details: () => [...entityDataKeys.all, "detail"],
204
- detail: (entity, id) => [...entityDataKeys.details(), entity, id]
205
- };
206
- function useEntityList(entity, options = {}) {
207
- const { skip = false } = options;
208
- const adapter = useContext(EntityDataContext);
209
- const adapterData = useMemo(() => {
210
- if (!adapter || !entity || skip) return [];
211
- return adapter.getData(entity);
212
- }, [adapter, entity, skip, adapter?.isLoading]);
213
- const [stubData, setStubData] = useState([]);
214
- const [stubLoading, setStubLoading] = useState(!skip && !!entity && !adapter);
215
- const [stubError, setStubError] = useState(null);
216
- useEffect(() => {
217
- if (adapter || skip || !entity) {
218
- setStubLoading(false);
219
- return;
220
- }
221
- setStubLoading(true);
222
- const t = setTimeout(() => {
223
- setStubData([]);
224
- setStubLoading(false);
225
- }, 100);
226
- return () => clearTimeout(t);
227
- }, [entity, skip, adapter]);
228
- if (adapter) {
229
- return {
230
- data: adapterData,
231
- isLoading: adapter.isLoading,
232
- error: adapter.error ? new Error(adapter.error) : null,
233
- refetch: () => {
234
- }
235
- };
236
- }
237
- return { data: stubData, isLoading: stubLoading, error: stubError, refetch: () => {
238
- } };
239
- }
240
- function useEntity(entity, id) {
241
- const adapter = useContext(EntityDataContext);
242
- const adapterData = useMemo(() => {
243
- if (!adapter || !entity || !id) return null;
244
- return adapter.getById(entity, id) ?? null;
245
- }, [adapter, entity, id, adapter?.isLoading]);
246
- const [stubData, setStubData] = useState(null);
247
- const [stubLoading, setStubLoading] = useState(!!entity && !!id && !adapter);
248
- const [stubError, setStubError] = useState(null);
249
- useEffect(() => {
250
- if (adapter || !entity || !id) {
251
- setStubLoading(false);
252
- return;
253
- }
254
- setStubLoading(true);
255
- const t = setTimeout(() => {
256
- setStubData(null);
257
- setStubLoading(false);
258
- }, 100);
259
- return () => clearTimeout(t);
260
- }, [entity, id, adapter]);
261
- if (adapter) {
262
- return {
263
- data: adapterData,
264
- isLoading: adapter.isLoading,
265
- error: adapter.error ? new Error(adapter.error) : null
266
- };
267
- }
268
- return { data: stubData, isLoading: stubLoading, error: stubError };
269
- }
270
- function useEntityDetail(entity, id) {
271
- const result = useEntity(entity, id);
272
- return { ...result, refetch: () => {
273
- } };
274
- }
275
- function usePaginatedEntityList(entity, params, options = {}) {
276
- const { skip = false } = options;
277
- const adapter = useContext(EntityDataContext);
278
- const adapterResult = useMemo(() => {
279
- if (!adapter || !entity || skip) {
280
- return { data: [], totalCount: 0 };
281
- }
282
- const all = adapter.getData(entity);
283
- const start = (params.page - 1) * params.pageSize;
284
- const paged = all.slice(start, start + params.pageSize);
285
- return { data: paged, totalCount: all.length };
286
- }, [adapter, entity, skip, params.page, params.pageSize, adapter?.isLoading]);
287
- const [stubData, setStubData] = useState([]);
288
- const [stubLoading, setStubLoading] = useState(!skip && !!entity && !adapter);
289
- const [stubError, setStubError] = useState(null);
290
- const [stubTotalCount, setStubTotalCount] = useState(0);
291
- useEffect(() => {
292
- if (adapter || skip || !entity) {
293
- setStubLoading(false);
294
- return;
295
- }
296
- setStubLoading(true);
297
- const t = setTimeout(() => {
298
- setStubData([]);
299
- setStubTotalCount(0);
300
- setStubLoading(false);
301
- }, 100);
302
- return () => clearTimeout(t);
303
- }, [entity, params.page, params.pageSize, params.search, params.sortBy, params.sortDirection, skip, adapter]);
304
- const totalCount = adapter ? adapterResult.totalCount : stubTotalCount;
305
- const totalPages = Math.ceil(totalCount / params.pageSize) || 1;
306
- if (adapter) {
307
- return {
308
- data: adapterResult.data,
309
- isLoading: adapter.isLoading,
310
- error: adapter.error ? new Error(adapter.error) : null,
311
- totalCount: adapterResult.totalCount,
312
- totalPages,
313
- hasNextPage: params.page < totalPages,
314
- hasPreviousPage: params.page > 1,
315
- refetch: () => {
316
- }
317
- };
318
- }
319
- return {
320
- data: stubData,
321
- isLoading: stubLoading,
322
- error: stubError,
323
- totalCount: stubTotalCount,
324
- totalPages,
325
- hasNextPage: params.page < totalPages,
326
- hasPreviousPage: params.page > 1,
327
- refetch: () => {
328
- }
329
- };
330
- }
331
- var SelectionContext = createContext(null);
332
- var defaultCompareEntities = (a, b) => {
333
- if (a === b) return true;
334
- if (!a || !b) return false;
335
- if (typeof a === "object" && typeof b === "object") {
336
- const aId = a.id;
337
- const bId = b.id;
338
- return aId !== void 0 && aId === bId;
339
- }
340
- return false;
341
- };
342
- function SelectionProvider({
343
- children,
344
- debug = false,
345
- compareEntities = defaultCompareEntities
346
- }) {
347
- const eventBus = useEventBus();
348
- const [selected, setSelectedState] = useState(null);
349
- const setSelected = useCallback(
350
- (entity) => {
351
- setSelectedState(entity);
352
- if (debug) {
353
- console.log("[SelectionProvider] Selection set:", entity);
354
- }
355
- },
356
- [debug]
357
- );
358
- const clearSelection = useCallback(() => {
359
- setSelectedState(null);
360
- if (debug) {
361
- console.log("[SelectionProvider] Selection cleared");
362
- }
363
- }, [debug]);
364
- const isSelected = useCallback(
365
- (entity) => {
366
- return compareEntities(selected, entity);
367
- },
368
- [selected, compareEntities]
369
- );
370
- useEffect(() => {
371
- const handleSelect = (event) => {
372
- const row = event.payload?.row;
373
- if (row) {
374
- setSelected(row);
375
- if (debug) {
376
- console.log(`[SelectionProvider] ${event.type} received:`, row);
377
- }
378
- }
379
- };
380
- const handleDeselect = (event) => {
381
- clearSelection();
382
- if (debug) {
383
- console.log(`[SelectionProvider] ${event.type} received - clearing selection`);
384
- }
385
- };
386
- const unsubView = eventBus.on("UI:VIEW", handleSelect);
387
- const unsubSelect = eventBus.on("UI:SELECT", handleSelect);
388
- const unsubClose = eventBus.on("UI:CLOSE", handleDeselect);
389
- const unsubDeselect = eventBus.on("UI:DESELECT", handleDeselect);
390
- const unsubCancel = eventBus.on("UI:CANCEL", handleDeselect);
391
- return () => {
392
- unsubView();
393
- unsubSelect();
394
- unsubClose();
395
- unsubDeselect();
396
- unsubCancel();
397
- };
398
- }, [eventBus, setSelected, clearSelection, debug]);
399
- const contextValue = {
400
- selected,
401
- setSelected,
402
- clearSelection,
403
- isSelected
404
- };
405
- return /* @__PURE__ */ jsx(SelectionContext.Provider, { value: contextValue, children });
406
- }
407
- function useSelection() {
408
- const context = useContext(SelectionContext);
409
- if (!context) {
410
- throw new Error("useSelection must be used within a SelectionProvider");
411
- }
412
- return context;
413
- }
414
- function useSelectionOptional() {
415
- const context = useContext(SelectionContext);
416
- return context;
417
- }
418
-
419
- export { EntityDataProvider, EventBusContext, EventBusProvider, SelectionContext, SelectionProvider, entityDataKeys, useEmitEvent, useEntity, useEntityDataAdapter, useEntityDetail, useEntityList, useEventBus, useEventListener, usePaginatedEntityList, useSelection, useSelectionOptional };
@@ -1,29 +0,0 @@
1
- import { useUISlotManager } from './chunk-7NEWMNNU.js';
2
- import { createContext, useMemo, useContext } from 'react';
3
- import { jsx } from 'react/jsx-runtime';
4
-
5
- var UISlotContext = createContext(null);
6
- function UISlotProvider({ children }) {
7
- const slotManager = useUISlotManager();
8
- const contextValue = useMemo(() => slotManager, [slotManager]);
9
- return /* @__PURE__ */ jsx(UISlotContext.Provider, { value: contextValue, children });
10
- }
11
- function useUISlots() {
12
- const context = useContext(UISlotContext);
13
- if (!context) {
14
- throw new Error(
15
- "useUISlots must be used within a UISlotProvider. Make sure your component tree is wrapped with <UISlotProvider>."
16
- );
17
- }
18
- return context;
19
- }
20
- function useSlotContent(slot) {
21
- const { getContent } = useUISlots();
22
- return getContent(slot);
23
- }
24
- function useSlotHasContent(slot) {
25
- const { hasContent } = useUISlots();
26
- return hasContent(slot);
27
- }
28
-
29
- export { UISlotContext, UISlotProvider, useSlotContent, useSlotHasContent, useUISlots };
@@ -1,9 +0,0 @@
1
- import { ClassValue } from 'clsx';
2
-
3
- /**
4
- * Utility function to merge Tailwind CSS classes
5
- * Combines clsx for conditional classes with tailwind-merge to handle conflicts
6
- */
7
- declare function cn(...inputs: ClassValue[]): string;
8
-
9
- export { cn as c };