eisland-dev-add-empty-…
Add a new empty subpage (tab) to an existing eIsland settings section with page navigation support. Use this skill whenever the user wants to add a new…
为 eIsland 灵动岛添加一个新的空白状态机(IslandState)。当用户要求创建新状态、新页面、 新界面(如登录页、设置子页面、独立面板)时使用此 skill。即使用户只说"加个新状态"或 "创建一个 XX 页面",也应触发。此 skill 覆盖从类型注册、窗口尺寸、CSS 样式到鼠标交互 行为的全部 12 个修改点,确保状态机完整可用。
$ npx -y skills add JNTMTMTM/eIsland --skill eisland-dev-add-empty-state --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/eisland-dev-add-empty-stateContext preview
The summary Claude sees to decide when to auto-load this skill.
为 eIsland 灵动岛添加一个新的空白状态机(IslandState)。当用户要求创建新状态、新页面、 新界面(如登录页、设置子页面、独立面板)时使用此 skill。即使用户只说"加个新状态"或 "创建一个 XX 页面",也应触发。此 skill 覆盖从类型注册、窗口尺寸、CSS 样式到鼠标交互 行为的全部 12 个修改点,确保状态机完整可用。
name: eisland-dev-add-empty-state description: > 为 eIsland 灵动岛添加一个新的空白状态机(IslandState)。当用户要求创建新状态、新页面、 新界面(如登录页、设置子页面、独立面板)时使用此 skill。即使用户只说"加个新状态"或 "创建一个 XX 页面",也应触发。此 skill 覆盖从类型注册、窗口尺寸、CSS 样式到鼠标交互 行为的全部 12 个修改点,确保状态机完整可用。
为灵动岛添加一个新的空白 IslandState,使其具备正确的窗口大小、样式和交互行为。
在开始前,向用户确认以下信息:
1. **状态名称** — kebab-case 标识符(如 `musicProvidersLogin`、`settings wizard`) 2. **窗口大小** — 选择一种预设:
3. **鼠标移出后是否收回?** — **必须主动询问**: > "鼠标移出灵动岛后,是否自动收回至待机状态?(大多数独立页面如登录、注册、支付页面选择不收回)"
4. **是否为认证/登录类页面?** — 如果是,需要导入 `auth.css` 并使用 `auth-state-content` 类名
**文件:** `src/renderer/store/types/index.ts`
1a. 在 `IslandState` 联合类型末尾添加新状态名:
export type IslandState = '...' | 'newStateName';
1b. 在 `IslandSlice` 接口中添加 setter 方法签名:
setNewStateName: () => void;
**文件:** `src/renderer/store/slices/islandSlice.ts`
在已有的 setter 群(如 `setBindEmail` 之后)添加新 setter:
setNewStateName: () => set((prev) => {
if (prev.uiStateLocked && prev.state !== 'newStateName') return prev;
const standalone = isStandaloneRenderer();
if (!standalone) {
window.api?.expandWindowSettings();
window.api?.disableMousePassthrough();
}
const nextAuthReturnState = (/* 已有 auth 状态列表 */ || prev.state === 'newStateName')
? prev.authReturnState
: (standalone ? 'maxExpand' : prev.state);
return { state: 'newStateName' as never, authReturnState: nextAuthReturnState };
}),2b. 在 `setIdle` 的守卫条件中添加新状态(防止被强制收回):
if (!force && (... || prev.state === 'newStateName')) return prev;
2c. 在 `returnFromAuth` 中:
**文件:** `src/renderer/store/constants/islandTransition.ts`
在 `ISLAND_STATE_AREA` 中添加条目(值与所选窗口大小一致):
newStateName: 860 * 400, // maxExpand 尺寸
**文件:** `src/renderer/components/config/dynamicIslandStateConfig.ts`
在 `STATE_CONFIGS` 中添加条目:
newStateName: {
name: 'newStateName',
mousePassthrough: false,
expanded: true,
enterDelay: 0,
leaveDelay: 0,
},**5a.** 创建目录 `src/renderer/components/states/newStateName/`
**5b.** 创建 `NewStateNameContent.tsx`:
import type { ReactElement } from 'react';
// 如果是认证类页面,导入 auth.css:
// import '../../../styles/auth/auth.css';
export function NewStateNameContent(): ReactElement {
// 认证类页面使用 auth-state-content 类
// return <div className="auth-state-content" />;
return <div />;
}**5c.** 创建 `index.ts`:
export { NewStateNameContent } from './NewStateNameContent';**6a.** `src/renderer/components/components/DynamicIslandStateContent.tsx`:
import { NewStateNameContent } from '../states/newStateName';
// 在状态判断链中添加:
if (state === 'newStateName') return <NewStateNameContent />;**6b.** `src/renderer/components/components/StandaloneWindowViewport.tsx`:
import { NewStateNameContent } from '../states/newStateName';
// 在 SettingsTab 守卫前添加:
{activeTab === 'settings' && state === 'newStateName' && <NewStateNameContent />}
// 更新 SettingsTab 排除条件:
{activeTab === 'settings' && state !== '...' && state !== 'newStateName' && <SettingsTab />}**文件:** `src/renderer/styles/shell/shell.css`
将新状态添加到对应尺寸的选择器组中。例如 maxExpand 尺寸:
.island-shell.login,
.island-shell.register,
/* ... */
.island-shell.newStateName {
width: 860px;
height: 400px;
background: var(--color-island-bg);
border-radius: 0 0 22px 22px;
box-shadow: none;
}同时添加 `::before` 伪元素规则(隐藏光泽层):
.island-shell.login::before,
/* ... */
.island-shell.newStateName::before {
opacity: 0;
pointer-events: none;
}**文件:** `src/renderer/styles/auth/auth.css`
将新状态添加到 auth 动画选择器组:
.island-shell.login .auth-state-content,
/* ... */
.island-shell.newStateName .auth-state-content {
align-items: center;
padding: 14px 22px;
}如果用户确认需要"鼠标移出后不收回",修改以下 3 个文件:
**9a.** `src/renderer/components/hooks/useIslandHoverInteraction.ts`:
**9b.** `src/renderer/components/hooks/useIslandSettingsSync.ts`:
npx tsc --noEmit --skipLibCheck
完成所有步骤后,验证以下文件已被修改:
eIsland - A sleek, Apple Dynamic Island inspired floating widget for Windows, built with Electron.
Repo: JNTMTMTM/eIsland
Add a new empty subpage (tab) to an existing eIsland settings section with page navigation support. Use this skill whenever the user wants to add a new…
创建 eIsland 引导配置窗口的新步骤页面。当用户要求在引导界面(Guide)中新增配置步骤、引导页面、引导分页时使用此 skill。 触发关键词:guide 步骤、引导页面、引导分页、Guide step、新建引导页、添加引导配置。 适用于 src/renderer/components/components/…
为 eIsland 灵动岛的 MaxExpand(全展开)模式添加一个新的 Tab 页面。当用户要求创建新的 MaxExpand 页面、添加全展开界面组件(如计算器、时钟、天气面板、便签、日历等)时使用此 skill。 即使用户只说"新建一个 maxexpand 界面"、"加个全展开页面"、"在 maxexpand…
Add a new SVG icon to the project's icon enum system with matching test assertions. Use this skill whenever the user asks to "add SVG icon", "添加图标", "add icon…
Generate a release announcement markdown for eIsland. Use this skill whenever the user asks to "generate release notes", "create announcement", "写更新日志",…
Analyze the current git status, review all staged and unstaged changes, and create a commit with a proper English commit message following conventional commit…