@actdim/dynstruct-mui 1.5.15 → 1.7.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/AGENTS.md CHANGED
@@ -1,158 +1,160 @@
1
- <!-- BEGIN ALONG-PROTOCOL ref=../../../AGENTS.md (managed by along-init - do not edit by hand) -->
2
- This folder belongs to a repository that uses the ALONG structure. The full working
3
- guidance + agent-context protocol live once in the nearest ancestor `AGENTS.md` (`../../../AGENTS.md`) -
4
- read it there. This folder keeps its OWN `.along/` state; use the nearest one.
5
- Only this folder's specifics follow.
6
- <!-- END ALONG-PROTOCOL --># AI Agent Guide for `@actdim/dynstruct-mui`
7
-
8
- MUI wrappers for `@actdim/dynstruct`. Each file wraps one MUI component into a dynstruct hook-constructor.
9
-
10
- ## Tech Stack
11
-
12
- - TypeScript · React · MobX · `@actdim/dynstruct` · `@mui/material` · Vite
13
-
14
- ## Component Authoring Pattern
15
-
16
- Every component follows this exact structure (see `src/Button.tsx` as the reference):
17
-
18
- ```tsx
19
- import { type ComponentStruct, type ComponentDef, type ComponentParams,
20
- type Component, type ComponentModel } from '@actdim/dynstruct/componentModel/contracts';
21
- import { useComponent, toReact } from '@actdim/dynstruct/componentModel/react/hooks';
22
- import { type BaseAppMsgStruct } from '@actdim/dynstruct/appDomain/appContracts';
23
-
24
- // 1. Local Struct type generic but private to file, default = BaseAppMsgStruct
25
- type Struct<TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct> = ComponentStruct<
26
- TMsgStruct,
27
- {
28
- props: { /* ... */ };
29
- }
30
- >;
31
-
32
- // 2. Hook-constructor — NOT generic, uses Struct with default
33
- export const useXxx = (params: ComponentParams<Struct>): Component<Struct> => {
34
- let c: Component<Struct>;
35
- let m: ComponentModel<Struct>;
36
-
37
- const def: ComponentDef<Struct> = {
38
- regType: 'Xxx',
39
- props: { /* defaults */ },
40
- view: () => ( /* JSX using m.* and m.$.* */ ),
41
- };
42
-
43
- c = useComponent(def, params);
44
- m = c.model;
45
- return c;
46
- };
47
-
48
- // 3. Exported type — concrete (non-generic) alias
49
- export type XxxStruct = Struct;
50
-
51
- // 4. React adapter — no explicit type params needed
52
- export const Xxx = toReact(useXxx);
53
- Xxx.displayName = 'Xxx';
54
- ```
55
-
56
- ### Rules
57
-
58
- - **`Struct` stays local** — generic with `TMsgStruct` default, never exported directly.
59
- - **Hook-constructor is non-generic** — `useXxx(params: ComponentParams<Struct>): Component<Struct>`.
60
- - **`XxxStruct` export is non-generic** `export type XxxStruct = Struct`.
61
- - **`toReact` needs no type params** `toReact(useXxx)` works because the hook is non-generic.
62
- - **`displayName`** always set `Xxx.displayName = 'Xxx'` after `toReact(...)` so Storybook and React DevTools show the correct name.
63
- - **Disabled state** use `m.$.isDisabled` (from `ComponentState`), not a dedicated `disabled` prop.
64
- - **Loading state** use explicit `loading?: boolean` prop or wire to `m.$.pendingRequestCount > 0`.
65
- - **`m.$.isVisible`** hide/show via component state, not a prop.
66
-
67
- ## Import Paths
68
-
69
- ```ts
70
- // Contracts (types only)
71
- import { ... } from '@actdim/dynstruct/componentModel/contracts';
72
-
73
- // React utilities (useComponent, toReact)
74
- import { ... } from '@actdim/dynstruct/componentModel/react/hooks';
75
- // ^^^^^^^^^^^
76
- // Note: the file lives at dist/componentModel/react/react.d.ts
77
- // NOT dist/componentModel/react.d.ts — that file does not exist
78
-
79
- // App domain
80
- import { ... } from '@actdim/dynstruct/appDomain/appContracts';
81
- import { ... } from '@actdim/dynstruct/appDomain/commonContracts';
82
- ```
83
-
84
- ## MUI Composition Rules
85
-
86
- Always follow the **official MUI website patterns** — use composable building blocks, not convenience shorthands:
87
-
88
- | Component | Correct pattern |
89
- |---|---|
90
- | Select | `FormControl` + `InputLabel` + `Select` + `FormHelperText` |
91
- | Checkbox (with label/error) | `FormControl` + `FormControlLabel` wrapping `Checkbox` + `FormHelperText` |
92
- | Switch (with label/error) | `FormControl` + `FormControlLabel` wrapping `Switch` + `FormHelperText` |
93
- | TextField | `TextField` (this IS the official atomic component, not a shorthand) |
94
- | Button / IconButton | Use directly |
95
- | Dialog | `Dialog` + `DialogTitle` + `DialogContent` + `DialogActions` |
96
- | Alert | `Alert` directly (`onClose` for close button) |
97
-
98
- - **`disabled`** always goes on the outermost container (`FormControl`, `Button`, etc.) not inside, not as a duplicate.
99
- - **`error`** and **`helperText`** always use `FormControl error={}` + `FormHelperText` — not ad-hoc inline text.
100
- - **`sx`** type: when `FormControl` is the root, use `FormControlProps['sx']`, otherwise `MuiXxxProps['sx']`.
101
- - For `labelId` (Select, etc.) use `c.id` from the dynstruct component instance to ensure uniqueness.
102
-
103
- ## Props Convention
104
-
105
- - Map MUI prop types via `MuiXxxProps['propName']` — e.g. `MuiButtonProps['variant']`.
106
- - Include `sx?` typed from the **outermost MUI element** (see MUI Composition Rules above).
107
- - Reactive `ReactNode` props (icons, content, `React.FC`) are fine — MobX handles them as observable refs.
108
- - Provide sensible defaults for all props in `def.props`.
109
-
110
- ## Storybook Stories
111
-
112
- Every story file uses `AppContextProvider` + `StorageService` as the decorator. See `src/_stories/Button.stories.tsx` as the reference.
113
-
114
- ```tsx
115
- import { AppContextProvider, appMsgBus } from './bootstrap';
116
- import { StorageService } from '@actdim/dynstruct/services/react/StorageService';
117
-
118
- const meta: Meta<typeof Xxx> = {
119
- title: 'Controls/Xxx',
120
- component: Xxx,
121
- decorators: [
122
- (Story) => (
123
- <AppContextProvider value={{ msgBus: appMsgBus }}>
124
- <StorageService storeName={'test'} />
125
- <Story />
126
- </AppContextProvider>
127
- ),
128
- ],
129
- // ...
130
- };
131
- ```
132
-
133
- - Always use `Meta<typeof Xxx>` explicit annotation (not `satisfies`) — avoids TS2742 from pnpm MUI path references.
134
- - `argTypes` for `startIcon`, `endIcon`, `sx`: set `control: false` (not Storybook-controllable).
135
- - `FullWidth` story should use `parameters: { layout: 'padded' }`.
136
-
137
- ## File Layout
138
-
139
- ```
140
- src/
141
- Button.tsx ← one file per MUI component
142
- TextField.tsx
143
- ...
144
- _stories/
145
- bootstrap.ts ← AppMsgStruct, appMsgBus, AppContextProvider
146
- Button.stories.tsx
147
- ...
148
- ```
149
-
150
- Import from the package: `import { useButton, ButtonStruct } from '@actdim/dynstruct-mui/Button'`.
151
-
152
- ## Project specifics
153
-
1
+ <!-- BEGIN ALONG-PROTOCOL ref=../../../AGENTS.md (managed by along-init - do not edit by hand) -->
2
+ This folder belongs to a repository that uses the ALONG structure. The full working
3
+ guidance + agent-context protocol live once in the nearest ancestor `AGENTS.md` (`../../../AGENTS.md`) -
4
+ read it there. This folder keeps its OWN `.along/` state; use the nearest one.
5
+ Only this folder's specifics follow.
6
+ <!-- END ALONG-PROTOCOL -->
7
+
8
+ # AI Agent Guide for `@actdim/dynstruct-mui`
9
+
10
+ MUI wrappers for `@actdim/dynstruct`. Each file wraps one MUI component into a dynstruct hook-constructor.
11
+
12
+ ## Tech Stack
13
+
14
+ - TypeScript · React · MobX · `@actdim/dynstruct` · `@mui/material` · Vite
15
+
16
+ ## Component Authoring Pattern
17
+
18
+ Every component follows this exact structure (see `src/Button.tsx` as the reference):
19
+
20
+ ```tsx
21
+ import { type ComponentStruct, type ComponentDef, type ComponentParams,
22
+ type Component, type ComponentModel } from '@actdim/dynstruct/componentModel/contracts';
23
+ import { useComponent, toReact } from '@actdim/dynstruct/componentModel/react/hooks';
24
+ import { type BaseAppMsgStruct } from '@actdim/dynstruct/appDomain/appContracts';
25
+
26
+ // 1. Local Struct type - generic but private to file, default = BaseAppMsgStruct
27
+ type Struct<TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct> = ComponentStruct<
28
+ TMsgStruct,
29
+ {
30
+ props: { /* ... */ };
31
+ }
32
+ >;
33
+
34
+ // 2. Hook-constructor - NOT generic, uses Struct with default
35
+ export const useXxx = (params: ComponentParams<Struct>): Component<Struct> => {
36
+ let c: Component<Struct>;
37
+ let m: ComponentModel<Struct>;
38
+
39
+ const def: ComponentDef<Struct> = {
40
+ regType: 'Xxx',
41
+ props: { /* defaults */ },
42
+ view: () => ( /* JSX using m.* and m.$.* */ ),
43
+ };
44
+
45
+ c = useComponent(def, params);
46
+ m = c.model;
47
+ return c;
48
+ };
49
+
50
+ // 3. Exported type - concrete (non-generic) alias
51
+ export type XxxStruct = Struct;
52
+
53
+ // 4. React adapter - no explicit type params needed
54
+ export const Xxx = toReact(useXxx);
55
+ Xxx.displayName = 'Xxx';
56
+ ```
57
+
58
+ ### Rules
59
+
60
+ - **`Struct` stays local** - generic with `TMsgStruct` default, never exported directly.
61
+ - **Hook-constructor is non-generic** - `useXxx(params: ComponentParams<Struct>): Component<Struct>`.
62
+ - **`XxxStruct` export is non-generic** - `export type XxxStruct = Struct`.
63
+ - **`toReact` needs no type params** - `toReact(useXxx)` works because the hook is non-generic.
64
+ - **`displayName`** - always set `Xxx.displayName = 'Xxx'` after `toReact(...)` so Storybook and React DevTools show the correct name.
65
+ - **Disabled state** - use `m.$.isDisabled` (from `ComponentState`), not a dedicated `disabled` prop.
66
+ - **Loading state** - use explicit `loading?: boolean` prop or wire to `m.$.pendingRequestCount > 0`.
67
+ - **`m.$.isVisible`** - hide/show via component state, not a prop.
68
+
69
+ ## Import Paths
70
+
71
+ ```ts
72
+ // Contracts (types only)
73
+ import { ... } from '@actdim/dynstruct/componentModel/contracts';
74
+
75
+ // React utilities (useComponent, toReact)
76
+ import { ... } from '@actdim/dynstruct/componentModel/react/hooks';
77
+ // ^^^^^^^^^^^
78
+ // Note: the file lives at dist/componentModel/react/react.d.ts
79
+ // NOT dist/componentModel/react.d.ts - that file does not exist
80
+
81
+ // App domain
82
+ import { ... } from '@actdim/dynstruct/appDomain/appContracts';
83
+ import { ... } from '@actdim/dynstruct/appDomain/commonContracts';
84
+ ```
85
+
86
+ ## MUI Composition Rules
87
+
88
+ Always follow the **official MUI website patterns** - use composable building blocks, not convenience shorthands:
89
+
90
+ | Component | Correct pattern |
91
+ |---|---|
92
+ | Select | `FormControl` + `InputLabel` + `Select` + `FormHelperText` |
93
+ | Checkbox (with label/error) | `FormControl` + `FormControlLabel` wrapping `Checkbox` + `FormHelperText` |
94
+ | Switch (with label/error) | `FormControl` + `FormControlLabel` wrapping `Switch` + `FormHelperText` |
95
+ | TextField | `TextField` (this IS the official atomic component, not a shorthand) |
96
+ | Button / IconButton | Use directly |
97
+ | Dialog | `Dialog` + `DialogTitle` + `DialogContent` + `DialogActions` |
98
+ | Alert | `Alert` directly (`onClose` for close button) |
99
+
100
+ - **`disabled`** always goes on the outermost container (`FormControl`, `Button`, etc.) - not inside, not as a duplicate.
101
+ - **`error`** and **`helperText`** always use `FormControl error={}` + `FormHelperText` - not ad-hoc inline text.
102
+ - **`sx`** type: when `FormControl` is the root, use `FormControlProps['sx']`, otherwise `MuiXxxProps['sx']`.
103
+ - For `labelId` (Select, etc.) use `c.id` from the dynstruct component instance to ensure uniqueness.
104
+
105
+ ## Props Convention
106
+
107
+ - Map MUI prop types via `MuiXxxProps['propName']` - e.g. `MuiButtonProps['variant']`.
108
+ - Include `sx?` typed from the **outermost MUI element** (see MUI Composition Rules above).
109
+ - Reactive `ReactNode` props (icons, content, `React.FC`) are fine - MobX handles them as observable refs.
110
+ - Provide sensible defaults for all props in `def.props`.
111
+
112
+ ## Storybook Stories
113
+
114
+ Every story file uses `AppContextProvider` + `StorageService` as the decorator. See `src/_stories/Button.stories.tsx` as the reference.
115
+
116
+ ```tsx
117
+ import { AppContextProvider, appMsgBus } from './bootstrap';
118
+ import { StorageService } from '@actdim/dynstruct/services/react/StorageService';
119
+
120
+ const meta: Meta<typeof Xxx> = {
121
+ title: 'Controls/Xxx',
122
+ component: Xxx,
123
+ decorators: [
124
+ (Story) => (
125
+ <AppContextProvider value={{ msgBus: appMsgBus }}>
126
+ <StorageService storeName={'test'} />
127
+ <Story />
128
+ </AppContextProvider>
129
+ ),
130
+ ],
131
+ // ...
132
+ };
133
+ ```
134
+
135
+ - Always use `Meta<typeof Xxx>` explicit annotation (not `satisfies`) - avoids TS2742 from pnpm MUI path references.
136
+ - `argTypes` for `startIcon`, `endIcon`, `sx`: set `control: false` (not Storybook-controllable).
137
+ - `FullWidth` story should use `parameters: { layout: 'padded' }`.
138
+
139
+ ## File Layout
140
+
141
+ ```
142
+ src/
143
+ Button.tsx ← one file per MUI component
144
+ TextField.tsx
145
+ ...
146
+ _stories/
147
+ bootstrap.ts ← AppMsgStruct, appMsgBus, AppContextProvider
148
+ Button.stories.tsx
149
+ ...
150
+ ```
151
+
152
+ Import from the package: `import { useButton, ButtonStruct } from '@actdim/dynstruct-mui/Button'`.
153
+
154
+ ## Project specifics
155
+
154
156
  <!-- BEGIN ALONG-RULES -->
