@wangs-ui/skills 1.3.0-alpha.12 → 1.3.0-alpha.14

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.
@@ -17,15 +17,15 @@ Do **NOT** hardcode or guess prop names, component options, preset variations, o
17
17
  ### Component & Form API Protocol:
18
18
 
19
19
  ```json
20
- get_component_api({ "id": "form" })
21
- get_component_api({ "id": "field" })
22
- get_component_api({ "id": "dialogform" })
23
- get_component_api({ "id": "input" })
24
- get_component_api({ "id": "numberinput" })
25
- get_component_api({ "id": "select" })
26
- get_component_api({ "id": "multiselect" })
27
- get_component_api({ "id": "datepicker" })
28
- get_component_api({ "id": "fileupload" })
20
+ get_component_api({ "component": "form" })
21
+ get_component_api({ "component": "field" })
22
+ get_component_api({ "component": "dialogform" })
23
+ get_component_api({ "component": "input" })
24
+ get_component_api({ "component": "numberinput" })
25
+ get_component_api({ "component": "select" })
26
+ get_component_api({ "component": "multiselect" })
27
+ get_component_api({ "component": "datepicker" })
28
+ get_component_api({ "component": "fileupload" })
29
29
  ```
30
30
 
31
31
  ### Curated Form Documentation:
@@ -83,6 +83,8 @@ query_graph({ "query": "useWatchField" })
83
83
  - **Children Render Callback**: `Field` yields `{ fieldProps, fieldState }`.
84
84
  - **`fieldProps`**: Pass directly to primitive inputs (`<Input {...fieldProps} />`). Contains `name`, `value`, `ref`, `onChange`.
85
85
  - **`fieldState`**: Provides `invalid`, `error`, `isDirty`, `isPending`. Pass `invalid={fieldState.invalid}` to primitive components for accessibility and validation styling.
86
+ - **⚠️ Mandatory Destructuring (Never `(field) => ...`)**: `<Field>`'s callback render prop must destructure as `{({ fieldProps, fieldState })}`. Passing a single parameter instead (`{(field) => ...}`) produces `undefined` `value`/`onChange` and permanently locks the input.
87
+ - **Pass `fieldProps.onChange` directly**: `<Field>` is generic and `fieldProps.onChange` is already typed to the field's value type. Do not wrap it in unnecessary `e?.target?.value` extractions.
86
88
 
87
89
  ---
88
90
 
@@ -14,13 +14,13 @@ Use this skill when implementing data grids, server-paginated tables, filterable
14
14
 
15
15
  Do **NOT** guess table prop names or hardcode table structures. Query the MCP server dynamically to inspect exact TypeScript signatures, live story implementations, and companion controls:
16
16
 
17
- ### Inspect Component Contracts:
17
+ ### Inspect Component Contracts (`component` parameter):
18
18
 
19
19
  ```json
20
- get_component_api({ "id": "datatable" })
21
- get_component_api({ "id": "exportbutton" })
22
- get_component_api({ "id": "filtercontainer" })
23
- get_component_api({ "id": "bulkactionbutton" })
20
+ get_component_api({ "component": "datatable" })
21
+ get_component_api({ "component": "exportbutton" })
22
+ get_component_api({ "component": "filtercontainer" })
23
+ get_component_api({ "component": "bulkactionbutton" })
24
24
  ```
25
25
 
26
26
  ### Read Curated Documentation:
@@ -55,7 +55,7 @@ query_graph({ "query": "useDataTableFetch" })
55
55
  The Wangs UI `DataTable` is built on a modular, headless-first architecture:
56
56
 
57
57
  1. **Declarative Column Definitions (`TableColumn<T>[]`)**:
58
- Columns are configured as typed array objects, not as JSX children. Check `get_component_api({ "id": "datatable" })` for column field types.
58
+ Columns are configured as typed array objects, not as JSX children. Check `get_component_api({ "component": "datatable" })` for column field types.
59
59
  2. **Table Instance Hook (`useDataTable`)**:
60
60
  Coordinates table state (sorting, pagination, selection, column ordering, pinning, visibility).
