asterui 0.12.62 → 0.12.64

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 (127) hide show
  1. package/dist/components/Anchor.d.ts +2 -0
  2. package/dist/components/Anchor.js +79 -75
  3. package/dist/components/Anchor.js.map +1 -1
  4. package/dist/components/Autocomplete.d.ts +1 -0
  5. package/dist/components/Autocomplete.js +115 -110
  6. package/dist/components/Autocomplete.js.map +1 -1
  7. package/dist/components/Breadcrumb.d.ts +4 -2
  8. package/dist/components/Breadcrumb.js +54 -29
  9. package/dist/components/Breadcrumb.js.map +1 -1
  10. package/dist/components/Button.d.ts +5 -1
  11. package/dist/components/Button.js +117 -107
  12. package/dist/components/Button.js.map +1 -1
  13. package/dist/components/Chart.d.ts +1 -0
  14. package/dist/components/Chart.js +31 -30
  15. package/dist/components/Chart.js.map +1 -1
  16. package/dist/components/Chat.d.ts +1 -0
  17. package/dist/components/Chat.js +32 -30
  18. package/dist/components/Chat.js.map +1 -1
  19. package/dist/components/Collapse.js +58 -56
  20. package/dist/components/Collapse.js.map +1 -1
  21. package/dist/components/Command.d.ts +5 -2
  22. package/dist/components/Command.js +262 -233
  23. package/dist/components/Command.js.map +1 -1
  24. package/dist/components/ContextMenu.d.ts +4 -0
  25. package/dist/components/ContextMenu.js +149 -130
  26. package/dist/components/ContextMenu.js.map +1 -1
  27. package/dist/components/DatePicker.d.ts +19 -1
  28. package/dist/components/DatePicker.js +266 -87
  29. package/dist/components/DatePicker.js.map +1 -1
  30. package/dist/components/Dock.d.ts +2 -0
  31. package/dist/components/Dock.js +70 -46
  32. package/dist/components/Dock.js.map +1 -1
  33. package/dist/components/FileInput.d.ts +1 -0
  34. package/dist/components/FileInput.js +26 -26
  35. package/dist/components/FileInput.js.map +1 -1
  36. package/dist/components/Filter.d.ts +1 -0
  37. package/dist/components/Filter.js +43 -40
  38. package/dist/components/Filter.js.map +1 -1
  39. package/dist/components/Flex.d.ts +1 -0
  40. package/dist/components/Flex.js +43 -42
  41. package/dist/components/Flex.js.map +1 -1
  42. package/dist/components/FloatButton.d.ts +3 -0
  43. package/dist/components/FloatButton.js +178 -127
  44. package/dist/components/FloatButton.js.map +1 -1
  45. package/dist/components/Input.d.ts +1 -0
  46. package/dist/components/Input.js +201 -184
  47. package/dist/components/Input.js.map +1 -1
  48. package/dist/components/Loading.d.ts +1 -0
  49. package/dist/components/Loading.js +40 -37
  50. package/dist/components/Loading.js.map +1 -1
  51. package/dist/components/Masonry.d.ts +1 -0
  52. package/dist/components/Masonry.js +45 -42
  53. package/dist/components/Masonry.js.map +1 -1
  54. package/dist/components/Mention.d.ts +1 -0
  55. package/dist/components/Mention.js +95 -91
  56. package/dist/components/Mention.js.map +1 -1
  57. package/dist/components/Menu.d.ts +1 -1
  58. package/dist/components/Menu.js +99 -93
  59. package/dist/components/Menu.js.map +1 -1
  60. package/dist/components/Modal.js +26 -17
  61. package/dist/components/Modal.js.map +1 -1
  62. package/dist/components/MonthCalendar.d.ts +1 -0
  63. package/dist/components/MonthCalendar.js +104 -97
  64. package/dist/components/MonthCalendar.js.map +1 -1
  65. package/dist/components/Notification.js +53 -45
  66. package/dist/components/Notification.js.map +1 -1
  67. package/dist/components/QRCode.d.ts +1 -0
  68. package/dist/components/QRCode.js +84 -55
  69. package/dist/components/QRCode.js.map +1 -1
  70. package/dist/components/RadialProgress.d.ts +1 -0
  71. package/dist/components/RadialProgress.js +19 -17
  72. package/dist/components/RadialProgress.js.map +1 -1
  73. package/dist/components/Range.d.ts +1 -0
  74. package/dist/components/Range.js +45 -43
  75. package/dist/components/Range.js.map +1 -1
  76. package/dist/components/Rating.d.ts +4 -2
  77. package/dist/components/Rating.js +83 -79
  78. package/dist/components/Rating.js.map +1 -1
  79. package/dist/components/Responsive.d.ts +4 -2
  80. package/dist/components/Responsive.js +10 -9
  81. package/dist/components/Responsive.js.map +1 -1
  82. package/dist/components/Result.d.ts +1 -0
  83. package/dist/components/Result.js +24 -22
  84. package/dist/components/Result.js.map +1 -1
  85. package/dist/components/Select.d.ts +1 -0
  86. package/dist/components/Select.js +72 -62
  87. package/dist/components/Select.js.map +1 -1
  88. package/dist/components/Splitter.d.ts +2 -0
  89. package/dist/components/Splitter.js +137 -131
  90. package/dist/components/Splitter.js.map +1 -1
  91. package/dist/components/Stat.d.ts +4 -2
  92. package/dist/components/Stat.js +19 -18
  93. package/dist/components/Stat.js.map +1 -1
  94. package/dist/components/Steps.d.ts +4 -2
  95. package/dist/components/Steps.js +56 -52
  96. package/dist/components/Steps.js.map +1 -1
  97. package/dist/components/Tabs.js +69 -57
  98. package/dist/components/Tabs.js.map +1 -1
  99. package/dist/components/TextRotate.d.ts +1 -0
  100. package/dist/components/TextRotate.js +14 -12
  101. package/dist/components/TextRotate.js.map +1 -1
  102. package/dist/components/Textarea.d.ts +1 -0
  103. package/dist/components/Textarea.js +31 -30
  104. package/dist/components/Textarea.js.map +1 -1
  105. package/dist/components/ThemeController.d.ts +6 -3
  106. package/dist/components/ThemeController.js +101 -92
  107. package/dist/components/ThemeController.js.map +1 -1
  108. package/dist/components/Tooltip.js +38 -35
  109. package/dist/components/Tooltip.js.map +1 -1
  110. package/dist/components/Transfer.js +130 -121
  111. package/dist/components/Transfer.js.map +1 -1
  112. package/dist/components/TreeSelect.js +49 -48
  113. package/dist/components/TreeSelect.js.map +1 -1
  114. package/dist/components/Typography.d.ts +10 -5
  115. package/dist/components/Typography.js +84 -81
  116. package/dist/components/Typography.js.map +1 -1
  117. package/dist/components/VirtualList.d.ts +2 -1
  118. package/dist/components/VirtualList.js +40 -36
  119. package/dist/components/VirtualList.js.map +1 -1
  120. package/dist/components/Watermark.d.ts +1 -0
  121. package/dist/components/Watermark.js +74 -71
  122. package/dist/components/Watermark.js.map +1 -1
  123. package/dist/components/WeekCalendar.d.ts +1 -0
  124. package/dist/components/WeekCalendar.js +91 -76
  125. package/dist/components/WeekCalendar.js.map +1 -1
  126. package/dist/index.d.ts +1 -1
  127. package/package.json +1 -1
@@ -1,26 +1,27 @@
1
- import { jsx as g } from "react/jsx-runtime";
1
+ import { jsx as x } from "react/jsx-runtime";
2
2
  import { useRef as p, useEffect as m } from "react";
