/eisland-dev-add-empty-setting-subpage
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 tab/page/subpage to any settings section in the eIsland project, including requests like "添加分页", "add a tab", "add subpage",
$ npx -y skills add JNTMTMTM/eIsland --skill eisland-dev-add-empty-setting-subpage --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/eisland-dev-add-empty-setting-subpage
Context preview
The summary Claude sees to decide when to auto-load this skill.
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 tab/page/subpage to any settings section in the eIsland project, including requests like "添加分页", "add a tab", "add subpage",
SKILL.md
eisland-dev-add-empty-setting-subpage.SKILL.mdname: eisland-dev-add-empty-setting-subpage
description: >
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 tab/page/subpage to any settings section in the eIsland project,
including requests like "添加分页", "add a tab", "add subpage", "新建空白分页", "add empty page to settings",
or when extending settings sections like AI, update, network, music, weather, mail, etc. with new page navigation.
This skill handles the full workflow: type definitions, config constants, PageDots component, section modifications,
SettingsTab state wiring, and i18n translations.
eIsland: Add Empty Settings Subpage
This skill guides you through adding a new empty subpage (with page navigation) to an existing eIsland settings section.
When to Use
- User asks to add a new tab/page/subpage to any settings section
- User wants to extend a settings section with page navigation
- User mentions "分页", "tab", "subpage" in context of settings
Prerequisites
Before starting, identify: 1. **Target settings section** — which section to extend (e.g., `update`, `ai`, `network`, `music`, `weather`, `mail`) 2. **New page key** — a kebab-case identifier (e.g., `info-sync`, `data-center`) 3. **New page label** — display name in Chinese (e.g., `信息同步`)
Reference Pattern
The canonical implementation pattern is the **AI settings section** (`ai`), which has pages: `general`, `r1pxc`, `ollama`.
Key reference files:
- `src/renderer/components/states/maxExpand/components/setting/utils/settingsConfig.ts` — types & config
- `src/renderer/components/states/maxExpand/components/setting/components/ai/AiSettingsSection.tsx` — section with pages
- `src/renderer/components/states/maxExpand/components/setting/components/ai/AiSettingsPageDots.tsx` — page dots component
- `src/renderer/components/states/maxExpand/components/setting/components/SettingsPageNavigation.tsx` — shared navigation
Step-by-Step Workflow
Step 1: Update `settingsConfig.ts`
File: `src/renderer/components/states/maxExpand/components/setting/utils/settingsConfig.ts`
**1a.** Add/extend the page key type:
// If the type already exists, add the new key to the union
export type XxxSettingsPageKey = 'existing-page' | 'new-page';
// If creating a new type, add it after similar types
**1b.** Update `SettingsTabLabelKey` union type to include the new page key:
export type SettingsTabLabelKey = SettingsSidebarTabKey | AppSettingsPageKey | AiSettingsPageKey | MusicNavCardKey | NewPageKey;
**1c.** Add labels in `SETTINGS_TAB_LABELS`:
'new-page': '新页面名称',
**1d.** Add descriptions in `SETTINGS_TAB_DESCRIPTIONS`:
'new-page': '新页面描述',
**1e.** Add pages array and labels record (after similar definitions):
export const XXX_SETTINGS_PAGES: XxxSettingsPageKey[] = ['existing-page', 'new-page'];
export const XXX_SETTINGS_PAGE_LABELS: Record<XxxSettingsPageKey, string> = {
'existing-page': '已有页面',
'new-page': '新页面',
};Step 2: Create PageDots Component
Create: `src/renderer/components/states/maxExpand/components/setting/components/<section>/<Section>SettingsPageDots.tsx`
Follow the pattern from `AiSettingsPageDots.tsx`:
import type { ReactElement } from 'react';
import { useTranslation } from 'react-i18next';
import { SettingsPageNavigation } from '../SettingsPageNavigation';
import type { XxxSettingsPageKey } from '../../utils/settingsConfig';
export interface XxxSettingsPageDotsProps {
xxxSettingsPage: XxxSettingsPageKey;
expanded: boolean;
xxxSettingsPages: XxxSettingsPageKey[];
settingsTabLabels: Record<string, string>;
setXxxSettingsPage: (page: XxxSettingsPageKey) => void;
}
export function XxxSettingsPageDots({
xxxSettingsPage,
expanded,
xxxSettingsPages,
settingsTabLabels,
setXxxSettingsPage,
}: XxxSettingsPageDotsProps): ReactElement {
const { t } = useTranslation();
return (
<SettingsPageNavigation
activePage={xxxSettingsPage}
expanded={expanded}
pages={xxxSettingsPages}
pageLabels={settingsTabLabels}
navigationLabel={t('settings.xxx.pagination')}
onSelectPage={setXxxSettingsPage}
/>
);
}Step 3: Modify the Settings Section
Modify: `src/renderer/components/states/maxExpand/components/setting/components/<section>/<Section>SettingsSection.tsx`
**3a.** Add imports:
import { useState, type ReactElement } from 'react';
import { XxxSettingsPageDots } from './XxxSettingsPageDots';
import { SettingsPageNavigationToggle } from '../SettingsPageNavigation';
import type { XxxSettingsPageKey } from '../../utils/settingsConfig';**3b.** Add props to the interface:
currentXxxSettingsPageLabel: string;
xxxSettingsPage: XxxSettingsPageKey;
xxxSettingsPages: XxxSettingsPageKey[];
xxxSettingsPageLabels: Record<string, string>;
setXxxSettingsPage: (page: XxxSettingsPageKey) => void;
**3c.** Add state and page rendering in the component body:
const [pageNavigationExpanded, setPageNavigationExpanded] = useState(false);
// Wrap existing content in a page render function
const renderExistingPage = (): ReactElement => (
<div className="settings-cards">
{/* existing cards here */}
</div>
);
// Add new empty page
const renderNewPage = (): ReactElement => (
<div className="settings-cards">
{/* empty - to be implemented */}
</div>
);
const renderCurrentPage = (): ReactElement | null => {
switch (xxxSettingsPage) {
case 'existing-page':
return renderExistingPage();
case 'new-page':
return renderNewPage();
default:
return null;
}
};**3d.** Update the JSX return to use page layout:
return (
<div className="max-expand-settings-section">
<div className="max-expand-settings-title settings-app-title-line">
<span>{t('settings.labels.xxx', { defaultValueRead more
name: eisland-dev-add-empty-setting-subpage description: > 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 tab/page/subpage to any settings section in the eIsland project, including requests like "添加分页", "add a tab", "add subpage", "新建空白分页", "add empty page to settings", or when extending settings sections like AI, update, network, music, weather, mail, etc. with new page navigation. This skill handles the full workflow: type definitions, config constants, PageDots component, section modifications, SettingsTab state wiring, and i18n translations.
eIsland: Add Empty Settings Subpage
This skill guides you through adding a new empty subpage (with page navigation) to an existing eIsland settings section.
When to Use
- User asks to add a new tab/page/subpage to any settings section
- User wants to extend a settings section with page navigation
- User mentions "分页", "tab", "subpage" in context of settings
Prerequisites
Before starting, identify: 1. **Target settings section** — which section to extend (e.g., `update`, `ai`, `network`, `music`, `weather`, `mail`) 2. **New page key** — a kebab-case identifier (e.g., `info-sync`, `data-center`) 3. **New page label** — display name in Chinese (e.g., `信息同步`)
Reference Pattern
The canonical implementation pattern is the **AI settings section** (`ai`), which has pages: `general`, `r1pxc`, `ollama`.
Key reference files:
- `src/renderer/components/states/maxExpand/components/setting/utils/settingsConfig.ts` — types & config
- `src/renderer/components/states/maxExpand/components/setting/components/ai/AiSettingsSection.tsx` — section with pages
- `src/renderer/components/states/maxExpand/components/setting/components/ai/AiSettingsPageDots.tsx` — page dots component
- `src/renderer/components/states/maxExpand/components/setting/components/SettingsPageNavigation.tsx` — shared navigation
Step-by-Step Workflow
Step 1: Update `settingsConfig.ts`
File: `src/renderer/components/states/maxExpand/components/setting/utils/settingsConfig.ts`
**1a.** Add/extend the page key type:
// If the type already exists, add the new key to the union export type XxxSettingsPageKey = 'existing-page' | 'new-page'; // If creating a new type, add it after similar types
**1b.** Update `SettingsTabLabelKey` union type to include the new page key:
export type SettingsTabLabelKey = SettingsSidebarTabKey | AppSettingsPageKey | AiSettingsPageKey | MusicNavCardKey | NewPageKey;
**1c.** Add labels in `SETTINGS_TAB_LABELS`:
'new-page': '新页面名称',
**1d.** Add descriptions in `SETTINGS_TAB_DESCRIPTIONS`:
'new-page': '新页面描述',
**1e.** Add pages array and labels record (after similar definitions):
export const XXX_SETTINGS_PAGES: XxxSettingsPageKey[] = ['existing-page', 'new-page'];
export const XXX_SETTINGS_PAGE_LABELS: Record<XxxSettingsPageKey, string> = {
'existing-page': '已有页面',
'new-page': '新页面',
};Step 2: Create PageDots Component
Create: `src/renderer/components/states/maxExpand/components/setting/components/<section>/<Section>SettingsPageDots.tsx`
Follow the pattern from `AiSettingsPageDots.tsx`:
import type { ReactElement } from 'react';
import { useTranslation } from 'react-i18next';
import { SettingsPageNavigation } from '../SettingsPageNavigation';
import type { XxxSettingsPageKey } from '../../utils/settingsConfig';
export interface XxxSettingsPageDotsProps {
xxxSettingsPage: XxxSettingsPageKey;
expanded: boolean;
xxxSettingsPages: XxxSettingsPageKey[];
settingsTabLabels: Record<string, string>;
setXxxSettingsPage: (page: XxxSettingsPageKey) => void;
}
export function XxxSettingsPageDots({
xxxSettingsPage,
expanded,
xxxSettingsPages,
settingsTabLabels,
setXxxSettingsPage,
}: XxxSettingsPageDotsProps): ReactElement {
const { t } = useTranslation();
return (
<SettingsPageNavigation
activePage={xxxSettingsPage}
expanded={expanded}
pages={xxxSettingsPages}
pageLabels={settingsTabLabels}
navigationLabel={t('settings.xxx.pagination')}
onSelectPage={setXxxSettingsPage}
/>
);
}Step 3: Modify the Settings Section
Modify: `src/renderer/components/states/maxExpand/components/setting/components/<section>/<Section>SettingsSection.tsx`
**3a.** Add imports:
import { useState, type ReactElement } from 'react';
import { XxxSettingsPageDots } from './XxxSettingsPageDots';
import { SettingsPageNavigationToggle } from '../SettingsPageNavigation';
import type { XxxSettingsPageKey } from '../../utils/settingsConfig';**3b.** Add props to the interface:
currentXxxSettingsPageLabel: string; xxxSettingsPage: XxxSettingsPageKey; xxxSettingsPages: XxxSettingsPageKey[]; xxxSettingsPageLabels: Record<string, string>; setXxxSettingsPage: (page: XxxSettingsPageKey) => void;
**3c.** Add state and page rendering in the component body:
const [pageNavigationExpanded, setPageNavigationExpanded] = useState(false);
// Wrap existing content in a page render function
const renderExistingPage = (): ReactElement => (
<div className="settings-cards">
{/* existing cards here */}
</div>
);
// Add new empty page
const renderNewPage = (): ReactElement => (
<div className="settings-cards">
{/* empty - to be implemented */}
</div>
);
const renderCurrentPage = (): ReactElement | null => {
switch (xxxSettingsPage) {
case 'existing-page':
return renderExistingPage();
case 'new-page':
return renderNewPage();
default:
return null;
}
};**3d.** Update the JSX return to use page layout:
return (
<div className="max-expand-settings-section">
<div className="max-expand-settings-title settings-app-title-line">
<span>{t('settings.labels.xxx', { defaultValueeIsland - A sleek, Apple Dynamic Island inspired floating widget for Windows, built with Electron.
Repo: JNTMTMTM/eIsland
Other skills on eisland.
- /eisland-dev-add-guide-step
创建 eIsland 引导配置窗口的新步骤页面。当用户要求在引导界面(Guide)中新增配置步骤、引导页面、引导分页时使用此 skill。 触发关键词:guide 步骤、引导页面、引导分页、Guide step、新建引导页、添加引导配置。 适用于 src/renderer/components/components/ 目录下的 Guide 模块。
Open skill - /eisland-dev-add-svg-icon
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 enum", "注册图标", "补齐图标枚举", "add SVG enum", or wants to register a new .svg file in the SvgIcon utility. Also trigger when
Open skill - /eisland-dev-generate-release-worklog
Generate a release announcement markdown for eIsland. Use this skill whenever the user asks to "generate release notes", "create announcement", "写更新日志", "生成发布公告", "draft release notes", or mentions preparing a new version release document.
Open skill - /eisland-dev-git-commit
Analyze the current git status, review all staged and unstaged changes, and create a commit with a proper English commit message following conventional commit format. Use this skill whenever the user asks to "commit", "提交", "git commit", "analyze and commit", "check git status
Open skill - /eisland-dev-refactor-module-split
Refactor a monolithic React component file into a standardized module structure with components/, hooks/, utils/, types/, and config/ subdirectories. Use this skill whenever the user asks to "split", "refactor", "拆分", "拆解", or "restructure" a component file into subdirectories,
Open skill - /eisland-dev-update-docs
Update or create documentation in the eIsland VuePress docs site (web/eisland-web-docs). Use this skill whenever the user asks to update docs, add documentation, write a doc article, document a feature, update the tech stack docs, update plugin docs, update command docs, or any
Open skill