61
61
  3. **Data Fetching Hook (`useDataTableFetch`)**:
@@ -73,4 +73,5 @@ The Wangs UI `DataTable` is built on a modular, headless-first architecture:
73
73
  1. **Query MCP for Current Code Patterns**: Always run `get_component_examples` for `datatable` before drafting code.
74
74
  2. **Strict Subpath Imports**: Import via `@wangs-ui/react-core/primitive/datatable` and companion primitive paths.
75
75
  3. **Always Translate Visible Copy**: All column header labels, empty state messages, and action button labels must be wrapped in `t('...')` from `@wangs-ui/react-i18n`.
76
- 4. **Stable Row Identity**: Always configure a unique key identifier for stable selection and row identity.
76
+ 4. **Stable Row Identity**: Always configure a unique key identifier (`dataKey` / `rowId`) for stable selection and row identity.
77
+ 5. **Zero Redundant Table Wrappers**: Never wrap `<DataTable />` in an isolated `<div>` or `<Box>` solely to set width or margin. Wangs UI DataTable manages its own container scroll and layout dimensions out of the box.
@@ -14,13 +14,13 @@ Use this skill when building interactive modals, create/edit dialog forms, destr
14
14
 
15
15
  Do **NOT** guess overlay props, event names, or footer slots. Query the MCP server dynamically to inspect exact contracts and live story implementations:
16
16
 
17
- ### Inspect Overlay Contracts:
17
+ ### Inspect Overlay Contracts (`component` parameter):
18
18
 
19
19
  ```json
20
- get_component_api({ "id": "dialog" })
21
- get_component_api({ "id": "dialogform" })
22
- get_component_api({ "id": "modal" })
23
- get_component_api({ "id": "toast" })
20
+ get_component_api({ "component": "dialog" })
21
+ get_component_api({ "component": "dialogform" })
22
+ get_component_api({ "component": "modal" })
23
+ get_component_api({ "component": "toast" })
24
24
  ```
25
25
 
26
26
  ### Read Curated Overlay Documentation:
@@ -14,14 +14,14 @@ Use this skill when implementing multi-language interfaces, translating user-fac
14
14
 
15
15
  Do **NOT** guess component localization contracts, language switcher variants, or datepicker props. Query the MCP server dynamically to inspect exact props and live story implementations:
16
16
 
17
- ### Inspect Localized Component Contracts:
17
+ ### Inspect Localized Component Contracts (`component` parameter):
18
18
 
19
19
  ```json
20
- get_component_api({ "id": "languageswitcher" })
21
- get_component_api({ "id": "currencyinput" })
22
- get_component_api({ "id": "datepicker" })
23
- get_component_api({ "id": "select" })
24
- get_component_api({ "id": "datatable" })
20
+ get_component_api({ "component": "languageswitcher" })
21
+ get_component_api({ "component": "currencyinput" })
22
+ get_component_api({ "component": "datepicker" })
23
+ get_component_api({ "component": "select" })
24
+ get_component_api({ "component": "datatable" })
25
25
  ```
26
26
 
27
27
  ### Read Curated Localization Documentation:
@@ -140,7 +140,7 @@ selectedCount === 0
140
140
  Use standard supported HTML tags (`<a>`, `<b>`, `<i>`, `<u>`, `<s>`, `<br/>`, `<sub>`, `<sup>`, `<code>`, `<mark>`) for inline styling. Tags are automatically parsed into React elements without custom regex or string manipulation:
141
141
 
