@fangxinyan/lumina 0.1.0

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 (319) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +110 -0
  3. package/dist/Accordion-GSBY5T5U.css +38 -0
  4. package/dist/Accordion.cjs +13 -0
  5. package/dist/Accordion.cjs.map +1 -0
  6. package/dist/Accordion.d.cts +21 -0
  7. package/dist/Accordion.d.ts +21 -0
  8. package/dist/Accordion.js +4 -0
  9. package/dist/Accordion.js.map +1 -0
  10. package/dist/Alert-LSKBYDRI.css +35 -0
  11. package/dist/Alert.cjs +13 -0
  12. package/dist/Alert.cjs.map +1 -0
  13. package/dist/Alert.d.cts +17 -0
  14. package/dist/Alert.d.ts +17 -0
  15. package/dist/Alert.js +4 -0
  16. package/dist/Alert.js.map +1 -0
  17. package/dist/AppShell-RCALXUCZ.css +162 -0
  18. package/dist/AppShell.cjs +24 -0
  19. package/dist/AppShell.cjs.map +1 -0
  20. package/dist/AppShell.d.cts +68 -0
  21. package/dist/AppShell.d.ts +68 -0
  22. package/dist/AppShell.js +3 -0
  23. package/dist/AppShell.js.map +1 -0
  24. package/dist/Avatar-OXDSG5Q6.css +36 -0
  25. package/dist/Avatar.cjs +12 -0
  26. package/dist/Avatar.cjs.map +1 -0
  27. package/dist/Avatar.d.cts +15 -0
  28. package/dist/Avatar.d.ts +15 -0
  29. package/dist/Avatar.js +3 -0
  30. package/dist/Avatar.js.map +1 -0
  31. package/dist/Button-5UI7QXGU.css +96 -0
  32. package/dist/Button.cjs +17 -0
  33. package/dist/Button.cjs.map +1 -0
  34. package/dist/Button.d.cts +41 -0
  35. package/dist/Button.d.ts +41 -0
  36. package/dist/Button.js +4 -0
  37. package/dist/Button.js.map +1 -0
  38. package/dist/Calendar-LHZELUDL.css +65 -0
  39. package/dist/Calendar.cjs +13 -0
  40. package/dist/Calendar.cjs.map +1 -0
  41. package/dist/Calendar.d.cts +16 -0
  42. package/dist/Calendar.d.ts +16 -0
  43. package/dist/Calendar.js +4 -0
  44. package/dist/Calendar.js.map +1 -0
  45. package/dist/Card-2CHHFD4Y.css +28 -0
  46. package/dist/Card.cjs +16 -0
  47. package/dist/Card.cjs.map +1 -0
  48. package/dist/Card.d.cts +25 -0
  49. package/dist/Card.d.ts +25 -0
  50. package/dist/Card.js +3 -0
  51. package/dist/Card.js.map +1 -0
  52. package/dist/Cascader-TO2QMSLJ.css +76 -0
  53. package/dist/Cascader.cjs +13 -0
  54. package/dist/Cascader.cjs.map +1 -0
  55. package/dist/Cascader.d.cts +23 -0
  56. package/dist/Cascader.d.ts +23 -0
  57. package/dist/Cascader.js +4 -0
  58. package/dist/Cascader.js.map +1 -0
  59. package/dist/Checkbox-SKJATVSN.css +72 -0
  60. package/dist/Checkbox.cjs +17 -0
  61. package/dist/Checkbox.cjs.map +1 -0
  62. package/dist/Checkbox.d.cts +33 -0
  63. package/dist/Checkbox.d.ts +33 -0
  64. package/dist/Checkbox.js +4 -0
  65. package/dist/Checkbox.js.map +1 -0
  66. package/dist/Divider-Z37INS5E.css +49 -0
  67. package/dist/Divider.cjs +12 -0
  68. package/dist/Divider.cjs.map +1 -0
  69. package/dist/Divider.d.cts +12 -0
  70. package/dist/Divider.d.ts +12 -0
  71. package/dist/Divider.js +3 -0
  72. package/dist/Divider.js.map +1 -0
  73. package/dist/Empty-VM23UNLQ.css +138 -0
  74. package/dist/Empty.cjs +20 -0
  75. package/dist/Empty.cjs.map +1 -0
  76. package/dist/Empty.d.cts +37 -0
  77. package/dist/Empty.d.ts +37 -0
  78. package/dist/Empty.js +3 -0
  79. package/dist/Empty.js.map +1 -0
  80. package/dist/Icon.cjs +16 -0
  81. package/dist/Icon.cjs.map +1 -0
  82. package/dist/Icon.d.cts +21 -0
  83. package/dist/Icon.d.ts +21 -0
  84. package/dist/Icon.js +3 -0
  85. package/dist/Icon.js.map +1 -0
  86. package/dist/Image-WYWORJT4.css +106 -0
  87. package/dist/Image.cjs +17 -0
  88. package/dist/Image.cjs.map +1 -0
  89. package/dist/Image.d.cts +30 -0
  90. package/dist/Image.d.ts +30 -0
  91. package/dist/Image.js +4 -0
  92. package/dist/Image.js.map +1 -0
  93. package/dist/Input-Z526ARZP.css +66 -0
  94. package/dist/Input.cjs +17 -0
  95. package/dist/Input.cjs.map +1 -0
  96. package/dist/Input.d.cts +36 -0
  97. package/dist/Input.d.ts +36 -0
  98. package/dist/Input.js +4 -0
  99. package/dist/Input.js.map +1 -0
  100. package/dist/List-W5BW4D2P.css +26 -0
  101. package/dist/List.cjs +12 -0
  102. package/dist/List.cjs.map +1 -0
  103. package/dist/List.d.cts +20 -0
  104. package/dist/List.d.ts +20 -0
  105. package/dist/List.js +3 -0
  106. package/dist/List.js.map +1 -0
  107. package/dist/Modal-AYKNIWWQ.css +79 -0
  108. package/dist/Modal.cjs +18 -0
  109. package/dist/Modal.cjs.map +1 -0
  110. package/dist/Modal.d.cts +27 -0
  111. package/dist/Modal.d.ts +27 -0
  112. package/dist/Modal.js +5 -0
  113. package/dist/Modal.js.map +1 -0
  114. package/dist/Pagination-6FFOI4NM.css +35 -0
  115. package/dist/Pagination.cjs +13 -0
  116. package/dist/Pagination.cjs.map +1 -0
  117. package/dist/Pagination.d.cts +19 -0
  118. package/dist/Pagination.d.ts +19 -0
  119. package/dist/Pagination.js +4 -0
  120. package/dist/Pagination.js.map +1 -0
  121. package/dist/Popover-WXEVUYBG.css +15 -0
  122. package/dist/Popover.cjs +12 -0
  123. package/dist/Popover.cjs.map +1 -0
  124. package/dist/Popover.d.cts +16 -0
  125. package/dist/Popover.d.ts +16 -0
  126. package/dist/Popover.js +3 -0
  127. package/dist/Popover.js.map +1 -0
  128. package/dist/Progress-IXRSO5TW.css +63 -0
  129. package/dist/Progress.cjs +16 -0
  130. package/dist/Progress.cjs.map +1 -0
  131. package/dist/Progress.d.cts +26 -0
  132. package/dist/Progress.d.ts +26 -0
  133. package/dist/Progress.js +3 -0
  134. package/dist/Progress.js.map +1 -0
  135. package/dist/Select-DDJJBQEL.css +263 -0
  136. package/dist/Select.cjs +14 -0
  137. package/dist/Select.cjs.map +1 -0
  138. package/dist/Select.d.cts +68 -0
  139. package/dist/Select.d.ts +68 -0
  140. package/dist/Select.js +5 -0
  141. package/dist/Select.js.map +1 -0
  142. package/dist/Slider-RE4HZQKF.css +59 -0
  143. package/dist/Slider.cjs +12 -0
  144. package/dist/Slider.cjs.map +1 -0
  145. package/dist/Slider.d.cts +18 -0
  146. package/dist/Slider.d.ts +18 -0
  147. package/dist/Slider.js +3 -0
  148. package/dist/Slider.js.map +1 -0
  149. package/dist/Switch-NP7KKJOX.css +44 -0
  150. package/dist/Switch.cjs +12 -0
  151. package/dist/Switch.cjs.map +1 -0
  152. package/dist/Switch.d.cts +18 -0
  153. package/dist/Switch.d.ts +18 -0
  154. package/dist/Switch.js +3 -0
  155. package/dist/Switch.js.map +1 -0
  156. package/dist/Table-ZDPGWLH3.css +139 -0
  157. package/dist/Table.cjs +18 -0
  158. package/dist/Table.cjs.map +1 -0
  159. package/dist/Table.d.cts +57 -0
  160. package/dist/Table.d.ts +57 -0
  161. package/dist/Table.js +5 -0
  162. package/dist/Table.js.map +1 -0
  163. package/dist/Tabs-A27TSZOP.css +95 -0
  164. package/dist/Tabs.cjs +16 -0
  165. package/dist/Tabs.cjs.map +1 -0
  166. package/dist/Tabs.d.cts +35 -0
  167. package/dist/Tabs.d.ts +35 -0
  168. package/dist/Tabs.js +3 -0
  169. package/dist/Tabs.js.map +1 -0
  170. package/dist/Tag-EYOY3UWG.css +49 -0
  171. package/dist/Tag.cjs +17 -0
  172. package/dist/Tag.cjs.map +1 -0
  173. package/dist/Tag.d.cts +27 -0
  174. package/dist/Tag.d.ts +27 -0
  175. package/dist/Tag.js +4 -0
  176. package/dist/Tag.js.map +1 -0
  177. package/dist/Theme.cjs +44 -0
  178. package/dist/Theme.cjs.map +1 -0
  179. package/dist/Theme.d.cts +127 -0
  180. package/dist/Theme.d.ts +127 -0
  181. package/dist/Theme.js +3 -0
  182. package/dist/Theme.js.map +1 -0
  183. package/dist/Toast-ERHDN3WG.css +45 -0
  184. package/dist/Toast.cjs +17 -0
  185. package/dist/Toast.cjs.map +1 -0
  186. package/dist/Toast.d.cts +26 -0
  187. package/dist/Toast.d.ts +26 -0
  188. package/dist/Toast.js +4 -0
  189. package/dist/Toast.js.map +1 -0
  190. package/dist/Tooltip-RT4BOVTD.css +23 -0
  191. package/dist/Tooltip.cjs +12 -0
  192. package/dist/Tooltip.cjs.map +1 -0
  193. package/dist/Tooltip.d.cts +13 -0
  194. package/dist/Tooltip.d.ts +13 -0
  195. package/dist/Tooltip.js +3 -0
  196. package/dist/Tooltip.js.map +1 -0
  197. package/dist/chunk-2VA2HSL4.cjs +121 -0
  198. package/dist/chunk-2VA2HSL4.cjs.map +1 -0
  199. package/dist/chunk-2W2AJUZW.js +118 -0
  200. package/dist/chunk-2W2AJUZW.js.map +1 -0
  201. package/dist/chunk-3QWHDCHJ.js +53 -0
  202. package/dist/chunk-3QWHDCHJ.js.map +1 -0
  203. package/dist/chunk-3WAFIUDQ.js +85 -0
  204. package/dist/chunk-3WAFIUDQ.js.map +1 -0
  205. package/dist/chunk-4AA22BOG.js +63 -0
  206. package/dist/chunk-4AA22BOG.js.map +1 -0
  207. package/dist/chunk-4GT5TOHP.js +18 -0
  208. package/dist/chunk-4GT5TOHP.js.map +1 -0
  209. package/dist/chunk-5EYI27B6.js +64 -0
  210. package/dist/chunk-5EYI27B6.js.map +1 -0
  211. package/dist/chunk-6YVW3VYL.js +51 -0
  212. package/dist/chunk-6YVW3VYL.js.map +1 -0
  213. package/dist/chunk-77NP67ML.cjs +70 -0
  214. package/dist/chunk-77NP67ML.cjs.map +1 -0
  215. package/dist/chunk-7CKHWCEA.cjs +110 -0
  216. package/dist/chunk-7CKHWCEA.cjs.map +1 -0
  217. package/dist/chunk-7H453VPW.cjs +20 -0
  218. package/dist/chunk-7H453VPW.cjs.map +1 -0
  219. package/dist/chunk-7NM5BRUX.js +91 -0
  220. package/dist/chunk-7NM5BRUX.js.map +1 -0
  221. package/dist/chunk-7U6I44RV.cjs +283 -0
  222. package/dist/chunk-7U6I44RV.cjs.map +1 -0
  223. package/dist/chunk-AAMYURWQ.cjs +87 -0
  224. package/dist/chunk-AAMYURWQ.cjs.map +1 -0
  225. package/dist/chunk-ALFDP5WX.cjs +70 -0
  226. package/dist/chunk-ALFDP5WX.cjs.map +1 -0
  227. package/dist/chunk-C5TGQ7CV.cjs +114 -0
  228. package/dist/chunk-C5TGQ7CV.cjs.map +1 -0
  229. package/dist/chunk-F3NHM4GX.js +20 -0
  230. package/dist/chunk-F3NHM4GX.js.map +1 -0
  231. package/dist/chunk-FI7QO3I5.cjs +90 -0
  232. package/dist/chunk-FI7QO3I5.cjs.map +1 -0
  233. package/dist/chunk-FMG3ZPGK.js +88 -0
  234. package/dist/chunk-FMG3ZPGK.js.map +1 -0
  235. package/dist/chunk-G3UWXSNQ.js +71 -0
  236. package/dist/chunk-G3UWXSNQ.js.map +1 -0
  237. package/dist/chunk-GEYMWUW6.js +146 -0
  238. package/dist/chunk-GEYMWUW6.js.map +1 -0
  239. package/dist/chunk-HTP6UEVR.js +48 -0
  240. package/dist/chunk-HTP6UEVR.js.map +1 -0
  241. package/dist/chunk-I2ERCHFV.cjs +58 -0
  242. package/dist/chunk-I2ERCHFV.cjs.map +1 -0
  243. package/dist/chunk-I7SSCSFH.js +253 -0
  244. package/dist/chunk-I7SSCSFH.js.map +1 -0
  245. package/dist/chunk-IGHLSNXT.cjs +109 -0
  246. package/dist/chunk-IGHLSNXT.cjs.map +1 -0
  247. package/dist/chunk-IKI5CS4L.cjs +91 -0
  248. package/dist/chunk-IKI5CS4L.cjs.map +1 -0
  249. package/dist/chunk-ITGCHU3Y.cjs +94 -0
  250. package/dist/chunk-ITGCHU3Y.cjs.map +1 -0
  251. package/dist/chunk-JNFCTYJT.cjs +31 -0
  252. package/dist/chunk-JNFCTYJT.cjs.map +1 -0
  253. package/dist/chunk-JWFVSBVX.cjs +30 -0
  254. package/dist/chunk-JWFVSBVX.cjs.map +1 -0
  255. package/dist/chunk-K5MHL732.js +81 -0
  256. package/dist/chunk-K5MHL732.js.map +1 -0
  257. package/dist/chunk-K67KIKX4.cjs +67 -0
  258. package/dist/chunk-K67KIKX4.cjs.map +1 -0
  259. package/dist/chunk-KF4MCHZL.cjs +105 -0
  260. package/dist/chunk-KF4MCHZL.cjs.map +1 -0
  261. package/dist/chunk-M6CGYGEO.js +91 -0
  262. package/dist/chunk-M6CGYGEO.js.map +1 -0
  263. package/dist/chunk-M6OTFXZA.js +48 -0
  264. package/dist/chunk-M6OTFXZA.js.map +1 -0
  265. package/dist/chunk-NWJW5KLN.js +29 -0
  266. package/dist/chunk-NWJW5KLN.js.map +1 -0
  267. package/dist/chunk-NXOAYNG2.cjs +52 -0
  268. package/dist/chunk-NXOAYNG2.cjs.map +1 -0
  269. package/dist/chunk-NZPJ7BUB.cjs +22 -0
  270. package/dist/chunk-NZPJ7BUB.cjs.map +1 -0
  271. package/dist/chunk-OUJBCNWD.js +52 -0
  272. package/dist/chunk-OUJBCNWD.js.map +1 -0
  273. package/dist/chunk-OXYFB2ZI.js +35 -0
  274. package/dist/chunk-OXYFB2ZI.js.map +1 -0
  275. package/dist/chunk-Q33V7MSK.js +79 -0
  276. package/dist/chunk-Q33V7MSK.js.map +1 -0
  277. package/dist/chunk-QESLHLTG.cjs +107 -0
  278. package/dist/chunk-QESLHLTG.cjs.map +1 -0
  279. package/dist/chunk-QPZZNSRB.js +65 -0
  280. package/dist/chunk-QPZZNSRB.js.map +1 -0
  281. package/dist/chunk-QT7SJITQ.cjs +114 -0
  282. package/dist/chunk-QT7SJITQ.cjs.map +1 -0
  283. package/dist/chunk-RMD6KQ4H.cjs +56 -0
  284. package/dist/chunk-RMD6KQ4H.cjs.map +1 -0
  285. package/dist/chunk-T5AH4FCV.js +280 -0
  286. package/dist/chunk-T5AH4FCV.js.map +1 -0
  287. package/dist/chunk-U6ODMPTI.cjs +74 -0
  288. package/dist/chunk-U6ODMPTI.cjs.map +1 -0
  289. package/dist/chunk-V2ZUOEXM.cjs +73 -0
  290. package/dist/chunk-V2ZUOEXM.cjs.map +1 -0
  291. package/dist/chunk-VJN637MT.js +49 -0
  292. package/dist/chunk-VJN637MT.js.map +1 -0
  293. package/dist/chunk-VMHNKD3N.cjs +56 -0
  294. package/dist/chunk-VMHNKD3N.cjs.map +1 -0
  295. package/dist/chunk-VXITDXLW.js +28 -0
  296. package/dist/chunk-VXITDXLW.js.map +1 -0
  297. package/dist/chunk-XFRP2MBR.js +87 -0
  298. package/dist/chunk-XFRP2MBR.js.map +1 -0
  299. package/dist/chunk-XRZ5OKZH.js +101 -0
  300. package/dist/chunk-XRZ5OKZH.js.map +1 -0
  301. package/dist/chunk-Y6FVCCUE.js +34 -0
  302. package/dist/chunk-Y6FVCCUE.js.map +1 -0
  303. package/dist/chunk-YVO7XO4W.cjs +149 -0
  304. package/dist/chunk-YVO7XO4W.cjs.map +1 -0
  305. package/dist/chunk-ZMDVK2U3.cjs +302 -0
  306. package/dist/chunk-ZMDVK2U3.cjs.map +1 -0
  307. package/dist/chunk-ZXM247EM.cjs +123 -0
  308. package/dist/chunk-ZXM247EM.cjs.map +1 -0
  309. package/dist/index.cjs +249 -0
  310. package/dist/index.cjs.map +1 -0
  311. package/dist/index.d.cts +35 -0
  312. package/dist/index.d.ts +35 -0
  313. package/dist/index.js +35 -0
  314. package/dist/index.js.map +1 -0
  315. package/dist/shared-NJHRNLRH.css +4 -0
  316. package/dist/styles.css +2068 -0
  317. package/dist/tokens-HWQ7KWPG.css +153 -0
  318. package/dist/tokens.css +153 -0
  319. package/package.json +77 -0
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
package/README.md ADDED
@@ -0,0 +1,110 @@
1
+ # Lumina
2
+
3
+ > A neumorphic React + TypeScript component library designed for Electron desktop apps.
4
+
5
+ 柔和、温润的拟态(Neumorphism)风格组件库,使用 **React 18** + **TypeScript**,开箱即用地适配 **Electron** 桌面应用场景 —— 包含窗口标题栏、侧边栏、抽屉、弹窗等桌面级组件。
6
+
7
+ ## ✨ 特性
8
+
9
+ - **TypeScript 优先** — 全量类型定义,IDE 智能提示完善
10
+ - **拟态设计语言** — 统一的凸起/凹陷/柔光阴影系统,通过 CSS 变量自定义
11
+ - **25+ 基础组件** — Button、Input、Table、Modal、Toast、Calendar …
12
+ - **Electron 原生感** — `TitleBar`、`Sidebar`、`AppShell` 直接拼出窗口布局
13
+ - **主题化** — 明/暗模式、6 套强调色、3 档密度(紧凑/标准/宽松)
14
+ - **零运行时依赖** — 只依赖 React;样式纯 CSS 变量驱动
15
+
16
+ ## 📦 安装
17
+
18
+ ```bash
19
+ npm install lumina
20
+ # 或
21
+ pnpm add lumina
22
+ # 或
23
+ yarn add lumina
24
+ ```
25
+
26
+ Peer deps: `react@>=18`, `react-dom@>=18`.
27
+
28
+ ## 🚀 快速上手
29
+
30
+ ```tsx
31
+ import { Button, Card, toast, ToastContainer } from "lumina";
32
+ import "lumina/styles"; // 全局样式 + 设计令牌
33
+
34
+ export default function App() {
35
+ return (
36
+ <>
37
+ <Card padding="lg">
38
+ <h2>欢迎使用 Lumina</h2>
39
+ <Button variant="primary" onClick={() => toast.success("你好!")}>
40
+ 点我
41
+ </Button>
42
+ </Card>
43
+ <ToastContainer />
44
+ </>
45
+ );
46
+ }
47
+ ```
48
+
49
+ ## 🛠 本地开发(下载即用)
50
+
51
+ ```bash
52
+ cd package
53
+ npm install
54
+ npm run dev # 启动 Playground(http://localhost:5173)
55
+ npm run typecheck # 类型检查
56
+ npm run build:lib # 构建库 → dist/(ESM + CJS + .d.ts)
57
+ ```
58
+
59
+ > Vite 已配置好 `lumina` 的别名,直接指向 `src/index.ts`。
60
+ > 你修改 `src/components/*.tsx` 或 `src/styles/*.css`,Playground 会即时热更新。
61
+
62
+ 项目结构:
63
+
64
+ ```
65
+ package/
66
+ ├── src/
67
+ │ ├── components/ # 所有 .tsx 组件源码
68
+ │ ├── styles/
69
+ │ │ ├── tokens.css # 设计令牌(主题 / 颜色 / 阴影 / 间距)
70
+ │ │ ├── base.css # 基础样式(body / scrollbar / focus)
71
+ │ │ └── components/ # 每个组件对应一个 .css 文件
72
+ │ └── index.ts # 公共出口
73
+ ├── playground/ # 本地演示应用(Vite)
74
+ ├── docs/ # 组件文档 & API 文档
75
+ ├── tsup.config.ts # 库构建配置
76
+ └── vite.config.ts # Playground 开发服务器
77
+ ```
78
+
79
+ ## 🎨 主题定制
80
+
81
+ 所有设计令牌都在 `:root` 上定义,可以通过 `data-*` 属性切换主题:
82
+
83
+ ```html
84
+ <html data-theme="dark" data-accent="sky" data-density="compact">
85
+ ```
86
+
87
+ - `data-theme`: `light` | `dark`
88
+ - `data-accent`: `rose` | `sky` | `coral` | `mint` | `violet` | `amber`
89
+ - `data-density`: `compact` | `comfortable` | `spacious`
90
+
91
+ 覆写任意 CSS 变量即可局部定制:
92
+
93
+ ```css
94
+ .my-scope {
95
+ --accent: oklch(72% 0.18 200);
96
+ --r-md: 12px;
97
+ --d: 0.8; /* 阴影强度乘数 */
98
+ }
99
+ ```
100
+
101
+ ## 📚 文档
102
+
103
+ - [组件清单](./docs/components.md)
104
+ - [API 参考](./docs/api.md)
105
+ - [设计令牌](./docs/tokens.md)
106
+ - [Electron 集成](./docs/electron.md)
107
+
108
+ ## 📄 许可证
109
+
110
+ MIT
@@ -0,0 +1,38 @@
1
+ /* ============ Accordion ============ */
2
+ .accordion { display: flex; flex-direction: column; gap: 10px; }
3
+ .accordion-item {
4
+ background: var(--bg);
5
+ border-radius: var(--r-md);
6
+ box-shadow: var(--neu-out-sm);
7
+ overflow: hidden;
8
+ }
9
+ .accordion-head {
10
+ width: 100%;
11
+ border: none;
12
+ background: transparent;
13
+ padding: 14px 18px;
14
+ display: flex;
15
+ align-items: center;
16
+ justify-content: space-between;
17
+ cursor: pointer;
18
+ font-size: 13px;
19
+ font-weight: 500;
20
+ font-family: inherit;
21
+ color: var(--fg);
22
+ text-align: left;
23
+ }
24
+ .accordion-body {
25
+ max-height: 0;
26
+ overflow: hidden;
27
+ transition: max-height var(--dur) var(--ease);
28
+ color: var(--fg-muted);
29
+ font-size: 13px;
30
+ }
31
+ .accordion-item.open .accordion-body { max-height: 320px; }
32
+ .accordion-body-inner { padding: 0 18px 16px; }
33
+ .accordion-chev {
34
+ transition: transform var(--dur) var(--ease);
35
+ color: var(--fg-subtle);
36
+ display: inline-flex;
37
+ }
38
+ .accordion-item.open .accordion-chev { transform: rotate(180deg); color: var(--accent); }
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var chunk77NP67ML_cjs = require('./chunk-77NP67ML.cjs');
4
+ require('./chunk-YVO7XO4W.cjs');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "Accordion", {
9
+ enumerable: true,
10
+ get: function () { return chunk77NP67ML_cjs.Accordion; }
11
+ });
12
+ //# sourceMappingURL=Accordion.cjs.map
13
+ //# sourceMappingURL=Accordion.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Accordion.cjs"}
@@ -0,0 +1,21 @@
1
+ import * as React from 'react';
2
+
3
+ interface AccordionItem {
4
+ key: string;
5
+ title: React.ReactNode;
6
+ content: React.ReactNode;
7
+ disabled?: boolean;
8
+ }
9
+ interface AccordionProps {
10
+ items: AccordionItem[];
11
+ /** If true, multiple sections can be open at once. */
12
+ multiple?: boolean;
13
+ activeKeys?: string[];
14
+ defaultActiveKeys?: string[];
15
+ onChange?: (keys: string[]) => void;
16
+ className?: string;
17
+ }
18
+ /** `Accordion` — collapsible sections. */
19
+ declare const Accordion: React.FC<AccordionProps>;
20
+
21
+ export { Accordion, type AccordionItem, type AccordionProps };
@@ -0,0 +1,21 @@
1
+ import * as React from 'react';
2
+
3
+ interface AccordionItem {
4
+ key: string;
5
+ title: React.ReactNode;
6
+ content: React.ReactNode;
7
+ disabled?: boolean;
8
+ }
9
+ interface AccordionProps {
10
+ items: AccordionItem[];
11
+ /** If true, multiple sections can be open at once. */
12
+ multiple?: boolean;
13
+ activeKeys?: string[];
14
+ defaultActiveKeys?: string[];
15
+ onChange?: (keys: string[]) => void;
16
+ className?: string;
17
+ }
18
+ /** `Accordion` — collapsible sections. */
19
+ declare const Accordion: React.FC<AccordionProps>;
20
+
21
+ export { Accordion, type AccordionItem, type AccordionProps };
@@ -0,0 +1,4 @@
1
+ export { Accordion } from './chunk-M6OTFXZA.js';
2
+ import './chunk-GEYMWUW6.js';
3
+ //# sourceMappingURL=Accordion.js.map
4
+ //# sourceMappingURL=Accordion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Accordion.js"}
@@ -0,0 +1,35 @@
1
+ /* ============ Alert ============ */
2
+ .alert {
3
+ display: flex;
4
+ gap: 12px;
5
+ align-items: flex-start;
6
+ padding: 14px 16px;
7
+ border-radius: var(--r-md);
8
+ background: var(--bg);
9
+ box-shadow: var(--neu-in-sm);
10
+ position: relative;
11
+ }
12
+ .alert-ico {
13
+ width: 20px; height: 20px;
14
+ display: grid; place-items: center;
15
+ flex-shrink: 0;
16
+ margin-top: 1px;
17
+ }
18
+ .alert.info .alert-ico { color: var(--info); }
19
+ .alert.success .alert-ico { color: var(--success); }
20
+ .alert.warning .alert-ico { color: var(--warning); }
21
+ .alert.danger .alert-ico { color: var(--danger); }
22
+ .alert-body { flex: 1; min-width: 0; }
23
+ .alert-title { font-size: 13px; font-weight: 600; margin-bottom: 3px; line-height: 1.4; }
24
+ .alert-desc { font-size: 12px; color: var(--fg-muted); line-height: 1.55; }
25
+ .alert.no-title { align-items: center; }
26
+ .alert.no-title .alert-ico { margin-top: 0; }
27
+ .alert-close {
28
+ position: absolute; top: 10px; right: 10px;
29
+ width: 22px; height: 22px; border-radius: 7px;
30
+ display: grid; place-items: center;
31
+ color: var(--fg-subtle);
32
+ cursor: pointer;
33
+ border: none; background: transparent;
34
+ }
35
+ .alert-close:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-flat); }
package/dist/Alert.cjs ADDED
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var chunkJNFCTYJT_cjs = require('./chunk-JNFCTYJT.cjs');
4
+ require('./chunk-YVO7XO4W.cjs');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "Alert", {
9
+ enumerable: true,
10
+ get: function () { return chunkJNFCTYJT_cjs.Alert; }
11
+ });
12
+ //# sourceMappingURL=Alert.cjs.map
13
+ //# sourceMappingURL=Alert.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Alert.cjs"}
@@ -0,0 +1,17 @@
1
+ import * as React from 'react';
2
+ import { IconName } from './Icon.cjs';
3
+
4
+ type AlertTone = "info" | "success" | "warning" | "danger";
5
+ interface AlertProps {
6
+ tone?: AlertTone;
7
+ title?: React.ReactNode;
8
+ children?: React.ReactNode;
9
+ icon?: IconName;
10
+ closable?: boolean;
11
+ onClose?: () => void;
12
+ className?: string;
13
+ }
14
+ /** `Alert` — inline contextual message. */
15
+ declare const Alert: React.FC<AlertProps>;
16
+
17
+ export { Alert, type AlertProps, type AlertTone };
@@ -0,0 +1,17 @@
1
+ import * as React from 'react';
2
+ import { IconName } from './Icon.js';
3
+
4
+ type AlertTone = "info" | "success" | "warning" | "danger";
5
+ interface AlertProps {
6
+ tone?: AlertTone;
7
+ title?: React.ReactNode;
8
+ children?: React.ReactNode;
9
+ icon?: IconName;
10
+ closable?: boolean;
11
+ onClose?: () => void;
12
+ className?: string;
13
+ }
14
+ /** `Alert` — inline contextual message. */
15
+ declare const Alert: React.FC<AlertProps>;
16
+
17
+ export { Alert, type AlertProps, type AlertTone };
package/dist/Alert.js ADDED
@@ -0,0 +1,4 @@
1
+ export { Alert } from './chunk-NWJW5KLN.js';
2
+ import './chunk-GEYMWUW6.js';
3
+ //# sourceMappingURL=Alert.js.map
4
+ //# sourceMappingURL=Alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Alert.js"}
@@ -0,0 +1,162 @@
1
+ /* ============ TitleBar (Electron) ============ */
2
+ .titlebar {
3
+ display: flex;
4
+ align-items: center;
5
+ gap: var(--gap-3);
6
+ padding: 0 var(--gap-3);
7
+ height: 40px;
8
+ background: var(--bg);
9
+ -webkit-app-region: drag;
10
+ user-select: none;
11
+ border-bottom: 1px solid var(--divider);
12
+ position: relative;
13
+ z-index: 5;
14
+ overflow: visible;
15
+ }
16
+ .titlebar.windows { padding-right: 0; }
17
+ .titlebar-title {
18
+ display: inline-flex;
19
+ align-items: center;
20
+ gap: 10px;
21
+ font-weight: 500;
22
+ font-size: 13px;
23
+ flex-shrink: 0;
24
+ min-width: 0;
25
+ }
26
+ .titlebar-center {
27
+ position: absolute; left: 50%; transform: translateX(-50%);
28
+ display: inline-flex; align-items: center; gap: 8px;
29
+ -webkit-app-region: no-drag;
30
+ }
31
+ .titlebar-actions {
32
+ margin-left: auto;
33
+ display: inline-flex; align-items: center; gap: 6px;
34
+ -webkit-app-region: no-drag;
35
+ flex-shrink: 0;
36
+ }
37
+
38
+ /* macOS traffic lights */
39
+ .win-controls { flex-shrink: 0; }
40
+ .win-controls.mac { display: inline-flex; gap: 8px; -webkit-app-region: no-drag; }
41
+ .win-controls.mac .win-btn {
42
+ width: 13px; height: 13px;
43
+ border: none; padding: 0;
44
+ border-radius: 999px;
45
+ background: var(--bg);
46
+ box-shadow: var(--neu-flat);
47
+ position: relative;
48
+ cursor: pointer;
49
+ transition: transform var(--dur-fast) var(--ease);
50
+ }
51
+ .win-controls.mac .win-btn::after {
52
+ content: "";
53
+ position: absolute; inset: 2px;
54
+ border-radius: 999px;
55
+ background: var(--dot, var(--fg-subtle));
56
+ opacity: 0.85;
57
+ }
58
+ .win-controls.mac .win-btn.close { --dot: #ff5f57; }
59
+ .win-controls.mac .win-btn.minimize { --dot: #febc2e; }
60
+ .win-controls.mac .win-btn.maximize { --dot: #28c840; }
61
+ .win-controls.mac .win-btn:hover { transform: scale(1.08); }
62
+
63
+ /* Windows controls */
64
+ .win-controls.windows {
65
+ display: inline-flex;
66
+ -webkit-app-region: no-drag;
67
+ margin-left: 8px;
68
+ flex-shrink: 0;
69
+ }
70
+ .win-controls.windows .win-btn {
71
+ width: 38px;
72
+ height: 28px;
73
+ border: 0;
74
+ padding: 0;
75
+ border-radius: 8px;
76
+ background: transparent;
77
+ color: var(--fg-muted);
78
+ display: inline-grid;
79
+ place-items: center;
80
+ cursor: pointer;
81
+ transition: all var(--dur-fast) var(--ease);
82
+ margin: 0 1px;
83
+ flex-shrink: 0;
84
+ overflow: visible;
85
+ }
86
+ .win-controls.windows .win-btn svg { display: block; flex-shrink: 0; }
87
+ .win-controls.windows .win-btn:hover { background: var(--bg); box-shadow: var(--neu-in-sm); color: var(--fg); }
88
+ .win-controls.windows .win-btn.close:hover {
89
+ background: var(--danger);
90
+ color: white;
91
+ box-shadow: 2px 2px 4px color-mix(in oklch, var(--danger) 30%, var(--shadow-dark));
92
+ }
93
+
94
+ /* ============ Sidebar ============ */
95
+ .sidebar {
96
+ display: flex;
97
+ flex-direction: column;
98
+ width: 220px;
99
+ padding: 12px;
100
+ background: var(--bg);
101
+ border-right: 1px solid var(--divider);
102
+ flex-shrink: 0;
103
+ overflow-y: auto;
104
+ gap: 4px;
105
+ }
106
+ .sidebar.collapsed { width: 64px; }
107
+ .sidebar-header { padding: 4px 8px 12px; border-bottom: 1px solid var(--divider); margin-bottom: 8px; }
108
+ .sidebar-footer { margin-top: auto; padding-top: 12px; border-top: 1px solid var(--divider); }
109
+ .sidebar-nav { display: flex; flex-direction: column; gap: 2px; }
110
+ .sidebar-item {
111
+ display: flex; align-items: center; gap: 10px;
112
+ padding: 10px 12px;
113
+ border: none;
114
+ border-radius: var(--r-sm);
115
+ background: transparent;
116
+ color: var(--fg-muted);
117
+ font-size: 13px;
118
+ font-family: inherit;
119
+ text-align: left;
120
+ cursor: pointer;
121
+ width: 100%;
122
+ transition: all var(--dur-fast) var(--ease);
123
+ }
124
+ .sidebar-item:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-flat); }
125
+ .sidebar-item.active {
126
+ color: var(--accent-ink);
127
+ background: var(--bg);
128
+ box-shadow: var(--neu-in-sm);
129
+ font-weight: 500;
130
+ }
131
+ .sidebar-icon { display: inline-flex; flex-shrink: 0; }
132
+ .sidebar-label { flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
133
+ .sidebar-badge {
134
+ font-size: 11px;
135
+ padding: 1px 7px;
136
+ border-radius: 999px;
137
+ background: var(--accent);
138
+ color: white;
139
+ font-weight: 600;
140
+ }
141
+
142
+ /* ============ AppShell ============ */
143
+ .app-shell {
144
+ display: flex;
145
+ flex-direction: column;
146
+ width: 100%;
147
+ height: 100vh;
148
+ background: var(--bg);
149
+ color: var(--fg);
150
+ overflow: hidden;
151
+ position: relative;
152
+ }
153
+ .app-shell-body {
154
+ flex: 1;
155
+ display: flex;
156
+ min-height: 0;
157
+ }
158
+ .app-shell-main {
159
+ flex: 1;
160
+ min-width: 0;
161
+ overflow: auto;
162
+ }
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ var chunkFI7QO3I5_cjs = require('./chunk-FI7QO3I5.cjs');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "AppShell", {
8
+ enumerable: true,
9
+ get: function () { return chunkFI7QO3I5_cjs.AppShell; }
10
+ });
11
+ Object.defineProperty(exports, "Sidebar", {
12
+ enumerable: true,
13
+ get: function () { return chunkFI7QO3I5_cjs.Sidebar; }
14
+ });
15
+ Object.defineProperty(exports, "TitleBar", {
16
+ enumerable: true,
17
+ get: function () { return chunkFI7QO3I5_cjs.TitleBar; }
18
+ });
19
+ Object.defineProperty(exports, "WindowControls", {
20
+ enumerable: true,
21
+ get: function () { return chunkFI7QO3I5_cjs.WindowControls; }
22
+ });
23
+ //# sourceMappingURL=AppShell.cjs.map
24
+ //# sourceMappingURL=AppShell.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"AppShell.cjs"}
@@ -0,0 +1,68 @@
1
+ import * as React from 'react';
2
+
3
+ interface WindowControlsProps {
4
+ /** macOS traffic lights or Windows-style buttons. */
5
+ platform?: "mac" | "windows";
6
+ onMinimize?: () => void;
7
+ onMaximize?: () => void;
8
+ onClose?: () => void;
9
+ className?: string;
10
+ }
11
+ /**
12
+ * `WindowControls` — standalone window control buttons.
13
+ * Mac: traffic lights (close/min/max). Windows: rectangular controls.
14
+ */
15
+ declare const WindowControls: React.FC<WindowControlsProps>;
16
+ interface TitleBarProps {
17
+ title?: React.ReactNode;
18
+ /** Platform appearance — affects button placement. Default "mac". */
19
+ platform?: "mac" | "windows";
20
+ onMinimize?: () => void;
21
+ onMaximize?: () => void;
22
+ onClose?: () => void;
23
+ /** Extra content in the center. */
24
+ center?: React.ReactNode;
25
+ /** Extra content on the trailing side. */
26
+ actions?: React.ReactNode;
27
+ /** Make the whole bar draggable (Electron `-webkit-app-region: drag`). */
28
+ draggable?: boolean;
29
+ className?: string;
30
+ }
31
+ /**
32
+ * `TitleBar` — Electron-style window chrome. Attach at the top of your app.
33
+ * Buttons are non-draggable regions so clicks register correctly.
34
+ */
35
+ declare const TitleBar: React.FC<TitleBarProps>;
36
+ interface SidebarItem {
37
+ key: string;
38
+ label: React.ReactNode;
39
+ icon?: React.ReactNode;
40
+ badge?: React.ReactNode;
41
+ children?: SidebarItem[];
42
+ }
43
+ interface SidebarProps {
44
+ items: SidebarItem[];
45
+ activeKey?: string;
46
+ onSelect?: (key: string) => void;
47
+ /** Collapsed: icons only. */
48
+ collapsed?: boolean;
49
+ /** Header slot (e.g. workspace switcher). */
50
+ header?: React.ReactNode;
51
+ /** Footer slot (e.g. user card). */
52
+ footer?: React.ReactNode;
53
+ className?: string;
54
+ }
55
+ /** `Sidebar` — navigation rail. Pair with `AppShell`. */
56
+ declare const Sidebar: React.FC<SidebarProps>;
57
+ interface AppShellProps {
58
+ sidebar?: React.ReactNode;
59
+ titleBar?: React.ReactNode;
60
+ children?: React.ReactNode;
61
+ className?: string;
62
+ }
63
+ /**
64
+ * `AppShell` — 3-zone Electron layout: title bar across top, sidebar on left, content fills rest.
65
+ */
66
+ declare const AppShell: React.FC<AppShellProps>;
67
+
68
+ export { AppShell, type AppShellProps, Sidebar, type SidebarItem, type SidebarProps, TitleBar, type TitleBarProps, WindowControls, type WindowControlsProps };
@@ -0,0 +1,68 @@
1
+ import * as React from 'react';
2
+
3
+ interface WindowControlsProps {
4
+ /** macOS traffic lights or Windows-style buttons. */
5
+ platform?: "mac" | "windows";
6
+ onMinimize?: () => void;
7
+ onMaximize?: () => void;
8
+ onClose?: () => void;
9
+ className?: string;
10
+ }
11
+ /**
12
+ * `WindowControls` — standalone window control buttons.
13
+ * Mac: traffic lights (close/min/max). Windows: rectangular controls.
14
+ */
15
+ declare const WindowControls: React.FC<WindowControlsProps>;
16
+ interface TitleBarProps {
17
+ title?: React.ReactNode;
18
+ /** Platform appearance — affects button placement. Default "mac". */
19
+ platform?: "mac" | "windows";
20
+ onMinimize?: () => void;
21
+ onMaximize?: () => void;
22
+ onClose?: () => void;
23
+ /** Extra content in the center. */
24
+ center?: React.ReactNode;
25
+ /** Extra content on the trailing side. */
26
+ actions?: React.ReactNode;
27
+ /** Make the whole bar draggable (Electron `-webkit-app-region: drag`). */
28
+ draggable?: boolean;
29
+ className?: string;
30
+ }
31
+ /**
32
+ * `TitleBar` — Electron-style window chrome. Attach at the top of your app.
33
+ * Buttons are non-draggable regions so clicks register correctly.
34
+ */
35
+ declare const TitleBar: React.FC<TitleBarProps>;
36
+ interface SidebarItem {
37
+ key: string;
38
+ label: React.ReactNode;
39
+ icon?: React.ReactNode;
40
+ badge?: React.ReactNode;
41
+ children?: SidebarItem[];
42
+ }
43
+ interface SidebarProps {
44
+ items: SidebarItem[];
45
+ activeKey?: string;
46
+ onSelect?: (key: string) => void;
47
+ /** Collapsed: icons only. */
48
+ collapsed?: boolean;
49
+ /** Header slot (e.g. workspace switcher). */
50
+ header?: React.ReactNode;
51
+ /** Footer slot (e.g. user card). */
52
+ footer?: React.ReactNode;
53
+ className?: string;
54
+ }
55
+ /** `Sidebar` — navigation rail. Pair with `AppShell`. */
56
+ declare const Sidebar: React.FC<SidebarProps>;
57
+ interface AppShellProps {
58
+ sidebar?: React.ReactNode;
59
+ titleBar?: React.ReactNode;
60
+ children?: React.ReactNode;
61
+ className?: string;
62
+ }
63
+ /**
64
+ * `AppShell` — 3-zone Electron layout: title bar across top, sidebar on left, content fills rest.
65
+ */
66
+ declare const AppShell: React.FC<AppShellProps>;
67
+
68
+ export { AppShell, type AppShellProps, Sidebar, type SidebarItem, type SidebarProps, TitleBar, type TitleBarProps, WindowControls, type WindowControlsProps };
@@ -0,0 +1,3 @@
1
+ export { AppShell, Sidebar, TitleBar, WindowControls } from './chunk-3WAFIUDQ.js';
2
+ //# sourceMappingURL=AppShell.js.map
3
+ //# sourceMappingURL=AppShell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"AppShell.js"}