@crossangle-org/cs-ui 0.2.6 → 0.2.7

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 (119) hide show
  1. package/dist/components/accordion/cs-accordion.js +116 -0
  2. package/dist/components/accordion/cs-accordion.js.map +1 -0
  3. package/dist/components/alert-dialog/cs-alert-dialog.js +148 -0
  4. package/dist/components/alert-dialog/cs-alert-dialog.js.map +1 -0
  5. package/dist/components/avatar/cs-avatar.js +44 -0
  6. package/dist/components/avatar/cs-avatar.js.map +1 -0
  7. package/dist/components/badge/cs-badge.js +40 -0
  8. package/dist/components/badge/cs-badge.js.map +1 -0
  9. package/dist/components/box/cs-box.js +37 -0
  10. package/dist/components/box/cs-box.js.map +1 -0
  11. package/dist/components/button/cs-button.js +91 -0
  12. package/dist/components/button/cs-button.js.map +1 -0
  13. package/dist/components/calendar/cs-calendar.js +199 -0
  14. package/dist/components/calendar/cs-calendar.js.map +1 -0
  15. package/dist/components/card/cs-card.js +95 -0
  16. package/dist/components/card/cs-card.js.map +1 -0
  17. package/dist/components/chart/cs-chart.js +88 -0
  18. package/dist/components/chart/cs-chart.js.map +1 -0
  19. package/dist/components/checkbox/cs-checkbox.js +55 -0
  20. package/dist/components/checkbox/cs-checkbox.js.map +1 -0
  21. package/dist/components/code-block/cs-code-block.js +39 -0
  22. package/dist/components/code-block/cs-code-block.js.map +1 -0
  23. package/dist/components/code-block/cs-code-highlighter.js +59 -0
  24. package/dist/components/code-block/cs-code-highlighter.js.map +1 -0
  25. package/dist/components/collapsible/cs-collapsible.js +36 -0
  26. package/dist/components/collapsible/cs-collapsible.js.map +1 -0
  27. package/dist/components/date-picker/cs-date-picker.js +25 -0
  28. package/dist/components/date-picker/cs-date-picker.js.map +1 -0
  29. package/dist/components/dialog/cs-dialog.js +131 -0
  30. package/dist/components/dialog/cs-dialog.js.map +1 -0
  31. package/dist/components/drawer/cs-drawer.js +131 -0
  32. package/dist/components/drawer/cs-drawer.js.map +1 -0
  33. package/dist/components/dropdown-menu/cs-dropdown-menu.js +247 -0
  34. package/dist/components/dropdown-menu/cs-dropdown-menu.js.map +1 -0
  35. package/dist/components/dropzone/cs-dropzone.js +147 -0
  36. package/dist/components/dropzone/cs-dropzone.js.map +1 -0
  37. package/dist/components/empty/cs-empty.js +107 -0
  38. package/dist/components/empty/cs-empty.js.map +1 -0
  39. package/dist/components/field/cs-field.js +218 -0
  40. package/dist/components/field/cs-field.js.map +1 -0
  41. package/dist/components/input/cs-input-group.js +207 -0
  42. package/dist/components/input/cs-input-group.js.map +1 -0
  43. package/dist/components/input/cs-input.js +40 -0
  44. package/dist/components/input/cs-input.js.map +1 -0
  45. package/dist/components/label/cs-label.js +26 -0
  46. package/dist/components/label/cs-label.js.map +1 -0
  47. package/dist/components/navigation-menu/cs-navigation-menu.js +214 -0
  48. package/dist/components/navigation-menu/cs-navigation-menu.js.map +1 -0
  49. package/dist/components/pagination/cs-pagination.js +124 -0
  50. package/dist/components/pagination/cs-pagination.js.map +1 -0
  51. package/dist/components/popover/cs-popover.js +60 -0
  52. package/dist/components/popover/cs-popover.js.map +1 -0
  53. package/dist/components/progress/cs-progress.js +62 -0
  54. package/dist/components/progress/cs-progress.js.map +1 -0
  55. package/dist/components/scroll-area/cs-scroll-area.js +61 -0
  56. package/dist/components/scroll-area/cs-scroll-area.js.map +1 -0
  57. package/dist/components/select/cs-select.js +195 -0
  58. package/dist/components/select/cs-select.js.map +1 -0
  59. package/dist/components/select/cs-simple-select.js +32 -0
  60. package/dist/components/select/cs-simple-select.js.map +1 -0
  61. package/dist/components/separator/cs-separator.js +28 -0
  62. package/dist/components/separator/cs-separator.js.map +1 -0
  63. package/dist/components/sheet/cs-sheet.js +128 -0
  64. package/dist/components/sheet/cs-sheet.js.map +1 -0
  65. package/dist/components/sidebar/cs-sidebar.js +657 -0
  66. package/dist/components/sidebar/cs-sidebar.js.map +1 -0
  67. package/dist/components/skeleton/cs-skeleton.js +32 -0
  68. package/dist/components/skeleton/cs-skeleton.js.map +1 -0
  69. package/dist/components/sonner/cs-sonner.js +76 -0
  70. package/dist/components/sonner/cs-sonner.js.map +1 -0
  71. package/dist/components/spinner/cs-spinner.js +34 -0
  72. package/dist/components/spinner/cs-spinner.js.map +1 -0
  73. package/dist/components/switch/cs-switch.js +38 -0
  74. package/dist/components/switch/cs-switch.js.map +1 -0
  75. package/dist/components/table/cs-data-base-table.js +108 -0
  76. package/dist/components/table/cs-data-base-table.js.map +1 -0
  77. package/dist/components/table/cs-data-table.js +32 -0
  78. package/dist/components/table/cs-data-table.js.map +1 -0
  79. package/dist/components/table/cs-skeleton-table.js +41 -0
  80. package/dist/components/table/cs-skeleton-table.js.map +1 -0
  81. package/dist/components/table/cs-table.js +120 -0
  82. package/dist/components/table/cs-table.js.map +1 -0
  83. package/dist/components/tabs/cs-simple-tabs.js +24 -0
  84. package/dist/components/tabs/cs-simple-tabs.js.map +1 -0
  85. package/dist/components/tabs/cs-tabs.js +114 -0
  86. package/dist/components/tabs/cs-tabs.js.map +1 -0
  87. package/dist/components/toggle/cs-toggle-group.js +65 -0
  88. package/dist/components/toggle/cs-toggle-group.js.map +1 -0
  89. package/dist/components/toggle/cs-toggle.js +46 -0
  90. package/dist/components/toggle/cs-toggle.js.map +1 -0
  91. package/dist/components/tooltip/cs-simple-tooltip.js +16 -0
  92. package/dist/components/tooltip/cs-simple-tooltip.js.map +1 -0
  93. package/dist/components/tooltip/cs-tooltip.js +72 -0
  94. package/dist/components/tooltip/cs-tooltip.js.map +1 -0
  95. package/dist/constants/cs-chart-option.constant.js +105 -0
  96. package/dist/constants/cs-chart-option.constant.js.map +1 -0
  97. package/dist/cs-ui.css +5 -96
  98. package/dist/hooks/use-accordion.js +54 -0
  99. package/dist/hooks/use-accordion.js.map +1 -0
  100. package/dist/hooks/use-infinite-scroll.js +40 -0
  101. package/dist/hooks/use-infinite-scroll.js.map +1 -0
  102. package/dist/hooks/use-laptop.js +20 -0
  103. package/dist/hooks/use-laptop.js.map +1 -0
  104. package/dist/hooks/use-mobile.js +20 -0
  105. package/dist/hooks/use-mobile.js.map +1 -0
  106. package/dist/index.d.ts +19 -6
  107. package/dist/index.js +287 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/lib/chart.util.js +48 -0
  110. package/dist/lib/chart.util.js.map +1 -0
  111. package/dist/lib/style.util.js +19 -0
  112. package/dist/lib/style.util.js.map +1 -0
  113. package/dist/lib/utils.js +27 -0
  114. package/dist/lib/utils.js.map +1 -0
  115. package/package.json +4 -5
  116. package/dist/index.cjs.js +0 -147660
  117. package/dist/index.cjs.js.map +0 -1
  118. package/dist/index.es.js +0 -147625
  119. package/dist/index.es.js.map +0 -1
