@iamfiro/design 0.1.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/AGENTS.md +1 -0
  2. package/agents/INDEX.md +1 -0
  3. package/agents/brand-icon/AGENTS.md +2 -2
  4. package/agents/social-login-button/AGENTS.md +156 -0
  5. package/lib/components/Accordion/Accordion2.js +135 -0
  6. package/lib/components/ActionBar/ActionBar2.js +66 -0
  7. package/lib/components/Alert/Alert2.js +131 -0
  8. package/lib/components/AppShell/AppShell2.js +94 -0
  9. package/lib/components/AreaChart/AreaChart.js +59 -0
  10. package/lib/components/BarChart/BarChart2.js +243 -0
  11. package/lib/components/BarList/BarList2.js +172 -0
  12. package/lib/components/Breadcrumb/Breadcrumb2.js +90 -0
  13. package/lib/components/Calendar/Calendar2.js +309 -0
  14. package/lib/components/Calendar/DatePicker2.js +228 -0
  15. package/lib/components/Calendar/date.js +118 -0
  16. package/lib/components/Card/Card2.js +103 -0
  17. package/lib/components/CardFrame/CardFrame2.js +67 -0
  18. package/lib/components/Chart/ChartParts.js +150 -0
  19. package/lib/components/Chart/chart2.js +96 -0
  20. package/lib/components/Chart/useChartInteraction.js +94 -0
  21. package/lib/components/ChatBubble/ChatBubble2.js +174 -0
  22. package/lib/components/ChatBubble/formatChatTime.js +48 -0
  23. package/lib/components/ChatComposer/ChatComposer2.js +153 -0
  24. package/lib/components/CodeBlock/CodeBlock2.js +93 -0
  25. package/lib/components/CodeBlock/highlight.js +111 -0
  26. package/lib/components/ColorPicker/ColorPicker2.js +609 -0
  27. package/lib/components/ColorPicker/color.js +180 -0
  28. package/lib/components/ColorPicker/presets.js +70 -0
  29. package/lib/components/Combobox/Combobox2.js +228 -0
  30. package/lib/components/CommandMenu/CommandMenu.js +267 -0
  31. package/lib/components/Comment/Comment2.js +110 -0
  32. package/lib/components/ContextMenu/ContextMenu2.js +168 -0
  33. package/lib/components/DataGrid/DataGrid2.js +1998 -0
  34. package/lib/components/DataGrid/GridPopover.js +154 -0
  35. package/lib/components/DataGrid/anchor.js +50 -0
  36. package/lib/components/DataGrid/model.js +557 -0
  37. package/lib/components/DataGrid/panels.js +701 -0
  38. package/lib/components/DataGrid/typeMeta.js +75 -0
  39. package/lib/components/DataGrid/types.js +53 -0
  40. package/lib/components/DescriptionList/DescriptionList2.js +180 -0
  41. package/lib/components/Dialog/AlertDialog.js +119 -0
  42. package/lib/components/Dialog/Dialog2.js +110 -0
  43. package/lib/components/Dialog/modal.js +92 -0
  44. package/lib/components/Drawer/Drawer2.js +244 -0
  45. package/lib/components/DropdownMenu/DropdownMenu2.js +393 -0
  46. package/lib/components/DropdownMenu/menuCore.js +63 -0
  47. package/lib/components/Dropzone/Dropzone2.js +145 -0
  48. package/lib/components/EmptyState/EmptyState2.js +70 -0
  49. package/lib/components/FileChip/FileChip2.js +94 -0
  50. package/lib/components/FileUpload/FileUpload.js +259 -0
  51. package/lib/components/FilterChips/FilterChips2.js +101 -0
  52. package/lib/components/FunnelChart/FunnelChart2.js +283 -0
  53. package/lib/components/FunnelChart/funnel.js +72 -0
  54. package/lib/components/Highlight/Highlight2.js +100 -0
  55. package/lib/components/HoverCard/HoverCard.js +134 -0
  56. package/lib/components/InlineDiff/InlineDiff2.js +215 -0
  57. package/lib/components/InlineDiff/diff.js +126 -0
  58. package/lib/components/InlineDiff/useDiffReview.js +110 -0
  59. package/lib/components/Kanban/Kanban2.js +691 -0
  60. package/lib/components/Kanban/KanbanCard.js +159 -0
  61. package/lib/components/Kanban/move.js +69 -0
  62. package/lib/components/LineChart/LineChart2.js +342 -0
  63. package/lib/components/List/List2.js +132 -0
  64. package/lib/components/Listbox/Listbox2.js +163 -0
  65. package/lib/components/Marker/Marker2.js +82 -0
  66. package/lib/components/Menubar/Menubar2.js +222 -0
  67. package/lib/components/MultiSelect/MultiSelect2.js +204 -0
  68. package/lib/components/NavigationMenu/NavigationMenu2.js +481 -0
  69. package/lib/components/NoticeStack/NoticeStack2.js +178 -0
  70. package/lib/components/NumberStepper/NumberStepper2.js +128 -0
  71. package/lib/components/OtpInput/OtpInput2.js +122 -0
  72. package/lib/components/Pagination/Pagination2.js +210 -0
  73. package/lib/components/Pagination/paginationRange.js +52 -0
  74. package/lib/components/PhoneInput/PhoneInput.js +175 -0
  75. package/lib/components/PieChart/PieChart2.js +246 -0
  76. package/lib/components/PieChart/arc.js +90 -0
  77. package/lib/components/PieChart/useArcTween.js +92 -0
  78. package/lib/components/Popover/Popover2.js +111 -0
  79. package/lib/components/ProgressTracker/ProgressTracker2.js +226 -0
  80. package/lib/components/Rating/Rating2.js +186 -0
  81. package/lib/components/Resizable/Resizable2.js +238 -0
  82. package/lib/components/Resizable/layout.js +115 -0
  83. package/lib/components/ScaledPreview/ScaledPreview2.js +99 -0
  84. package/lib/components/ScatterChart/ScatterChart2.js +355 -0
  85. package/lib/components/ScatterChart/scatter.js +85 -0
  86. package/lib/components/ScrollArea/ScrollArea2.js +217 -0
  87. package/lib/components/Select/Select2.js +153 -0
  88. package/lib/components/Sidebar/Sidebar2.js +127 -0
  89. package/lib/components/Skeleton/Skeleton2.js +91 -0
  90. package/lib/components/Slider/Slider2.js +142 -0
  91. package/lib/components/SocialLoginButton/SocialLoginButton.js +84 -0
  92. package/lib/components/SparkChart/SparkChart2.js +217 -0
  93. package/lib/components/SparkChart/spark.js +71 -0
  94. package/lib/components/Sparkbar/Sparkbar2.js +111 -0
  95. package/lib/components/SplitView/SplitView2.js +95 -0
  96. package/lib/components/Stat/Stat2.js +164 -0
  97. package/lib/components/StepList/StepList2.js +131 -0
  98. package/lib/components/Table/Table2.js +104 -0
  99. package/lib/components/Tabs/Tabs2.js +131 -0
  100. package/lib/components/TagInput/TagInput2.js +357 -0
  101. package/lib/components/TimePicker/TimePicker2.js +388 -0
  102. package/lib/components/TimePicker/time.js +81 -0
  103. package/lib/components/Timeline/Timeline2.js +369 -0
  104. package/lib/components/Timeline/scale.js +81 -0
  105. package/lib/components/Toast/Toaster.js +213 -0
  106. package/lib/components/Toast/store.js +128 -0
  107. package/lib/components/ToggleGroup/ToggleGroup2.js +125 -0
  108. package/lib/components/Toolbar/Toolbar2.js +283 -0
  109. package/lib/components/Tracker/Tracker2.js +172 -0
  110. package/lib/components/TreeDiagram/TreeDiagram2.js +223 -0
  111. package/lib/components/TreeView/TreeView2.js +286 -0
  112. package/lib/hooks/timing.js +57 -0
  113. package/lib/hooks/useControllableState.js +49 -0
  114. package/lib/hooks/useCountdown.js +75 -0
  115. package/lib/hooks/useDigitInput.js +103 -0
  116. package/lib/hooks/useDismiss.js +69 -0
  117. package/lib/hooks/useElapsed.js +85 -0
  118. package/lib/hooks/useFloating.js +70 -0
  119. package/lib/hooks/useFocusTrap.js +85 -0
  120. package/lib/hooks/usePresence.js +58 -0
  121. package/lib/hooks/usePressToOpen.js +70 -0
  122. package/lib/hooks/useScrollLock.js +71 -0
  123. package/lib/hooks/useSelection.js +65 -0
  124. package/lib/index.js +176 -17911
  125. package/lib/primitives/AspectRatio2.js +76 -0
  126. package/lib/primitives/BrandIcon.js +245 -0
  127. package/lib/primitives/ColorDot2.js +71 -0
  128. package/lib/primitives/CopyButton2.js +86 -0
  129. package/lib/primitives/CountBadge2.js +80 -0
  130. package/lib/primitives/Countdown2.js +61 -0
  131. package/lib/primitives/Delta2.js +92 -0
  132. package/lib/primitives/Elapsed.js +62 -0
  133. package/lib/primitives/FileIcon2.js +125 -0
  134. package/lib/primitives/Flag2.js +263 -0
  135. package/lib/primitives/IconStack2.js +85 -0
  136. package/lib/primitives/IconTile2.js +69 -0
  137. package/lib/primitives/Kbd2.js +88 -0
  138. package/lib/primitives/Layout2.js +118 -0
  139. package/lib/primitives/Link2.js +55 -0
  140. package/lib/primitives/MaskedText2.js +121 -0
  141. package/lib/primitives/Progress2.js +137 -0
  142. package/lib/primitives/RelativeTime.js +82 -0
  143. package/lib/primitives/SearchInput2.js +85 -0
  144. package/lib/primitives/SelectorButton2.js +96 -0
  145. package/lib/primitives/Spinner2.js +94 -0
  146. package/lib/primitives/StatusIcon2.js +126 -0
  147. package/lib/primitives/Swatch2.js +79 -0
  148. package/lib/primitives/Tooltip2.js +132 -0
  149. package/lib/primitives/Typography2.js +97 -0
  150. package/lib/primitives/formatCountdown.js +54 -0
  151. package/lib/primitives/formatElapsed.js +63 -0
  152. package/lib/primitives/formatRelativeTime.js +64 -0
  153. package/lib/primitives/hotkey.js +94 -0
  154. package/lib/primitives/index.js +351 -0
  155. package/lib/primitives/maskValue.js +69 -0
  156. package/lib/style.css +1 -1
  157. package/lib/types/components/SocialLoginButton/SocialLoginButton.d.ts +10 -0
  158. package/lib/types/components/index.d.ts +2 -0
  159. package/lib/types/primitives/BrandIcon.d.ts +1 -1
  160. package/package.json +2 -1