155
157
  See the following engineering guidelines:
156
158
  - `[languages/typescript.md](.along/rules/languages/typescript.md)`
157
159
  - `[platforms/web.md](.along/rules/platforms/web.md)`
158
- <!-- END ALONG-RULES -->
160
+ <!-- END ALONG-RULES -->
package/LICENSE CHANGED
@@ -1,6 +1,7 @@
1
1
  MIT License
2
2
 
3
3
  Copyright (c) 2025 Pavel Borodaev (@actdim/msgmesh)
4
+ Copyright (c) 2025 Pavel Borodaev (@actdim/dynstruct-mui)
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
7
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,10 +1,11 @@
1
1
  # @actdim/dynstruct-mui
2
2
 
3
- MUI component wrappers for [@actdim/dynstruct](https://github.com/actdim/dynstruct). Each component is a dynstruct hook-constructor observable props, reactive rendering, MobX-backed state out of the box.
3
+ MUI component wrappers for [@actdim/dynstruct](https://github.com/actdim/dynstruct). Each component is a dynstruct hook-constructor - observable props, reactive rendering, MobX-backed state out of the box.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@actdim/dynstruct-mui.svg)](https://www.npmjs.com/package/@actdim/dynstruct-mui)
6
6
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.9+-blue.svg)](https://www.typescriptlang.org/)
7
7
  [![License: Proprietary](https://img.shields.io/badge/License-Proprietary-red.svg)](LICENSE)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
8
9
 
9
10
  ## Components
10
11
 
@@ -50,7 +51,7 @@ MUI component wrappers for [@actdim/dynstruct](https://github.com/actdim/dynstru
50
51
  npm install @actdim/dynstruct-mui
51
52
  ```
52
53
 
53
- Peer dependencies: `@actdim/dynstruct`, `@mui/material`, `react`, `mobx`, `mobx-react-lite` see `package.json` for full list.
54
+ Peer dependencies: `@actdim/dynstruct`, `@mui/material`, `react`, `mobx`, `mobx-react-lite` - see `package.json` for full list.
54
55
 
55
56
  ## Usage
56
57
 
@@ -89,6 +90,7 @@ Developed with [Along](https://github.com/actdim/along) - a provider-agnostic co
89
90
  ## License
90
91
 
91
92
  Proprietary - see [LICENSE](LICENSE) for details.
93
+ MIT License. See [LICENSE](LICENSE) for details.
92
94
 
93
95
  ## Author
94
96
 
package/docs/INDEX.md CHANGED
@@ -1,44 +1,49 @@
1
- ---
2
- protocol: along
3
- protocol_version: "2.2.25"
4
- slug: INDEX
5
- title: Knowledge Base Topic Index
6
- type: index
7
- created: 2026-09-07
8
- updated: 2026-09-07
9
- tags: [index, kb, topics, map]
10
- ---
11
-
12
- # Knowledge Base Topic Index
13
-
14
- Central entry point and cross-linked topic catalog for project documentation:
15
-
16
- ## Knowledge Graph & Topic Map
17
-
18
- ```mermaid
19
- flowchart TD
20
- INDEX["Knowledge Base (INDEX)"]
21
- T_ARCHITECTURE["01 Architecture"]
22
- INDEX --> T_ARCHITECTURE
23
- T_DOMAIN_MODEL["02 Domain Model"]
24
- INDEX --> T_DOMAIN_MODEL
25
- T_SETUP_AND_WORKFLOW["03 Setup And Workflow"]
26
- INDEX --> T_SETUP_AND_WORKFLOW
27
- ```
28
-
29
- ---
30
-
31
- ## Articles
32
-
33
- - **[01 Architecture](./topic--architecture.md)** (topic) `architecture`
34
- - **[02 Domain Model](./topic--domain-model.md)** (topic) `domain-model`
35
- - **[03 Setup And Workflow](./topic--setup-and-workflow.md)** (topic) `setup-and-workflow`
36
-
37
- ---
38
-
39
- ## Related Context
40
-
41
- - [AGENTS.md](../AGENTS.md): Active protocol conventions and rules.
42
- - [.along/DECISIONS.md](../.along/DECISIONS.md): Architectural Decision Records.
43
- - [.along/ISSUES.md](../.along/ISSUES.md): Active issue tracking board.
44
- - [.along/HISTORY.md](../.along/HISTORY.md): Append-only project history log.
1
+ ---
2
+ protocol: along
3
+ slug: INDEX
4
+ title: Knowledge Base Topic Index
5
+ type: index
6
+ created: 2026-09-10
7
+ updated: 2026-09-10
8
+ tags: [index, kb, topics, map]
9
+ ---
10
+
11
+ # Knowledge Base Topic Index
12
+
13
+ Central entry point and cross-linked topic catalog for project documentation:
14
+
15
+ ## Knowledge Graph & Topic Map
16
+
17
+ ```mermaid
18
+ flowchart TD
19
+ INDEX["Knowledge Base (INDEX)"]
20
+ T_ARCHITECTURE["01 Architecture"]
21
+ INDEX --> T_ARCHITECTURE
22
+ T_DOMAIN_MODEL["02 Domain Model"]
23
+ INDEX --> T_DOMAIN_MODEL
24
+ T_SETUP_AND_WORKFLOW["03 Setup And Workflow"]
25
+ INDEX --> T_SETUP_AND_WORKFLOW
26
+ T_ARCHITECTURE -.->|references| T_DOMAIN_MODEL
27
+ T_ARCHITECTURE -.->|references| T_SETUP_AND_WORKFLOW
28
+ T_DOMAIN_MODEL -.->|references| T_ARCHITECTURE
29
+ T_DOMAIN_MODEL -.->|references| T_SETUP_AND_WORKFLOW
30
+ T_SETUP_AND_WORKFLOW -.->|references| T_ARCHITECTURE
31
+ T_SETUP_AND_WORKFLOW -.->|references| T_DOMAIN_MODEL
32
+ ```
33
+
34
+ ---
35
+
36
+ ## Articles
37
+
38
+ - **[01 Architecture](./topic--architecture.md)** (topic) `architecture`
39
+ - **[02 Domain Model](./topic--domain-model.md)** (topic) `domain-model`
40
+ - **[03 Setup And Workflow](./topic--setup-and-workflow.md)** (topic) `setup-and-workflow`
41
+
42
+ ---
43
+
44
+ ## Related Context
45
+
46
+ - [AGENTS.md](../AGENTS.md): Active protocol conventions and rules.
47
+ - [.along/DECISIONS.md](../.along/DECISIONS.md): Architectural Decision Records.
48
+ - [.along/ISSUES.md](../.along/ISSUES.md): Active issue tracking board.
49
+ - [.along/HISTORY.md](../.along/HISTORY.md): Append-only project history log.
@@ -1,11 +1,10 @@
1
1
  ---
2
2
  protocol: along
3
- protocol_version: "2.2.5"
4
3
  slug: architecture
5
4
  title: 01 Architecture
6
5
  type: topic
7
6
  created: 2026-08-27
8
- updated: 2026-09-02
7
+ updated: 2026-09-10
9
8
  tags: [architecture]
10
9
  ---
11
10
 
@@ -35,5 +34,5 @@ tags: [architecture]
35
34
 
36
35
  ## 2. Cross-Links
37
36
  - [[INDEX.md]] - Knowledge Base Root
38
- - [[02-domain-model.md]] - Domain Model & Component Catalog
39
- - [[03-setup-and-workflow.md]] - Setup, Build & Storybook Workflow
37
+ - [[02-[domain-model](./topic--domain-model.md).md]] - Domain Model & Component Catalog
38
+ - [[03-[setup-and-workflow](./topic--setup-and-workflow.md).md]] - Setup, Build & Storybook Workflow
@@ -1,11 +1,10 @@
1
1
  ---
2
2
  protocol: along
3
- protocol_version: "2.2.5"
4
3
  slug: domain-model
5
4
  title: 02 Domain Model
6
5
  type: topic
7
6
  created: 2026-08-27
8
- updated: 2026-09-02
7
+ updated: 2026-09-10
9
8
  tags: [domain-model]
10
9
  ---
11
10
 
@@ -52,5 +51,5 @@ tags: [domain-model]
52
51
 
53
52
  ## 3. Cross-Links
54
53
  - [[INDEX.md]] - Knowledge Base Root
55
- - [[01-architecture.md]] - System Architecture
56
- - [[03-setup-and-workflow.md]] - Setup, Build & Storybook Workflow
54
+ - [[01-[architecture](./topic--architecture.md).md]] - System Architecture
55
+ - [[03-[setup-and-workflow](./topic--setup-and-workflow.md).md]] - Setup, Build & Storybook Workflow
@@ -1,11 +1,10 @@
1
1
  ---
2
2
  protocol: along
3
- protocol_version: "2.2.5"
4
3
  slug: setup-and-workflow
5
4
  title: 03 Setup And Workflow
6
5
  type: topic
7
6
  created: 2026-08-27
8
- updated: 2026-09-02
7
+ updated: 2026-09-10
9
8
  tags: [setup-and-workflow]
10
9
  ---
11
10
 
@@ -44,5 +43,5 @@ Interactive stories exist for every wrapped Material UI component: `Button.stori
44
43
 
45
44
  ## 4. Cross-Links
46
45
  - [[INDEX.md]] - Knowledge Base Root
47
- - [[01-architecture.md]] - Architecture
48
- - [[02-domain-model.md]] - Domain Model
46
+ - [[01-[architecture](./topic--architecture.md).md]] - Architecture
47
+ - [[02-[domain-model](./topic--domain-model.md).md]] - Domain Model
package/llms-full.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # @actdim/dynstruct-mui - Full Documentation Context
2
2
 
3
- > Knowledge Base and documentation index for dynstruct-mui.
3
+ > MUI component wrappers for [@actdim/dynstruct](https://github.com/actdim/dynstruct). Each component is a dynstruct hook-constructor - observable props, reactive rendering, MobX-backed state out of the box.
4
4
 
5
5
  ---
6
6
 
@@ -8,11 +8,12 @@
8
8
 
9
9
  # @actdim/dynstruct-mui
10
10
 
11
- MUI component wrappers for [@actdim/dynstruct](https://github.com/actdim/dynstruct). Each component is a dynstruct hook-constructor observable props, reactive rendering, MobX-backed state out of the box.
11
+ MUI component wrappers for [@actdim/dynstruct](https://github.com/actdim/dynstruct). Each component is a dynstruct hook-constructor - observable props, reactive rendering, MobX-backed state out of the box.
12
12
 
13
13
  [![npm version](https://img.shields.io/npm/v/@actdim/dynstruct-mui.svg)](https://www.npmjs.com/package/@actdim/dynstruct-mui)
14
14
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.9+-blue.svg)](https://www.typescriptlang.org/)
15
15
  [![License: Proprietary](https://img.shields.io/badge/License-Proprietary-red.svg)](LICENSE)
16
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
16
17
 
17
18
  ## Components
18
19
 
@@ -58,7 +59,7 @@ MUI component wrappers for [@actdim/dynstruct](https://github.com/actdim/dynstru
58
59
  npm install @actdim/dynstruct-mui
59
60
  ```
60
61
 
61
- Peer dependencies: `@actdim/dynstruct`, `@mui/material`, `react`, `mobx`, `mobx-react-lite` see `package.json` for full list.
62
+ Peer dependencies: `@actdim/dynstruct`, `@mui/material`, `react`, `mobx`, `mobx-react-lite` - see `package.json` for full list.
62
63
 
63
64
  ## Usage
64
65
 
@@ -97,6 +98,7 @@ Developed with [Along](https://github.com/actdim/along) - a provider-agnostic co
97
98
  ## License
98
99
 
99
100
  Proprietary - see [LICENSE](LICENSE) for details.
101
+ MIT License. See [LICENSE](LICENSE) for details.
100
102
 
101
103
  ## Author
102
104
 
@@ -106,159 +108,161 @@ Pavel Borodaev - [github.com/actdim/dynstruct-mui](https://github.com/actdim/dyn
106
108
 
107
109
  ## Document: AGENTS.md (Agent Conventions & Protocol)
108
110
 
109
- <!-- BEGIN ALONG-PROTOCOL ref=../../../AGENTS.md (managed by along-init - do not edit by hand) -->
110
- This folder belongs to a repository that uses the ALONG structure. The full working
111
- guidance + agent-context protocol live once in the nearest ancestor `AGENTS.md` (`../../../AGENTS.md`) -
112
- read it there. This folder keeps its OWN `.along/` state; use the nearest one.
113
- Only this folder's specifics follow.
114
- <!-- END ALONG-PROTOCOL --># AI Agent Guide for `@actdim/dynstruct-mui`
115
-
116
- MUI wrappers for `@actdim/dynstruct`. Each file wraps one MUI component into a dynstruct hook-constructor.
117
-
118
- ## Tech Stack
119
-
120
- - TypeScript · React · MobX · `@actdim/dynstruct` · `@mui/material` · Vite
121
-
122
- ## Component Authoring Pattern
123
-
124
- Every component follows this exact structure (see `src/Button.tsx` as the reference):
125
-
126
- ```tsx
127
- import { type ComponentStruct, type ComponentDef, type ComponentParams,
128
- type Component, type ComponentModel } from '@actdim/dynstruct/componentModel/contracts';
129
- import { useComponent, toReact } from '@actdim/dynstruct/componentModel/react/hooks';
130
- import { type BaseAppMsgStruct } from '@actdim/dynstruct/appDomain/appContracts';
131
-
132
- // 1. Local Struct type generic but private to file, default = BaseAppMsgStruct
133
- type Struct<TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct> = ComponentStruct<
134
- TMsgStruct,
135
- {
136
- props: { /* ... */ };
137
- }
138
- >;
139
-
140
- // 2. Hook-constructor — NOT generic, uses Struct with default
141
- export const useXxx = (params: ComponentParams<Struct>): Component<Struct> => {
142
- let c: Component<Struct>;
143
- let m: ComponentModel<Struct>;
144
-
145
- const def: ComponentDef<Struct> = {
146
- regType: 'Xxx',
147
- props: { /* defaults */ },
148
- view: () => ( /* JSX using m.* and m.$.* */ ),
149
- };
150
-
151
- c = useComponent(def, params);
152
- m = c.model;
153
- return c;
154
- };
155
-
156
- // 3. Exported type — concrete (non-generic) alias
157
- export type XxxStruct = Struct;
158
-
159
- // 4. React adapter — no explicit type params needed
160
- export const Xxx = toReact(useXxx);
161
- Xxx.displayName = 'Xxx';
162
- ```
163
-
164
- ### Rules
165
-
166
- - **`Struct` stays local** — generic with `TMsgStruct` default, never exported directly.
167
- - **Hook-constructor is non-generic** — `useXxx(params: ComponentParams<Struct>): Component<Struct>`.
168
- - **`XxxStruct` export is non-generic** `export type XxxStruct = Struct`.
169
- - **`toReact` needs no type params** `toReact(useXxx)` works because the hook is non-generic.
170
- - **`displayName`** always set `Xxx.displayName = 'Xxx'` after `toReact(...)` so Storybook and React DevTools show the correct name.
171
- - **Disabled state** use `m.$.isDisabled` (from `ComponentState`), not a dedicated `disabled` prop.
172
- - **Loading state** use explicit `loading?: boolean` prop or wire to `m.$.pendingRequestCount > 0`.
173
- - **`m.$.isVisible`** hide/show via component state, not a prop.
174
-
175
- ## Import Paths
176
-
177
- ```ts
178
- // Contracts (types only)
179
- import { ... } from '@actdim/dynstruct/componentModel/contracts';
180
-
181
- // React utilities (useComponent, toReact)
182
- import { ... } from '@actdim/dynstruct/componentModel/react/hooks';
183
- // ^^^^^^^^^^^
184
- // Note: the file lives at dist/componentModel/react/react.d.ts
185
- // NOT dist/componentModel/react.d.ts — that file does not exist
186
-
187
- // App domain
188
- import { ... } from '@actdim/dynstruct/appDomain/appContracts';
189
- import { ... } from '@actdim/dynstruct/appDomain/commonContracts';
190
- ```
191
-
192
- ## MUI Composition Rules
193
-
194
- Always follow the **official MUI website patterns** — use composable building blocks, not convenience shorthands:
195
-
196
- | Component | Correct pattern |
197
- |---|---|
198
- | Select | `FormControl` + `InputLabel` + `Select` + `FormHelperText` |
199
- | Checkbox (with label/error) | `FormControl` + `FormControlLabel` wrapping `Checkbox` + `FormHelperText` |
200
- | Switch (with label/error) | `FormControl` + `FormControlLabel` wrapping `Switch` + `FormHelperText` |
201
- | TextField | `TextField` (this IS the official atomic component, not a shorthand) |
202
- | Button / IconButton | Use directly |
203
- | Dialog | `Dialog` + `DialogTitle` + `DialogContent` + `DialogActions` |
204
- | Alert | `Alert` directly (`onClose` for close button) |
205
-
206
- - **`disabled`** always goes on the outermost container (`FormControl`, `Button`, etc.) not inside, not as a duplicate.
207
- - **`error`** and **`helperText`** always use `FormControl error={}` + `FormHelperText` — not ad-hoc inline text.
208
- - **`sx`** type: when `FormControl` is the root, use `FormControlProps['sx']`, otherwise `MuiXxxProps['sx']`.
209
- - For `labelId` (Select, etc.) use `c.id` from the dynstruct component instance to ensure uniqueness.
210
-
211
- ## Props Convention
212
-
213
- - Map MUI prop types via `MuiXxxProps['propName']` — e.g. `MuiButtonProps['variant']`.
214
- - Include `sx?` typed from the **outermost MUI element** (see MUI Composition Rules above).
215
- - Reactive `ReactNode` props (icons, content, `React.FC`) are fine — MobX handles them as observable refs.
216
- - Provide sensible defaults for all props in `def.props`.
217
-
218
- ## Storybook Stories
219
-
220
- Every story file uses `AppContextProvider` + `StorageService` as the decorator. See `src/_stories/Button.stories.tsx` as the reference.
221
-
222
- ```tsx
223
- import { AppContextProvider, appMsgBus } from './bootstrap';
224
- import { StorageService } from '@actdim/dynstruct/services/react/StorageService';
225
-
226
- const meta: Meta<typeof Xxx> = {
227
- title: 'Controls/Xxx',
228
- component: Xxx,
229
- decorators: [
230
- (Story) => (
231
- <AppContextProvider value={{ msgBus: appMsgBus }}>
232
- <StorageService storeName={'test'} />
233
- <Story />
234
- </AppContextProvider>
235
- ),
236
- ],
237
- // ...
238
- };
239
- ```
240
-
241
- - Always use `Meta<typeof Xxx>` explicit annotation (not `satisfies`) — avoids TS2742 from pnpm MUI path references.
242
- - `argTypes` for `startIcon`, `endIcon`, `sx`: set `control: false` (not Storybook-controllable).
243
- - `FullWidth` story should use `parameters: { layout: 'padded' }`.
244
-
245
- ## File Layout
246
-
247
- ```
248
- src/
249
- Button.tsx ← one file per MUI component
250
- TextField.tsx
251
- ...
252
- _stories/
253
- bootstrap.ts ← AppMsgStruct, appMsgBus, AppContextProvider
254
- Button.stories.tsx
255
- ...
256
- ```
257
-
258
- Import from the package: `import { useButton, ButtonStruct } from '@actdim/dynstruct-mui/Button'`.
259
-
260
- ## Project specifics
261
-
111
+ <!-- BEGIN ALONG-PROTOCOL ref=../../../AGENTS.md (managed by along-init - do not edit by hand) -->
112
+ This folder belongs to a repository that uses the ALONG structure. The full working
113
+ guidance + agent-context protocol live once in the nearest ancestor `AGENTS.md` (`../../../AGENTS.md`) -
114
+ read it there. This folder keeps its OWN `.along/` state; use the nearest one.
115
+ Only this folder's specifics follow.
116
+ <!-- END ALONG-PROTOCOL -->
117
+
118
+ # AI Agent Guide for `@actdim/dynstruct-mui`
119
+
120
+ MUI wrappers for `@actdim/dynstruct`. Each file wraps one MUI component into a dynstruct hook-constructor.
121
+
122
+ ## Tech Stack
123
+
124
+ - TypeScript · React · MobX · `@actdim/dynstruct` · `@mui/material` · Vite
125
+
126
+ ## Component Authoring Pattern
127
+
128
+ Every component follows this exact structure (see `src/Button.tsx` as the reference):
129
+
130
+ ```tsx
131
+ import { type ComponentStruct, type ComponentDef, type ComponentParams,
132
+ type Component, type ComponentModel } from '@actdim/dynstruct/componentModel/contracts';
133
+ import { useComponent, toReact } from '@actdim/dynstruct/componentModel/react/hooks';
134
+ import { type BaseAppMsgStruct } from '@actdim/dynstruct/appDomain/appContracts';
135
+
136
+ // 1. Local Struct type - generic but private to file, default = BaseAppMsgStruct
137
+ type Struct<TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct> = ComponentStruct<
138
+ TMsgStruct,
139
+ {
140
+ props: { /* ... */ };
141
+ }
142
+ >;
143
+
144
+ // 2. Hook-constructor - NOT generic, uses Struct with default
145
+ export const useXxx = (params: ComponentParams<Struct>): Component<Struct> => {
146
+ let c: Component<Struct>;
147
+ let m: ComponentModel<Struct>;
148
+
149
+ const def: ComponentDef<Struct> = {
150
+ regType: 'Xxx',
151
+ props: { /* defaults */ },
152
+ view: () => ( /* JSX using m.* and m.$.* */ ),
153
+ };
154
+
155
+ c = useComponent(def, params);
156
+ m = c.model;
157
+ return c;
158
+ };
159
+
160
+ // 3. Exported type - concrete (non-generic) alias
161
+ export type XxxStruct = Struct;
162
+
163
+ // 4. React adapter - no explicit type params needed
164
+ export const Xxx = toReact(useXxx);
165
+ Xxx.displayName = 'Xxx';
166
+ ```
167
+
168
+ ### Rules
169
+
170
+ - **`Struct` stays local** - generic with `TMsgStruct` default, never exported directly.
171
+ - **Hook-constructor is non-generic** - `useXxx(params: ComponentParams<Struct>): Component<Struct>`.
172
+ - **`XxxStruct` export is non-generic** - `export type XxxStruct = Struct`.
173
+ - **`toReact` needs no type params** - `toReact(useXxx)` works because the hook is non-generic.
174
+ - **`displayName`** - always set `Xxx.displayName = 'Xxx'` after `toReact(...)` so Storybook and React DevTools show the correct name.
175
+ - **Disabled state** - use `m.$.isDisabled` (from `ComponentState`), not a dedicated `disabled` prop.
176
+ - **Loading state** - use explicit `loading?: boolean` prop or wire to `m.$.pendingRequestCount > 0`.
177
+ - **`m.$.isVisible`** - hide/show via component state, not a prop.
178
+
179
+ ## Import Paths
180
+
181
+ ```ts
182
+ // Contracts (types only)
183
+ import { ... } from '@actdim/dynstruct/componentModel/contracts';
184
+
185
+ // React utilities (useComponent, toReact)
186
+ import { ... } from '@actdim/dynstruct/componentModel/react/hooks';
187
+ // ^^^^^^^^^^^
188
+ // Note: the file lives at dist/componentModel/react/react.d.ts
189
+ // NOT dist/componentModel/react.d.ts - that file does not exist
190
+
191
+ // App domain
192
+ import { ... } from '@actdim/dynstruct/appDomain/appContracts';
193
+ import { ... } from '@actdim/dynstruct/appDomain/commonContracts';
194
+ ```
195
+
196
+ ## MUI Composition Rules
197
+
198
+ Always follow the **official MUI website patterns** - use composable building blocks, not convenience shorthands:
199
+
200
+ | Component | Correct pattern |
201
+ |---|---|
202
+ | Select | `FormControl` + `InputLabel` + `Select` + `FormHelperText` |
203
+ | Checkbox (with label/error) | `FormControl` + `FormControlLabel` wrapping `Checkbox` + `FormHelperText` |
204
+ | Switch (with label/error) | `FormControl` + `FormControlLabel` wrapping `Switch` + `FormHelperText` |
205
+ | TextField | `TextField` (this IS the official atomic component, not a shorthand) |
206
+ | Button / IconButton | Use directly |
207
+ | Dialog | `Dialog` + `DialogTitle` + `DialogContent` + `DialogActions` |
208
+ | Alert | `Alert` directly (`onClose` for close button) |
209
+
210
+ - **`disabled`** always goes on the outermost container (`FormControl`, `Button`, etc.) - not inside, not as a duplicate.
211
+ - **`error`** and **`helperText`** always use `FormControl error={}` + `FormHelperText` - not ad-hoc inline text.
212
+ - **`sx`** type: when `FormControl` is the root, use `FormControlProps['sx']`, otherwise `MuiXxxProps['sx']`.
213
+ - For `labelId` (Select, etc.) use `c.id` from the dynstruct component instance to ensure uniqueness.
214
+
215
+ ## Props Convention
216
+
217
+ - Map MUI prop types via `MuiXxxProps['propName']` - e.g. `MuiButtonProps['variant']`.
218
+ - Include `sx?` typed from the **outermost MUI element** (see MUI Composition Rules above).
219
+ - Reactive `ReactNode` props (icons, content, `React.FC`) are fine - MobX handles them as observable refs.
220
+ - Provide sensible defaults for all props in `def.props`.
221
+
222
+ ## Storybook Stories
223
+
224
+ Every story file uses `AppContextProvider` + `StorageService` as the decorator. See `src/_stories/Button.stories.tsx` as the reference.
225
+
226
+ ```tsx
227
+ import { AppContextProvider, appMsgBus } from './bootstrap';
228
+ import { StorageService } from '@actdim/dynstruct/services/react/StorageService';
229
+
230
+ const meta: Meta<typeof Xxx> = {
231
+ title: 'Controls/Xxx',
232
+ component: Xxx,
233
+ decorators: [
234
+ (Story) => (
235
+ <AppContextProvider value={{ msgBus: appMsgBus }}>
236
+ <StorageService storeName={'test'} />
237
+ <Story />
238
+ </AppContextProvider>
239
+ ),
240
+ ],
241
+ // ...
242
+ };
243
+ ```
244
+
245
+ - Always use `Meta<typeof Xxx>` explicit annotation (not `satisfies`) - avoids TS2742 from pnpm MUI path references.
246
+ - `argTypes` for `startIcon`, `endIcon`, `sx`: set `control: false` (not Storybook-controllable).
247
+ - `FullWidth` story should use `parameters: { layout: 'padded' }`.
248
+
249
+ ## File Layout
250
+
251
+ ```
252
+ src/
253
+ Button.tsx ← one file per MUI component
254
+ TextField.tsx
255
+ ...
256
+ _stories/
257
+ bootstrap.ts ← AppMsgStruct, appMsgBus, AppContextProvider
258
+ Button.stories.tsx
259
+ ...
260
+ ```
261
+
262
+ Import from the package: `import { useButton, ButtonStruct } from '@actdim/dynstruct-mui/Button'`.
263
+
264
+ ## Project specifics
265
+
262
266
  <!-- BEGIN ALONG-RULES -->
263
267
  See the following engineering guidelines:
264
268
  - `[languages/typescript.md](.along/rules/languages/typescript.md)`
@@ -295,8 +299,8 @@ See the following engineering guidelines:
295
299
 
296
300
  ## 2. Cross-Links
297
301
  - [[INDEX.md]] - Knowledge Base Root
298
- - [[02-domain-model.md]] - Domain Model & Component Catalog
299
- - [[03-setup-and-workflow.md]] - Setup, Build & Storybook Workflow
302
+ - [[02-[domain-model](./topic--domain-model.md).md]] - Domain Model & Component Catalog
303
+ - [[03-[setup-and-workflow](./topic--setup-and-workflow.md).md]] - Setup, Build & Storybook Workflow
300
304
 
301
305
  ---
302
306
 
@@ -345,8 +349,8 @@ See the following engineering guidelines:
345
349
 
346
350
  ## 3. Cross-Links
347
351
  - [[INDEX.md]] - Knowledge Base Root
348
- - [[01-architecture.md]] - System Architecture
349
- - [[03-setup-and-workflow.md]] - Setup, Build & Storybook Workflow
352
+ - [[01-[architecture](./topic--architecture.md).md]] - System Architecture
353
+ - [[03-[setup-and-workflow](./topic--setup-and-workflow.md).md]] - Setup, Build & Storybook Workflow
350
354
 
351
355
  ---
352
356
 
@@ -387,5 +391,5 @@ Interactive stories exist for every wrapped Material UI component: `Button.stori
387
391
 
388
392
  ## 4. Cross-Links
389
393
  - [[INDEX.md]] - Knowledge Base Root
390
- - [[01-architecture.md]] - Architecture
391
- - [[02-domain-model.md]] - Domain Model
394
+ - [[01-[architecture](./topic--architecture.md).md]] - Architecture
395
+ - [[02-[domain-model](./topic--domain-model.md).md]] - Domain Model
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actdim/dynstruct-mui",
3
- "version": "1.5.15",
3
+ "version": "1.7.0",
4
4
  "description": "MUI component wrappers for @actdim/dynstruct",
5
5
  "author": "Pavel Borodaev",
6
6
  "license": "MIT",
@@ -68,9 +68,9 @@
68
68
  },
69
69
  "sideEffects": false,
70
70
  "peerDependencies": {
71
- "@actdim/dynstruct": ">=1.5.15",
72
- "@actdim/msgmesh": ">=1.5.15",
73
- "@actdim/utico": ">=1.5.15",
71
+ "@actdim/dynstruct": ">=1.7.0",
72
+ "@actdim/msgmesh": ">=1.7.0",
73
+ "@actdim/utico": ">=1.7.0",
74
74
  "@emotion/react": ">=11.14.0",
75
75
  "@emotion/styled": ">=11.14.1",
76
76
  "@mui/material": ">=9.0.1",
@@ -88,37 +88,38 @@
88
88
  "uuid": ">=13.0.0"
89
89
  },
90
90
  "devDependencies": {
91
+ "@eslint/js": "^9.39.5",
91
92
  "@faker-js/faker": "^10.4.0",
92
- "@storybook/addon-docs": "10.0.7",
93
- "@storybook/addon-onboarding": "10.0.7",
94
- "@storybook/react-vite": "10.0.7",
95
- "@swc/core": "^1.15.1",
93
+ "@storybook/addon-docs": "10.6.0",
94
+ "@storybook/addon-onboarding": "10.6.0",
95
+ "@storybook/react-vite": "10.6.0",
96
+ "@swc/core": "^1.16.2",
96
97
  "@types/chai": "^5.2.3",
97
98
  "@types/mocha": "^10.0.10",
98
99
  "@types/node": "^24.10.0",
99
- "@types/react": "^19.2.14",
100
- "@types/react-dom": "^19.2.3",
101
- "@typescript-eslint/eslint-plugin": "^8.46.3",
102
- "@typescript-eslint/parser": "^8.46.3",
103
- "@vitejs/plugin-react-swc": "^4.2.1",
100
+ "@types/react": "^19.2.18",
101
+ "@types/react-dom": "^19.2.7",
102
+ "@typescript-eslint/eslint-plugin": "^8.70.0",
103
+ "@typescript-eslint/parser": "^8.70.0",
104
+ "@vitejs/plugin-react-swc": "^4.3.3",
104
105
  "chai": "^6.2.0",
105
- "eslint": "^9.39.1",
106
+ "eslint": "^9.39.5",
106
107
  "eslint-config-prettier": "^10.1.8",
107
108
  "eslint-formatter-visualstudio": "^9.0.1",
108
- "eslint-plugin-prettier": "^5.5.4",
109
+ "eslint-plugin-prettier": "^5.5.6",
109
110
  "eslint-plugin-react": "^7.37.5",
110
- "eslint-plugin-react-hooks": "^7.0.1",
111
- "eslint-plugin-react-refresh": "^0.4.24",
112
- "eslint-plugin-storybook": "10.0.7",
111
+ "eslint-plugin-react-hooks": "^7.1.1",
112
+ "eslint-plugin-react-refresh": "^0.5.6",
113
+ "eslint-plugin-storybook": "10.6.0",
113
114
  "globals": "^16.5.0",
114
115
  "mocha": "^11.7.5",
115
116
  "npm-check-updates": "^19.1.2",
116
- "prettier": "^3.6.2",
117
+ "prettier": "^3.9.6",
117
118
  "prettier-plugin-classnames": "^0.8.5",
118
119
  "shx": "^0.4.0",
119
- "storybook": "10.0.7",
120
+ "storybook": "10.6.0",
120
121
  "typescript": "^5.9.3",
121
- "typescript-eslint": "^8.46.3",
122
+ "typescript-eslint": "^8.70.0",
122
123
  "vite": "^7.2.2",
123
124
  "vite-plugin-dts": "^4.5.4",
124
125
  "vite-tsconfig-paths": "^5.1.4",
@@ -129,7 +130,7 @@
129
130
  "test": "npx vitest --config=vitest.node.config.ts --no-cache",
130
131
  "test:w": "npx vitest --config=vitest.node.config.ts --watch",
131
132
  "test:v8": "npx vite",
132
- "lint": "eslint \"./**/*.{ts,tsx}\" -f visualstudio --ext .ts,.tsx --report-unused-disable-directives --max-warnings 0",
133
+ "lint": "eslint \"./**/*.{ts,tsx}\" -f visualstudio --report-unused-disable-directives --max-warnings 0",
133
134
  "build": "tsc -b tsconfig.json --noEmit && vite build",
134
135
  "pnpm:u": "pnpm update",
135
136
  "pnpm:ou": "pnpm outdated",