@@ -0,0 +1,105 @@
1
+ import { getFillerColor } from "../lib/chart.util.js";
2
+ import { csChartTooltipStyle } from "../components/tooltip/cs-tooltip.js";
3
+ const CsChartBaseOptions = {
4
+ tooltip: {
5
+ className: csChartTooltipStyle,
6
+ borderColor: "transparent"
7
+ },
8
+ legend: {
9
+ bottom: 0,
10
+ icon: "circle",
11
+ itemWidth: 12,
12
+ itemHeight: 12,
13
+ itemGap: 12,
14
+ textStyle: {
15
+ color: "var(--chart-data-label-font)"
16
+ }
17
+ }
18
+ };
19
+ const CsLineChartTheme = {
20
+ line: {
21
+ symbol: "none",
22
+ symbolSize: 8,
23
+ itemStyle: {
24
+ borderWidth: 2
25
+ }
26
+ }
27
+ };
28
+ const CsChartAxisOptions = {
29
+ grid: {
30
+ containLabel: true,
31
+ top: 10,
32
+ bottom: 40,
33
+ left: 10,
34
+ right: 10,
35
+ borderColor: "var(--chart-wrapper-grid-color)",
36
+ show: false
37
+ },
38
+ xAxis: {
39
+ axisLine: {
40
+ lineStyle: {
41
+ color: "var(--chart-wrapper-axis-color)"
42
+ }
43
+ },
44
+ axisLabel: {
45
+ color: "var(--chart-wrapper-label)"
46
+ },
47
+ splitLine: {
48
+ lineStyle: {
49
+ color: "var(--chart-wrapper-grid-color)"
50
+ }
51
+ }
52
+ },
53
+ yAxis: {
54
+ axisLine: {
55
+ lineStyle: {
56
+ color: "var(--chart-wrapper-axis-color)"
57
+ }
58
+ },
59
+ axisLabel: {
60
+ color: "var(--chart-wrapper-label)"
61
+ },
62
+ splitLine: {
63
+ lineStyle: {
64
+ color: "var(--chart-wrapper-grid-color)"
65
+ }
66
+ }
67
+ }
68
+ };
69
+ const getCsChartZoomOptions = () => ({
70
+ dataZoom: [
71
+ {
72
+ type: "inside",
73
+ disabled: true,
74
+ start: 0,
75
+ end: 100
76
+ },
77
+ {
78
+ type: "slider",
79
+ show: false,
80
+ start: 0,
81
+ end: 100,
82
+ bottom: 20,
83
+ height: 24,
84
+ borderColor: "var(--chart-range-slider-track-border)",
85
+ backgroundColor: "var(--chart-range-slider-track-bg)",
86
+ fillerColor: getFillerColor(),
87
+ handleSize: "100%",
88
+ handleStyle: {
89
+ color: "var(--chart-range-slider-thumb-handle)",
90
+ borderColor: "var(--chart-range-slider-thumb-handle-border)",
91
+ borderWidth: 1
92
+ },
93
+ moveHandleStyle: {
94
+ color: "var(--chart-range-slider-thumb-bar)"
95
+ }
96
+ }
97
+ ]
98
+ });
99
+ export {
100
+ CsChartAxisOptions,
101
+ CsChartBaseOptions,
102
+ CsLineChartTheme,
103
+ getCsChartZoomOptions
104
+ };
105
+ //# sourceMappingURL=cs-chart-option.constant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cs-chart-option.constant.js","sources":["../../src/constants/cs-chart-option.constant.ts"],"sourcesContent":["import { IXChartBodyProps } from \"x-charts/components/chart/x-charts-body\";\nimport { csChartTooltipStyle } from \"../components/tooltip\";\nimport { getFillerColor } from '../lib/chart.util';\n\nexport const CsChartBaseOptions: IXChartBodyProps['customOptions'] = {\n tooltip: {\n className: csChartTooltipStyle,\n borderColor: \"transparent\"\n },\n legend: {\n bottom: 0,\n icon: 'circle',\n itemWidth: 12,\n itemHeight: 12,\n itemGap: 12,\n textStyle: {\n color: 'var(--chart-data-label-font)',\n }\n }\n}\n\nexport const CsLineChartTheme = {\n line: {\n symbol: 'none',\n symbolSize: 8,\n itemStyle: {\n borderWidth: 2\n }\n }\n}\n\nexport const CsChartAxisOptions: IXChartBodyProps['customOptions'] = {\n grid: {\n containLabel: true,\n top: 10,\n bottom: 40,\n left: 10,\n right: 10,\n borderColor: 'var(--chart-wrapper-grid-color)',\n show: false\n },\n xAxis: {\n axisLine: {\n lineStyle: {\n color: 'var(--chart-wrapper-axis-color)'\n }\n },\n axisLabel: {\n color: 'var(--chart-wrapper-label)'\n },\n splitLine: {\n lineStyle: {\n color: 'var(--chart-wrapper-grid-color)'\n }\n }\n },\n yAxis: {\n axisLine: {\n lineStyle: {\n color: 'var(--chart-wrapper-axis-color)'\n }\n },\n axisLabel: {\n color: 'var(--chart-wrapper-label)'\n },\n splitLine: {\n lineStyle: {\n color: 'var(--chart-wrapper-grid-color)'\n }\n }\n }\n}\n\nexport const getCsChartZoomOptions = (): IXChartBodyProps['customOptions'] => ({\n dataZoom: [\n {\n type: 'inside',\n disabled: true,\n start: 0,\n end: 100\n },\n {\n type: 'slider',\n show: false,\n start: 0,\n end: 100,\n bottom: 20,\n height: 24,\n borderColor: 'var(--chart-range-slider-track-border)',\n backgroundColor: 'var(--chart-range-slider-track-bg)',\n fillerColor: getFillerColor(),\n handleSize: '100%',\n handleStyle: {\n color: 'var(--chart-range-slider-thumb-handle)',\n borderColor: 'var(--chart-range-slider-thumb-handle-border)',\n borderWidth: 1\n },\n moveHandleStyle: {\n color: 'var(--chart-range-slider-thumb-bar)',\n },\n }\n ]\n})"],"names":[],"mappings":";;AAIO,MAAM,qBAAwD;AAAA,EACnE,SAAS;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA,EAEd,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,WAAW;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,EACT;AAEJ;AAEO,MAAM,mBAAmB;AAAA,EAC9B,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;AAEO,MAAM,qBAAwD;AAAA,EACnE,MAAM;AAAA,IACJ,cAAc;AAAA,IACd,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,OAAO;AAAA,IACL,UAAU;AAAA,MACR,WAAW;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,IAEF,WAAW;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,IAET,WAAW;AAAA,MACT,WAAW;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEF,OAAO;AAAA,IACL,UAAU;AAAA,MACR,WAAW;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,IAEF,WAAW;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,IAET,WAAW;AAAA,MACT,WAAW;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,EACF;AAEJ;AAEO,MAAM,wBAAwB,OAA0C;AAAA,EAC7E,UAAU;AAAA,IACR;AAAA,MACE,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,IAAA;AAAA,IAEP;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,aAAa,eAAA;AAAA,MACb,YAAY;AAAA,MACZ,aAAa;AAAA,QACX,OAAO;AAAA,QACP,aAAa;AAAA,QACb,aAAa;AAAA,MAAA;AAAA,MAEf,iBAAiB;AAAA,QACd,OAAO;AAAA,MAAA;AAAA,IACV;AAAA,EACF;AAEJ;"}
package/dist/cs-ui.css CHANGED
@@ -837,7 +837,7 @@
837
837
  --toast-error-description: var(--font-color-secondary-default);