package/AGENTS.md CHANGED
@@ -55,6 +55,7 @@ export function App() {
55
55
  | --- | --- |
56
56
  | 앱 뼈대 · 사이드바 · 상단 경로 | `AppShell` · `Sidebar` · `Breadcrumb` |
57
57
  | 버튼 · 아이콘 버튼 · 링크 | `Button`(`iconOnly` + `aria-label` + `Tooltip`) · `Link` |
58
+ | Google · Apple 로그인 | `SocialLoginButton`(`provider` · `action`) — 로고 · 브랜드 색을 직접 그리지 않는다 |
58
59
  | 콘텐츠 묶음 | `Card` + `CardHeader` / `CardBody` / `CardFooter` |
59
60
  | 사람 · 파일 · 설정 행 목록 | `List` + `ListItem`(`leading` · `trailing`) + `Avatar` / `IconTile` |
60
61
  | 폼 | `Field` + `Input` / `Textarea` / `Select` / `Combobox` / `Checkbox` / `Switch` / `DatePicker` |
package/agents/INDEX.md CHANGED
@@ -18,6 +18,7 @@
18
18
  - **SelectorButton** — 지금 선택된 것을 보여 주고 눌러서 바꾸는 조용한 버튼. → [`agents/selector-button/AGENTS.md`](selector-button/AGENTS.md)
19
19
  - **Link** — 글 속 링크. → [`agents/link/AGENTS.md`](link/AGENTS.md)
20
20
  - **ActionBar** — 상세 화면 · 검토 화면 아래에 붙는 동작 바. → [`agents/action-bar/AGENTS.md`](action-bar/AGENTS.md)
21
+ - **SocialLoginButton** — Google · Apple 계정으로 로그인하는 버튼. → [`agents/social-login-button/AGENTS.md`](social-login-button/AGENTS.md)
21
22
  - **Toolbar** — 버튼 · 토글 · ToggleGroup · 메뉴 트리거를 한 줄로 묶는 WAI-ARIA 툴바. → [`agents/toolbar/AGENTS.md`](toolbar/AGENTS.md)
22
23
 
23
24
  ## 라벨 & 배지
@@ -14,7 +14,7 @@ import { BrandIcon, BRAND_NAMES } from '@iamfiro/design'
14
14
 
15
15
  | prop | 타입 | 기본값 | 설명 |
16
16
  | --- | --- | --- | --- |
17
- | `name` (필수) | `'gmail' \| 'slack' \| 'clickup' \| 'figma' \| 'github' \| 'hubspot' \| 'notion' \| 'google-calendar'` | | 앱. |
17
+ | `name` (필수) | `'gmail' \| 'slack' \| 'clickup' \| 'figma' \| 'github' \| 'hubspot' \| 'notion' \| 'google-calendar' \| 'google' \| 'apple'` | | 앱. |
18
18
  | `size` | `number` | `18` | 가로·세로(px). |
19
19
  | `title` | `string` | | 접근성 이름. 없으면 장식으로 취급해요(옆에 글자가 있을 때). |
20
20
  | `className` | `string` | | svg에 붙일 클래스. |
@@ -25,7 +25,7 @@ import { BrandIcon, BRAND_NAMES } from '@iamfiro/design'
25
25
 
26
26
  ### 로고 목록
27
27
 
28
- 지금 들어 있는 로고 8개(Gmail, Slack, ClickUp, Figma, GitHub, HubSpot, Notion, Google Calendar). 새 앱은 BrandIcon.tsx의 MARKS에 추가해요.
28
+ 지금 들어 있는 로고 10개(Gmail, Slack, ClickUp, Figma, GitHub, HubSpot, Notion, Google Calendar, Google, Apple). Apple은 한 색 로고라 글자색을 따라요. 새 앱은 BrandIcon.tsx의 MARKS에 추가해요.
29
29
 
30
30
  ```tsx
31
31
  import { BRAND_NAMES, BrandIcon, Inline, Stack, Text } from '@iamfiro/design'
@@ -0,0 +1,156 @@
1
+ # SocialLoginButton
2
+
3
+ > 버튼 & 링크 · `@iamfiro/design` · 직접 만들지 말고 이 컴포넌트를 쓴다.
4
+
5
+ Google · Apple 계정으로 로그인하는 버튼. 각 브랜드 가이드대로 Google은 흰 바탕 + 옅은 윤곽 + 색 G 로고, Apple은 검정 바탕 + 흰 로고예요. 문구는 action으로 고르고, 나머지 props는 Button과 같아요.
6
+
7
+ ```tsx
8
+ import { SocialLoginButton } from '@iamfiro/design'
9
+ ```
10
+
11
+ ## API
12
+
13
+ ### SocialLoginButton
14
+
15
+ variant · icon은 provider가 정해요. 나머지 props(size · block · loading · disabled · onClick…)는 Button에 그대로 전달돼요.
16
+
17
+ | prop | 타입 | 기본값 | 설명 |
18
+ | --- | --- | --- | --- |
19
+ | `provider` (필수) | `'google' \| 'apple'` | | 로그인 제공자. 색 · 로고 · 이름이 정해져요. |
20
+ | `action` | `'continue' \| 'signin' \| 'signup'` | `'continue'` | "Google로 계속하기" · "Google로 로그인" · "Google로 가입하기". |
21
+ | `children` | `ReactNode` | | 문구를 직접 바꿀 때. |
22
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | 높이 28 / 34 / 40px. 로고는 14 / 16 / 18px. |
23
+ | `iconOnly` | `boolean` | | 로고만 보이는 정사각형 버튼. aria-label은 문구로 붙어요. |
24
+ | `block` | `boolean` | | 너비 100%. |
25
+ | `loading` | `boolean` | | 로고 자리에 스피너, 클릭 막음. 인증 창으로 넘어가는 동안 써요. |
26
+
27
+ ## 예제
28
+
29
+ 예제를 감싼 `style={{ ... }}` div는 미리보기 배치용이다. 실제 화면 배치는 `Stack` · `Inline` · `Grid`로 한다.
30
+
31
+ ### 기본
32
+
33
+ 로그인 화면에선 block으로 폭을 채워 위아래로 쌓아요. 순서는 보통 Google → Apple.
34
+
35
+ ```tsx
36
+ import { SocialLoginButton, Stack } from '@iamfiro/design'
37
+
38
+ export default function Example() {
39
+ return (
40
+ <Stack gap={2} style={{ width: 320 }}>
41
+ <SocialLoginButton provider="google" size="lg" block />
42
+ <SocialLoginButton provider="apple" size="lg" block />
43
+ </Stack>
44
+ )
45
+ }
46
+ ```
47
+
48
+ ### 문구
49
+
50
+ action='continue'(기본) · 'signin' · 'signup'. 로그인과 가입을 한 화면에서 받으면 continue를 써요.
51
+
52
+ ```tsx
53
+ import { SocialLoginButton, Inline, Stack } from '@iamfiro/design'
54
+
55
+ export default function Example() {
56
+ return (
57
+ <Stack gap={3}>
58
+ <Inline gap={2}>
59
+ <SocialLoginButton provider="google" action="continue" />
60
+ <SocialLoginButton provider="google" action="signin" />
61
+ <SocialLoginButton provider="google" action="signup" />
62
+ </Inline>
63
+ <Inline gap={2}>
64
+ <SocialLoginButton provider="apple" action="continue" />
65
+ <SocialLoginButton provider="apple" action="signin" />
66
+ <SocialLoginButton provider="apple" action="signup" />
67
+ </Inline>
68
+ </Stack>
69
+ )
70
+ }
71
+ ```
72
+
73
+ ### 크기 · 아이콘만
74
+
75
+ sm · md · lg는 Button과 같은 높이. iconOnly면 로고만 보이고 aria-label은 문구로 자동으로 붙어요.
76
+
77
+ ```tsx
78
+ import { SocialLoginButton, Inline, Stack } from '@iamfiro/design'
79
+
80
+ export default function Example() {
81
+ return (
82
+ <Stack gap={3}>
83
+ <Inline gap={2}>
84
+ <SocialLoginButton provider="google" size="sm" />
85
+ <SocialLoginButton provider="google" />
86
+ <SocialLoginButton provider="google" size="lg" />
87
+ </Inline>
88
+ <Inline gap={2}>
89
+ <SocialLoginButton provider="google" iconOnly />
90
+ <SocialLoginButton provider="apple" iconOnly />
91
+ <SocialLoginButton provider="google" size="lg" iconOnly />
92
+ <SocialLoginButton provider="apple" size="lg" iconOnly />
93
+ </Inline>
94
+ </Stack>
95
+ )
96
+ }
97
+ ```
98
+
99
+ ### 로그인 카드
100
+
101
+ Card 안에 소셜 버튼 → "또는" Separator → 이메일 입력. 누르면 loading으로 잠가 두 번 눌리지 않게 해요.
102
+
103
+ ```tsx
104
+ import { useState } from 'react'
105
+ import { Card, CardBody, CardHeader, SocialLoginButton, type SocialProvider, Button, Field, Input, Separator, Stack, Text } from '@iamfiro/design'
106
+
107
+ export default function Example() {
108
+ const [pending, setPending] = useState<SocialProvider | null>(null)
109
+
110
+ // 실제 앱에선 여기서 OAuth 창으로 넘어가요. 예제는 2초 뒤 풀어요.
111
+ const signIn = (provider: SocialProvider) => {
112
+ setPending(provider)
113
+ window.setTimeout(() => setPending(null), 2000)
114
+ }
115
+
116
+ return (
117
+ <Card style={{ width: 360 }}>
118
+ <CardHeader title="Lumen에 로그인" description="팀 워크스페이스로 계속하려면 로그인하세요." />
119
+ <CardBody>
120
+ <Stack gap={4}>
121
+ <Stack gap={2}>
122
+ <SocialLoginButton
123
+ provider="google"
124
+ size="lg"
125
+ block
126
+ loading={pending === 'google'}
127
+ disabled={pending !== null}
128
+ onClick={() => signIn('google')}
129
+ />
130
+ <SocialLoginButton
131
+ provider="apple"
132
+ size="lg"
133
+ block
134
+ loading={pending === 'apple'}
135
+ disabled={pending !== null}
136
+ onClick={() => signIn('apple')}
137
+ />
138
+ </Stack>
139
+ <Separator label="또는" />
140
+ <Stack gap={3}>
141
+ <Field label="이메일" htmlFor="login-email">
142
+ <Input id="login-email" type="email" placeholder="minji@lumen.co" />
143
+ </Field>
144
+ <Button variant="secondary" size="lg" block>
145
+ 이메일로 계속하기
146
+ </Button>
147
+ </Stack>
148
+ <Text variant="caption" tone="secondary">
149
+ 계속하면 서비스 약관과 개인정보 처리방침에 동의하게 돼요.
150
+ </Text>
151
+ </Stack>
152
+ </CardBody>
153
+ </Card>
154
+ )
155
+ }
156
+ ```
@@ -0,0 +1,135 @@
1
+ "use client";
2
+ const e = c;
3
+ (function(e, t) {
4
+ let n = c, r = e();
5
+ for (;;) try {
6
+ if (-parseInt(n(306)) / 1 * (-parseInt(n(311)) / 2) + -parseInt(n(294)) / 3 * (parseInt(n(282)) / 4) + -parseInt(n(310)) / 5 * (-parseInt(n(287)) / 6) + -parseInt(n(297)) / 7 * (parseInt(n(305)) / 8) + parseInt(n(293)) / 9 + -parseInt(n(295)) / 10 * (-parseInt(n(292)) / 11) + -parseInt(n(285)) / 12 == t) break;
7
+ r.push(r.shift());
8
+ } catch {
9
+ r.push(r.shift());
10
+ }
11
+ })(g, 693264);
12
+ import { useControllableState as t } from "../../hooks/useControllableState.js";
13
+ import { cx as n } from "../../primitives/index.js";
14
+ import { useSelection as r } from "../../hooks/useSelection.js";
15
+ /* empty css */
16
+ import { createContext as i, useContext as a, useId as o, useRef as s } from "react";
17
+ function c(e, t) {
18
+ e -= 272;
19
+ let n = g(), r = n[e];
20
+ c.wgdSiw === void 0 && (c.yTHQDg = function(e) {
21
+ let t = "", n = "";
22
+ for (let n = 0, r, i, a = 0; i = e.charAt(a++); ~i && (r = n % 4 ? r * 64 + i : i, n++ % 4) && (t += String.fromCharCode(255 & r >> (-2 * n & 6)))) i = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=".indexOf(i);
23
+ for (let e = 0, r = t.length; e < r; e++) n += "%" + ("00" + t.charCodeAt(e).toString(16)).slice(-2);
24
+ return decodeURIComponent(n);
25
+ }, c.fLGrYU = {}, c.wgdSiw = !0);
26
+ let i = n[0];
27
+ c.XsACOT !== i && (c.fLGrYU = {}, c.XsACOT = i);
28
+ let a = c.fLGrYU[e];
29
+ return a === void 0 ? (r = c.yTHQDg(r), c.fLGrYU[e] = r) : r = a, r;
30
+ }
31
+ import { ChevronDown as l } from "lucide-react";
32
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
33
+ function f({ open: e, defaultOpen: n = !1, onOpenChange: r, ...i }) {
34
+ let [a, o] = t(e, n, r);
35
+ return u(p, {
36
+ ...i,
37
+ open: a,
38
+ onToggle: () => o(!a)
39
+ });
40
+ }
41
+ function p({ label: e, description: t, icon: r, disabled: i, open: a, onToggle: s, children: f, variant: p = "default", iconTone: m = "default", className: h }) {
42
+ let g = c, _ = o(), v = p === "inline" ? "div" : "h3";
43
+ return d(g(301), {
44
+ className: n(g(314), p === g(317) && g(298), h),
45
+ "data-open": a || void 0,
46
+ "data-disabled": i || void 0,
47
+ children: [u(v, {
48
+ className: g(307),
49
+ children: d("button", {
50
+ type: g(283),
51
+ id: _ + g(309),
52
+ "aria-expanded": a,
53
+ "aria-controls": _ + g(284),
54
+ disabled: i,
55
+ className: g(308),
56
+ onClick: s,
57
+ children: [
58
+ r && u("span", {
59
+ className: g(280),
60
+ "data-tone": m === g(286) ? void 0 : m,
61
+ children: r
62
+ }),
63
+ d(g(304), {
64
+ className: g(279),
65
+ children: [u("span", {
66
+ className: g(288),
67
+ children: e
68
+ }), t && u("span", {
69
+ className: "ds-disclosure__desc",
70
+ children: t
71
+ })]
72
+ }),
73
+ u(l, {
74
+ className: g(312),
75
+ "aria-hidden": !0
76
+ })
77
+ ]
78
+ })
79
+ }), u(g(301), {
80
+ id: _ + g(284),
81
+ role: g(278),
82
+ "aria-labelledby": _ + "-trigger",
83
+ className: g(291),
84
+ inert: !a || void 0,
85
+ children: u("div", {
86
+ className: g(290),
87
+ children: u(g(301), {
88
+ className: g(296),
89
+ children: f
90
+ })
91
+ })
92
+ })]
93
+ });
94
+ }
95
+ var m = i(null);
96
+ function h({ variant: t = e(299), children: i, className: a, style: o, ...l }) {
97
+ let d = e, f = r(l), p = s(null);
98
+ return u(m[d(289)], {
99
+ value: {
100
+ isOpen: f[d(300)],
101
+ toggle: f[d(273)]
102
+ },
103
+ children: u("div", {
104
+ ref: p,
105
+ className: n("ds-accordion", d(313) + t, a),
106
+ style: o,
107
+ onKeyDown: (e) => {
108
+ let t = c, n = [...p[t(303)]?.[t(281)](".ds-disclosure__trigger:not(:disabled)") ?? []].filter((e) => e[t(275)](".ds-accordion") === p[t(303)]), r = n[t(302)](document.activeElement);
109
+ if (r < 0) return;
110
+ let i;
111
+ e.key === "ArrowDown" ? i = n[(r + 1) % n[t(277)]] : e[t(315)] === t(276) ? i = n[(r - 1 + n[t(277)]) % n.length] : e[t(315)] === t(272) ? i = n[0] : e[t(315)] === "End" && (i = n[n[t(277)] - 1]), i && (e.preventDefault(), i[t(274)]());
112
+ },
113
+ children: i
114
+ })
115
+ });
116
+ }
117
+ function g() {
118
+ let e = /* @__PURE__ */ "mM1vvhvXEa.zhmTzgLZy2XVC3vYzv9Fy2HLDNjVBG.zhmTywnJB3jKAw9Uls0.zhmTzgLZy2XVC3vYzq.A2v5.qwnJB3jKAw9UsxrLBsbTDxn0igjLihvZzwqGAw5ZAwrLidXby2nVCMrPB24+.Aw5SAw5L.sg9Tzq.Dg9Nz2XL.zM9JDxm.y2XVC2vZDa.qxjYB3DvCa.BgvUz3rO.CMvNAw9U.zhmTzgLZy2XVC3vYzv9FDgv4Da.zhmTzgLZy2XVC3vYzv9FAwnVBG.CxvLCNLtzwXLy3rVCKfSBa.mJu2yuH4EM11.yNv0Dg9U.lxjLz2LVBG.nJCYmte0menPDMz2tG.zgvMyxvSDa.otqYBeLQuK9u.zhmTzgLZy2XVC3vYzv9FBgfIzwW.uhjVDMLKzxi.zhmTzgLZy2XVC3vYzv9FAw5Uzxi.zhmTzgLZy2XVC3vYzv9FzM9Sza.otm1rfLpvKXq.ntaYoti4muHpC2DAyq.mJuZndrYwKroq3y.mtiYmJCWDgTsvw5p.zhmTzgLZy2XVC3vYzv9Fy29UDgvUDa.mtK0nJyWowzPrwflwG.zhmTzgLZy2XVC3vYzs0TAw5SAw5L.CgXHAw4.AxntzwXLy3rLza.zgL2.Aw5KzxHpzG.y3vYCMvUDa.C3bHBG.mJrmwfHUD1y.odKWm3bMrwnzvW.zhmTzgLZy2XVC3vYzv9FAgvHzgLUzW.zhmTzgLZy2XVC3vYzv9FDhjPz2DLCG.lxrYAwDNzxi.mZi1mJvkteXgzhO".split(".");
119
+ return g = function() {
120
+ return e;
121
+ }, g();
122
+ }
123
+ function _({ value: t, title: n, flush: r, ...i }) {
124
+ let o = e, s = a(m);
125
+ if (!s) throw Error(o(316));
126
+ return u(p, {
127
+ ...i,
128
+ className: r ? "ds-disclosure--flush" : void 0,
129
+ label: n,
130
+ open: s.isOpen(t),
131
+ onToggle: () => s[o(273)](t)
132
+ });
133
+ }
134
+ h.Item = _;
135
+ export { h as Accordion, _ as AccordionItem, f as Collapsible };
@@ -0,0 +1,66 @@
1
+ "use client";
2
+ var e = n;
3
+ (function(e, t) {
4
+ for (var r = n, i = e();;) try {
5
+ if (parseInt(r(273)) / 1 * (-parseInt(r(267)) / 2) + parseInt(r(270)) / 3 + -parseInt(r(266)) / 4 + -parseInt(r(274)) / 5 * (-parseInt(r(262)) / 6) + parseInt(r(264)) / 7 * (parseInt(r(272)) / 8) + parseInt(r(269)) / 9 * (-parseInt(r(271)) / 10) + parseInt(r(260)) / 11 == t) break;
6
+ i.push(i.shift());
7
+ } catch {
8
+ i.push(i.shift());
9
+ }
10
+ })(r, 361033);
11
+ import { cx as t } from "../../primitives/index.js";
12
+ function n(e, t) {
13
+ e -= 258;
14
+ var i = r(), a = i[e];
15
+ n.cnnNfB === void 0 && (n.JIdoDC = function(e) {
16
+ for (var t = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=", n = "", r = "", i = 0, a, o, s = 0; o = e.charAt(s++); ~o && (a = i % 4 ? a * 64 + o : o, i++ % 4) && (n += String.fromCharCode(255 & a >> (-2 * i & 6)))) o = t.indexOf(o);
17
+ for (var c = 0, l = n.length; c < l; c++) r += "%" + ("00" + n.charCodeAt(c).toString(16)).slice(-2);
18
+ return decodeURIComponent(r);
19
+ }, n.BbmDXR = {}, n.cnnNfB = !0);
20
+ var o = i[0];
21
+ n.DiysCn !== o && (n.BbmDXR = {}, n.DiysCn = o);
22
+ var s = n.BbmDXR[e];
23
+ return s === void 0 ? (a = n.JIdoDC(a), n.BbmDXR[e] = a) : a = s, a;
24
+ }
25
+ function r() {
26
+ var e = [
27
+ "ndy5vhvOzwnm",
28
+ "zhmTywn0Aw9UlwjHCI0T",
29
+ "mtK0mdu4mfvuEe9bDG",
30
+ "mJyZofzLAufeDq",
31
+ "zhmTywn0Aw9UlwjHCI0TC3rPy2T5",
32
+ "nZaXnZiXwuDIs3vn",
33
+ "mtq0ode0oenuwNvNCa",
34
+ "mZb1rNb5v20",
35
+ "nZG4nZjpC0fuAwW",
36
+ "ntiZBNvkDK15",
37
+ "nwzPzenzsW",
38
+ "zgL2",
39
+ "zhmTywn0Aw9UlwjHCL9Fz3jVDxa",
40
+ "mZi1mdqZnhjVyLnKuG",
41
+ "y2vUDgvY",
42
+ "mtK4nJK1ngLbrMv6rq",
43
+ "zMLLBgrZzxq"
44
+ ];
45
+ return r = function() {
46
+ return e;
47
+ }, r();
48
+ }
49
+ /* empty css */
50
+ import { jsx as i } from "react/jsx-runtime";
51
+ function a({ children: n, align: r = e(261), sticky: a = !0, pending: o, "aria-label": s, className: c, style: l }) {
52
+ var u = e;
53
+ return i(u(258), {
54
+ className: t("ds-action-bar", u(265) + r, a && u(268), c),
55
+ "data-pending": o || void 0,
56
+ style: l,
57
+ children: i(u(263), {
58
+ className: u(259),
59
+ disabled: o,
60
+ "aria-label": s,
61
+ "aria-busy": o || void 0,
62
+ children: n
63
+ })
64
+ });
65
+ }
66
+ export { a as ActionBar };
@@ -0,0 +1,131 @@
1
+ "use client";
2
+ const e = i;
3
+ (function(e, t) {
4
+ let n = i, r = e();
5
+ for (;;) try {
6
+ if (-parseInt(n(418)) / 1 * (-parseInt(n(400)) / 2) + parseInt(n(398)) / 3 + parseInt(n(422)) / 4 * (-parseInt(n(393)) / 5) + parseInt(n(395)) / 6 + parseInt(n(403)) / 7 + parseInt(n(420)) / 8 * (-parseInt(n(396)) / 9) + -parseInt(n(407)) / 10 == t) break;
7
+ r.push(r.shift());
8
+ } catch {
9
+ r.push(r.shift());
10
+ }
11
+ })(f, 977308);
12
+ import { Button as t, cx as n } from "../../primitives/index.js";
13
+ /* empty css */
14
+ import { useState as r } from "react";
15
+ function i(e, t) {
16
+ e -= 391;
17
+ let n = f(), r = n[e];
18
+ i.nbTKfX === void 0 && (i.YBedFN = function(e) {
19
+ let t = "", n = "";
20
+ for (let n = 0, r, i, a = 0; i = e.charAt(a++); ~i && (r = n % 4 ? r * 64 + i : i, n++ % 4) && (t += String.fromCharCode(255 & r >> (-2 * n & 6)))) i = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=".indexOf(i);
21
+ for (let e = 0, r = t.length; e < r; e++) n += "%" + ("00" + t.charCodeAt(e).toString(16)).slice(-2);
22
+ return decodeURIComponent(n);
23
+ }, i.bOgwOD = {}, i.nbTKfX = !0);
24
+ let a = n[0];
25
+ i.uCBDsV !== a && (i.bOgwOD = {}, i.uCBDsV = a);
26
+ let o = i.bOgwOD[e];
27
+ return o === void 0 ? (r = i.YBedFN(r), i.bOgwOD[e] = r) : r = o, r;
28
+ }
29
+ import { AlertTriangle as a, CheckCircle2 as o, Info as s, X as c, XCircle as l } from "lucide-react";
30
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
31
+ function f() {
32
+ let e = /* @__PURE__ */ "zhmTywXLCNrFx2fJDgLVBNm.Aw5SAw5L.mteWnZu3otbht2r0sKK.ywXLCNq.C3rHy2TLza.z2HVC3q.zhmTyMfUBMvYls1MBhvZAa.zhmTywXLCNq.zgL2.zhmTyMfUBMvYx19Hy3rPB24.zhmTywXLCNqTlq.zhmTywXLCNrFx2nVBNrLBNq.C2v0vgLTzw91Da.mvP5tNjSwq.C3rHDhvZ.nZG0nZC2AwPlvhnM.zhmTywXLCNqTD3jHCa.ntm0otm2nhjzDhHkvG.zhmTywXLCNrFx3rPDgXL.67cW64siioUlQ+Q4Sa.C3bHBG.Aw5MBW.nwHJqKz6sW.zhmTywXLCNrFx2jVzhK.ntu4odGXnefcwxzTqq.nZj2wgf5AwC.zhmTyMfUBMvY.ndq3nZu3mKzmCw1Krq.zhmTywXLCNrFx2LJB24.odG2nJm0qK9fB1bZ.7jwm66A8ioUlQ+Q4Sa.zhmTywXLCNrFx2nSB3nL.otm3nZG1ohPbBwHSva.D2fYBMLUzW".split(".");
33
+ return f = function() {
34
+ return e;
35
+ }, f();
36
+ }
37
+ var p = {
38
+ neutral: u(s, {}),
39
+ info: u(s, {}),
40
+ success: u(o, {}),
41
+ warning: u(a, {}),
42
+ danger: u(l, {})
43
+ }, m = 260;
44
+ function h({ tone: a = e(392), title: o, children: s, icon: l, actions: f, onClose: h, layout: g = e(409), className: _ }) {
45
+ let v = e, [y, b] = r(!1);
46
+ return u(v(413), {
47
+ className: v(421),
48
+ "data-leaving": y || void 0,
49
+ children: d("div", {
50
+ role: a === "danger" || a === v(404) ? v(408) : v(419),
51
+ className: n(v(412), v(415) + a, "ds-alert--" + g, _),
52
+ children: [
53
+ l !== !1 && u(v(391), {
54
+ className: "ds-alert__icon",
55
+ children: l ?? p[a]
56
+ }),
57
+ d("div", {
58
+ className: v(416),
59
+ children: [
60
+ o && u("div", {
61
+ className: v(423),
62
+ children: o
63
+ }),
64
+ s && u(v(413), {
65
+ className: v(394),
66
+ children: s
67
+ }),
68
+ f && g === v(409) && u(v(413), {
69
+ className: v(405),
70
+ children: f
71
+ })
72
+ ]
73
+ }),
74
+ f && g === v(406) && u(v(413), {
75
+ className: "ds-alert__actions",
76
+ children: f
77
+ }),
78
+ h && u(t, {
79
+ iconOnly: !0,
80
+ variant: "ghost",
81
+ size: "sm",
82
+ icon: u(c, {}),
83
+ "aria-label": v(401),
84
+ className: v(402),
85
+ onClick: () => {
86
+ let e = i;
87
+ b(!0), window[e(417)](() => h?.(), m);
88
+ }
89
+ })
90
+ ]
91
+ })
92
+ });
93
+ }
94
+ function g({ tone: a = e(392), children: o, action: s, onClose: l, icon: f, flush: h, className: g }) {
95
+ let _ = e, [v, y] = r(!1);
96
+ return u("div", {
97
+ className: _(421),
98
+ "data-leaving": v || void 0,
99
+ children: d(_(413), {
100
+ role: _(419),
101
+ className: n(_(397), _(415) + a, h && _(411), g),
102
+ children: [
103
+ f !== !1 && u("span", {
104
+ className: _(399),
105
+ children: f ?? p[a]
106
+ }),
107
+ u("span", {
108
+ className: "ds-banner__text",
109
+ children: o
110
+ }),
111
+ s && u(_(391), {
112
+ className: _(414),
113
+ children: s
114
+ }),
115
+ l && u(t, {
116
+ iconOnly: !0,
117
+ variant: _(410),
118
+ size: "sm",
119
+ icon: u(c, {}),
120
+ "aria-label": _(424),
121
+ className: "ds-banner__close",
122
+ onClick: () => {
123
+ let e = i;
124
+ y(!0), window[e(417)](() => l?.(), m);
125
+ }
126
+ })
127
+ ]
128
+ })
129
+ });
130
+ }
131
+ export { h as Alert, g as Banner };
@@ -0,0 +1,94 @@
1
+ "use client";
2
+ function e(n, r) {
3
+ n -= 343;
4
+ let i = t(), a = i[n];
5
+ e.YxTQky === void 0 && (e.UToKZm = function(e) {
6
+ let t = "", n = "";
7
+ for (let n = 0, r, i, a = 0; i = e.charAt(a++); ~i && (r = n % 4 ? r * 64 + i : i, n++ % 4) && (t += String.fromCharCode(255 & r >> (-2 * n & 6)))) i = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=".indexOf(i);
8
+ for (let e = 0, r = t.length; e < r; e++) n += "%" + ("00" + t.charCodeAt(e).toString(16)).slice(-2);
9
+ return decodeURIComponent(n);
10
+ }, e.rQRdQd = {}, e.YxTQky = !0);
11
+ let o = i[0];
12
+ e.sxZRsv !== o && (e.rQRdQd = {}, e.sxZRsv = o);
13
+ let s = e.rQRdQd[n];
14
+ return s === void 0 ? (a = e.UToKZm(a), e.rQRdQd[n] = a) : a = s, a;
15
+ }
16
+ function t() {
17
+ let e = /* @__PURE__ */ "A2v5.zhmTC2HLBgWTlq.zhmTC2HLBgWTlwfZAwrL.yxnPzgu.A2v5zg93BG.zhmTC2HLBgXFx21HAw4.odiWmejzq2nmBa.mJqZnZy5rercDwjZ.zhmTC2HLBgXFx2HLywrLCG.nJC5nunPteDZCG.mtmZnJG5mgLqA3z6wG.CgXHAw4.mZq0nZmWzfvtDe5P.Aw5Zzxq.mtCWnJu5nLHnELzUEG.zhmTC2HLBgXFx2nVBNrLBNq.zhmTC2nYB2XS.CMvTB3zLrxzLBNrmAxn0zw5LCG.y3vYCMvUDa.nJGWmdG4AK5eD1vk.nwjNA0PgEa.zgL2.rxnJyxbL.zhmTC2HLBgXFx3nJCMLT.zhmTC2HLBgXFx3nPzgvIyxi.odm5nZqXCw9rrLnK.C2nYB2XSvg8.zhmTC2HLBgXFx2fZAwrLlwLUBMvYigrZlxnJCM9SBa".split(".");
18
+ return t = function() {
19
+ return e;
20
+ }, t();
21
+ }
22
+ const n = e;
23
+ (function(t, n) {
24
+ let r = e, i = t();
25
+ for (;;) try {
26
+ if (parseInt(r(351)) / 1 + -parseInt(r(356)) / 2 + parseInt(r(363)) / 3 + parseInt(r(358)) / 4 * (parseInt(r(364)) / 5) + parseInt(r(354)) / 6 + parseInt(r(369)) / 7 + parseInt(r(350)) / 8 * (-parseInt(r(353)) / 9) == n) break;
27
+ i.push(i.shift());
28
+ } catch {
29
+ i.push(i.shift());
30
+ }
31
+ })(t, 293652);
32
+ import { cx as r } from "../../primitives/index.js";
33
+ /* empty css */
34
+ import { useEffect as i, useRef as a } from "react";
35
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
36
+ function c({ sidebar: t, header: c, children: l, variant: u = n(355), sidebarWidth: d = 264, sidebarCollapsed: f = !1, mobileSidebarOpen: p = !1, onMobileSidebarOpenChange: m, aside: h, asideWidth: g = 320, asideOpen: _ = !0, asideLabel: v = "패널", scrollKey: y, className: b }) {
37
+ let x = n, S = a(null);
38
+ i(() => {
39
+ let t = e;
40
+ if (!p) return;
41
+ let n = (e) => e[t(344)] === t(366) && m?.(!1);
42
+ return document.addEventListener(t(348), n), () => document[t(361)]("keydown", n);
43
+ }, [p, m]);
44
+ let C = a(!0);
45
+ return i(() => {
46
+ let t = e;
47
+ C[t(362)] ? C.current = !1 : u === t(357) ? S[t(362)]?.[t(370)]({ top: 0 }) : window.scrollTo({ top: 0 });
48
+ }, [y, u]), s(x(365), {
49
+ className: r("ds-shell", x(345) + u, h != null && x(346), b),
50
+ "data-drawer-open": p || void 0,
51
+ "data-sidebar-collapsed": f || void 0,
52
+ "data-aside-open": h != null && _ || void 0,
53
+ style: {
54
+ "--_sidebar": d + "px",
55
+ "--_aside": g + "px"
56
+ },
57
+ children: [
58
+ o(x(365), {
59
+ className: x(368),
60
+ inert: f && !p ? !0 : void 0,
61
+ children: o("div", {
62
+ className: "ds-shell__sidebar-inner",
63
+ children: t
64
+ })
65
+ }),
66
+ o("div", {
67
+ className: x(367),
68
+ "aria-hidden": !0,
69
+ onClick: () => m?.(!1)
70
+ }),
71
+ s(x(365), {
72
+ ref: S,
73
+ className: r(x(349), u === x(357) && x(360)),
74
+ children: [c && o("header", {
75
+ className: x(352),
76
+ children: c
77
+ }), o("main", {
78
+ className: x(359),
79
+ children: l
80
+ })]
81
+ }),
82
+ h != null && o(x(347), {
83
+ className: "ds-shell__aside",
84
+ "aria-label": v,
85
+ inert: !_ || void 0,
86
+ children: o(x(365), {
87
+ className: x(343),
88
+ children: h
89
+ })
90
+ })
91
+ ]
92
+ });
93
+ }
94
+ export { c as AppShell };
@@ -0,0 +1,59 @@
1
+ "use client";
2
+ function e() {
3
+ var t = [
4
+ "oeHwAgHjtW",
5
+ "zhmTyxjLys1JAgfYDa",
6
+ "mtbOwMf0tMW",
7
+ "ndC4ntmWouPqse1jDG",
8
+ "mJeYndy1uMviv1LA",
9
+ "mZjSC01TDuO",
10
+ "mtu1nJK2mvjMu2LgsG",
11
+ "zgvMyxvSDa",
12
+ "mtC4qKf5D0LX",
13
+ "nZeWnZC3mxDOwMTUDq",
14
+ "odmYndK0C3npAfvn",
15
+ "mJa0ntfxy1rOs2K",
16
+ "z3jHzgLLBNq",
17
+ "7jIb7jETioYWQo2kUa",
18
+ "mJCYmJqZsgzvzhzg"
19
+ ];
20
+ return e = function() {
21
+ return t;
22
+ }, e();
23
+ }
24
+ var t = i;
25
+ (function(e, t) {
26
+ for (var n = i, r = e();;) try {
27
+ if (parseInt(n(424)) / 1 + parseInt(n(433)) / 2 * (parseInt(n(421)) / 3) + -parseInt(n(430)) / 4 * (parseInt(n(429)) / 5) + parseInt(n(435)) / 6 + -parseInt(n(431)) / 7 * (parseInt(n(425)) / 8) + -parseInt(n(428)) / 9 * (-parseInt(n(427)) / 10) + -parseInt(n(434)) / 11 == t) break;
28
+ r.push(r.shift());
29
+ } catch {
30
+ r.push(r.shift());
31
+ }
32
+ })(e, 340878);
33
+ import { cx as n } from "../../primitives/index.js";
34
+ import { LineChart as r } from "../LineChart/LineChart2.js";
35
+ function i(t, n) {
36
+ t -= 421;
37
+ var r = e(), a = r[t];
38
+ i.bDGNpM === void 0 && (i.DUUSKg = function(e) {
39
+ for (var t = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=", n = "", r = "", i = 0, a, o, s = 0; o = e.charAt(s++); ~o && (a = i % 4 ? a * 64 + o : o, i++ % 4) && (n += String.fromCharCode(255 & a >> (-2 * i & 6)))) o = t.indexOf(o);
40
+ for (var c = 0, l = n.length; c < l; c++) r += "%" + ("00" + n.charCodeAt(c).toString(16)).slice(-2);
41
+ return decodeURIComponent(r);
42
+ }, i.QZyBRK = {}, i.bDGNpM = !0);
43
+ var o = r[0];
44
+ i.mfQywK !== o && (i.QZyBRK = {}, i.mfQywK = o);
45
+ var s = i.QZyBRK[t];
46
+ return s === void 0 ? (a = i.DUUSKg(a), i.QZyBRK[t] = a) : a = s, a;
47
+ }
48
+ import { jsx as a } from "react/jsx-runtime";
49
+ function o({ type: e = t(432), fill: i = t(422), "aria-label": o = t(423), className: s, ...c }) {
50
+ var l = t;
51
+ return a(r, {
52
+ ...c,
53
+ area: i,
54
+ stack: e === "default" ? void 0 : e,
55
+ "aria-label": o,
56
+ className: n(l(426), s)
57
+ });
58
+ }
59
+ export { o as AreaChart };