142
142
  ```tsx
143
- import Link from '@wangs-ui/foundation/theme/Link';
143
+ import { Link } from '@wangs-ui/foundation/theme';
144
144
 
145
145
  t('You have selected <b>{count} items</b>. Click <a>here</a> to review.', {
146
146
  count: selectedCount,
@@ -4,9 +4,10 @@ description: Architecture, navigation hierarchies, and MCP discovery protocol fo
4
4
  metadata:
5
5
  owner: wangs-ui
6
6
  ---
7
+
7
8
  # Skill: Application Layout & Navigation Hierarchy
8
9
 
9
- Use this skill when constructing application shells, multi-level sidebars, page headers, breadcrumbs, or tabbed views with `@wangs-ui/react-core`.
10
+ Use this skill when constructing application shells, multi-level sidebars, page headers, breadcrumbs, tabbed views, or feature routing with `@wangs-ui/react-core`, `@wangs-ui/foundation`, and `@wangs-ui/react-navigation`.
10
11
 
11
12
  ---
12
13
 
@@ -14,20 +15,23 @@ Use this skill when constructing application shells, multi-level sidebars, page
14
15
 
15
16
  Do **NOT** guess layout block slots, sidebar item interfaces, or breadcrumb props. Query the MCP server dynamically to inspect exact contracts and live story implementations:
16
17
 
17
- ### Inspect Layout & Navigation Contracts:
18
+ ### Inspect Layout & Navigation Contracts (`component` parameter):
18
19
 
19
20
  ```json
20
- get_component_api({ "id": "applayout" })
21
- get_component_api({ "id": "sidebar" })
22
- get_component_api({ "id": "breadcrumb" })
23
- get_component_api({ "id": "tabs" })
21
+ get_component_api({ "component": "applayout" })
22
+ get_component_api({ "component": "sidebar" })
23
+ get_component_api({ "component": "tabletoolbar" })
24
+ get_component_api({ "component": "breadcrumb" })
25
+ get_component_api({ "component": "tabs" })
24
26
  ```
25
27
 
26
- ### Read Curated Layout Documentation:
28
+
29
+ ### Read Curated Layout Documentation (`id` parameter):
27
30
 
28
31
  ```json
29
32
  get_documentation({ "id": "applayout" })
30
33
  get_documentation({ "id": "sidebar" })