838
838
  --toast-error-icon: var(--color-state-error-default);
839
839
  --calendar-date-picker-radius: var(--radius-medium);
840
- --calendar-days-week-font: var(--font-color-onbrand-default);
840
+ --calendar-days-week-font: var(--font-color-primary-default);
841
841
  --calendar-date-picker-padding-x: var(--spacing-component-padding-md);
842
842
  --calendar-date-picker-padding-y: var(--spacing-component-padding-md);
843
843
  --calendar-date-picker-icon-size: var(--icon-size-medium);
@@ -4829,6 +4829,10 @@
4829
4829
  color: var(--color-green-700);
4830
4830
  }
4831
4831
 
4832
+ .text-red-500 {
4833
+ color: var(--color-red-500);
4834
+ }
4835
+
4832
4836
  .text-red-700 {
4833
4837
  color: var(--color-red-700);
4834
4838
  }
@@ -7504,11 +7508,6 @@
7504
7508
  height: var(--toggle-common-icon-size);
7505
7509
  }
7506
7510
 
7507
- .\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*="size-"]) {
7508
- width: calc(var(--spacing) * 4);
7509
- height: calc(var(--spacing) * 4);
7510
- }
7511
-
7512
7511
  .\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-6 svg:not([class*="size-"]) {
7513
7512
  width: calc(var(--spacing) * 6);
7514
7513
  height: calc(var(--spacing) * 6);
@@ -8856,93 +8855,3 @@
8856
8855
  height: 0;
8857
8856
  }