3
- import x from "apexcharts";
4
- import { useTheme as k } from "../hooks/useTheme.js";
5
- function c(t, e) {
3
+ import k from "apexcharts";
4
+ import { useTheme as A } from "../hooks/useTheme.js";
5
+ function a(t, o) {
6
6
  const l = { ...t };
7
- for (const o in e)
8
- e[o] !== void 0 && (typeof e[o] == "object" && e[o] !== null && !Array.isArray(e[o]) && typeof t[o] == "object" && t[o] !== null && !Array.isArray(t[o]) ? l[o] = c(
9
- t[o],
10
- e[o]
11
- ) : l[o] = e[o]);
7
+ for (const e in o)
8
+ o[e] !== void 0 && (typeof o[e] == "object" && o[e] !== null && !Array.isArray(o[e]) && typeof t[e] == "object" && t[e] !== null && !Array.isArray(t[e]) ? l[e] = a(
9
+ t[e],
10
+ o[e]
11
+ ) : l[e] = o[e]);
12
12
  return l;
13
13
  }
14
- const j = ({
14
+ const T = ({
15
15
  type: t,
16
- series: e,
16
+ series: o,
17
17
  width: l = "100%",
18
- height: o = 350,
19
- options: a = {},
20
- themed: i = !0,
21
- className: y = ""
18
+ height: e = 350,
19
+ options: c = {},
20
+ themed: f = !0,
21
+ className: y = "",
22
+ "data-testid": h
22
23
  }) => {
23
- const u = p(null), n = p(null), { isDark: f, colors: r } = k(), h = () => ({
24
+ const u = p(null), n = p(null), { isDark: d, colors: r } = A(), b = () => ({
24
25
  colors: [
25
26
  r.primary,
26
27
  r.secondary,
@@ -31,7 +32,7 @@ const j = ({
31
32
  r.error
32
33
  ],
33
34
  theme: {
34
- mode: f ? "dark" : "light"
35
+ mode: d ? "dark" : "light"
35
36
  },
36
37
  chart: {
37
38
  background: "transparent",
@@ -67,7 +68,7 @@ const j = ({
67
68
  }
68
69
  },
69
70
  tooltip: {
70
- theme: f ? "dark" : "light",
71
+ theme: d ? "dark" : "light",
71
72
  style: {
72
73
  fontSize: "12px"
73
74
  },
@@ -89,34 +90,34 @@ const j = ({
89
90
  enabled: !1
90
91
  }
91
92
  }
92
- }), d = () => {
93
+ }), i = () => {
93
94
  const s = {
94
95
  chart: {
95
96
  type: t,
96
97
  width: l,
97
- height: o
98
+ height: e
98
99
  },
99
- series: e
100
+ series: o
100
101
  };
101
- if (i) {
102
- const b = h();
103
- return c(c(s, b), a);
102
+ if (f) {
103
+ const g = b();
104
+ return a(a(s, g), c);
104
105
  }
105
- return c(s, a);
106
+ return a(s, c);
106
107
  };
107
108
  return m(() => {
108
109
  if (!u.current) return;
109
- const s = d();
110
- return n.current = new x(u.current, s), n.current.render(), () => {
110
+ const s = i();
111
+ return n.current = new k(u.current, s), n.current.render(), () => {
111
112
  n.current && (n.current.destroy(), n.current = null);
112
113
  };
113
114
  }, []), m(() => {
114
115
  if (!n.current) return;
115
- const s = d();
116
+ const s = i();
116
117
  n.current.updateOptions(s, !0, !0);
117
- }, [t, e, l, o, a, i, f, r]), /* @__PURE__ */ g("div", { ref: u, className: y });
118
+ }, [t, o, l, e, c, f, d, r]), /* @__PURE__ */ x("div", { ref: u, className: y, "data-testid": h });
118
119
  };
119
120
  export {
120
- j as Chart
121
+ T as Chart
121
122
  };
122
123
  //# sourceMappingURL=Chart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Chart.js","sources":["../../src/components/Chart.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react'\nimport ApexCharts from 'apexcharts'\nimport type { ApexOptions } from 'apexcharts'\nimport { useTheme } from '../hooks/useTheme'\n\nexport interface ChartProps {\n /** Chart type */\n type: 'line' | 'area' | 'bar' | 'pie' | 'donut' | 'radialBar' | 'scatter' | 'bubble' | 'heatmap' | 'candlestick' | 'boxPlot' | 'radar' | 'polarArea' | 'rangeBar' | 'rangeArea' | 'treemap'\n /** Chart series data */\n series: ApexAxisChartSeries | ApexNonAxisChartSeries\n /** Chart width */\n width?: string | number\n /** Chart height */\n height?: string | number\n /** ApexCharts options (merged with theme defaults) */\n options?: ApexOptions\n /** Use daisyUI theme colors */\n themed?: boolean\n /** Additional CSS classes */\n className?: string\n}\n\n// Deep merge objects\nfunction deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const result = { ...target }\n\n for (const key in source) {\n if (source[key] !== undefined) {\n if (\n typeof source[key] === 'object' &&\n source[key] !== null &&\n !Array.isArray(source[key]) &&\n typeof target[key] === 'object' &&\n target[key] !== null &&\n !Array.isArray(target[key])\n ) {\n result[key] = deepMerge(\n target[key] as Record<string, unknown>,\n source[key] as Record<string, unknown>\n ) as T[Extract<keyof T, string>]\n } else {\n result[key] = source[key] as T[Extract<keyof T, string>]\n }\n }\n }\n\n return result\n}\n\nexport const Chart: React.FC<ChartProps> = ({\n type,\n series,\n width = '100%',\n height = 350,\n options = {},\n themed = true,\n className = '',\n}) => {\n const chartRef = useRef<HTMLDivElement>(null)\n const chartInstance = useRef<ApexCharts | null>(null)\n const { isDark, colors } = useTheme()\n\n // Build theme-aware chart options\n const getThemedOptions = (): Partial<ApexOptions> => {\n const chartColors = [\n colors.primary,\n colors.secondary,\n colors.accent,\n colors.info,\n colors.success,\n colors.warning,\n colors.error,\n ]\n\n return {\n colors: chartColors,\n theme: {\n mode: isDark ? 'dark' : 'light',\n },\n chart: {\n background: 'transparent',\n foreColor: colors.foreground,\n },\n grid: {\n borderColor: colors.foreground + '20', // 12.5% opacity\n },\n xaxis: {\n labels: {\n style: {\n colors: colors.foreground,\n },\n },\n axisBorder: {\n color: colors.foreground + '20',\n },\n axisTicks: {\n color: colors.foreground + '20',\n },\n },\n yaxis: {\n labels: {\n style: {\n colors: colors.foreground,\n },\n },\n },\n legend: {\n labels: {\n colors: colors.foreground,\n },\n },\n tooltip: {\n theme: isDark ? 'dark' : 'light',\n style: {\n fontSize: '12px',\n },\n x: {\n show: true,\n },\n marker: {\n show: true,\n },\n },\n dataLabels: {\n style: {\n colors: Array(7).fill(colors.foreground),\n },\n background: {\n enabled: false,\n },\n dropShadow: {\n enabled: false,\n },\n },\n }\n }\n\n // Build final options\n const buildOptions = (): ApexOptions => {\n const baseOptions: ApexOptions = {\n chart: {\n type,\n width,\n height,\n },\n series,\n }\n\n if (themed) {\n const themedOpts = getThemedOptions()\n return deepMerge(deepMerge(baseOptions as unknown as Record<string, unknown>, themedOpts as unknown as Record<string, unknown>), options as unknown as Record<string, unknown>) as ApexOptions\n }\n\n return deepMerge(baseOptions as unknown as Record<string, unknown>, options as unknown as Record<string, unknown>) as ApexOptions\n }\n\n // Initialize chart\n useEffect(() => {\n if (!chartRef.current) return\n\n const opts = buildOptions()\n chartInstance.current = new ApexCharts(chartRef.current, opts)\n chartInstance.current.render()\n\n return () => {\n if (chartInstance.current) {\n chartInstance.current.destroy()\n chartInstance.current = null\n }\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Update chart when props or theme change\n useEffect(() => {\n if (!chartInstance.current) return\n\n const opts = buildOptions()\n chartInstance.current.updateOptions(opts, true, true)\n }, [type, series, width, height, options, themed, isDark, colors]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return <div ref={chartRef} className={className} />\n}\n"],"names":["deepMerge","target","source","result","key","Chart","type","series","width","height","options","themed","className","chartRef","useRef","chartInstance","isDark","colors","useTheme","getThemedOptions","buildOptions","baseOptions","themedOpts","useEffect","opts","ApexCharts","jsx"],"mappings":";;;;AAuBA,SAASA,EAA6CC,GAAWC,GAAuB;AACtF,QAAMC,IAAS,EAAE,GAAGF,EAAA;AAEpB,aAAWG,KAAOF;AAChB,IAAIA,EAAOE,CAAG,MAAM,WAEhB,OAAOF,EAAOE,CAAG,KAAM,YACvBF,EAAOE,CAAG,MAAM,QAChB,CAAC,MAAM,QAAQF,EAAOE,CAAG,CAAC,KAC1B,OAAOH,EAAOG,CAAG,KAAM,YACvBH,EAAOG,CAAG,MAAM,QAChB,CAAC,MAAM,QAAQH,EAAOG,CAAG,CAAC,IAE1BD,EAAOC,CAAG,IAAIJ;AAAA,MACZC,EAAOG,CAAG;AAAA,MACVF,EAAOE,CAAG;AAAA,IAAA,IAGZD,EAAOC,CAAG,IAAIF,EAAOE,CAAG;AAK9B,SAAOD;AACT;AAEO,MAAME,IAA8B,CAAC;AAAA,EAC1C,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,SAAAC,IAAU,CAAA;AAAA,EACV,QAAAC,IAAS;AAAA,EACT,WAAAC,IAAY;AACd,MAAM;AACJ,QAAMC,IAAWC,EAAuB,IAAI,GACtCC,IAAgBD,EAA0B,IAAI,GAC9C,EAAE,QAAAE,GAAQ,QAAAC,EAAA,IAAWC,EAAA,GAGrBC,IAAmB,OAWhB;AAAA,IACL,QAXkB;AAAA,MAClBF,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,IAAA;AAAA,IAKP,OAAO;AAAA,MACL,MAAMD,IAAS,SAAS;AAAA,IAAA;AAAA,IAE1B,OAAO;AAAA,MACL,YAAY;AAAA,MACZ,WAAWC,EAAO;AAAA,IAAA;AAAA,IAEpB,MAAM;AAAA,MACJ,aAAaA,EAAO,aAAa;AAAA;AAAA,IAAA;AAAA,IAEnC,OAAO;AAAA,MACL,QAAQ;AAAA,QACN,OAAO;AAAA,UACL,QAAQA,EAAO;AAAA,QAAA;AAAA,MACjB;AAAA,MAEF,YAAY;AAAA,QACV,OAAOA,EAAO,aAAa;AAAA,MAAA;AAAA,MAE7B,WAAW;AAAA,QACT,OAAOA,EAAO,aAAa;AAAA,MAAA;AAAA,IAC7B;AAAA,IAEF,OAAO;AAAA,MACL,QAAQ;AAAA,QACN,OAAO;AAAA,UACL,QAAQA,EAAO;AAAA,QAAA;AAAA,MACjB;AAAA,IACF;AAAA,IAEF,QAAQ;AAAA,MACN,QAAQ;AAAA,QACN,QAAQA,EAAO;AAAA,MAAA;AAAA,IACjB;AAAA,IAEF,SAAS;AAAA,MACP,OAAOD,IAAS,SAAS;AAAA,MACzB,OAAO;AAAA,QACL,UAAU;AAAA,MAAA;AAAA,MAEZ,GAAG;AAAA,QACD,MAAM;AAAA,MAAA;AAAA,MAER,QAAQ;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,YAAY;AAAA,MACV,OAAO;AAAA,QACL,QAAQ,MAAM,CAAC,EAAE,KAAKC,EAAO,UAAU;AAAA,MAAA;AAAA,MAEzC,YAAY;AAAA,QACV,SAAS;AAAA,MAAA;AAAA,MAEX,YAAY;AAAA,QACV,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,EACF,IAKEG,IAAe,MAAmB;AACtC,UAAMC,IAA2B;AAAA,MAC/B,OAAO;AAAA,QACL,MAAAf;AAAA,QACA,OAAAE;AAAA,QACA,QAAAC;AAAA,MAAA;AAAA,MAEF,QAAAF;AAAA,IAAA;AAGF,QAAII,GAAQ;AACV,YAAMW,IAAaH,EAAA;AACnB,aAAOnB,EAAUA,EAAUqB,GAAmDC,CAAgD,GAAGZ,CAA6C;AAAA,IAChL;AAEA,WAAOV,EAAUqB,GAAmDX,CAA6C;AAAA,EACnH;AAGA,SAAAa,EAAU,MAAM;AACd,QAAI,CAACV,EAAS,QAAS;AAEvB,UAAMW,IAAOJ,EAAA;AACb,WAAAL,EAAc,UAAU,IAAIU,EAAWZ,EAAS,SAASW,CAAI,GAC7DT,EAAc,QAAQ,OAAA,GAEf,MAAM;AACX,MAAIA,EAAc,YAChBA,EAAc,QAAQ,QAAA,GACtBA,EAAc,UAAU;AAAA,IAE5B;AAAA,EACF,GAAG,CAAA,CAAE,GAGLQ,EAAU,MAAM;AACd,QAAI,CAACR,EAAc,QAAS;AAE5B,UAAMS,IAAOJ,EAAA;AACb,IAAAL,EAAc,QAAQ,cAAcS,GAAM,IAAM,EAAI;AAAA,EACtD,GAAG,CAAClB,GAAMC,GAAQC,GAAOC,GAAQC,GAASC,GAAQK,GAAQC,CAAM,CAAC,GAE1D,gBAAAS,EAAC,OAAA,EAAI,KAAKb,GAAU,WAAAD,EAAA,CAAsB;AACnD;"}
1
+ {"version":3,"file":"Chart.js","sources":["../../src/components/Chart.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react'\nimport ApexCharts from 'apexcharts'\nimport type { ApexOptions } from 'apexcharts'\nimport { useTheme } from '../hooks/useTheme'\n\nexport interface ChartProps {\n /** Chart type */\n type: 'line' | 'area' | 'bar' | 'pie' | 'donut' | 'radialBar' | 'scatter' | 'bubble' | 'heatmap' | 'candlestick' | 'boxPlot' | 'radar' | 'polarArea' | 'rangeBar' | 'rangeArea' | 'treemap'\n /** Chart series data */\n series: ApexAxisChartSeries | ApexNonAxisChartSeries\n /** Chart width */\n width?: string | number\n /** Chart height */\n height?: string | number\n /** ApexCharts options (merged with theme defaults) */\n options?: ApexOptions\n /** Use daisyUI theme colors */\n themed?: boolean\n /** Additional CSS classes */\n className?: string\n 'data-testid'?: string\n}\n\n// Deep merge objects\nfunction deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const result = { ...target }\n\n for (const key in source) {\n if (source[key] !== undefined) {\n if (\n typeof source[key] === 'object' &&\n source[key] !== null &&\n !Array.isArray(source[key]) &&\n typeof target[key] === 'object' &&\n target[key] !== null &&\n !Array.isArray(target[key])\n ) {\n result[key] = deepMerge(\n target[key] as Record<string, unknown>,\n source[key] as Record<string, unknown>\n ) as T[Extract<keyof T, string>]\n } else {\n result[key] = source[key] as T[Extract<keyof T, string>]\n }\n }\n }\n\n return result\n}\n\nexport const Chart: React.FC<ChartProps> = ({\n type,\n series,\n width = '100%',\n height = 350,\n options = {},\n themed = true,\n className = '',\n 'data-testid': testId,\n}) => {\n const chartRef = useRef<HTMLDivElement>(null)\n const chartInstance = useRef<ApexCharts | null>(null)\n const { isDark, colors } = useTheme()\n\n // Build theme-aware chart options\n const getThemedOptions = (): Partial<ApexOptions> => {\n const chartColors = [\n colors.primary,\n colors.secondary,\n colors.accent,\n colors.info,\n colors.success,\n colors.warning,\n colors.error,\n ]\n\n return {\n colors: chartColors,\n theme: {\n mode: isDark ? 'dark' : 'light',\n },\n chart: {\n background: 'transparent',\n foreColor: colors.foreground,\n },\n grid: {\n borderColor: colors.foreground + '20', // 12.5% opacity\n },\n xaxis: {\n labels: {\n style: {\n colors: colors.foreground,\n },\n },\n axisBorder: {\n color: colors.foreground + '20',\n },\n axisTicks: {\n color: colors.foreground + '20',\n },\n },\n yaxis: {\n labels: {\n style: {\n colors: colors.foreground,\n },\n },\n },\n legend: {\n labels: {\n colors: colors.foreground,\n },\n },\n tooltip: {\n theme: isDark ? 'dark' : 'light',\n style: {\n fontSize: '12px',\n },\n x: {\n show: true,\n },\n marker: {\n show: true,\n },\n },\n dataLabels: {\n style: {\n colors: Array(7).fill(colors.foreground),\n },\n background: {\n enabled: false,\n },\n dropShadow: {\n enabled: false,\n },\n },\n }\n }\n\n // Build final options\n const buildOptions = (): ApexOptions => {\n const baseOptions: ApexOptions = {\n chart: {\n type,\n width,\n height,\n },\n series,\n }\n\n if (themed) {\n const themedOpts = getThemedOptions()\n return deepMerge(deepMerge(baseOptions as unknown as Record<string, unknown>, themedOpts as unknown as Record<string, unknown>), options as unknown as Record<string, unknown>) as ApexOptions\n }\n\n return deepMerge(baseOptions as unknown as Record<string, unknown>, options as unknown as Record<string, unknown>) as ApexOptions\n }\n\n // Initialize chart\n useEffect(() => {\n if (!chartRef.current) return\n\n const opts = buildOptions()\n chartInstance.current = new ApexCharts(chartRef.current, opts)\n chartInstance.current.render()\n\n return () => {\n if (chartInstance.current) {\n chartInstance.current.destroy()\n chartInstance.current = null\n }\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Update chart when props or theme change\n useEffect(() => {\n if (!chartInstance.current) return\n\n const opts = buildOptions()\n chartInstance.current.updateOptions(opts, true, true)\n }, [type, series, width, height, options, themed, isDark, colors]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return <div ref={chartRef} className={className} data-testid={testId} />\n}\n"],"names":["deepMerge","target","source","result","key","Chart","type","series","width","height","options","themed","className","testId","chartRef","useRef","chartInstance","isDark","colors","useTheme","getThemedOptions","buildOptions","baseOptions","themedOpts","useEffect","opts","ApexCharts"],"mappings":"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"}
@@ -7,5 +7,6 @@ export interface ChatProps extends React.HTMLAttributes<HTMLDivElement> {
7
7
  header?: React.ReactNode;
8
8
  footer?: React.ReactNode;
9
9
  color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'error';
10
+ 'data-testid'?: string;
10
11
  }
11
12
  export declare const Chat: React.FC<ChatProps>;
@@ -1,42 +1,44 @@
1
- import { jsxs as C, jsx as t } from "react/jsx-runtime";
2
- import { useId as m } from "react";
3
- const B = "chat", f = "chat-start", p = "chat-end", v = "chat-image", y = "chat-header", N = "chat-bubble", g = "chat-bubble-primary", $ = "chat-bubble-secondary", I = "chat-bubble-accent", j = "chat-bubble-neutral", w = "chat-bubble-info", x = "chat-bubble-success", S = "chat-bubble-warning", A = "chat-bubble-error", E = "chat-footer", F = "avatar", W = ({
4
- message: l,
5
- position: d = "start",
6
- avatar: s,
7
- avatarAlt: o = "",
8
- header: a,
9
- footer: e,
10
- color: c,
11
- className: h = "",
12
- ...i
1
+ import { jsxs as B, jsx as t } from "react/jsx-runtime";
2
+ import { useId as f } from "react";
3
+ const g = "chat", p = "chat-start", y = "chat-end", N = "chat-image", $ = "chat-header", j = "chat-bubble", w = "chat-bubble-primary", x = "chat-bubble-secondary", I = "chat-bubble-accent", S = "chat-bubble-neutral", A = "chat-bubble-info", E = "chat-bubble-success", F = "chat-bubble-warning", H = "chat-bubble-error", P = "chat-footer", T = "avatar", q = ({
4
+ message: o,
5
+ position: h = "start",
6
+ avatar: b,
7
+ avatarAlt: i = "",
8
+ header: e,
9
+ footer: d,
10
+ color: s,
11
+ className: u = "",
12
+ "data-testid": c,
13
+ ...C
13
14
  }) => {
14
- const b = m(), u = d === "start" ? f : p, n = {
15
- primary: g,
16
- secondary: $,
15
+ const n = f(), m = h === "start" ? p : y, a = (v) => c ? `${c}-${v}` : void 0, r = {
16
+ primary: w,
17
+ secondary: x,
17
18
  accent: I,
18
- neutral: j,
19
- info: w,
20
- success: x,
21
- warning: S,
22
- error: A
23
- }, r = [N];
24
- return c && n[c] && r.push(n[c]), /* @__PURE__ */ C(
19
+ neutral: S,
20
+ info: A,
21
+ success: E,
22
+ warning: F,
23
+ error: H
24
+ }, l = [j];
25
+ return s && r[s] && l.push(r[s]), /* @__PURE__ */ B(
25
26
  "article",
26
27
  {
27
- className: `${B} ${u} ${h}`,
28
- "aria-labelledby": a ? b : void 0,
29
- ...i,
28
+ className: `${g} ${m} ${u}`,
29
+ "aria-labelledby": e ? n : void 0,
30
+ "data-testid": c,
31
+ ...C,
30
32
  children: [
31
- s && /* @__PURE__ */ t("div", { className: `${v} ${F}`, children: /* @__PURE__ */ t("div", { className: "w-10 rounded-full", children: /* @__PURE__ */ t("img", { alt: o, src: s }) }) }),
32
- a && /* @__PURE__ */ t("div", { id: b, className: y, children: a }),
33
- /* @__PURE__ */ t("div", { className: r.join(" "), children: l }),
34
- e && /* @__PURE__ */ t("div", { className: E, children: e })
33
+ b && /* @__PURE__ */ t("div", { className: `${N} ${T}`, "data-testid": a("avatar"), children: /* @__PURE__ */ t("div", { className: "w-10 rounded-full", children: /* @__PURE__ */ t("img", { alt: i, src: b }) }) }),
34
+ e && /* @__PURE__ */ t("div", { id: n, className: $, "data-testid": a("header"), children: e }),
35
+ /* @__PURE__ */ t("div", { className: l.join(" "), "data-testid": a("bubble"), children: o }),
36
+ d && /* @__PURE__ */ t("div", { className: P, "data-testid": a("footer"), children: d })
35
37
  ]
36
38
  }
37
39
  );
38
40
  };
39
41
  export {
40
- W as Chat
42
+ q as Chat
41
43
  };
42
44
  //# sourceMappingURL=Chat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Chat.js","sources":["../../src/components/Chat.tsx"],"sourcesContent":["import React, { useId } from 'react'\n\n// DaisyUI classes\nconst dChat = 'chat'\nconst dChatStart = 'chat-start'\nconst dChatEnd = 'chat-end'\nconst dChatImage = 'chat-image'\nconst dChatHeader = 'chat-header'\nconst dChatBubble = 'chat-bubble'\nconst dChatBubblePrimary = 'chat-bubble-primary'\nconst dChatBubbleSecondary = 'chat-bubble-secondary'\nconst dChatBubbleAccent = 'chat-bubble-accent'\nconst dChatBubbleNeutral = 'chat-bubble-neutral'\nconst dChatBubbleInfo = 'chat-bubble-info'\nconst dChatBubbleSuccess = 'chat-bubble-success'\nconst dChatBubbleWarning = 'chat-bubble-warning'\nconst dChatBubbleError = 'chat-bubble-error'\nconst dChatFooter = 'chat-footer'\nconst dAvatar = 'avatar'\n\nexport interface ChatProps extends React.HTMLAttributes<HTMLDivElement> {\n message: React.ReactNode\n position?: 'start' | 'end'\n avatar?: string\n avatarAlt?: string\n header?: React.ReactNode\n footer?: React.ReactNode\n color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'error'\n}\n\nexport const Chat: React.FC<ChatProps> = ({\n message,\n position = 'start',\n avatar,\n avatarAlt = '',\n header,\n footer,\n color,\n className = '',\n ...rest\n}) => {\n const headerId = useId()\n const positionClass = position === 'start' ? dChatStart : dChatEnd\n\n const colorClasses: Record<string, string> = {\n primary: dChatBubblePrimary,\n secondary: dChatBubbleSecondary,\n accent: dChatBubbleAccent,\n neutral: dChatBubbleNeutral,\n info: dChatBubbleInfo,\n success: dChatBubbleSuccess,\n warning: dChatBubbleWarning,\n error: dChatBubbleError,\n }\n\n const bubbleClasses = [dChatBubble]\n if (color && colorClasses[color]) {\n bubbleClasses.push(colorClasses[color])\n }\n\n return (\n <article\n className={`${dChat} ${positionClass} ${className}`}\n aria-labelledby={header ? headerId : undefined}\n {...rest}\n >\n {avatar && (\n <div className={`${dChatImage} ${dAvatar}`}>\n <div className=\"w-10 rounded-full\">\n <img alt={avatarAlt} src={avatar} />\n </div>\n </div>\n )}\n {header && <div id={headerId} className={dChatHeader}>{header}</div>}\n <div className={bubbleClasses.join(' ')}>{message}</div>\n {footer && <div className={dChatFooter}>{footer}</div>}\n </article>\n )\n}\n"],"names":["dChat","dChatStart","dChatEnd","dChatImage","dChatHeader","dChatBubble","dChatBubblePrimary","dChatBubbleSecondary","dChatBubbleAccent","dChatBubbleNeutral","dChatBubbleInfo","dChatBubbleSuccess","dChatBubbleWarning","dChatBubbleError","dChatFooter","dAvatar","Chat","message","position","avatar","avatarAlt","header","footer","color","className","rest","headerId","useId","positionClass","colorClasses","bubbleClasses","jsxs","jsx"],"mappings":";;AAGA,MAAMA,IAAQ,QACRC,IAAa,cACbC,IAAW,YACXC,IAAa,cACbC,IAAc,eACdC,IAAc,eACdC,IAAqB,uBACrBC,IAAuB,yBACvBC,IAAoB,sBACpBC,IAAqB,uBACrBC,IAAkB,oBAClBC,IAAqB,uBACrBC,IAAqB,uBACrBC,IAAmB,qBACnBC,IAAc,eACdC,IAAU,UAYHC,IAA4B,CAAC;AAAA,EACxC,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,QAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAWC,EAAA,GACXC,IAAgBV,MAAa,UAAUjB,IAAaC,GAEpD2B,IAAuC;AAAA,IAC3C,SAASvB;AAAA,IACT,WAAWC;AAAA,IACX,QAAQC;AAAA,IACR,SAASC;AAAA,IACT,MAAMC;AAAA,IACN,SAASC;AAAA,IACT,SAASC;AAAA,IACT,OAAOC;AAAA,EAAA,GAGHiB,IAAgB,CAACzB,CAAW;AAClC,SAAIkB,KAASM,EAAaN,CAAK,KAC7BO,EAAc,KAAKD,EAAaN,CAAK,CAAC,GAItC,gBAAAQ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAG/B,CAAK,IAAI4B,CAAa,IAAIJ,CAAS;AAAA,MACjD,mBAAiBH,IAASK,IAAW;AAAA,MACpC,GAAGD;AAAA,MAEH,UAAA;AAAA,QAAAN,uBACE,OAAA,EAAI,WAAW,GAAGhB,CAAU,IAAIY,CAAO,IACtC,UAAA,gBAAAiB,EAAC,SAAI,WAAU,qBACb,4BAAC,OAAA,EAAI,KAAKZ,GAAW,KAAKD,GAAQ,GACpC,EAAA,CACF;AAAA,QAEDE,KAAU,gBAAAW,EAAC,OAAA,EAAI,IAAIN,GAAU,WAAWtB,GAAc,UAAAiB,GAAO;AAAA,0BAC7D,OAAA,EAAI,WAAWS,EAAc,KAAK,GAAG,GAAI,UAAAb,GAAQ;AAAA,QACjDK,KAAU,gBAAAU,EAAC,OAAA,EAAI,WAAWlB,GAAc,UAAAQ,EAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGtD;"}
1
+ {"version":3,"file":"Chat.js","sources":["../../src/components/Chat.tsx"],"sourcesContent":["import React, { useId } from 'react'\n\n// DaisyUI classes\nconst dChat = 'chat'\nconst dChatStart = 'chat-start'\nconst dChatEnd = 'chat-end'\nconst dChatImage = 'chat-image'\nconst dChatHeader = 'chat-header'\nconst dChatBubble = 'chat-bubble'\nconst dChatBubblePrimary = 'chat-bubble-primary'\nconst dChatBubbleSecondary = 'chat-bubble-secondary'\nconst dChatBubbleAccent = 'chat-bubble-accent'\nconst dChatBubbleNeutral = 'chat-bubble-neutral'\nconst dChatBubbleInfo = 'chat-bubble-info'\nconst dChatBubbleSuccess = 'chat-bubble-success'\nconst dChatBubbleWarning = 'chat-bubble-warning'\nconst dChatBubbleError = 'chat-bubble-error'\nconst dChatFooter = 'chat-footer'\nconst dAvatar = 'avatar'\n\nexport interface ChatProps extends React.HTMLAttributes<HTMLDivElement> {\n message: React.ReactNode\n position?: 'start' | 'end'\n avatar?: string\n avatarAlt?: string\n header?: React.ReactNode\n footer?: React.ReactNode\n color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'error'\n 'data-testid'?: string\n}\n\nexport const Chat: React.FC<ChatProps> = ({\n message,\n position = 'start',\n avatar,\n avatarAlt = '',\n header,\n footer,\n color,\n className = '',\n 'data-testid': testId,\n ...rest\n}) => {\n const headerId = useId()\n const positionClass = position === 'start' ? dChatStart : dChatEnd\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n const colorClasses: Record<string, string> = {\n primary: dChatBubblePrimary,\n secondary: dChatBubbleSecondary,\n accent: dChatBubbleAccent,\n neutral: dChatBubbleNeutral,\n info: dChatBubbleInfo,\n success: dChatBubbleSuccess,\n warning: dChatBubbleWarning,\n error: dChatBubbleError,\n }\n\n const bubbleClasses = [dChatBubble]\n if (color && colorClasses[color]) {\n bubbleClasses.push(colorClasses[color])\n }\n\n return (\n <article\n className={`${dChat} ${positionClass} ${className}`}\n aria-labelledby={header ? headerId : undefined}\n data-testid={testId}\n {...rest}\n >\n {avatar && (\n <div className={`${dChatImage} ${dAvatar}`} data-testid={getTestId('avatar')}>\n <div className=\"w-10 rounded-full\">\n <img alt={avatarAlt} src={avatar} />\n </div>\n </div>\n )}\n {header && <div id={headerId} className={dChatHeader} data-testid={getTestId('header')}>{header}</div>}\n <div className={bubbleClasses.join(' ')} data-testid={getTestId('bubble')}>{message}</div>\n {footer && <div className={dChatFooter} data-testid={getTestId('footer')}>{footer}</div>}\n </article>\n )\n}\n"],"names":["dChat","dChatStart","dChatEnd","dChatImage","dChatHeader","dChatBubble","dChatBubblePrimary","dChatBubbleSecondary","dChatBubbleAccent","dChatBubbleNeutral","dChatBubbleInfo","dChatBubbleSuccess","dChatBubbleWarning","dChatBubbleError","dChatFooter","dAvatar","Chat","message","position","avatar","avatarAlt","header","footer","color","className","testId","rest","headerId","useId","positionClass","getTestId","suffix","colorClasses","bubbleClasses","jsxs","jsx"],"mappings":";;AAGA,MAAMA,IAAQ,QACRC,IAAa,cACbC,IAAW,YACXC,IAAa,cACbC,IAAc,eACdC,IAAc,eACdC,IAAqB,uBACrBC,IAAuB,yBACvBC,IAAoB,sBACpBC,IAAqB,uBACrBC,IAAkB,oBAClBC,IAAqB,uBACrBC,IAAqB,uBACrBC,IAAmB,qBACnBC,IAAc,eACdC,IAAU,UAaHC,IAA4B,CAAC;AAAA,EACxC,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,QAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,eAAeC;AAAA,EACf,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAWC,EAAA,GACXC,IAAgBX,MAAa,UAAUjB,IAAaC,GACpD4B,IAAY,CAACC,MAAoBN,IAAS,GAAGA,CAAM,IAAIM,CAAM,KAAK,QAElEC,IAAuC;AAAA,IAC3C,SAAS1B;AAAA,IACT,WAAWC;AAAA,IACX,QAAQC;AAAA,IACR,SAASC;AAAA,IACT,MAAMC;AAAA,IACN,SAASC;AAAA,IACT,SAASC;AAAA,IACT,OAAOC;AAAA,EAAA,GAGHoB,IAAgB,CAAC5B,CAAW;AAClC,SAAIkB,KAASS,EAAaT,CAAK,KAC7BU,EAAc,KAAKD,EAAaT,CAAK,CAAC,GAItC,gBAAAW;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAGlC,CAAK,IAAI6B,CAAa,IAAIL,CAAS;AAAA,MACjD,mBAAiBH,IAASM,IAAW;AAAA,MACrC,eAAaF;AAAA,MACZ,GAAGC;AAAA,MAEH,UAAA;AAAA,QAAAP,KACC,gBAAAgB,EAAC,SAAI,WAAW,GAAGhC,CAAU,IAAIY,CAAO,IAAI,eAAae,EAAU,QAAQ,GACzE,UAAA,gBAAAK,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA,gBAAAA,EAAC,OAAA,EAAI,KAAKf,GAAW,KAAKD,EAAA,CAAQ,EAAA,CACpC,EAAA,CACF;AAAA,QAEDE,KAAU,gBAAAc,EAAC,OAAA,EAAI,IAAIR,GAAU,WAAWvB,GAAa,eAAa0B,EAAU,QAAQ,GAAI,UAAAT,EAAA,CAAO;AAAA,QAChG,gBAAAc,EAAC,OAAA,EAAI,WAAWF,EAAc,KAAK,GAAG,GAAG,eAAaH,EAAU,QAAQ,GAAI,UAAAb,EAAA,CAAQ;AAAA,QACnFK,uBAAW,OAAA,EAAI,WAAWR,GAAa,eAAagB,EAAU,QAAQ,GAAI,UAAAR,EAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGxF;"}
@@ -1,106 +1,108 @@
1
- import { jsx as t, jsxs as y } from "react/jsx-runtime";
2
- import { forwardRef as h, useState as P } from "react";
3
- const T = "collapse", $ = "collapse-arrow", z = "collapse-plus", B = "collapse-open", E = "collapse-close", k = "collapse-arrow-end", R = "collapse-title", S = "collapse-content", q = {
1
+ import { jsx as d, jsxs as A } from "react/jsx-runtime";
2
+ import { forwardRef as g, useState as I, useId as D } from "react";
3
+ const P = "collapse", T = "collapse-arrow", z = "collapse-plus", B = "collapse-open", E = "collapse-close", k = "collapse-arrow-end", R = "collapse-title", S = "collapse-content", q = {
4
4
  sm: "text-sm",
5
5
  md: "text-base",
6
6
  lg: "text-lg"
7
- }, A = h(({ item: l, isOpen: s, onToggle: C, icon: c, expandIconPlacement: d, bordered: i, ghost: p, size: b, testId: f }, v) => {
8
- const o = l.collapsible === "disabled", m = [
9
- T,
7
+ }, N = g(({ item: l, isOpen: s, onToggle: w, icon: c, expandIconPlacement: i, bordered: p, ghost: f, size: m, testId: u }, x) => {
8
+ const o = l.collapsible === "disabled", h = [
9
+ P,
10
10
  {
11
- arrow: $,
11
+ arrow: T,
12
12
  plus: z,
13
13
  none: ""
14
14
  }[c],
15
15
  s ? B : E,
16
- !p && "bg-base-200",
17
- p && "bg-transparent",
18
- i && "border border-base-300",
19
- d === "end" && c !== "none" && k,
20
- q[b],
16
+ !f && "bg-base-200",
17
+ f && "bg-transparent",
18
+ p && "border border-base-300",
19
+ i === "end" && c !== "none" && k,
20
+ q[m],
21
21
  o && "opacity-50 cursor-not-allowed",
22
22
  l.className
23
- ].filter(Boolean).join(" "), u = () => {
24
- o || C();
25
- };
26
- return /* @__PURE__ */ y(
23
+ ].filter(Boolean).join(" "), C = () => {
24
+ o || w();
25
+ }, n = D(), b = `${n}-header`, v = `${n}-content`;
26
+ return /* @__PURE__ */ A(
27
27
  "div",
28
28
  {
29
- ref: v,
30
- className: m,
31
- "data-testid": f ? `${f}-panel-${l.key}` : void 0,
29
+ ref: x,
30
+ className: h,
31
+ "data-testid": u ? `${u}-panel-${l.key}` : void 0,
32
32
  "data-state": s ? "open" : "closed",
33
33
  children: [
34
- /* @__PURE__ */ y(
34
+ /* @__PURE__ */ A(
35
35
  "div",
36
36
  {
37
+ id: b,
37
38
  className: `${R} font-medium flex items-center justify-between cursor-pointer`,
38
- onClick: u,
39
+ onClick: C,
39
40
  role: "button",
40
41
  tabIndex: o ? -1 : 0,
41
42
  onKeyDown: (a) => {
42
- (a.key === "Enter" || a.key === " ") && (a.preventDefault(), u());
43
+ (a.key === "Enter" || a.key === " ") && (a.preventDefault(), C());
43
44
  },
44
45
  "aria-expanded": s,
45
46
  "aria-disabled": o,
47
+ "aria-controls": v,
46
48
  children: [
47
- /* @__PURE__ */ t("span", { children: l.label }),
48
- l.extra && /* @__PURE__ */ t("span", { className: "ml-auto mr-6", children: l.extra })
49
+ /* @__PURE__ */ d("span", { children: l.label }),
50
+ l.extra && /* @__PURE__ */ d("span", { className: "ml-auto mr-6", children: l.extra })
49
51
  ]
50
52
  }
51
53
  ),
52
- /* @__PURE__ */ t("div", { className: S, children: l.children })
54
+ /* @__PURE__ */ d("div", { id: v, className: S, role: "region", "aria-labelledby": b, children: l.children })
53
55
  ]
54
56
  }
55
57
  );
56
58
  });
57
- A.displayName = "CollapsePanel";
58
- const F = h(
59
+ N.displayName = "CollapsePanel";
60
+ const F = g(
59
61
  ({
60
62
  items: l = [],
61
63
  activeKey: s,
62
- defaultActiveKey: C,
64
+ defaultActiveKey: w,
63
65
  accordion: c = !1,
64
- bordered: d = !0,
65
- ghost: i = !1,
66
- size: p = "md",
67
- icon: b = "arrow",
68
- expandIconPlacement: f = "start",
69
- onChange: v,
66
+ bordered: i = !0,
67
+ ghost: p = !1,
68
+ size: f = "md",
69
+ icon: m = "arrow",
70
+ expandIconPlacement: u = "start",
71
+ onChange: x,
70
72
  className: o = "",
71
- "data-testid": w = "collapse",
72
- ...m
73
- }, u) => {
74
- const a = (e) => e === void 0 ? [] : Array.isArray(e) ? e : [e], [N, g] = P(
75
- () => a(C)
76
- ), x = s !== void 0, n = x ? a(s) : N, j = (e) => {
77
- let r;
78
- c ? r = n.includes(e) ? [] : [e] : n.includes(e) ? r = n.filter((D) => D !== e) : r = [...n, e], x || g(r), v?.(r);
73
+ "data-testid": y = "collapse",
74
+ ...h
75
+ }, C) => {
76
+ const n = (e) => e === void 0 ? [] : Array.isArray(e) ? e : [e], [b, v] = I(
77
+ () => n(w)
78
+ ), a = s !== void 0, r = a ? n(s) : b, j = (e) => {
79
+ let t;
80
+ c ? t = r.includes(e) ? [] : [e] : r.includes(e) ? t = r.filter(($) => $ !== e) : t = [...r, e], a || v(t), x?.(t);
79
81
  }, K = [
80
82
  "flex flex-col",
81
- d && !i && "divide-y divide-base-300",
82
- d && "border border-base-300 rounded-lg overflow-hidden",
83
+ i && !p && "divide-y divide-base-300",
84
+ i && "border border-base-300 rounded-lg overflow-hidden",
83
85
  o
84
86
  ].filter(Boolean).join(" ");
85
- return /* @__PURE__ */ t(
87
+ return /* @__PURE__ */ d(
86
88
  "div",
87
89
  {
88
- ref: u,
90
+ ref: C,
89
91
  className: K,
90
- "data-testid": w,
91
- ...m,
92
- children: l.map((e) => /* @__PURE__ */ t(
93
- A,
92
+ "data-testid": y,
93
+ ...h,
94
+ children: l.map((e) => /* @__PURE__ */ d(
95
+ N,
94
96
  {
95
97
  item: e,
96
- isOpen: n.includes(e.key),
98
+ isOpen: r.includes(e.key),
97
99
  onToggle: () => j(e.key),
98
- icon: e.showArrow === !1 ? "none" : b,
99
- expandIconPlacement: f,
100
+ icon: e.showArrow === !1 ? "none" : m,
101
+ expandIconPlacement: u,
100
102
  bordered: !1,
101
- ghost: i,
102
- size: p,
103
- testId: w
103
+ ghost: p,
104
+ size: f,
105
+ testId: y
104
106
  },
105
107
  e.key
106
108
  ))
@@ -1 +1 @@
1
- {"version":3,"file":"Collapse.js","sources":["../../src/components/Collapse.tsx"],"sourcesContent":["import React, { forwardRef, useState } from 'react'\n\n// DaisyUI classes\nconst dCollapse = 'collapse'\nconst dCollapseArrow = 'collapse-arrow'\nconst dCollapsePlus = 'collapse-plus'\nconst dCollapseOpen = 'collapse-open'\nconst dCollapseClose = 'collapse-close'\nconst dCollapseArrowEnd = 'collapse-arrow-end'\nconst dCollapseTitle = 'collapse-title'\nconst dCollapseContent = 'collapse-content'\n\nexport type CollapseSize = 'sm' | 'md' | 'lg'\nexport type CollapseIconPosition = 'start' | 'end'\nexport type CollapseCollapsible = 'header' | 'icon' | 'disabled'\n\nexport interface CollapseItemType {\n /** Unique key for the panel */\n key: string | number\n /** Panel header/label */\n label: React.ReactNode\n /** Panel content */\n children: React.ReactNode\n /** Extra element in the corner */\n extra?: React.ReactNode\n /** Whether to show the arrow icon */\n showArrow?: boolean\n /** Collapsible mode for this panel */\n collapsible?: CollapseCollapsible\n /** Custom class name for this panel */\n className?: string\n}\n\nexport interface CollapseProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Collapse items */\n items?: CollapseItemType[]\n /** Currently active panel keys (controlled) */\n activeKey?: string | number | (string | number)[]\n /** Default active panel keys (uncontrolled) */\n defaultActiveKey?: string | number | (string | number)[]\n /** Accordion mode - only one panel open at a time */\n accordion?: boolean\n /** Show border around panels */\n bordered?: boolean\n /** Ghost mode - transparent background */\n ghost?: boolean\n /** Size variant */\n size?: CollapseSize\n /** Icon type */\n icon?: 'arrow' | 'plus' | 'none'\n /** Icon placement */\n expandIconPlacement?: CollapseIconPosition\n /** Callback when panels change */\n onChange?: (activeKey: (string | number)[]) => void\n /** Test ID */\n 'data-testid'?: string\n}\n\nconst sizeClasses: Record<CollapseSize, string> = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n}\n\nconst CollapsePanel = forwardRef<\n HTMLDivElement,\n {\n item: CollapseItemType\n isOpen: boolean\n onToggle: () => void\n icon: 'arrow' | 'plus' | 'none'\n expandIconPlacement: CollapseIconPosition\n bordered: boolean\n ghost: boolean\n size: CollapseSize\n testId?: string\n }\n>(({ item, isOpen, onToggle, icon, expandIconPlacement, bordered, ghost, size, testId }, ref) => {\n const isDisabled = item.collapsible === 'disabled'\n\n const iconClasses = {\n arrow: dCollapseArrow,\n plus: dCollapsePlus,\n none: '',\n }\n\n const panelClasses = [\n dCollapse,\n iconClasses[icon],\n isOpen ? dCollapseOpen : dCollapseClose,\n !ghost && 'bg-base-200',\n ghost && 'bg-transparent',\n bordered && 'border border-base-300',\n expandIconPlacement === 'end' && icon !== 'none' && dCollapseArrowEnd,\n sizeClasses[size],\n isDisabled && 'opacity-50 cursor-not-allowed',\n item.className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const handleClick = () => {\n if (!isDisabled) {\n onToggle()\n }\n }\n\n return (\n <div\n ref={ref}\n className={panelClasses}\n data-testid={testId ? `${testId}-panel-${item.key}` : undefined}\n data-state={isOpen ? 'open' : 'closed'}\n >\n <div\n className={`${dCollapseTitle} font-medium flex items-center justify-between cursor-pointer`}\n onClick={handleClick}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }}\n aria-expanded={isOpen}\n aria-disabled={isDisabled}\n >\n <span>{item.label}</span>\n {item.extra && <span className=\"ml-auto mr-6\">{item.extra}</span>}\n </div>\n <div className={dCollapseContent}>\n {item.children}\n </div>\n </div>\n )\n})\n\nCollapsePanel.displayName = 'CollapsePanel'\n\nexport const Collapse = forwardRef<HTMLDivElement, CollapseProps>(\n (\n {\n items = [],\n activeKey,\n defaultActiveKey,\n accordion = false,\n bordered = true,\n ghost = false,\n size = 'md',\n icon = 'arrow',\n expandIconPlacement = 'start',\n onChange,\n className = '',\n 'data-testid': testId = 'collapse',\n ...rest\n },\n ref\n ) => {\n // Normalize keys to array\n const normalizeKeys = (keys: string | number | (string | number)[] | undefined): (string | number)[] => {\n if (keys === undefined) return []\n if (Array.isArray(keys)) return keys\n return [keys]\n }\n\n const [internalActiveKeys, setInternalActiveKeys] = useState<(string | number)[]>(\n () => normalizeKeys(defaultActiveKey)\n )\n\n const isControlled = activeKey !== undefined\n const currentActiveKeys = isControlled ? normalizeKeys(activeKey) : internalActiveKeys\n\n const handleToggle = (key: string | number) => {\n let newActiveKeys: (string | number)[]\n\n if (accordion) {\n // In accordion mode, only one can be open\n newActiveKeys = currentActiveKeys.includes(key) ? [] : [key]\n } else {\n // Toggle the key\n if (currentActiveKeys.includes(key)) {\n newActiveKeys = currentActiveKeys.filter((k) => k !== key)\n } else {\n newActiveKeys = [...currentActiveKeys, key]\n }\n }\n\n if (!isControlled) {\n setInternalActiveKeys(newActiveKeys)\n }\n onChange?.(newActiveKeys)\n }\n\n const containerClasses = [\n 'flex flex-col',\n bordered && !ghost && 'divide-y divide-base-300',\n bordered && 'border border-base-300 rounded-lg overflow-hidden',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div\n ref={ref}\n className={containerClasses}\n data-testid={testId}\n {...rest}\n >\n {items.map((item) => (\n <CollapsePanel\n key={item.key}\n item={item}\n isOpen={currentActiveKeys.includes(item.key)}\n onToggle={() => handleToggle(item.key)}\n icon={item.showArrow === false ? 'none' : icon}\n expandIconPlacement={expandIconPlacement}\n bordered={false}\n ghost={ghost}\n size={size}\n testId={testId}\n />\n ))}\n </div>\n )\n }\n)\n\nCollapse.displayName = 'Collapse'\n"],"names":["dCollapse","dCollapseArrow","dCollapsePlus","dCollapseOpen","dCollapseClose","dCollapseArrowEnd","dCollapseTitle","dCollapseContent","sizeClasses","CollapsePanel","forwardRef","item","isOpen","onToggle","icon","expandIconPlacement","bordered","ghost","size","testId","ref","isDisabled","panelClasses","handleClick","jsxs","e","jsx","Collapse","items","activeKey","defaultActiveKey","accordion","onChange","className","rest","normalizeKeys","keys","internalActiveKeys","setInternalActiveKeys","useState","isControlled","currentActiveKeys","handleToggle","key","newActiveKeys","k","containerClasses"],"mappings":"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"}
1
+ {"version":3,"file":"Collapse.js","sources":["../../src/components/Collapse.tsx"],"sourcesContent":["import React, { forwardRef, useState, useId } from 'react'\n\n// DaisyUI classes\nconst dCollapse = 'collapse'\nconst dCollapseArrow = 'collapse-arrow'\nconst dCollapsePlus = 'collapse-plus'\nconst dCollapseOpen = 'collapse-open'\nconst dCollapseClose = 'collapse-close'\nconst dCollapseArrowEnd = 'collapse-arrow-end'\nconst dCollapseTitle = 'collapse-title'\nconst dCollapseContent = 'collapse-content'\n\nexport type CollapseSize = 'sm' | 'md' | 'lg'\nexport type CollapseIconPosition = 'start' | 'end'\nexport type CollapseCollapsible = 'header' | 'icon' | 'disabled'\n\nexport interface CollapseItemType {\n /** Unique key for the panel */\n key: string | number\n /** Panel header/label */\n label: React.ReactNode\n /** Panel content */\n children: React.ReactNode\n /** Extra element in the corner */\n extra?: React.ReactNode\n /** Whether to show the arrow icon */\n showArrow?: boolean\n /** Collapsible mode for this panel */\n collapsible?: CollapseCollapsible\n /** Custom class name for this panel */\n className?: string\n}\n\nexport interface CollapseProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Collapse items */\n items?: CollapseItemType[]\n /** Currently active panel keys (controlled) */\n activeKey?: string | number | (string | number)[]\n /** Default active panel keys (uncontrolled) */\n defaultActiveKey?: string | number | (string | number)[]\n /** Accordion mode - only one panel open at a time */\n accordion?: boolean\n /** Show border around panels */\n bordered?: boolean\n /** Ghost mode - transparent background */\n ghost?: boolean\n /** Size variant */\n size?: CollapseSize\n /** Icon type */\n icon?: 'arrow' | 'plus' | 'none'\n /** Icon placement */\n expandIconPlacement?: CollapseIconPosition\n /** Callback when panels change */\n onChange?: (activeKey: (string | number)[]) => void\n /** Test ID */\n 'data-testid'?: string\n}\n\nconst sizeClasses: Record<CollapseSize, string> = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n}\n\nconst CollapsePanel = forwardRef<\n HTMLDivElement,\n {\n item: CollapseItemType\n isOpen: boolean\n onToggle: () => void\n icon: 'arrow' | 'plus' | 'none'\n expandIconPlacement: CollapseIconPosition\n bordered: boolean\n ghost: boolean\n size: CollapseSize\n testId?: string\n }\n>(({ item, isOpen, onToggle, icon, expandIconPlacement, bordered, ghost, size, testId }, ref) => {\n const isDisabled = item.collapsible === 'disabled'\n\n const iconClasses = {\n arrow: dCollapseArrow,\n plus: dCollapsePlus,\n none: '',\n }\n\n const panelClasses = [\n dCollapse,\n iconClasses[icon],\n isOpen ? dCollapseOpen : dCollapseClose,\n !ghost && 'bg-base-200',\n ghost && 'bg-transparent',\n bordered && 'border border-base-300',\n expandIconPlacement === 'end' && icon !== 'none' && dCollapseArrowEnd,\n sizeClasses[size],\n isDisabled && 'opacity-50 cursor-not-allowed',\n item.className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const handleClick = () => {\n if (!isDisabled) {\n onToggle()\n }\n }\n\n const panelId = useId()\n const headerId = `${panelId}-header`\n const contentId = `${panelId}-content`\n\n return (\n <div\n ref={ref}\n className={panelClasses}\n data-testid={testId ? `${testId}-panel-${item.key}` : undefined}\n data-state={isOpen ? 'open' : 'closed'}\n >\n <div\n id={headerId}\n className={`${dCollapseTitle} font-medium flex items-center justify-between cursor-pointer`}\n onClick={handleClick}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }}\n aria-expanded={isOpen}\n aria-disabled={isDisabled}\n aria-controls={contentId}\n >\n <span>{item.label}</span>\n {item.extra && <span className=\"ml-auto mr-6\">{item.extra}</span>}\n </div>\n <div id={contentId} className={dCollapseContent} role=\"region\" aria-labelledby={headerId}>\n {item.children}\n </div>\n </div>\n )\n})\n\nCollapsePanel.displayName = 'CollapsePanel'\n\nexport const Collapse = forwardRef<HTMLDivElement, CollapseProps>(\n (\n {\n items = [],\n activeKey,\n defaultActiveKey,\n accordion = false,\n bordered = true,\n ghost = false,\n size = 'md',\n icon = 'arrow',\n expandIconPlacement = 'start',\n onChange,\n className = '',\n 'data-testid': testId = 'collapse',\n ...rest\n },\n ref\n ) => {\n // Normalize keys to array\n const normalizeKeys = (keys: string | number | (string | number)[] | undefined): (string | number)[] => {\n if (keys === undefined) return []\n if (Array.isArray(keys)) return keys\n return [keys]\n }\n\n const [internalActiveKeys, setInternalActiveKeys] = useState<(string | number)[]>(\n () => normalizeKeys(defaultActiveKey)\n )\n\n const isControlled = activeKey !== undefined\n const currentActiveKeys = isControlled ? normalizeKeys(activeKey) : internalActiveKeys\n\n const handleToggle = (key: string | number) => {\n let newActiveKeys: (string | number)[]\n\n if (accordion) {\n // In accordion mode, only one can be open\n newActiveKeys = currentActiveKeys.includes(key) ? [] : [key]\n } else {\n // Toggle the key\n if (currentActiveKeys.includes(key)) {\n newActiveKeys = currentActiveKeys.filter((k) => k !== key)\n } else {\n newActiveKeys = [...currentActiveKeys, key]\n }\n }\n\n if (!isControlled) {\n setInternalActiveKeys(newActiveKeys)\n }\n onChange?.(newActiveKeys)\n }\n\n const containerClasses = [\n 'flex flex-col',\n bordered && !ghost && 'divide-y divide-base-300',\n bordered && 'border border-base-300 rounded-lg overflow-hidden',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div\n ref={ref}\n className={containerClasses}\n data-testid={testId}\n {...rest}\n >\n {items.map((item) => (\n <CollapsePanel\n key={item.key}\n item={item}\n isOpen={currentActiveKeys.includes(item.key)}\n onToggle={() => handleToggle(item.key)}\n icon={item.showArrow === false ? 'none' : icon}\n expandIconPlacement={expandIconPlacement}\n bordered={false}\n ghost={ghost}\n size={size}\n testId={testId}\n />\n ))}\n </div>\n )\n }\n)\n\nCollapse.displayName = 'Collapse'\n"],"names":["dCollapse","dCollapseArrow","dCollapsePlus","dCollapseOpen","dCollapseClose","dCollapseArrowEnd","dCollapseTitle","dCollapseContent","sizeClasses","CollapsePanel","forwardRef","item","isOpen","onToggle","icon","expandIconPlacement","bordered","ghost","size","testId","ref","isDisabled","panelClasses","handleClick","panelId","useId","headerId","contentId","jsxs","e","jsx","Collapse","items","activeKey","defaultActiveKey","accordion","onChange","className","rest","normalizeKeys","keys","internalActiveKeys","setInternalActiveKeys","useState","isControlled","currentActiveKeys","handleToggle","key","newActiveKeys","k","containerClasses"],"mappings":"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"}
@@ -19,12 +19,14 @@ export interface CommandProps extends Omit<React.HTMLAttributes<HTMLDialogElemen
19
19
  shortcut?: string[];
20
20
  placeholder?: string;
21
21
  emptyMessage?: React.ReactNode;
22
+ 'data-testid'?: string;
22
23
  }
23
24
  interface CommandInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {
24
25
  value?: string;
25
26
  onValueChange?: (value: string) => void;
27
+ 'data-testid'?: string;
26
28
  }
27
- declare function CommandInput({ placeholder, value, onValueChange, ...rest }: CommandInputProps): import("react/jsx-runtime").JSX.Element;
29
+ declare function CommandInput({ placeholder, value, onValueChange, 'data-testid': testId, ...rest }: CommandInputProps): import("react/jsx-runtime").JSX.Element;
28
30
  interface CommandListProps {
29
31
  children: React.ReactNode;
30
32
  }
@@ -41,8 +43,9 @@ interface CommandItemProps {
41
43
  disabled?: boolean;
42
44
  keywords?: string[];
43
45
  icon?: React.ReactNode;
46
+ 'data-testid'?: string;
44
47
  }
45
- declare function CommandItem({ children, value, onSelect, disabled, keywords, icon, }: CommandItemProps): import("react/jsx-runtime").JSX.Element | null;
48
+ declare function CommandItem({ children, value, onSelect, disabled, keywords, icon, 'data-testid': testId, }: CommandItemProps): import("react/jsx-runtime").JSX.Element | null;
46
49
  interface CommandEmptyProps {
47
50
  children?: React.ReactNode;
48
51
  }