ginskill-init 1.0.2 → 2.4.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ginskill-init",
3
- "version": "1.0.2",
3
+ "version": "2.4.0",
4
4
  "description": "Install GinStudio skills and agents for Claude Code",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -0,0 +1,323 @@
1
+ ---
2
+ name: ant-design
3
+ description: |
4
+ **Ant Design (antd) Expert**: Production patterns for building React UIs with Ant Design v5/v6 — components, theming, Form, Table, Modal, layout, icons, TypeScript, Next.js/Vite setup, and best practices.
5
+ - MANDATORY TRIGGERS: ant design, antd, ant-design, <Button, <Form, <Table, <Modal, <Select, <Input, <DatePicker, <ConfigProvider, antd theme, antd dark mode, antd form, antd table, antd modal, antd layout, antd component, antd v5, antd v6, ant design component, design token, colorPrimary, borderRadius, darkAlgorithm, compactAlgorithm, Form.useForm, Form.Item, TableColumnsType, Modal.confirm, Modal.useModal, useToken, ConfigProvider theme, antd migration, antd vite, antd next.js, antd nextjs, antd ssr, antd import, antd icon, @ant-design/icons
6
+ - Use this skill when building, reviewing, or debugging React code that imports from `antd` or `@ant-design/icons`, or when setting up Ant Design in a project.
7
+ ---
8
+
9
+ # Ant Design (antd) — Expert Guide
10
+
11
+ ## Quick Start
12
+
13
+ ```bash
14
+ npm install antd @ant-design/icons
15
+ ```
16
+
17
+ ```tsx
18
+ // src/main.tsx — import once at root
19
+ import 'antd/dist/reset.css';
20
+
21
+ // Components auto tree-shake — no plugin needed in v5
22
+ import { Button, Form, Table, Modal, Select, Input, DatePicker } from 'antd';
23
+ import { SearchOutlined, PlusOutlined } from '@ant-design/icons';
24
+ ```
25
+
26
+ ---
27
+
28
+ ## Key Principles
29
+
30
+ 1. **No `@types/antd`** — TypeScript types are bundled in `antd` itself
31
+ 2. **No `babel-plugin-import`** — v5 CSS-in-JS auto loads styles on demand
32
+ 3. **`antd/dist/reset.css`** — import once at root (replaces `antd/dist/antd.css`)
33
+ 4. **`visible` → `open`** — all popups/overlays use `open` prop in v5+
34
+ 5. **`ConfigProvider` does NOT affect** `message.xxx` / `Modal.xxx` / `notification.xxx` static methods — use `App.useApp()` or `Modal.useModal()` instead
35
+
36
+ ---
37
+
38
+ ## Theme Customization
39
+
40
+ ```tsx
41
+ import { ConfigProvider, theme } from 'antd';
42
+ import type { ThemeConfig } from 'antd';
43
+
44
+ const myTheme: ThemeConfig = {
45
+ token: {
46
+ colorPrimary: '#1677ff', // brand color (cascades to all primary variants)
47
+ borderRadius: 6,
48
+ fontSize: 14,
49
+ fontFamily: 'Inter, sans-serif',
50
+ },
51
+ algorithm: theme.darkAlgorithm, // light | dark | compact | [dark, compact]
52
+ components: {
53
+ Button: { borderRadius: 20 }, // per-component override
54
+ Table: { headerBg: '#f0f4f8' },
55
+ },
56
+ cssVar: true, // enables CSS variables for runtime theming
57
+ };
58
+
59
+ <ConfigProvider theme={myTheme}>
60
+ <App />
61
+ </ConfigProvider>
62
+ ```
63
+
64
+ ### Token layers (3-tier system)
65
+ | Layer | Example | Use |
66
+ |-------|---------|-----|
67
+ | Seed Token | `colorPrimary`, `borderRadius` | Set root values; algorithm derives the rest |
68
+ | Map Token | `colorPrimaryHover`, `colorPrimaryBg` | Auto-derived; override cautiously |
69
+ | Alias Token | `colorLink`, `colorTextHeading` | Semantic batch-controls across components |
70
+
71
+ ### Consume tokens inside components
72
+ ```tsx
73
+ import { theme } from 'antd';
74
+ const { token } = theme.useToken();
75
+ // token.colorPrimary, token.borderRadius, token.paddingLG, ...
76
+
77
+ // Outside React (build time / utilities)
78
+ const t = theme.getDesignToken({ token: { colorPrimary: '#f00' } });
79
+ ```
80
+
81
+ ### Dynamic dark/light toggle
82
+ ```tsx
83
+ const [isDark, setIsDark] = useState(false);
84
+ <ConfigProvider theme={{ algorithm: isDark ? theme.darkAlgorithm : theme.defaultAlgorithm }}>
85
+ ```
86
+
87
+ ---
88
+
89
+ ## Form — Core Patterns
90
+
91
+ ```tsx
92
+ import { Form, Input, Button, Select, Checkbox } from 'antd';
93
+
94
+ const [form] = Form.useForm<MyValues>();
95
+
96
+ <Form form={form} layout="vertical" onFinish={onFinish} scrollToFirstError>
97
+ <Form.Item name="email" label="Email"
98
+ rules={[{ required: true }, { type: 'email', message: 'Invalid email' }]}>
99
+ <Input />
100
+ </Form.Item>
101
+
102
+ <Form.Item name="role" label="Role" rules={[{ required: true }]}>
103
+ <Select options={[{ value: 'admin', label: 'Admin' }]} />
104
+ </Form.Item>
105
+
106
+ {/* Boolean controls need valuePropName="checked" */}
107
+ <Form.Item name="active" valuePropName="checked">
108
+ <Checkbox>Active</Checkbox>
109
+ </Form.Item>
110
+
111
+ <Button type="primary" htmlType="submit">Submit</Button>
112
+ </Form>
113
+ ```
114
+
115
+ ### FormInstance methods
116
+ ```tsx
117
+ form.setFieldValue('email', 'test@test.com'); // single field
118
+ form.setFieldsValue({ email: 'x', role: 'y' }); // multiple
119
+ form.validateFields(); // returns Promise<Values>
120
+ form.resetFields();
121
+ form.getFieldValue('email');
122
+
123
+ // Reactive watch (use instead of getFieldsValue in render)
124
+ const email = Form.useWatch('email', form);
125
+ ```
126
+
127
+ > **Read `docs/key-components.md`** for full Form API, validation rules, Form.List dynamic fields, common mistakes.
128
+
129
+ ---
130
+
131
+ ## Table — Core Pattern
132
+
133
+ ```tsx
134
+ import type { TableColumnsType } from 'antd';
135
+ import { Table, Tag, Button } from 'antd';
136
+
137
+ const columns: TableColumnsType<User> = [
138
+ {
139
+ title: 'Name', dataIndex: 'name',
140
+ sorter: (a, b) => a.name.localeCompare(b.name),
141
+ },
142
+ {
143
+ title: 'Status', dataIndex: 'status',
144
+ filters: [{ text: 'Active', value: 'active' }],
145
+ onFilter: (value, record) => record.status === value,
146
+ render: (status) => <Tag color={status === 'active' ? 'green' : 'red'}>{status}</Tag>,
147
+ },
148
+ {
149
+ title: 'Actions', key: 'actions', fixed: 'right', width: 100,
150
+ render: (_, record) => <Button onClick={() => edit(record)}>Edit</Button>,
151
+ },
152
+ ];
153
+
154
+ <Table<User>
155
+ dataSource={data}
156
+ columns={columns}
157
+ rowKey="id"
158
+ pagination={{ pageSize: 20, showSizeChanger: true }}
159
+ rowSelection={{ type: 'checkbox', onChange: onSelectChange }}
160
+ scroll={{ x: 1000 }}
161
+ onChange={(pagination, filters, sorter) => fetchData({ ...pagination, filters, sorter })}
162
+ />
163
+ ```
164
+
165
+ > **Read `docs/key-components.md`** for full column API, server-side sorting/filtering, virtual scrolling, expandable rows.
166
+
167
+ ---
168
+
169
+ ## Modal — Core Patterns
170
+
171
+ ```tsx
172
+ // Controlled component
173
+ <Modal open={visible} title="Edit" onOk={handleOk} onCancel={close}
174
+ confirmLoading={saving} destroyOnHidden width={600}>
175
+ <Form form={form}>...</Form>
176
+ </Modal>
177
+
178
+ // Imperative — use useModal for context access (NOT Modal.confirm directly)
179
+ const [modal, contextHolder] = Modal.useModal();
180
+ // render {contextHolder} in the JSX tree
181
+ modal.confirm({ title: 'Delete?', onOk: async () => { await deleteItem(); } });
182
+ modal.info({ ... }); modal.success({ ... }); modal.error({ ... });
183
+
184
+ // Static (NO context — theme/locale won't apply)
185
+ Modal.confirm({ title: 'Are you sure?', onOk: () => {} });
186
+ ```
187
+
188
+ ---
189
+
190
+ ## Button — Key Variants
191
+
192
+ ```tsx
193
+ <Button type="primary">Primary</Button>
194
+ <Button type="primary" danger>Delete</Button>
195
+ <Button type="primary" loading={saving}>Save</Button>
196
+ <Button type="primary" icon={<PlusOutlined />}>Add</Button>
197
+ <Button type="primary" htmlType="submit" block>Submit Form</Button>
198
+
199
+ {/* v5.21+ color+variant system */}
200
+ <Button color="primary" variant="outlined">Ghost-style</Button>
201
+ <Button color="danger" variant="filled">Soft Danger</Button>
202
+ <Button color="green" variant="solid">Green Solid</Button>
203
+ ```
204
+
205
+ ---
206
+
207
+ ## Layout
208
+
209
+ ```tsx
210
+ import { Layout, Menu } from 'antd';
211
+ const { Header, Content, Sider, Footer } = Layout;
212
+
213
+ <Layout style={{ minHeight: '100vh' }}>
214
+ <Sider collapsible>
215
+ <Menu theme="dark" mode="inline" items={menuItems} />
216
+ </Sider>
217
+ <Layout>
218
+ <Header style={{ background: '#fff', padding: 0 }} />
219
+ <Content style={{ margin: '24px 16px', padding: 24 }}>
220
+ {children}
221
+ </Content>
222
+ <Footer>Footer</Footer>
223
+ </Layout>
224
+ </Layout>
225
+ ```
226
+
227
+ ---
228
+
229
+ ## Feedback Components
230
+
231
+ ```tsx
232
+ // Transient global messages (top of page)
233
+ import { message, notification } from 'antd';
234
+ message.success('Saved!');
235
+ message.error('Failed.');
236
+ message.loading('Processing...', 2.5);
237
+
238
+ // Persistent notifications (corner)
239
+ notification.success({ message: 'Done', description: 'Your record was saved.' });
240
+
241
+ // Use App.useApp() to get context-aware versions
242
+ import { App } from 'antd';
243
+ const { message, modal, notification } = App.useApp();
244
+ // Wrap root with <App><Root /></App>
245
+ ```
246
+
247
+ ---
248
+
249
+ ## Common Components Quick Reference
250
+
251
+ | Component | Import | Key props |
252
+ |-----------|--------|-----------|
253
+ | Input | `antd` | `value`, `onChange`, `allowClear`, `prefix`, `suffix`, `addonAfter` |
254
+ | Input.TextArea | `antd` | `rows`, `autoSize`, `showCount`, `maxLength` |
255
+ | Input.Password | `antd` | `visibilityToggle` |
256
+ | Select | `antd` | `mode` (multiple/tags), `options`, `showSearch`, `allowClear`, `loading`, `fieldNames` |
257
+ | DatePicker | `antd` | `picker`, `showTime`, `format`, `disabledDate`, `onChange` |
258
+ | Checkbox | `antd` | `checked`, `onChange`; `Checkbox.Group` for grouped |
259
+ | Radio | `antd` | `value`; `Radio.Group`, `Radio.Button` |
260
+ | Switch | `antd` | `checked`, `onChange`, `checkedChildren` |
261
+ | Upload | `antd` | `action`, `accept`, `multiple`, `beforeUpload`, `fileList`, `listType` |
262
+ | Spin | `antd` | `spinning`, `tip`, wraps content |
263
+ | Alert | `antd` | `type` (success/info/warning/error), `message`, `description`, `closable` |
264
+ | Tag | `antd` | `color`, `closable`, `onClose` |
265
+ | Badge | `antd` | `count`, `dot`, `status`, `offset` |
266
+ | Tooltip | `antd` | `title`, `placement`, wraps target |
267
+ | Popconfirm | `antd` | `title`, `onConfirm`, `onCancel`, `okText`, `cancelText` |
268
+ | Drawer | `antd` | `open`, `onClose`, `title`, `placement`, `width` |
269
+ | Card | `antd` | `title`, `extra`, `loading`, `actions`, `hoverable` |
270
+ | Avatar | `antd` | `src`, `icon`, `size`, `shape`; `Avatar.Group` |
271
+ | Tabs | `antd` | `items`, `activeKey`, `onChange`, `type`, `tabPosition` |
272
+
273
+ ---
274
+
275
+ ## Icons
276
+
277
+ ```bash
278
+ npm install @ant-design/icons
279
+ ```
280
+
281
+ ```tsx
282
+ import { SearchOutlined, HeartFilled, SmileTwoTone } from '@ant-design/icons';
283
+ // Naming: <Name>Outlined | <Name>Filled | <Name>TwoTone
284
+ // TwoTone supports twoToneColor prop
285
+
286
+ <SearchOutlined style={{ fontSize: 20, color: '#1677ff' }} />
287
+ ```
288
+
289
+ ---
290
+
291
+ ## Loading Docs On Demand
292
+
293
+ **Do NOT load all docs at once.** Use the routing guide below to load only what is needed.
294
+
295
+ ### Docs Routing Guide
296
+
297
+ | Topic / Component | Load This File |
298
+ |-------------------|---------------|
299
+ | Vite / Next.js setup, v4→v5 migration | `docs/setup.md` |
300
+ | Theme tokens, dark mode, ConfigProvider, CSS vars | `docs/theme.md` |
301
+ | Form, Table, Modal, Button (full API) | `docs/key-components.md` |
302
+ | Menu, Tabs, Layout, Grid | `docs/navigation.md` |
303
+ | Select, Upload, DatePicker, Input (full API) | `docs/data-entry.md` |
304
+ | Typography, Card, List, Descriptions, Space, Flex | `docs/display.md` |
305
+ | Drawer, Message, Notification, Spin, Skeleton, App | `docs/feedback.md` |
306
+ | ProTable, ProForm, ProLayout | `docs/pro-components.md` |
307
+ | All 60+ components — quick reference | `docs/components.md` |
308
+
309
+ ### Fetching Live Docs For Any Component
310
+
311
+ Use the fetch script to get the latest URL for any component, then call `WebFetch` on it:
312
+
313
+ ```bash
314
+ # Run to get the URL for a component
315
+ bash ginstudio-skills/skills/ant-design/scripts/fetch-component-docs.sh <component-name>
316
+ # Examples:
317
+ bash ginstudio-skills/skills/ant-design/scripts/fetch-component-docs.sh select
318
+ bash ginstudio-skills/skills/ant-design/scripts/fetch-component-docs.sh pro-table
319
+ bash ginstudio-skills/skills/ant-design/scripts/fetch-component-docs.sh customize-theme
320
+ ```
321
+
322
+ Then fetch the returned URL with `WebFetch` using the prompt:
323
+ > "Extract all props, types, defaults, sub-components, and code examples"
@@ -0,0 +1,160 @@
1
+ # Ant Design — All Components Reference
2
+
3
+ All components: `import { ComponentName } from 'antd'`
4
+ Icons: `import { IconName } from '@ant-design/icons'`
5
+
6
+ ---
7
+
8
+ ## General (3)
9
+
10
+ | Component | Key Props | Notes |
11
+ |-----------|-----------|-------|
12
+ | **Button** | `type`, `color`, `variant`, `size`, `shape`, `loading`, `danger`, `ghost`, `icon`, `htmlType` | See `key-components.md` for full API |
13
+ | **Icon** | `style`, `spin`, `rotate`, `twoToneColor` | From `@ant-design/icons`; `Outlined`/`Filled`/`TwoTone` suffixes |
14
+ | **Typography** | — | Sub: `Title` (h1-h5), `Text` (copyable, code, delete, editable), `Link`, `Paragraph` |
15
+
16
+ ---
17
+
18
+ ## Layout (6)
19
+
20
+ | Component | Key Props | Notes |
21
+ |-----------|-----------|-------|
22
+ | **Divider** | `type` (horizontal/vertical), `orientation`, `dashed`, `plain` | |
23
+ | **Flex** | `justify`, `align`, `gap`, `wrap`, `vertical` | CSS Flexbox abstraction; v5.10+ |
24
+ | **Grid** (Row/Col) | `Row: gutter, justify, align, wrap` / `Col: span, offset, xs, sm, md, lg, xl` | 24-column grid |
25
+ | **Layout** | `hasSider` | Sub: `Header`, `Content`, `Footer`, `Sider` (collapsible, width, breakpoint) |
26
+ | **Space** | `size`, `direction`, `wrap`, `align`, `split` | Inline gap management |
27
+ | **Splitter** | `layout` (horizontal/vertical), `onResize`, `onResizeEnd` | Resizable panels; v5.21+ |
28
+
29
+ ---
30
+
31
+ ## Navigation (8)
32
+
33
+ | Component | Key Props | Notes |
34
+ |-----------|-----------|-------|
35
+ | **Affix** | `offsetTop`, `offsetBottom`, `target`, `onChange` | Sticky element |
36
+ | **Anchor** | `items`, `affix`, `offsetTop`, `targetOffset`, `onChange` | Jump links |
37
+ | **Breadcrumb** | `items[{ title, href, onClick }]`, `separator` | |
38
+ | **Dropdown** | `menu`, `open`, `trigger`, `placement`, `arrow` | `menu.items` array |
39
+ | **Menu** | `items`, `mode` (horizontal/vertical/inline), `theme`, `selectedKeys`, `openKeys`, `onSelect` | |
40
+ | **Pagination** | `total`, `pageSize`, `current`, `showSizeChanger`, `showQuickJumper`, `onChange` | |
41
+ | **Steps** | `items[{ title, description, status, icon }]`, `current`, `direction`, `type` | |
42
+ | **FloatButton** | `icon`, `tooltip`, `type`, `shape`, `onClick` | Sub: `FloatButton.Group`, `FloatButton.BackTop`; v5.0+ |
43
+
44
+ ---
45
+
46
+ ## Data Entry (19)
47
+
48
+ | Component | Key Props | Notes |
49
+ |-----------|-----------|-------|
50
+ | **AutoComplete** | `options`, `onSearch`, `onSelect`, `filterOption` | Input with suggestions |
51
+ | **Cascader** | `options`, `value`, `onChange`, `multiple`, `showSearch`, `changeOnSelect` | Multi-level selector |
52
+ | **Checkbox** | `checked`, `onChange`, `disabled`, `indeterminate` | `Checkbox.Group: options, value` |
53
+ | **ColorPicker** | `value`, `onChange`, `format`, `presets`, `showText` | v5.5+ |
54
+ | **DatePicker** | `picker`, `value`, `onChange`, `showTime`, `format`, `disabledDate`, `needConfirm` | Uses dayjs; `RangePicker` for ranges |
55
+ | **Form** | — | See `key-components.md` |
56
+ | **Input** | `value`, `onChange`, `allowClear`, `prefix`, `suffix`, `addonBefore`, `addonAfter`, `showCount`, `maxLength` | Sub: `TextArea`, `Password`, `Search` |
57
+ | **InputNumber** | `min`, `max`, `step`, `precision`, `formatter`, `parser`, `addonBefore`, `addonAfter` | |
58
+ | **Mentions** | `options`, `prefix`, `onSearch`, `onSelect` | @mention input |
59
+ | **Radio** | `value`, `onChange` | `Radio.Group: options, value, buttonStyle` / `Radio.Button` |
60
+ | **Rate** | `count`, `value`, `onChange`, `allowHalf`, `character` | Star rating |
61
+ | **Select** | `mode` (multiple/tags), `options`, `value`, `onChange`, `showSearch`, `filterOption`, `allowClear`, `loading`, `fieldNames`, `labelInValue` | |
62
+ | **Segmented** | `options`, `value`, `onChange`, `block`, `size` | Button-group toggle |
63
+ | **Slider** | `min`, `max`, `step`, `value`, `onChange`, `range`, `marks`, `tooltip` | Range or single |
64
+ | **Switch** | `checked`, `onChange`, `checkedChildren`, `unCheckedChildren`, `loading` | |
65
+ | **TimePicker** | `value`, `onChange`, `format`, `use12Hours`, `showNow`, `disabledTime` | |
66
+ | **Transfer** | `dataSource`, `targetKeys`, `onChange`, `titles`, `render`, `listStyle` | Dual-panel list |
67
+ | **TreeSelect** | `treeData`, `value`, `onChange`, `multiple`, `showSearch`, `treeCheckable` | |
68
+ | **Upload** | `action`, `accept`, `multiple`, `fileList`, `onChange`, `beforeUpload`, `listType`, `maxCount` | `listType: 'text' \| 'picture' \| 'picture-card'` |
69
+
70
+ ---
71
+
72
+ ## Data Display (20)
73
+
74
+ | Component | Key Props | Notes |
75
+ |-----------|-----------|-------|
76
+ | **Avatar** | `src`, `icon`, `size`, `shape` (circle/square), `alt` | `Avatar.Group: max, size` |
77
+ | **Badge** | `count`, `dot`, `status`, `color`, `overflowCount`, `showZero`, `offset` | Wraps child |
78
+ | **Calendar** | `value`, `onSelect`, `dateCellRender`, `monthCellRender`, `mode`, `fullscreen` | |
79
+ | **Card** | `title`, `extra`, `loading`, `actions`, `hoverable`, `cover`, `tabList` | Sub: `Card.Meta`, `Card.Grid` |
80
+ | **Carousel** | `autoplay`, `dots`, `effect`, `arrows`, `afterChange` | |
81
+ | **Collapse** | `items[{ key, label, children }]`, `accordion`, `defaultActiveKey` | |
82
+ | **Descriptions** | `items[{ key, label, children, span }]`, `column`, `layout`, `bordered`, `title` | Key-value display |
83
+ | **Empty** | `image`, `description`, `imageStyle` | No-data placeholder |
84
+ | **Image** | `src`, `width`, `height`, `preview`, `fallback` | `Image.PreviewGroup` for gallery |
85
+ | **List** | `dataSource`, `renderItem`, `grid`, `pagination`, `loading` | Sub: `List.Item`, `List.Item.Meta` |
86
+ | **Popover** | `content`, `title`, `trigger`, `placement`, `open` | Richer than Tooltip |
87
+ | **QRCode** | `value`, `size`, `color`, `bgColor`, `icon`, `status` | v5.1+ |
88
+ | **Statistic** | `value`, `title`, `prefix`, `suffix`, `formatter`, `precision` | `Statistic.Countdown` |
89
+ | **Table** | — | See `key-components.md` |
90
+ | **Tabs** | `items[{ key, label, children }]`, `activeKey`, `onChange`, `type`, `tabPosition`, `tabBarExtraContent` | |
91
+ | **Tag** | `color`, `closable`, `onClose`, `bordered` | Preset or hex color |
92
+ | **Timeline** | `items[{ color, dot, label, children }]`, `mode`, `pending`, `reverse` | |
93
+ | **Tooltip** | `title`, `placement`, `trigger`, `open`, `color` | Light hover text |
94
+ | **Tree** | `treeData`, `checkable`, `defaultExpandAll`, `onCheck`, `onSelect`, `draggable` | |
95
+ | **Watermark** | `content`, `font`, `image`, `rotate`, `gap`, `offset` | v5.1+ |
96
+
97
+ ---
98
+
99
+ ## Feedback (11)
100
+
101
+ | Component | Key Props | Notes |
102
+ |-----------|-----------|-------|
103
+ | **Alert** | `type` (success/info/warning/error), `message`, `description`, `closable`, `action`, `showIcon`, `banner` | Inline banner |
104
+ | **Drawer** | `open`, `onClose`, `title`, `placement`, `width`, `height`, `mask`, `extra`, `footer` | Slide-in panel |
105
+ | **Message** | — | Imperative: `message.success/error/warning/info/loading(content, duration)` |
106
+ | **Modal** | — | See `key-components.md` |
107
+ | **Notification** | — | `notification.success/error/warning/info({ message, description, placement, duration })` |
108
+ | **Popconfirm** | `title`, `onConfirm`, `onCancel`, `okText`, `cancelText`, `okButtonProps`, `placement` | Bubble confirm |
109
+ | **Progress** | `percent`, `type` (line/circle/dashboard), `status`, `strokeColor`, `format`, `steps` | |
110
+ | **Result** | `status` (success/error/warning/404/403/500), `title`, `subTitle`, `extra` | Full-page outcome |
111
+ | **Skeleton** | `active`, `paragraph`, `avatar`, `title`, `loading` | Loading placeholder |
112
+ | **Spin** | `spinning`, `tip`, `size`, `delay`, wraps content | Loading overlay |
113
+ | **Tour** | `open`, `onClose`, `steps[{ title, description, target, cover }]` | Guided tour; v5.0+ |
114
+
115
+ ---
116
+
117
+ ## Utility Components
118
+
119
+ | Component | Notes |
120
+ |-----------|-------|
121
+ | **App** | Wrap root: `<App>`. Use `App.useApp()` for context-aware `message`, `modal`, `notification` |
122
+ | **ConfigProvider** | Global theme, locale, direction, componentSize, virtual, getPopupContainer |
123
+
124
+ ---
125
+
126
+ ## Quick Import Reference
127
+
128
+ ```tsx
129
+ // Single import covers everything — fully tree-shaken
130
+ import {
131
+ // Layout
132
+ Layout, Grid, Row, Col, Space, Flex, Divider,
133
+ // Navigation
134
+ Menu, Breadcrumb, Pagination, Steps, Tabs, Dropdown,
135
+ // Data Entry
136
+ Form, Input, Select, DatePicker, Checkbox, Radio, Switch, Upload, Slider,
137
+ InputNumber, AutoComplete, Cascader, Rate, Transfer, Mentions, TimePicker,
138
+ // Data Display
139
+ Table, Card, List, Avatar, Badge, Tag, Tooltip, Popover, Tree, Image,
140
+ Collapse, Carousel, Timeline, Descriptions, Statistic, QRCode, Calendar,
141
+ // Feedback
142
+ Modal, Drawer, Alert, Spin, Progress, Skeleton, Result, Popconfirm,
143
+ // Utility
144
+ ConfigProvider, App,
145
+ // Imperative APIs
146
+ message, notification,
147
+ // Theme
148
+ theme,
149
+ } from 'antd';
150
+
151
+ // Icons (separate package)
152
+ import { SearchOutlined, PlusOutlined, DeleteFilled } from '@ant-design/icons';
153
+
154
+ // TypeScript types
155
+ import type {
156
+ ButtonProps, InputProps, SelectProps, FormInstance, FormProps,
157
+ TableColumnsType, TableProps, TablePaginationConfig,
158
+ ModalProps, DrawerProps, MenuProps, TabsProps, ThemeConfig,
159
+ } from 'antd';
160
+ ```