8858
8857
  }
8859
- pre code.hljs {
8860
- display: block;
8861
- overflow-x: auto;
8862
- padding: 1em
8863
- }
8864
- code.hljs {
8865
- padding: 3px 5px
8866
- }
8867
- /*
8868
-
8869
- Atom One Dark by Daniel Gamage
8870
- Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax
8871
-
8872
- base: #282c34
8873
- mono-1: #abb2bf
8874
- mono-2: #818896
8875
- mono-3: #5c6370
8876
- hue-1: #56b6c2
8877
- hue-2: #61aeee
8878
- hue-3: #c678dd
8879
- hue-4: #98c379
8880
- hue-5: #e06c75
8881
- hue-5-2: #be5046
8882
- hue-6: #d19a66
8883
- hue-6-2: #e6c07b
8884
-
8885
- */
8886
- .hljs {
8887
- color: #abb2bf;
8888
- background: #282c34
8889
- }
8890
- .hljs-comment,
8891
- .hljs-quote {
8892
- color: #5c6370;
8893
- font-style: italic
8894
- }
8895
- .hljs-doctag,
8896
- .hljs-keyword,
8897
- .hljs-formula {
8898
- color: #c678dd
8899
- }
8900
- .hljs-section,
8901
- .hljs-name,
8902
- .hljs-selector-tag,
8903
- .hljs-deletion,
8904
- .hljs-subst {
8905
- color: #e06c75
8906
- }
8907
- .hljs-literal {
8908
- color: #56b6c2
8909
- }
8910
- .hljs-string,
8911
- .hljs-regexp,
8912
- .hljs-addition,
8913
- .hljs-attribute,
8914
- .hljs-meta .hljs-string {
8915
- color: #98c379
8916
- }
8917
- .hljs-attr,
8918
- .hljs-variable,
8919
- .hljs-template-variable,
8920
- .hljs-type,
8921
- .hljs-selector-class,
8922
- .hljs-selector-attr,
8923
- .hljs-selector-pseudo,
8924
- .hljs-number {
8925
- color: #d19a66
8926
- }
8927
- .hljs-symbol,
8928
- .hljs-bullet,
8929
- .hljs-link,
8930
- .hljs-meta,
8931
- .hljs-selector-id,
8932
- .hljs-title {
8933
- color: #61aeee
8934
- }
8935
- .hljs-built_in,
8936
- .hljs-title.class_,
8937
- .hljs-class .hljs-title {
8938
- color: #e6c07b
8939
- }
8940
- .hljs-emphasis {
8941
- font-style: italic
8942
- }
8943
- .hljs-strong {
8944
- font-weight: bold
8945
- }
8946
- .hljs-link {
8947
- text-decoration: underline
8948
- }
@@ -0,0 +1,54 @@
1
+ "use client";
2
+ import { useMemo, useState, useCallback } from "react";
3
+ const useAccordion = (itemKeys, options) => {
4
+ const { initialOpenedItems = [], defaultOpenAll = false } = options ?? {};
5
+ const initialState = useMemo(() => {
6
+ if (defaultOpenAll) {
7
+ return itemKeys;
8
+ }
9
+ return initialOpenedItems;
10
+ }, []);
11
+ const [openedItems, setOpenedItems] = useState(initialState);
12
+ const allKeys = useMemo(
13
+ () => itemKeys,
14
+ [itemKeys]
15
+ );
16
+ const toggleAccordion = useCallback((value) => {
17
+ setOpenedItems(
18
+ (prev) => prev.includes(value) ? prev.filter((item) => item !== value) : [...prev, value]
19
+ );
20
+ }, []);
21
+ const openAllAccordions = useCallback(() => {
22
+ setOpenedItems(allKeys);
23
+ }, [allKeys]);
24
+ const closeAllAccordions = useCallback(() => {
25
+ setOpenedItems([]);
26
+ }, []);
27
+ const toggleAllAccordions = useCallback(() => {
28
+ setOpenedItems(
29
+ (prev) => prev.length === allKeys.length ? [] : allKeys
30
+ );
31
+ }, [allKeys]);
32
+ const isOpenedAll = useMemo(
33
+ () => openedItems.length === allKeys.length && allKeys.length > 0,
34
+ [openedItems.length, allKeys.length]
35
+ );
36
+ const isOpened = useCallback(
37
+ (value) => openedItems.includes(value),
38
+ [openedItems]
39
+ );
40
+ return {
41
+ openedItems,
42
+ setOpenedItems,
43
+ toggleAccordion,
44
+ openAllAccordions,
45
+ closeAllAccordions,
46
+ toggleAllAccordions,
47
+ isOpenedAll,
48
+ isOpened
49
+ };
50
+ };
51
+ export {
52
+ useAccordion
53
+ };
54
+ //# sourceMappingURL=use-accordion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-accordion.js","sources":["../../src/hooks/use-accordion.tsx"],"sourcesContent":["'use client'\n\nimport { type Dispatch, type SetStateAction, useCallback, useMemo, useState } from 'react'\n\nexport interface UseCsAccordionOptions {\n /** 초기 열림 상태 (기본값: []) */\n initialOpenedItems?: string[]\n /** 초기에 모두 열림 상태로 시작 (기본값: false) */\n defaultOpenAll?: boolean\n}\n\nexport interface ReturnUseCsAccordion {\n openedItems: string[]\n setOpenedItems: Dispatch<SetStateAction<string[]>>\n toggleAccordion: (value: string) => void\n openAllAccordions: () => void\n closeAllAccordions: () => void\n toggleAllAccordions: () => void\n isOpenedAll: boolean\n isOpened: (value: string) => boolean\n}\n\n/**\n * CsAccordion 컴포넌트와 함께 사용하는 훅으로, 아코디언의 열림/닫힘 상태를 관리합니다.\n * \n * @var `openedItems` 열린 아코디언의 key 배열\n * @var `setOpenedItems` 열린 아코디언의 key 배열의 setter 함수\n * @var `toggleAccordion` 특정 아코디언을 토글하는 함수\n * @var `openAllAccordions` 모든 아코디언을 여는 함수\n * @var `closeAllAccordions` 모든 아코디언을 닫는 함수\n * @var `toggleAllAccordions` 모든 아코디언을 토글하는 함수 (모두 열림 → 모두 닫힘, 그 외 → 모두 열림)\n * @var `isOpenedAll` 모든 아코디언이 열려있는지 여부\n * @var `isOpened` 특정 아코디언이 열려있는지 확인하는 함수\n * \n * @example ```tsx\n * // 기본 사용법\n * const itemKeys = ['1', '2', '3']\n * \n * const {\n * openedItems,\n * setOpenedItems,\n * toggleAllAccordions,\n * isOpenedAll\n * } = useCsAccordion(itemKeys)\n * \n * return (\n * <>\n * <CsButton onClick={toggleAllAccordions}>\n * {isOpenedAll ? <Minimize2 /> : <Maximize2 />}\n * {isOpenedAll ? 'Collapse All' : 'Expand All'}\n * </CsButton>\n * \n * <CsAccordion\n * type=\"multiple\"\n * value={openedItems}\n * onValueChange={setOpenedItems}\n * >\n * {items.map((item) => (\n * <CsAccordionItem key={item.id} value={item.id}>\n * <CsAccordionTrigger>{item.title}</CsAccordionTrigger>\n * <CsAccordionContent>{item.content}</CsAccordionContent>\n * </CsAccordionItem>\n * ))}\n * </CsAccordion>\n * </>\n * )\n * ```\n * \n * @example ```tsx\n * // 초기 상태 설정\n * const { openedItems, setOpenedItems } = useCsAccordion(itemKeys, {\n * defaultOpenAll: true // 초기에 모두 열림\n * })\n * \n * // 또는\n * const { openedItems, setOpenedItems } = useCsAccordion(itemKeys, {\n * initialOpenedItems: ['1', '3'] // 특정 아이템만 열림\n * })\n * ```\n * \n * @param {string[]} itemKeys 아코디언 아이템의 key 배열\n * @param {UseCsAccordionOptions} options 옵션\n * @returns {ReturnUseCsAccordion}\n */\n\nexport const useAccordion = (\n itemKeys: string[],\n options?: UseCsAccordionOptions\n): ReturnUseCsAccordion => {\n const { initialOpenedItems = [], defaultOpenAll = false } = options ?? {}\n\n // 초기 상태 설정\n const initialState = useMemo(() => {\n if (defaultOpenAll) {\n return itemKeys\n }\n return initialOpenedItems\n }, []) // 의도적으로 빈 배열 - 초기 마운트 시에만 실행\n\n const [openedItems, setOpenedItems] = useState<string[]>(initialState)\n\n // 모든 아이템의 key 배열을 메모이제이션\n const allKeys = useMemo(\n () => itemKeys,\n [itemKeys]\n )\n\n // 특정 아코디언 토글\n const toggleAccordion = useCallback((value: string) => {\n setOpenedItems((prev) =>\n prev.includes(value)\n ? prev.filter((item) => item !== value)\n : [...prev, value]\n )\n }, [])\n\n // 모든 아코디언 열기\n const openAllAccordions = useCallback(() => {\n setOpenedItems(allKeys)\n }, [allKeys])\n\n // 모든 아코디언 닫기\n const closeAllAccordions = useCallback(() => {\n setOpenedItems([])\n }, [])\n\n // 모든 아코디언 토글 (모두 열림 → 닫힘, 그 외 → 열림)\n const toggleAllAccordions = useCallback(() => {\n setOpenedItems((prev) =>\n prev.length === allKeys.length ? [] : allKeys\n )\n }, [allKeys])\n\n // 모든 아코디언이 열려있는지 확인\n const isOpenedAll = useMemo(\n () => openedItems.length === allKeys.length && allKeys.length > 0,\n [openedItems.length, allKeys.length]\n )\n\n // 특정 아코디언이 열려있는지 확인\n const isOpened = useCallback(\n (value: string) => openedItems.includes(value),\n [openedItems]\n )\n\n return {\n openedItems,\n setOpenedItems,\n toggleAccordion,\n openAllAccordions,\n closeAllAccordions,\n toggleAllAccordions,\n isOpenedAll,\n isOpened,\n }\n}\n\n"],"names":[],"mappings":";;AAyFE,MAAA,eAAQ,CAAA,UAAqB,YAAI;AAGjC,QAAM,EAAA,qBAAuB,CAAA,GAAA,iBAAM,MAAA,IAAA,WAAA,CAAA;AACjC,QAAI,eAAA,QAAgB,MAAA;AAClB,wBAAO;AACT,aAAA;AAAA,IACA;AACF,WAAK;AAAA,EAEL,GAAA,CAAA,CAAA;AAGA,QAAM,CAAA,aAAU,cAAA,IAAA,SAAA,YAAA;AAAA,kBACR;AAAA,IACN,MAAC;AAAA,IACH,CAAA,QAAA;AAAA,EAGA;AACE,QAAA,kBAAA,YAAA,CAAA,UAAA;AAAA;AAAA,MAIA,CAAA,SAAA,KAAA,SAAA,KAAA,IAAA,KAAA,OAAA,CAAA,SAAA,SAAA,KAAA,IAAA,CAAA,GAAA,MAAA,KAAA;AAAA,IACF;AAAA,EAGA,GAAA,CAAA,CAAA;AACE,QAAA,oBAAsB,YAAA,MAAA;AACxB,mBAAY,OAAA;AAAA,EAGZ,GAAA,CAAA,OAAM,CAAA;AACJ,QAAA,qBAAiB,YAAA,MAAA;AACnB,mBAAK,CAAA,CAAA;AAAA,EAGL,GAAA,CAAA,CAAA;AACE,QAAA,sBAAA,YAAA,MAAA;AAAA;AAAA,MAEA,CAAA,SAAA,KAAA,WAAA,QAAA,SAAA,CAAA,IAAA;AAAA,IACF;AAAA,EAGA,GAAA,CAAA,OAAM,CAAA;AAAc,QAClB,cAAkB;AAAA,IAClB,MAAC,uBAA4B,QAAM,UAAA,QAAA,SAAA;AAAA,IACrC,CAAA,YAAA,QAAA,QAAA,MAAA;AAAA,EAGA;AAAiB,mBACI;AAAA,IACnB,CAAC,UAAA,YAAW,SAAA,KAAA;AAAA,IACd,CAAA,WAAA;AAAA,EAEA;AAAO,SACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACF;AAAA,EACF;;"}
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ import { useRef, useEffect } from "react";
3
+ function useInfiniteScroll({
4
+ fetchMore,
5
+ hasMore,
6
+ isFetching,
7
+ threshold = 200
8
+ }) {
9
+ const observerRef = useRef(null);
10
+ useEffect(() => {
11
+ const observer = new IntersectionObserver(
12
+ (entries) => {
13
+ const first = entries[0];
14
+ if (first.isIntersecting && hasMore && !isFetching) {
15
+ fetchMore();
16
+ }
17
+ },
18
+ {
19
+ root: null,
20
+ // viewport
21
+ rootMargin: `${threshold}px`,
22
+ threshold: 0.1
23
+ }
24
+ );
25
+ const currentTarget = observerRef.current;
26
+ if (currentTarget) {
27
+ observer.observe(currentTarget);
28
+ }
29
+ return () => {
30
+ if (currentTarget) {
31
+ observer.unobserve(currentTarget);
32
+ }
33
+ };
34
+ }, [fetchMore, hasMore, isFetching, threshold]);
35
+ return { scrollContainerRef: observerRef };
36
+ }
37
+ export {
38
+ useInfiniteScroll
39
+ };
40
+ //# sourceMappingURL=use-infinite-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-infinite-scroll.js","sources":["../../src/hooks/use-infinite-scroll.ts"],"sourcesContent":["'use client'\n\nimport { useEffect, useRef } from 'react';\n\ninterface UseInfiniteScrollProps {\n fetchMore: () => void;\n hasMore: boolean;\n isFetching: boolean;\n threshold?: number; // IntersectionObserver의 rootMargin으로 사용 (px 단위)\n useWindowScroll?: boolean; // 하위 호환성을 위해 남겨둠 (사용 안 함)\n}\n\nexport function useInfiniteScroll<T extends HTMLElement = HTMLDivElement>({\n fetchMore,\n hasMore,\n isFetching,\n threshold = 200,\n}: UseInfiniteScrollProps) {\n const observerRef = useRef<T>(null);\n\n useEffect(() => {\n const observer = new IntersectionObserver(\n (entries) => {\n const first = entries[0];\n if (first.isIntersecting && hasMore && !isFetching) {\n fetchMore();\n }\n },\n {\n root: null, // viewport\n rootMargin: `${threshold}px`,\n threshold: 0.1,\n }\n );\n\n const currentTarget = observerRef.current;\n if (currentTarget) {\n observer.observe(currentTarget);\n }\n\n return () => {\n if (currentTarget) {\n observer.unobserve(currentTarget);\n }\n };\n }, [fetchMore, hasMore, isFetching, threshold]);\n\n return { scrollContainerRef: observerRef }; // 호환성을 위해 이름 유지 (실제로는 sentinel ref)\n}\n"],"names":[],"mappings":";;AAY0E,SACxE,kBAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACF,YAA2B;AACzB;AAEA,QAAA,cAAgB,OAAA,IAAA;AACd,YAAM;AAAe,qBACN,IAAA;AAAA,MACX,CAAA,YAAM;AACN,sBAAU,QAAA,CAAA;AACR,oCAAU,WAAA,CAAA,YAAA;AACZ,oBAAA;AAAA,QACF;AAAA,MACA;AAAA,MAAA;AAAA,QACQ,MAAA;AAAA;AAAA,QAEN,YAAW,GAAA,SAAA;AAAA,QAAA,WAAA;AAAA,MAEf;AAAA,IAEA;AACA,0BAAmB,YAAA;AACjB,QAAA,eAAiB;AACnB,eAAA,QAAA,aAAA;AAAA,IAEA;AACE;AACE,UAAA,eAAS;AACX,iBAAA,UAAA,aAAA;AAAA,MACF;AAAA;EAGF,GAAA,CAAA,WAAS,SAAA,qBAAgC,CAAA;AAC3C,SAAA,EAAA,oBAAA,YAAA;;"}
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ const LAPTOP_BREAKPOINT = 1600;
4
+ function useIsLaptop() {
5
+ const [isLaptop, setIsLaptop] = React.useState(void 0);
6
+ React.useEffect(() => {
7
+ const mql = window.matchMedia(`(max-width: ${LAPTOP_BREAKPOINT - 1}px)`);
8
+ const onChange = () => {
9
+ setIsLaptop(window.innerWidth < LAPTOP_BREAKPOINT);
10
+ };
11
+ mql.addEventListener("change", onChange);
12
+ setIsLaptop(window.innerWidth < LAPTOP_BREAKPOINT);
13
+ return () => mql.removeEventListener("change", onChange);
14
+ }, []);
15
+ return !!isLaptop;
16
+ }
17
+ export {
18
+ useIsLaptop
19
+ };
20
+ //# sourceMappingURL=use-laptop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-laptop.js","sources":["../../src/hooks/use-laptop.tsx"],"sourcesContent":["'use client'\n\nimport * as React from \"react\"\n\n// Matches --breakpoint-laptop in packages/cs-ui/src/styles/globals.css\nconst LAPTOP_BREAKPOINT = 1600\n\nexport function useIsLaptop() {\n const [isLaptop, setIsLaptop] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${LAPTOP_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsLaptop(window.innerWidth < LAPTOP_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsLaptop(window.innerWidth < LAPTOP_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isLaptop\n}\n"],"names":[],"mappings":";;AAOO,MAAA,oBAAuB;AAC5B,SAAO,cAAU;AAEjB,QAAM,CAAA,UAAU,WAAM,IAAA,MAAA,SAAA,MAAA;AACpB,kBAAY;AACZ,UAAM,MAAA,OAAW,WAAM,eAAA,oBAAA,CAAA,KAAA;AACrB,qBAAY,MAAO;AACrB,kBAAA,OAAA,aAAA,iBAAA;AAAA,IACA;AACA,yBAAmB;AACnB,qDAA+C;AACjD,WAAK,MAAA,IAAA,oBAAA,UAAA,QAAA;AAAA,EAEL,GAAA,CAAA,CAAA;AACF,SAAA,CAAA,CAAA;;"}
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ const MOBILE_BREAKPOINT = 840;
4
+ function useIsMobile() {
5
+ const [isMobile, setIsMobile] = React.useState(void 0);
6
+ React.useEffect(() => {
7
+ const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
8
+ const onChange = () => {
9
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
10
+ };
11
+ mql.addEventListener("change", onChange);
12
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
13
+ return () => mql.removeEventListener("change", onChange);
14
+ }, []);
15
+ return !!isMobile;
16
+ }
17
+ export {
18
+ useIsMobile
19
+ };
20
+ //# sourceMappingURL=use-mobile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-mobile.js","sources":["../../src/hooks/use-mobile.tsx"],"sourcesContent":["'use client'\n\nimport * as React from \"react\"\n\n// Matches --breakpoint-max-mobile in packages/cs-ui/src/styles/globals.css\nconst MOBILE_BREAKPOINT = 840\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n"],"names":[],"mappings":";;AAOO,MAAA,oBAAuB;AAC5B,SAAO,cAAU;AAEjB,QAAM,CAAA,UAAU,WAAM,IAAA,MAAA,SAAA,MAAA;AACpB,kBAAY;AACZ,UAAM,MAAA,OAAW,WAAM,eAAA,oBAAA,CAAA,KAAA;AACrB,qBAAY,MAAO;AACrB,kBAAA,OAAA,aAAA,iBAAA;AAAA,IACA;AACA,yBAAmB;AACnB,qDAA+C;AACjD,WAAK,MAAA,IAAA,oBAAA,UAAA,QAAA;AAAA,EAEL,GAAA,CAAA,CAAA;AACF,SAAA,CAAA,CAAA;;"}
package/dist/index.d.ts CHANGED
@@ -224,19 +224,15 @@ export declare function CsCollapsibleContent({ ...props }: React.ComponentProps<
224
224
 
225
225
  export declare function CsCollapsibleTrigger({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>): JSX.Element;
226
226
 
227
- export declare function CsDataTable<T>(props: CsDataTableProps<T>): JSX.Element;
227
+ export declare function CsDataBaseTable<T>(props: CsDataBaseTableProps<T>): JSX.Element;
228
228
 
229
- export declare interface CsDataTableProps<T> {
229
+ export declare interface CsDataBaseTableProps<T> {
230
230
  columns: TableColumnDef<T>[];
231
231
  rows?: T[];
232
232
  expandable?: boolean;
233
- isLoading?: boolean;
234
- isError?: boolean;
235
233
  className?: string;
236
- defaultRowSize?: number;
237
234
  subRowsName?: string;
238
235
  EmptyFallback?: ReactNode;
239
- ErrorFallback?: ReactNode;
240
236
  defaultHeaderComp?: ComponentType<{
241
237
  column: any;
242
238
  children: React.ReactNode;
@@ -246,6 +242,15 @@ export declare interface CsDataTableProps<T> {
246
242
  isFetchingNextPage?: boolean;
247
243
  }
248
244
 
245
+ export declare function CsDataTable<T>(props: CsDataTableProps<T>): JSX.Element;
246
+
247
+ export declare interface CsDataTableProps<T> extends CsDataBaseTableProps<T> {
248
+ isLoading?: boolean;
249
+ isError?: boolean;
250
+ defaultRowSize?: number;
251
+ ErrorFallback?: ReactNode;
252
+ }
253
+
249
254
  export declare function CsDatePicker({ children, className, ...props }: PropsWithChildren<CsCalendarProps>): default_2.JSX.Element;
250
255
 
251
256
  export declare type CsDatePickerProps = PropsWithChildren<CsCalendarProps>;
@@ -765,6 +770,14 @@ export declare type CsSkeletonProps = React.ComponentProps<"div"> & {
765
770
  radius?: 'default' | 'max';
766
771
  };
767
772
 
773
+ export declare function CsSkeletonTable<T>({ columns, rowCount, className, }: CsSkeletonTableProps<T>): JSX.Element;
774
+
775
+ export declare interface CsSkeletonTableProps<T> {
776
+ columns: TableColumnDef<T>[];
777
+ rowCount?: number;
778
+ className?: string;
779
+ }
780
+
768
781
  export declare const csSkeletonVariants: (props?: ({
769
782
  radius?: "default" | "max" | null | undefined;
770
783
  } & ClassProp) | undefined) => string;