34
+ get_documentation({ "id": "react-navigation" })
31
35
  ```
32
36
 
33
37
  ### Inspect Live Story Implementations:
@@ -51,20 +55,102 @@ query_graph({ "query": "Sidebar" })
51
55
  ## 2. Layout Architecture & Mental Model
52
56
 
53
57
  1. **Top-Level App Shell (`AppLayout`)**:
54
- Provides structured slots for `sidebar`, `header`, and main content view, handling responsive viewport scaling and mobile navigation overlays.
58
+ - Subpath: `@wangs-ui/react-core/blocks/applayout`
59
+ - Outer responsive shell arranging navigation, navbar, sidebars, main viewport, and footer. Inspect slots and layout variants via `get_component_api({ "component": "applayout" })`.
55
60
  2. **Hierarchical Menu (`Sidebar`)**:
56
- Renders single and nested navigation items, active route indicators, collapsible state, and notification badges.
61
+ - Subpath: `@wangs-ui/react-core/blocks/sidebar`
62
+ - Primary app navigation drawer/rail supporting nested menus, badges, and collapse states. Inspect items and events via `get_component_api({ "component": "sidebar" })`.
57
63
  3. **Breadcrumb Trail (`Breadcrumb`)**:
58
- Maintains clear navigational hierarchy on page headers.
64
+ - Subpath: `@wangs-ui/react-core/primitive/breadcrumb`
65
+ - Secondary hierarchy navigation displaying screen depth. Inspect item structure via `get_component_api({ "component": "breadcrumb" })`.
59
66
  4. **Tabbed Sub-Views (`Tabs`)**:
60
- Organizes complex entity detail views or multi-section settings into distinct tabbed panels.
67
+ - Subpath: `@wangs-ui/react-core/primitive/tabs`
68
+ - In-page view switcher for partitioning entity details into distinct panels. Inspect via `get_component_api({ "component": "tabs" })`.
69
+ 5. **Universal Routing (`@wangs-ui/react-navigation`)**:
70
+ - Platform-agnostic route graph abstraction (`buildGraph`, `paramRoute`).
71
+ - Web router bridge: `@wangs-ui/react-navigation/web` (React Router).
72
+ - Native router bridge: `@wangs-ui/react-navigation/native` (React Navigation / Expo).
61
73
 
62
74
  ---
63
75
 
64
- ## 3. Mandatory Implementation Rules
76
+ ## 3. Structural Page Blueprint (Standard Pattern)
77
+
78
+ ```tsx
79
+ import AppLayout from '@wangs-ui/react-core/blocks/applayout';
80
+ import Sidebar from '@wangs-ui/react-core/blocks/sidebar';
81
+ import Breadcrumb from '@wangs-ui/react-core/primitive/breadcrumb';
82
+ import { Container, Section, Stack, HStack } from '@wangs-ui/foundation/layout';
83
+ import { Text } from '@wangs-ui/foundation/theme';
84
+ import { useI18n } from '@wangs-ui/react-i18n';
85
+ import { HomeLine, Settings4Line } from '@wangs-ui/react-icons';
86
+ import { useState } from 'react';
87
+
88
+ export function ApplicationShell({ children }: { children: React.ReactNode }) {
89
+ const { t } = useI18n();
90
+ const [activeRoute, setActiveRoute] = useState('dashboard');
91
+ const [collapsed, setCollapsed] = useState(false);
92
+
93
+ const sidebarItems = [
94
+ { value: 'dashboard', label: t('Dashboard'), icon: HomeLine, to: '/' },
95
+ { value: 'settings', label: t('Settings'), icon: Settings4Line, to: '/settings' },
96
+ ];
97
+
98
+ return (
99
+ <AppLayout
100
+ variant="full-sidebar"
101
+ sidebar={
102
+ <Sidebar
103
+ items={sidebarItems}
104
+ value={activeRoute}
105
+ onValueChange={setActiveRoute}
106
+ collapsed={collapsed}
107
+ onCollapsedChange={setCollapsed}
108
+ collapseMode="rail"
109
+ />
110
+ }
111
+ >
112
+ <Container size="xl">
113
+ <Section space="md">
114
+ <Stack gap="4">
115
+ <Breadcrumb
116
+ items={[
117
+ { label: t('Home'), href: '/' },
118
+ { label: t('Dashboard') },
119
+ ]}
120
+ />
121
+ <Text variant="headlineLarge">{t('Overview')}</Text>
122
+ {children}
123
+ </Stack>
124
+ </Section>
125
+ </Container>
126
+ </AppLayout>
127
+ );
128
+ }
129
+ ```
130
+
131
+ ---
65
132
 
66
- 1. **Query MCP for Current Code Patterns**: Inspect `applayout` and `sidebar` stories via MCP before assembling the layout.
67
- 2. **Strict Subpath Imports**: Import layout blocks via `@wangs-ui/react-core/blocks/*` and primitives via `@wangs-ui/react-core/primitive/*`.
68
- 3. **Consistent Spacing Grid**: Use standard container padding (`p-6` or `p-3xl`) across page contents.
69
- 4. **Page Hierarchy Alignment**: Every page view inside the layout must provide a clear `.heading-1` hierarchy and synchronized breadcrumbs.
70
- 5. **Translate Navigation Labels**: Wrap all sidebar item labels and breadcrumb texts in `t('...')` from `@wangs-ui/react-i18n`.
133
+ ## 4. Mandatory Implementation Rules
134
+
135
+ 1. **Query MCP First**: Always inspect `applayout` and `sidebar` stories via MCP before assembling the layout.
136
+ 2. **Strict Subpath Imports**:
137
+ - Blocks: `@wangs-ui/react-core/blocks/*` (`applayout`, `sidebar`, `tabletoolbar`)
138
+ - Primitives: `@wangs-ui/react-core/primitive/*` (`breadcrumb`, `tabs`)
139
+ - Layout Primitives: `@wangs-ui/foundation/layout` (`Container`, `Section`, `Stack`, `HStack`, `Box`, `Grid`)
140
+ - Typography: `@wangs-ui/foundation/theme` (`Text`)
141
+ 3. **Standard Layout Containers & Spacing**:
142
+ - Use `Container` (max-width rhythm) and `Section` (vertical rhythm) for page boundaries.
143
+ - Use flat numeric Tailwind spacing (`gap="4"`, `p="6"`). Never use legacy named tokens like `p-3xl` or `gap-md`.
144
+ 4. **Typography Scale**:
145
+ - Use `<Text variant="headlineLarge">` or `display*` / `title*` for page headers. Never use obsolete `.heading-*` helper classes or raw HTML heading tags without primitives.
146
+ 5. **No Redundant Layout Wrappers**:
147
+ - Do NOT insert intermediate pass-through `<div>` or `<Box>` wrappers between `<Card>`/`<Tabs>` and tab contents.
148
+ - Render active tab content directly as a child of the container:
149
+ ```tsx
150
+ // ✅ Good
151
+ <Card>
152
+ <Tabs items={tabItems} value={activeTab} onValueChange={setActiveTab} />
153
+ {activeTab === 'general' ? <GeneralTab /> : <SecurityTab />}
154
+ </Card>
155
+ ```
156
+ 6. **Translate Navigation Labels**: Wrap all sidebar item labels, breadcrumb text, and page headings in `t('...')` from `@wangs-ui/react-i18n`.
@@ -10,7 +10,17 @@ Use this skill when building responsive pages, layouts, or screen adaptations wi
10
10
 
11
11
  ---
12
12
 
13
- ## 1. Breakpoint Reference
13
+ ## 1. MCP Inspection Protocol (Mandatory Single Source of Truth)
14
+
15
+ Do **NOT** guess responsive prop types or breakpoint keys. Query the MCP server dynamically:
16
+
17
+ ```json
18
+ resolve_type_definition({ "types": ["ResponsiveValue", "Breakpoint", "SpacingKey"] })
19
+ ```
20
+
21
+ ---
22
+
23
+ ## 2. Breakpoint Reference
14
24
 
15
25
  Wangs UI uses three standardized breakpoints:
16
26
 
@@ -30,14 +40,17 @@ const { breakpoint } = useTheme(); // 'compact' | 'medium' | 'expanded'
30
40
 
31
41
  ---
32
42
 
33
- ## 2. Responsive Props (`ResponsiveValue`)
43
+ ## 3. Responsive Props (`ResponsiveValue`)
34
44
 
35
45
  Visual scale props (`size`, layout `gap`, `columns`, `p`, `m`) accept either a single value or an object mapped by breakpoint:
36
46
 
37
47
  ```tsx
48
+ import { Button } from '@wangs-ui/react-core/components/button';
49
+ import { Grid, Stack } from '@wangs-ui/foundation/layout';
50
+
38
51
  // Static (identical across all devices)
39
52
  <Button size="md" />
40
- <Stack gap={4} />
53
+ <Stack gap="4" />
41
54
 
42
55
  // Adaptive (changes across breakpoints)
43
56
  <Button size={{ compact: 'lg', expanded: 'sm' }} />
@@ -48,7 +61,7 @@ Visual scale props (`size`, layout `gap`, `columns`, `p`, `m`) accept either a s
48
61
 
49
62
  ---
50
63
 
51
- ## 3. Conditional Rendering (`<Show>`)
64
+ ## 4. Conditional Rendering (`<Show>`)
52
65
 
53
66
  Use `<Show>` when a component should be mounted or unmounted based on the active breakpoint:
54
67
 
@@ -78,7 +91,7 @@ import { Show } from '@wangs-ui/foundation/theme';
78
91
 
79
92
  ---
80
93
 
81
- ## 4. Spacing Conventions
94
+ ## 5. Spacing Conventions
82
95
 
83
96
  Spacing tokens are **flat and fixed** (1 unit = 4px):
84
97
 
@@ -87,7 +100,7 @@ Spacing tokens are **flat and fixed** (1 unit = 4px):
87
100
 
88
101
  ---
89
102
 
90
- ## 5. Anti-Patterns to Avoid
103
+ ## 6. Anti-Patterns to Avoid
91
104
 
92
105
  1. **Avoid `hidden md:block` for stateful/heavy trees**: Always prefer `<Show>` so unused components cleanly unmount.
93
106
  2. **Never pass responsive objects to behavioral props**: `<Button disabled={{ compact: true }} />` is invalid.
@@ -18,24 +18,15 @@ Do **NOT** guess layout prop names, spacing scales, or breakpoint keys. Query th
18
18
  server dynamically:
19
19
 
20
20
  ```json
21
- list_catalog({ "category": "layout" })
22
- get_component_api({ "id": "layout:box" })
23
- get_component_api({ "id": "layout:grid" })
24
- get_documentation({ "id": "layout-stack" })
25
- ```
26
-
27
- Resolve shared types before writing responsive props:
28
-
29
- ```json
30
- resolve_type_definition({ "name": "ResponsiveValue" })
31
- resolve_type_definition({ "name": "SpacingKey" })
21
+ list_catalog({ "query": "layout" })
22
+ resolve_type_definition({ "types": ["ResponsiveValue", "SpacingKey", "StackProps", "GridProps", "BoxProps", "ScrollAreaProps"] })
32
23
  ```
33
24
 
34
25
  ---
35
26
 
36
27
  ## 2. Choosing the Right Primitive
37
28
 
38
- 1. **Stack (VStack)** — default for vertical flows (forms, cards, page sections).
29
+ 1. **Stack (Vertical)** — default for vertical flows (forms, cards, page sections).
39
30
  Fixed `column` direction, uniform `gap`, optional auto-`separator`.
40
31
  2. **HStack** — horizontal rows with vertical centering (avatar + label + action,
41
32
  toolbar clusters). Fixed `row` direction.
@@ -52,25 +43,26 @@ resolve_type_definition({ "name": "SpacingKey" })
52
43
  vertical rhythm (`space: 'sm' | 'md' | 'lg'`, default `'md'`). Never nest
53
44
  `Container` inside `Container`.
54
45
  7. **ZStack** — overlays (badge on card, status dot on avatar, hero overlay).
55
- 8. **AspectRatio / Bleed / Spacer** — media frames (`ratio`), full-bleed breakouts
46
+ 8. **ScrollArea** — styled, accessible scrollable viewports (`orientation: 'vertical' | 'horizontal' | 'both'`, `variant: 'hover' | 'always' | 'scroll'`).
47
+ 9. **AspectRatio / Bleed / Spacer** — media frames (`ratio`), full-bleed breakouts
56
48
  inside padded containers (`Bleed`), and flexible fillers in stacks (`Spacer`).
57
49
 
58
50
  ---
59
51
 
60
52
  ## 3. Mandatory Implementation Rules
61
53
 
62
- 1. **ResponsiveValue everywhere**: scalar for static (`gap={4}`), object for
63
- adaptive (`gap={{ compact: 2, medium: 4, expanded: 6 }}`,
54
+ 1. **ResponsiveValue everywhere**: scalar for static (`gap="4"`), object for
55
+ adaptive (`gap={{ compact: '2', medium: '4', expanded: '6' }}`,
64
56
  `columns={{ compact: 1, medium: 2, expanded: 4 }}`). Breakpoints are
65
57
  `compact` (mobile-first base), `medium` (`md:`), `expanded` (`lg:`).
66
58
  2. **Separators, not manual dividers**: `<Stack separator={<Divider />}>` inserts
67
59
  dividers between children with no trailing element. Never hand-place a divider
68
60
  after every child.
69
- 3. **Spacing scale**: `gap`/`p`/`m` use `SpacingKey` (Tailwind numeric scale,
70
- 1 unit = 4px). Never pass raw pixel strings to spacing props.
61
+ 3. **Spacing scale**: `gap`/`p`/`m` use `SpacingKey` (Tailwind numeric scale strings,
62
+ e.g. `'0'`, `'1'`, `'2'`, `'4'`, `'6'`, `'8'`, `'12'`, `'16'`). Never pass raw pixel strings to spacing props.
71
63
  4. **Strict subpath imports**:
72
64
  ```tsx
73
- import { Stack, HStack, Grid, Container } from '@wangs-ui/foundation/layout';
65
+ import { Stack, HStack, Grid, Container, Box, Flex, ScrollArea } from '@wangs-ui/foundation/layout';
74
66
  ```
75
67
  5. **Translate visible labels** inside layout children via `t('...')` from
76
68
  `@wangs-ui/react-i18n` (layout props themselves are never translated).