@fangxinyan/lumina 0.7.0 → 0.8.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 (46) hide show
  1. package/dist/Pagination.cjs +3 -3
  2. package/dist/Pagination.js +2 -2
  3. package/dist/Select.cjs +2 -2
  4. package/dist/Select.d.cts +4 -0
  5. package/dist/Select.d.ts +4 -0
  6. package/dist/Select.js +1 -1
  7. package/dist/Splitter.cjs +2 -2
  8. package/dist/Splitter.d.cts +10 -0
  9. package/dist/Splitter.d.ts +10 -0
  10. package/dist/Splitter.js +1 -1
  11. package/dist/{Table-W4HPZ7MZ.css → Table-KB6EEBDJ.css} +28 -1
  12. package/dist/Table.cjs +4 -4
  13. package/dist/Table.d.cts +7 -1
  14. package/dist/Table.d.ts +7 -1
  15. package/dist/Table.js +3 -3
  16. package/dist/TablePro.cjs +5 -5
  17. package/dist/TablePro.js +4 -4
  18. package/dist/{Tabs-A3IG6UZ6.css → Tabs-FB2AMBWL.css} +14 -0
  19. package/dist/Tabs.cjs +2 -2
  20. package/dist/Tabs.d.cts +6 -0
  21. package/dist/Tabs.d.ts +6 -0
  22. package/dist/Tabs.js +1 -1
  23. package/dist/{chunk-WMZV7PNO.js → chunk-63RSKQID.js} +5 -1
  24. package/dist/{chunk-3EHJ5QI3.js → chunk-DURKCGEM.js} +26 -12
  25. package/dist/{chunk-BJDQVVCG.js → chunk-HQNDVNTQ.js} +1 -1
  26. package/dist/{chunk-RAK6CENJ.js → chunk-IJDM2U3B.js} +52 -35
  27. package/dist/{chunk-LOWTSOWT.js → chunk-J5UEQ3ZQ.js} +32 -5
  28. package/dist/{chunk-U7VEPMCX.cjs → chunk-JBS353O4.cjs} +32 -5
  29. package/dist/{chunk-56I6ZKGU.cjs → chunk-PJFYIXBX.cjs} +2 -2
  30. package/dist/{chunk-ENFLP7SN.cjs → chunk-PNKNZREC.cjs} +15 -5
  31. package/dist/{chunk-XZXY3XCL.cjs → chunk-RR7KWH26.cjs} +52 -35
  32. package/dist/{chunk-D7YSY5RZ.cjs → chunk-SF7BPXDJ.cjs} +26 -12
  33. package/dist/{chunk-JINKQT6H.cjs → chunk-WHBKQZU5.cjs} +6 -2
  34. package/dist/{chunk-EA3NZBCZ.js → chunk-WMISXERU.js} +14 -4
  35. package/dist/index.cjs +13 -13
  36. package/dist/index.d.cts +2 -2
  37. package/dist/index.d.ts +2 -2
  38. package/dist/index.js +7 -7
  39. package/dist/styles.css +42 -1
  40. package/docs/llms/drawer.md +8 -1
  41. package/docs/llms/select.md +19 -0
  42. package/docs/llms/splitter.md +12 -1
  43. package/docs/llms/tablepro.md +23 -1
  44. package/docs/llms/tabs.md +21 -0
  45. package/docs/llms.md +1 -1
  46. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -21,7 +21,7 @@ export { MessageApi, MessageConfig, MessageContainer, MessageContainerProps, Mes
21
21
  export { Tooltip, TooltipPlacement, TooltipProps } from './Tooltip.js';
22
22
  export { Popover, PopoverPlacement, PopoverProps } from './Popover.js';
23
23
  export { Alert, AlertProps, AlertTone } from './Alert.js';
24
- export { ExpandableConfig, PaginationConfig, RowKey, RowSelectionConfig, Table, TableChangeAction, TableChangeInfo, TableColumn, TableColumnFilterItem, TablePaginationState, TableProps, TableScrollConfig, TableSorterState, TableVariant } from './Table.js';
24
+ export { ExpandableConfig, PaginationConfig, RowKey, RowSelectionConfig, Table, TableChangeAction, TableChangeInfo, TableColumn, TableColumnFilterItem, TablePaginationState, TableProps, TableRowClassName, TableScrollConfig, TableSorterState, TableVariant } from './Table.js';
25
25
  export { TablePro, TableProProps } from './TablePro.js';
26
26
  export { Pagination, PaginationProps } from './Pagination.js';
27
27
  export { DatePicker, DatePickerFormat, DatePickerProps, DatePickerSize } from './DatePicker.js';
@@ -54,6 +54,6 @@ import 'react/jsx-runtime';
54
54
  import 'react';
55
55
 
56
56
  /** Package version — bumped by release scripts. */
57
- declare const VERSION = "0.7.0";
57
+ declare const VERSION = "0.8.0";
58
58
 
59
59
  export { VERSION };
package/dist/index.js CHANGED
@@ -1,15 +1,15 @@
1
1
  export { Timeline } from './chunk-6RQJXSWN.js';
2
2
  export { Tooltip } from './chunk-U3SG2YT2.js';
3
3
  export { Link, Paragraph, Text, Title, Typography } from './chunk-UQI4R32R.js';
4
- export { TablePro } from './chunk-WMZV7PNO.js';
5
- export { Table } from './chunk-EA3NZBCZ.js';
6
- export { Tabs } from './chunk-RAK6CENJ.js';
4
+ export { TablePro } from './chunk-63RSKQID.js';
5
+ export { Table } from './chunk-WMISXERU.js';
6
+ export { Tabs } from './chunk-IJDM2U3B.js';
7
7
  import './chunk-EE7IJ3MB.js';
8
8
  export { THEME_PANEL_DEFAULT_PRESET_OPTIONS, THEME_PANEL_DEFAULT_THEME_PRESETS, ThemePanel } from './chunk-OLYSSZHP.js';
9
9
  export { TimePicker } from './chunk-SXLRWYQQ.js';
10
10
  export { Skeleton } from './chunk-5AXNUX3J.js';
11
11
  export { Slider } from './chunk-K5HGHOG7.js';
12
- export { Splitter } from './chunk-LOWTSOWT.js';
12
+ export { Splitter } from './chunk-J5UEQ3ZQ.js';
13
13
  export { StatusBar, StatusBarItem } from './chunk-YKHIIC7M.js';
14
14
  export { SURFACE_THEME_PRESETS, Surface } from './chunk-DU2DSERH.js';
15
15
  export { LUMINA_THEME_PRESETS, cloneLuminaThemePreset, pickLuminaThemePresets } from './chunk-TSL3F2K3.js';
@@ -18,8 +18,8 @@ export { InputNumber } from './chunk-YPMQC5HX.js';
18
18
  export { List } from './chunk-VQEMMJHC.js';
19
19
  export { MessageContainer, ToastContainer, message, toast } from './chunk-7QAVPVMW.js';
20
20
  export { Modal } from './chunk-BKW5PXEO.js';
21
- export { Pagination } from './chunk-BJDQVVCG.js';
22
- export { Select } from './chunk-3EHJ5QI3.js';
21
+ export { Pagination } from './chunk-HQNDVNTQ.js';
22
+ export { Select } from './chunk-DURKCGEM.js';
23
23
  export { Tag } from './chunk-62VV5COT.js';
24
24
  export { Popover } from './chunk-RPO7657K.js';
25
25
  export { Progress } from './chunk-HQFKXTX6.js';
@@ -56,6 +56,6 @@ import './chunk-DRDDQCDD.js';
56
56
  export { ACCENT_PRESETS, ACCENT_PRESETS_DARK, DEFAULT_THEME_COLORS, FONT_STACKS, ThemeProvider, applyTheme, componentTokensToStyle, deriveThemeColors, normalizeAccentInput, resolveThemeColorScheme, resolveThemeColors, resolveThemeMode, resolveVisualThemeSnapshot, themeColorsToStyle, themeTokenToKebabCase, useTheme, useThemeOptional, visualThemeToStyle } from './chunk-ULTDRMGN.js';
57
57
 
58
58
  // src/index.ts
59
- var VERSION = "0.7.0";
59
+ var VERSION = "0.8.0";
60
60
 
61
61
  export { VERSION };
package/dist/styles.css CHANGED
@@ -1444,6 +1444,13 @@ svg[data-lumina-icon-color],
1444
1444
  .surface > *:last-child { margin-bottom: 0; }
1445
1445
  /* ============ Tabs ============ */
1446
1446
  .tabs { display: flex; flex-direction: column; gap: var(--gap-3); }
1447
+ .tabs.fill {
1448
+ flex: 1 1 auto;
1449
+ width: 100%;
1450
+ height: 100%;
1451
+ min-width: 0;
1452
+ min-height: 0;
1453
+ }
1447
1454
  .tabs-nav {
1448
1455
  display: inline-flex;
1449
1456
  padding: 5px;
@@ -1452,6 +1459,7 @@ svg[data-lumina-icon-color],
1452
1459
  box-shadow: var(--lmn-tabs-neu-shadow-inset, var(--neu-shadow-inset));
1453
1460
  gap: 2px;
1454
1461
  align-self: flex-start;
1462
+ flex-shrink: 0;
1455
1463
  }
1456
1464
  .tabs-nav .tab {
1457
1465
  padding: 8px 16px;
@@ -1507,6 +1515,12 @@ svg[data-lumina-icon-color],
1507
1515
  .tabs.centered.line .tabs-nav .tab,
1508
1516
  .tabs.centered.underline .tabs-nav .tab { margin-right: 11px; margin-left: 11px; }
1509
1517
  .tabs-content { padding: var(--gap-2) 0; }
1518
+ .tabs.fill .tabs-content {
1519
+ flex: 1 1 auto;
1520
+ min-width: 0;
1521
+ min-height: 0;
1522
+ overflow: auto;
1523
+ }
1510
1524
  /* ============ Collapse ============ */
1511
1525
  .collapse { display: flex; flex-direction: column; gap: 10px; }
1512
1526
  .collapse-item {
@@ -2543,6 +2557,7 @@ button.collapse-chev {
2543
2557
  background: var(--lmn-table-bg, var(--bg));
2544
2558
  box-shadow: var(--lmn-table-neu-shadow-inset, var(--neu-shadow-inset));
2545
2559
  overflow: auto;
2560
+ container-type: inline-size;
2546
2561
  }
2547
2562
  /* When scroll=y is on, the wrap itself becomes the scroll region. */
2548
2563
  .table-wrap.scroll-y { overflow-y: auto; }
@@ -2610,6 +2625,10 @@ button.collapse-chev {
2610
2625
  .table.striped tbody tr:nth-child(even) td {
2611
2626
  background: color-mix(in oklch, var(--lmn-table-bg-sunken, var(--bg-sunken)) 40%, transparent);
2612
2627
  }
2628
+ .table:not(.cards) tbody tr.active-row td {
2629
+ background: color-mix(in oklch, var(--lmn-table-accent-soft, var(--accent-soft)) 72%, transparent);
2630
+ color: var(--lmn-table-accent-ink, var(--accent-ink));
2631
+ }
2613
2632
  /* Embossed: each row sits on the surface */
2614
2633
  .table.embossed { border-spacing: 0; }
2615
2634
  .table.embossed tbody td {
@@ -2664,10 +2683,32 @@ button.collapse-chev {
2664
2683
  }
2665
2684
  .table.cards.hoverable tbody tr:hover .card-row-surface { box-shadow: var(--lmn-table-neu-shadow-panel, var(--neu-shadow-panel)); }
2666
2685
  .table.cards.hoverable tbody tr:hover td { background: transparent; }
2686
+ .table.cards tbody tr.active-row .card-row-surface {
2687
+ box-shadow:
2688
+ var(--lmn-table-neu-shadow-control, var(--neu-shadow-control)),
2689
+ inset 0 0 0 2px var(--lmn-table-accent-glow, var(--accent-glow));
2690
+ }
2691
+ .table.cards tbody tr.active-row td {
2692
+ color: var(--lmn-table-accent-ink, var(--accent-ink));
2693
+ }
2667
2694
  .table .row-check { width: 44px; }
2668
2695
  .table .row-check .checkbox { display: inline-flex; }
2669
2696
  .table .row-expand { width: 40px; text-align: center; }
2670
- .table-empty { padding: 60px 20px; text-align: center; color: var(--lmn-table-fg-muted, var(--fg-muted)); }
2697
+ .table .table-empty {
2698
+ padding: 0;
2699
+ color: var(--lmn-table-fg-muted, var(--fg-muted));
2700
+ }
2701
+ .table-empty-content {
2702
+ box-sizing: border-box;
2703
+ width: 100%;
2704
+ padding: 60px 20px;
2705
+ text-align: center;
2706
+ }
2707
+ .table-wrap.scroll-x .table-empty-content {
2708
+ position: sticky;
2709
+ left: 0;
2710
+ width: 100cqi;
2711
+ }
2671
2712
  /* Expand button */
2672
2713
  .expand-btn {
2673
2714
  width: 22px; height: 22px;
@@ -34,7 +34,14 @@ extra 渲染到标题右边,常用来放刷新 / 更多 / 保存按钮。
34
34
  抽屉只让正文区滚动,并自动为拟态阴影留出空间;全宽内容可通过 bodyInset="none" 贴边。
35
35
 
36
36
  ```tsx
37
- <Drawer open={open} title="连接配置">
37
+ <Drawer
38
+ open={open}
39
+ title="连接配置"
40
+ bodyClassName="connection-drawer-body"
41
+ bodyStyle={{ scrollBehavior: "smooth" }}
42
+ bodyProps={{ "data-purpose": "connection-settings" }}
43
+ bodyOverflow="auto"
44
+ >
38
45
  <Card title="远程节点">无需手工补 padding 或修改 overflow。</Card>
39
46
  </Drawer>
40
47
  ```
@@ -27,6 +27,23 @@ multiple + Tag 形式呈现已选项。
27
27
  <Select multiple clearable value={tags} onChange={setTags} options={...} />
28
28
  ```
29
29
 
30
+ ### 数量上限 / 分类限选
31
+
32
+ maxCount 限制总数;getOptionDisabled 可读取当前选择,实现“一类最多选一个”。
33
+
34
+ ```tsx
35
+ <Select
36
+ multiple
37
+ maxCount={2}
38
+ value={values}
39
+ onChange={setValues}
40
+ getOptionDisabled={(option, selectedValues) =>
41
+ hasOtherSelectionInCategory(option, selectedValues)
42
+ }
43
+ options={groupedOptions}
44
+ />
45
+ ```
46
+
30
47
  ### 搜索过滤
31
48
 
32
49
  searchable + clearable + 选项 icon/description。icon 支持 IconName 或 ReactNode。
@@ -108,6 +125,8 @@ loading 时显示 spinner,emptyContent 自定义空态。
108
125
  | placeholder | `string` | `"请选择…"` | 空选择时的提示文本 |
109
126
  | multiple | `boolean` | `false` | 多选 |
110
127
  | maxTagCount | `number` | — | 多选时显示的标签数(超出折叠 +N) |
128
+ | maxCount | `number` | — | 多选允许的最大选择数;达到上限后禁用未选项 |
129
+ | getOptionDisabled | `(option, selectedValues) => boolean` | — | 基于候选项和当前选择动态判断禁用状态 |
111
130
  | searchable | `boolean` | `false` | 可搜索 |
112
131
  | showSearch | `boolean` | `false` | searchable 的等价别名 |
113
132
  | filterOption | `(input, option) => boolean` | — | 自定义过滤 |
@@ -13,7 +13,15 @@ import { Splitter } from "@fangxinyan/lumina";
13
13
  ### 水平分栏
14
14
 
15
15
  ```tsx
16
- <Splitter defaultSize={200} min={120} max={360}>
16
+ <Splitter
17
+ defaultSize={200}
18
+ min={120}
19
+ max={360}
20
+ firstPaneClassName="workspace-sidebar-pane"
21
+ firstPaneStyle={{ overflow: "hidden" }}
22
+ secondPaneClassName="workspace-main-pane"
23
+ handle={<span aria-hidden>⋮</span>}
24
+ >
17
25
  <SidePanel />
18
26
  <MainPanel />
19
27
  </Splitter>
@@ -64,6 +72,9 @@ const [w, setW] = useState(220);
64
72
  | step | `number` | `16` | 方向键步长 (px) |
65
73
  | secondMin | `number` | `24` | 第二面板保留的最小尺寸 |
66
74
  | storageKey | `string` | — | 持久化尺寸的本地存储键 |
75
+ | firstPaneClassName / firstPaneStyle | `string / CSSProperties` | — | 第一个面板的 class 与内联样式 |
76
+ | secondPaneClassName / secondPaneStyle | `string / CSSProperties` | — | 第二个面板的 class 与内联样式 |
77
+ | handle | `ReactNode` | — | 正式的分隔手柄内容槽;null 隐藏默认握柄 |
67
78
  | handleProps | `HTMLAttributes<HTMLDivElement>` | — | 分隔手柄原生属性与 aria-label |
68
79
  | children \* | `[ReactNode, ReactNode]` | — | 必须恰好两个子节点 |
69
80
 
@@ -25,6 +25,27 @@ import { TablePro } from "@fangxinyan/lumina";
25
25
  />
26
26
  ```
27
27
 
28
+ ### 当前行高亮 / 横向空态
29
+
30
+ activeRowKey 只表达当前上下文,不会勾选行;横向滚动表格的 empty 会始终居中在可视区域。
31
+
32
+ ```tsx
33
+ <TablePro
34
+ rowKey="id"
35
+ activeRowKey={activeRowKey}
36
+ rowClassName={(row) => row.status === "离线" ? "offline-row" : undefined}
37
+ onRowClick={(row) => setActiveRowKey(row.id)}
38
+ data={rows}
39
+ columns={columns}
40
+ />
41
+
42
+ <TablePro
43
+ data={[]}
44
+ scroll={{ x: 1200 }}
45
+ empty={<Tag>当前筛选没有结果</Tag>}
46
+ />
47
+ ```
48
+
28
49
  ### 卡片行分页
29
50
 
30
51
  variant='cards' 与内置 pagination 共用 TablePro 容器背景,分页区不会单独变成另一块底色。
@@ -59,7 +80,8 @@ TablePro 直接透传 expandable 到 Table。
59
80
 
60
81
  | Prop | 类型 | 默认 | 说明 |
61
82
  | --- | --- | --- | --- |
62
- | ... | `TableProps` | — | 继承自 Table 全部 props (包括新的 pagination / scroll / rowSelection / expandable / filters) |
83
+ | ... | `TableProps` | — | 继承自 Table 全部 props (包括 pagination / scroll / rowSelection / expandable / filters) |
84
+ | activeRowKey / rowClassName | `RowKey / string | (row, index) => string` | — | 纯高亮当前行,并支持固定或按行计算的业务类名 |
63
85
  | toolbar | `ReactNode` | — | 工具栏内容 |
64
86
  | actions | `ReactNode` | — | 工具栏右侧操作 |
65
87
  | footer | `ReactNode` | — | 底部 (可选,传了会渲染在分页下方) |
package/docs/llms/tabs.md CHANGED
@@ -25,6 +25,24 @@ import { Tabs } from "@fangxinyan/lumina";
25
25
  <Tabs variant="line" items={[...]} />
26
26
  ```
27
27
 
28
+ ### 满高布局 / 正文独立滚动
29
+
30
+ fill 让 Tabs 占满父容器,标签条保持固定,只有 tabs-content 滚动;两个 className 可定向接入业务布局。
31
+
32
+ ```tsx
33
+ <div style={{ height: 260 }}>
34
+ <Tabs
35
+ fill
36
+ tabBarClassName="workspace-tabs-bar"
37
+ contentClassName="workspace-tabs-content"
38
+ items={[
39
+ { key: "general", label: "通用", content: <LongSettings /> },
40
+ { key: "advanced", label: "高级", content: <LongSettings /> },
41
+ ]}
42
+ />
43
+ </div>
44
+ ```
45
+
28
46
  ### 居中对齐
29
47
 
30
48
  centered 让标签条在容器中水平居中。
@@ -44,6 +62,9 @@ centered 让标签条在容器中水平居中。
44
62
  | onChange | `(key: string) => void` | — | 切换 |
45
63
  | variant | `"line" | "pill" | "segmented"` | `"line"` | 样式 |
46
64
  | centered | `boolean` | `false` | 标签条居中对齐 |
65
+ | tabBarClassName | `string` | — | 标签条容器的附加类名 |
66
+ | contentClassName | `string` | — | 正文容器的附加类名 |
67
+ | fill | `boolean` | `false` | 占满父容器,并让正文区域独立滚动 |
47
68
 
48
69
 
49
70
  ---
package/docs/llms.md CHANGED
@@ -3,7 +3,7 @@
3
3
  > 拟态风格的 React 18 组件库,目标是 Electron 桌面应用。**写给 AI 编程助手**的按需文档 —— 每个组件单独一个 `.md`,避免一次性读取全部。示例源自 playground 的 demo,可直接复制运行。
4
4
 
5
5
  - **包名**: `@fangxinyan/lumina`
6
- - **版本**: `0.7.0`
6
+ - **版本**: `0.8.0`
7
7
  - **React 最低版本**: 18
8
8
  - **环境**: 带打包器的 React 工程(Vite / Next.js / Webpack / Remix / Electron + Vite 等)
9
9
  - **零运行时依赖**: 只依赖 `react` / `react-dom` (peer deps)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fangxinyan/lumina",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Lumina — Neumorphic component library for Electron & React apps",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",