@fangxinyan/lumina 0.9.1 → 0.9.3

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.
package/dist/styles.css CHANGED
@@ -1689,19 +1689,71 @@ button.collapse-chev {
1689
1689
  flex: 1;
1690
1690
  min-width: 0;
1691
1691
  align-items: center;
1692
+ width: 100%;
1692
1693
  }
1693
1694
  .select.multi .select-trigger > .placeholder {
1694
1695
  padding-left: 6px;
1695
1696
  line-height: calc(var(--ctrl-h) - 8px);
1696
1697
  }
1697
1698
  .select.multi .select-tags > .tag {
1698
- max-width: 160px;
1699
+ max-width: min(160px, 100%);
1700
+ min-width: 0;
1701
+ flex-shrink: 1;
1699
1702
  }
1700
- .select.multi .select-tags > .tag > span:not(.dot):not(.x) {
1703
+ .select.multi .select-tag-label {
1704
+ display: block;
1705
+ min-width: 0;
1701
1706
  white-space: nowrap;
1702
1707
  overflow: hidden;
1703
1708
  text-overflow: ellipsis;
1704
1709
  }
1710
+ .select.multi .select-tag-label > * {
1711
+ min-width: 0;
1712
+ max-width: 100%;
1713
+ }
1714
+ .select.multi .select-tag-overflow {
1715
+ flex-shrink: 0;
1716
+ }
1717
+ .select.multi.searchable .select-trigger {
1718
+ cursor: text;
1719
+ }
1720
+ .select-search-input {
1721
+ min-width: 0;
1722
+ height: 24px;
1723
+ padding: 0 2px;
1724
+ border: 0;
1725
+ outline: 0;
1726
+ appearance: none;
1727
+ background: transparent;
1728
+ color: var(--lmn-select-fg, var(--fg));
1729
+ font: inherit;
1730
+ line-height: 24px;
1731
+ }
1732
+ .select-search-input[data-inline-size="fill"] {
1733
+ flex: 1 1 auto;
1734
+ width: 100%;
1735
+ }
1736
+ .select-search-input[data-inline-size="content"] {
1737
+ flex: 0 1 auto;
1738
+ min-width: 2ch;
1739
+ max-width: 100%;
1740
+ field-sizing: content;
1741
+ }
1742
+ .select-search-input::placeholder {
1743
+ color: var(--lmn-select-fg-subtle, var(--fg-subtle));
1744
+ }
1745
+ .select-search-input::-webkit-search-cancel-button {
1746
+ appearance: none;
1747
+ }
1748
+ .select-search-input:focus-visible {
1749
+ box-shadow: none;
1750
+ }
1751
+ .select.searchable:focus-within .select-trigger {
1752
+ box-shadow: var(--lmn-select-neu-shadow-inset, var(--neu-shadow-inset)), 0 0 0 3px var(--lmn-select-accent-glow, var(--accent-glow));
1753
+ }
1754
+ .select.multi.searchable .select-caret {
1755
+ cursor: pointer;
1756
+ }
1705
1757
  .select-clear {
1706
1758
  position: absolute;
1707
1759
  right: 30px;
@@ -1742,14 +1794,6 @@ button.collapse-chev {
1742
1794
  background: var(--lmn-select-accent, var(--accent));
1743
1795
  box-shadow: var(--lmn-select-neu-shadow-control, var(--neu-shadow-control)), 0 1px 4px var(--lmn-select-accent-glow, var(--accent-glow));
1744
1796
  }
1745
- /* Menu search — flush with menu, single subtle separator (no nested frame) */
1746
- .menu-search {
1747
- display: block;
1748
- padding: 4px 2px 8px;
1749
- margin: -2px -2px 4px;
1750
- border-bottom: 1px solid var(--lmn-select-divider, var(--divider));
1751
- }
1752
- .menu-search .input-wrap { width: 100%; }
1753
1797
  /* Menu state (loading / empty) */
1754
1798
  .menu-state {
1755
1799
  display: flex;
@@ -27,6 +27,43 @@ multiple + Tag 形式呈现已选项。
27
27
  <Select multiple clearable value={tags} onChange={setTags} options={...} />
28
28
  ```
29
29
 
30
+ ### 远程搜索多选
31
+
32
+ searchable 在单选和多选中都复用选择框本体作为输入;多选 Tag 后的空输入会收缩,不单独占行。选中后保持展开和关键词,业务层负责防抖与迟到结果保护。
33
+
34
+ ```tsx
35
+ const [value, setValue] = useState<string[]>([]);
36
+ const [searchValue, setSearchValue] = useState("");
37
+ const [options, setOptions] = useState<SelectOption[]>([]);
38
+ const [loading, setLoading] = useState(false);
39
+ const latestRequest = useRef(0);
40
+
41
+ useEffect(() => {
42
+ const requestId = ++latestRequest.current;
43
+ setLoading(true);
44
+ const timer = window.setTimeout(() => {
45
+ void fetchOptions(searchValue).then((nextOptions) => {
46
+ if (requestId !== latestRequest.current) return;
47
+ setOptions(nextOptions);
48
+ setLoading(false);
49
+ });
50
+ }, 300);
51
+ return () => {
52
+ window.clearTimeout(timer);
53
+ if (requestId === latestRequest.current) latestRequest.current += 1;
54
+ };
55
+ }, [searchValue]);
56
+
57
+ <Select
58
+ multiple searchable clearable
59
+ value={value} onChange={setValue}
60
+ searchValue={searchValue} onSearch={setSearchValue}
61
+ options={options} loading={loading}
62
+ filterOption={false}
63
+ maxTagCount={2}
64
+ />
65
+ ```
66
+
30
67
  ### 数量上限 / 分类限选
31
68
 
32
69
  maxCount 限制总数;getOptionDisabled 可读取当前选择,实现“一类最多选一个”。
@@ -147,8 +184,10 @@ loading 时显示 spinner,emptyContent 自定义空态。
147
184
  | maxTagCount | `number` | — | 多选时显示的标签数(超出折叠 +N) |
148
185
  | maxCount | `number` | — | 多选允许的最大选择数;达到上限后禁用未选项 |
149
186
  | getOptionDisabled | `(option, selectedValues) => boolean` | — | 基于候选项和当前选择动态判断禁用状态 |
150
- | searchable | `boolean` | `false` | 可搜索 |
187
+ | searchable | `boolean` | `false` | 在选择框本体内启用搜索,单选和多选共用同一交互形态 |
151
188
  | showSearch | `boolean` | `false` | searchable 的等价别名 |
189
+ | searchValue / defaultSearchValue | `string` | — | 受控搜索词 / 非受控初始搜索词;多选 searchable 时输入框位于标签同一触发器内 |
190
+ | onSearch | `(value: string) => void` | — | 搜索词交互变化回调;多选选中不会清空关键词,关闭时清空并回调空字符串 |
152
191
  | filterOption | `(input, option) => boolean` | — | 自定义过滤 |
153
192
  | optionFilterProp | `"label" | "value" | "text" | string` | — | 默认过滤使用的 option 字段 |
154
193
  | clearable | `boolean` | `false` | 显示独立且可访问的清除按钮 |
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.9.1`
6
+ - **版本**: `0.9.3`
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.9.1",
3
+ "version": "0.9.3",
4
4
  "description": "Lumina — Neumorphic component library for Electron & React apps",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",