@hai3/screensets 0.2.0-alpha.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/CLAUDE.md +135 -0
- package/dist/index.cjs +85 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +37 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/types.cjs +48 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +189 -0
- package/dist/types.d.ts +189 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/llms.txt +52 -0
- package/package.json +45 -0
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# @hai3/screensets
|
|
2
|
+
|
|
3
|
+
Pure TypeScript contracts and registry for HAI3 screenset management.
|
|
4
|
+
|
|
5
|
+
## SDK Layer
|
|
6
|
+
|
|
7
|
+
This package is part of the **SDK Layer (L1)** - it has **ZERO dependencies** and can be used independently. It contains only TypeScript types and a simple registry implementation.
|
|
8
|
+
|
|
9
|
+
## What This Package Contains
|
|
10
|
+
|
|
11
|
+
| Export | Description |
|
|
12
|
+
|--------|-------------|
|
|
13
|
+
| `screensetRegistry` | Singleton registry for screenset registration |
|
|
14
|
+
| `LayoutDomain` | Enum of layout domains (header, footer, menu, etc.) |
|
|
15
|
+
| `ScreensetCategory` | Enum for three-stage workflow (Drafts, Mockups, Production) |
|
|
16
|
+
| `ScreensetDefinition` | Complete screenset configuration type |
|
|
17
|
+
| `MenuItemConfig` | Menu item structure type |
|
|
18
|
+
| `ScreenLoader` | Lazy screen loader function type |
|
|
19
|
+
|
|
20
|
+
## What This Package Does NOT Contain
|
|
21
|
+
|
|
22
|
+
- **NO translation types** - Use `@hai3/i18n` for translation types
|
|
23
|
+
- **NO Redux slices** - Layout state management is in `@hai3/framework`
|
|
24
|
+
- **NO selectors** - State selectors are in `@hai3/framework`
|
|
25
|
+
- **NO dependencies** - Pure TypeScript, zero runtime dependencies
|
|
26
|
+
|
|
27
|
+
## Screenset Registry
|
|
28
|
+
|
|
29
|
+
The registry is a pure storage implementation (~20 lines, Map wrapper) with no side effects:
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { screensetRegistry, ScreensetDefinition, ScreensetCategory } from '@hai3/screensets';
|
|
33
|
+
|
|
34
|
+
const myScreenset: ScreensetDefinition = {
|
|
35
|
+
id: 'myApp',
|
|
36
|
+
name: 'My Application',
|
|
37
|
+
category: ScreensetCategory.Production,
|
|
38
|
+
defaultScreen: 'home',
|
|
39
|
+
menu: [
|
|
40
|
+
{ menuItem: { id: 'home', label: 'Home' }, screen: () => import('./HomeScreen') }
|
|
41
|
+
]
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// Register
|
|
45
|
+
screensetRegistry.register(myScreenset);
|
|
46
|
+
|
|
47
|
+
// Query
|
|
48
|
+
screensetRegistry.get('myApp'); // ScreensetDefinition | undefined
|
|
49
|
+
screensetRegistry.getAll(); // ScreensetDefinition[]
|
|
50
|
+
screensetRegistry.has('myApp'); // boolean
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Translations
|
|
54
|
+
|
|
55
|
+
Screensets register translations directly with `i18nRegistry` from `@hai3/framework`:
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import { i18nRegistry, I18nRegistry, Language } from '@hai3/framework';
|
|
59
|
+
import { SCREENSET_ID } from './ids';
|
|
60
|
+
|
|
61
|
+
// Register translations (not on screenset config)
|
|
62
|
+
i18nRegistry.registerLoader(
|
|
63
|
+
`screenset.${SCREENSET_ID}`,
|
|
64
|
+
I18nRegistry.createLoader({
|
|
65
|
+
[Language.English]: () => import('./i18n/en.json'),
|
|
66
|
+
[Language.Spanish]: () => import('./i18n/es.json'),
|
|
67
|
+
// ... all 36 languages
|
|
68
|
+
})
|
|
69
|
+
);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Layout Domains
|
|
73
|
+
|
|
74
|
+
HAI3 defines 7 layout domains that screensets can use:
|
|
75
|
+
|
|
76
|
+
| Domain | Description |
|
|
77
|
+
|--------|-------------|
|
|
78
|
+
| `header` | Top navigation bar |
|
|
79
|
+
| `footer` | Bottom bar |
|
|
80
|
+
| `menu` | Side navigation menu |
|
|
81
|
+
| `sidebar` | Collapsible side panel |
|
|
82
|
+
| `screen` | Main content area |
|
|
83
|
+
| `popup` | Modal dialogs |
|
|
84
|
+
| `overlay` | Full-screen overlays |
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { LayoutDomain } from '@hai3/screensets';
|
|
88
|
+
|
|
89
|
+
// Use in screenset configuration
|
|
90
|
+
const visibleDomains = [LayoutDomain.Header, LayoutDomain.Menu, LayoutDomain.Screen];
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Screenset Definition
|
|
94
|
+
|
|
95
|
+
Complete definition of a screenset:
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
import {
|
|
99
|
+
ScreensetDefinition,
|
|
100
|
+
ScreensetCategory,
|
|
101
|
+
MenuScreenItem
|
|
102
|
+
} from '@hai3/screensets';
|
|
103
|
+
|
|
104
|
+
const demoScreenset: ScreensetDefinition = {
|
|
105
|
+
id: 'demo', // Unique identifier
|
|
106
|
+
name: 'Demo Screenset', // Display name
|
|
107
|
+
category: ScreensetCategory.Drafts, // Workflow stage
|
|
108
|
+
defaultScreen: 'home', // Default screen to show
|
|
109
|
+
menu: [ // Menu items with screens
|
|
110
|
+
{ menuItem: homeMenuItem, screen: () => import('./HomeScreen') }
|
|
111
|
+
]
|
|
112
|
+
};
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Note:** Translations are registered separately via `i18nRegistry`, not on the screenset definition.
|
|
116
|
+
|
|
117
|
+
## Key Rules
|
|
118
|
+
|
|
119
|
+
1. **This package is contracts only** - No business logic, no state management
|
|
120
|
+
2. **ZERO dependencies** - Keep it pure TypeScript, no @hai3 inter-dependencies
|
|
121
|
+
3. **Registry is pure storage** - No side effects, just a Map wrapper
|
|
122
|
+
4. **Use for screenset definitions** - Import types to define your screensets
|
|
123
|
+
5. **Translations via i18n** - Screensets register translations directly with `i18nRegistry`
|
|
124
|
+
6. **Import layout state from @hai3/framework** - HeaderState, MenuState, selectors are there
|
|
125
|
+
|
|
126
|
+
## Package Relationship
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
@hai3/screensets (SDK L1) @hai3/framework (L2)
|
|
130
|
+
├── Contracts (types) ──> ├── Re-exports contracts
|
|
131
|
+
├── screensetRegistry ──> ├── Re-exports registry
|
|
132
|
+
└── ZERO dependencies ├── Layout state shapes
|
|
133
|
+
├── Layout slices
|
|
134
|
+
└── i18nRegistry (from @hai3/i18n)
|
|
135
|
+
```
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var src_exports = {};
|
|
22
|
+
__export(src_exports, {
|
|
23
|
+
LayoutDomain: () => LayoutDomain,
|
|
24
|
+
ScreensetCategory: () => ScreensetCategory,
|
|
25
|
+
createScreensetRegistry: () => createScreensetRegistry,
|
|
26
|
+
screensetRegistry: () => screensetRegistry
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(src_exports);
|
|
29
|
+
|
|
30
|
+
// src/registry.ts
|
|
31
|
+
function createScreensetRegistry() {
|
|
32
|
+
const screensets = /* @__PURE__ */ new Map();
|
|
33
|
+
return {
|
|
34
|
+
register(screenset) {
|
|
35
|
+
screensets.set(screenset.id, screenset);
|
|
36
|
+
},
|
|
37
|
+
registerMany(configs) {
|
|
38
|
+
for (const config of configs) {
|
|
39
|
+
screensets.set(config.id, config);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
get(id) {
|
|
43
|
+
return screensets.get(id);
|
|
44
|
+
},
|
|
45
|
+
getAll() {
|
|
46
|
+
return Array.from(screensets.values());
|
|
47
|
+
},
|
|
48
|
+
has(id) {
|
|
49
|
+
return screensets.has(id);
|
|
50
|
+
},
|
|
51
|
+
unregister(id) {
|
|
52
|
+
return screensets.delete(id);
|
|
53
|
+
},
|
|
54
|
+
clear() {
|
|
55
|
+
screensets.clear();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
var screensetRegistry = createScreensetRegistry();
|
|
60
|
+
|
|
61
|
+
// src/types.ts
|
|
62
|
+
var LayoutDomain = /* @__PURE__ */ ((LayoutDomain2) => {
|
|
63
|
+
LayoutDomain2["Header"] = "header";
|
|
64
|
+
LayoutDomain2["Footer"] = "footer";
|
|
65
|
+
LayoutDomain2["Menu"] = "menu";
|
|
66
|
+
LayoutDomain2["Sidebar"] = "sidebar";
|
|
67
|
+
LayoutDomain2["Screen"] = "screen";
|
|
68
|
+
LayoutDomain2["Popup"] = "popup";
|
|
69
|
+
LayoutDomain2["Overlay"] = "overlay";
|
|
70
|
+
return LayoutDomain2;
|
|
71
|
+
})(LayoutDomain || {});
|
|
72
|
+
var ScreensetCategory = /* @__PURE__ */ ((ScreensetCategory2) => {
|
|
73
|
+
ScreensetCategory2["Drafts"] = "drafts";
|
|
74
|
+
ScreensetCategory2["Mockups"] = "mockups";
|
|
75
|
+
ScreensetCategory2["Production"] = "production";
|
|
76
|
+
return ScreensetCategory2;
|
|
77
|
+
})(ScreensetCategory || {});
|
|
78
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
79
|
+
0 && (module.exports = {
|
|
80
|
+
LayoutDomain,
|
|
81
|
+
ScreensetCategory,
|
|
82
|
+
createScreensetRegistry,
|
|
83
|
+
screensetRegistry
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/registry.ts","../src/types.ts"],"sourcesContent":["/**\n * @hai3/screensets\n *\n * Pure TypeScript contracts and registry for HAI3 screenset management.\n * This package has ZERO dependencies - SDK Layer (L1).\n *\n * Screensets are HAI3's first-class citizen - self-contained vertical slices\n * that can be composed into applications or injected into external platforms.\n *\n * NOTE: Translations are NOT part of this package. Use @hai3/i18n for translations.\n * Screensets register translations directly with i18nRegistry via framework.\n *\n * @example\n * ```typescript\n * import {\n * screensetRegistry,\n * ScreensetDefinition,\n * ScreensetCategory,\n * LayoutDomain,\n * } from '@hai3/screensets';\n *\n * const myScreenset: ScreensetDefinition = {\n * id: 'myApp',\n * name: 'My Application',\n * category: ScreensetCategory.Production,\n * defaultScreen: 'home',\n * menu: [\n * { menuItem: homeMenuItem, screen: () => import('./HomeScreen') }\n * ]\n * };\n *\n * screensetRegistry.register(myScreenset);\n * ```\n */\n\n// ============================================================================\n// Registry\n// ============================================================================\n\nexport { screensetRegistry, createScreensetRegistry } from './registry';\n\n// ============================================================================\n// Types and Contracts\n// ============================================================================\n\nexport {\n // Enums\n LayoutDomain,\n ScreensetCategory,\n\n // Branded types\n type ScreensetId,\n type ScreenId,\n\n // Configuration interfaces\n type MenuItemConfig,\n type ScreenLoader,\n type ScreenConfig,\n type MenuScreenItem,\n type ScreensetDefinition,\n\n // Registry interface\n type ScreensetRegistry,\n} from './types';\n","/**\n * @hai3/screensets - Screenset Registry\n *\n * Pure storage implementation for screenset registration.\n * This is a simple Map wrapper with no side effects.\n * ~20 lines of implementation - minimal and focused.\n *\n * NOTE: i18n wiring happens in @hai3/framework when it re-exports this registry.\n */\n\nimport type { ScreensetDefinition, ScreensetRegistry } from './types';\n\n/**\n * Create a new screenset registry instance.\n * This is a pure storage implementation with no dependencies.\n */\nfunction createScreensetRegistry(): ScreensetRegistry {\n const screensets = new Map<string, ScreensetDefinition>();\n\n return {\n register(screenset: ScreensetDefinition): void {\n screensets.set(screenset.id, screenset);\n },\n\n registerMany(configs: ScreensetDefinition[]): void {\n for (const config of configs) {\n screensets.set(config.id, config);\n }\n },\n\n get(id: string): ScreensetDefinition | undefined {\n return screensets.get(id);\n },\n\n getAll(): ScreensetDefinition[] {\n return Array.from(screensets.values());\n },\n\n has(id: string): boolean {\n return screensets.has(id);\n },\n\n unregister(id: string): boolean {\n return screensets.delete(id);\n },\n\n clear(): void {\n screensets.clear();\n },\n };\n}\n\n/**\n * Singleton screenset registry instance.\n * Use this for screenset registration throughout the application.\n *\n * @example\n * ```typescript\n * import { screensetRegistry } from '@hai3/screensets';\n *\n * // Register a screenset\n * screensetRegistry.register(myScreenset);\n *\n * // Get all screensets\n * const all = screensetRegistry.getAll();\n * ```\n */\nexport const screensetRegistry: ScreensetRegistry = createScreensetRegistry();\n\n// Also export the factory for testing purposes\nexport { createScreensetRegistry };\n","/**\n * @hai3/screensets - Type Definitions\n *\n * Pure TypeScript contracts for HAI3 screenset management.\n * This package has ZERO dependencies - pure types and contracts only.\n *\n * NOTE: Layout state shapes (HeaderState, MenuState, etc.) are in @hai3/framework\n */\n\nimport type { ComponentType } from 'react';\n\n// ============================================================================\n// Layout Domain Enum\n// ============================================================================\n\n/**\n * Layout Domain Enum\n * Defines all layout domains that can be orchestrated.\n */\nexport enum LayoutDomain {\n Header = 'header',\n Footer = 'footer',\n Menu = 'menu',\n Sidebar = 'sidebar',\n Screen = 'screen',\n Popup = 'popup',\n Overlay = 'overlay',\n}\n\n// ============================================================================\n// Branded Types for Type Safety\n// ============================================================================\n\n/**\n * Branded type for Screenset IDs\n * Provides compile-time safety for screenset identification.\n *\n * @example\n * ```typescript\n * const chatScreensetId = 'chat' as ScreensetId;\n * const demoScreensetId = 'demo' as ScreensetId;\n * ```\n */\nexport type ScreensetId = string & { readonly __brand: 'ScreensetId' };\n\n/**\n * Branded type for Screen IDs\n * Provides compile-time safety for screen identification.\n *\n * @example\n * ```typescript\n * const homeScreenId = 'home' as ScreenId;\n * const profileScreenId = 'profile' as ScreenId;\n * ```\n */\nexport type ScreenId = string & { readonly __brand: 'ScreenId' };\n\n// ============================================================================\n// Screenset Category\n// ============================================================================\n\n/**\n * Screenset Category Enum\n * Defines the three-stage development workflow categories.\n */\nexport enum ScreensetCategory {\n /** AI-generated initial layouts */\n Drafts = 'drafts',\n /** Designer-refined versions */\n Mockups = 'mockups',\n /** Engineer-finalized, production-ready screens */\n Production = 'production',\n}\n\n// ============================================================================\n// Menu Item Configuration\n// ============================================================================\n\n/**\n * Menu Item Configuration\n * Defines the structure of a menu item.\n *\n * @example\n * ```typescript\n * const menuItem: MenuItemConfig = {\n * id: 'dashboard',\n * label: 'screen.dashboard:title', // Translation key\n * icon: 'dashboard:home', // Icon ID\n * screenId: 'dashboard',\n * };\n * ```\n */\nexport interface MenuItemConfig {\n /** Unique identifier for the menu item */\n id: string;\n /** Translation key for the label */\n label: string;\n /** Icon identifier (format: screensetId:iconName) */\n icon?: string;\n /** Screen ID to navigate to on click */\n screenId?: string;\n /** External URL (mutually exclusive with screenId) */\n href?: string;\n /** Click handler (for custom actions) */\n onClick?: () => void;\n /** Child menu items for nested menus */\n children?: MenuItemConfig[];\n /** Badge content (string or number) */\n badge?: string | number;\n}\n\n// ============================================================================\n// Screen Configuration\n// ============================================================================\n\n/**\n * Screen Loader Function Type\n * Returns a Promise resolving to a module with a default React component.\n *\n * @example\n * ```typescript\n * const loader: ScreenLoader = () => import('./screens/HomeScreen');\n * ```\n */\nexport type ScreenLoader = () => Promise<{ default: ComponentType }>;\n\n/**\n * Screen Configuration\n * Defines the structure of a screen.\n *\n * @example\n * ```typescript\n * const screen: ScreenConfig = {\n * id: 'home',\n * loader: () => import('./screens/HomeScreen'),\n * };\n * ```\n */\nexport interface ScreenConfig {\n /** Unique identifier for the screen */\n id: string;\n /** Lazy loader function for the screen component */\n loader: ScreenLoader;\n}\n\n// ============================================================================\n// Screenset Definition\n// ============================================================================\n\n/**\n * Menu Screen Item\n * Combines menu item config with its screen loader.\n */\nexport interface MenuScreenItem {\n /** Menu item configuration */\n menuItem: MenuItemConfig;\n /** Screen loader function */\n screen: ScreenLoader;\n}\n\n/**\n * Screenset Definition\n * Complete definition of a screenset including screens and menu.\n *\n * NOTE: Translations are NOT part of screenset definition.\n * Screensets register translations directly with i18nRegistry via framework.\n *\n * @example\n * ```typescript\n * const demoScreenset: ScreensetDefinition = {\n * id: 'demo',\n * name: 'Demo Screenset',\n * category: ScreensetCategory.Drafts,\n * defaultScreen: 'home',\n * menu: [\n * { menuItem: homeMenuItem, screen: () => import('./screens/HomeScreen') },\n * ],\n * };\n * ```\n */\nexport interface ScreensetDefinition {\n /** Unique identifier for the screenset */\n id: string;\n /** Display name for the screenset */\n name: string;\n /** Category (drafts, mockups, production) */\n category: ScreensetCategory;\n /** Default screen ID to show when screenset is selected */\n defaultScreen: string;\n /** Menu items with their associated screens */\n menu: MenuScreenItem[];\n}\n\n// ============================================================================\n// Screenset Registry Interface\n// ============================================================================\n\n/**\n * Screenset Registry Interface\n * Pure storage interface for screenset registration.\n * Implementation is a simple Map wrapper with no side effects.\n */\nexport interface ScreensetRegistry {\n /** Register a screenset */\n register(screenset: ScreensetDefinition): void;\n /** Get a screenset by ID */\n get(id: string): ScreensetDefinition | undefined;\n /** Register multiple screensets at once */\n registerMany(configs: ScreensetDefinition[]): void;\n /** Get all registered screensets */\n getAll(): ScreensetDefinition[];\n /** Check if a screenset is registered */\n has(id: string): boolean;\n /** Unregister a screenset */\n unregister(id: string): boolean;\n /** Clear all screensets (useful for testing) */\n clear(): void;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACgBA,SAAS,0BAA6C;AACpD,QAAM,aAAa,oBAAI,IAAiC;AAExD,SAAO;AAAA,IACL,SAAS,WAAsC;AAC7C,iBAAW,IAAI,UAAU,IAAI,SAAS;AAAA,IACxC;AAAA,IAEA,aAAa,SAAsC;AACjD,iBAAW,UAAU,SAAS;AAC5B,mBAAW,IAAI,OAAO,IAAI,MAAM;AAAA,MAClC;AAAA,IACF;AAAA,IAEA,IAAI,IAA6C;AAC/C,aAAO,WAAW,IAAI,EAAE;AAAA,IAC1B;AAAA,IAEA,SAAgC;AAC9B,aAAO,MAAM,KAAK,WAAW,OAAO,CAAC;AAAA,IACvC;AAAA,IAEA,IAAI,IAAqB;AACvB,aAAO,WAAW,IAAI,EAAE;AAAA,IAC1B;AAAA,IAEA,WAAW,IAAqB;AAC9B,aAAO,WAAW,OAAO,EAAE;AAAA,IAC7B;AAAA,IAEA,QAAc;AACZ,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AACF;AAiBO,IAAM,oBAAuC,wBAAwB;;;AChDrE,IAAK,eAAL,kBAAKA,kBAAL;AACL,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,UAAO;AACP,EAAAA,cAAA,aAAU;AACV,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,WAAQ;AACR,EAAAA,cAAA,aAAU;AAPA,SAAAA;AAAA,GAAA;AA8CL,IAAK,oBAAL,kBAAKC,uBAAL;AAEL,EAAAA,mBAAA,YAAS;AAET,EAAAA,mBAAA,aAAU;AAEV,EAAAA,mBAAA,gBAAa;AANH,SAAAA;AAAA,GAAA;","names":["LayoutDomain","ScreensetCategory"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ScreensetRegistry } from './types.cjs';
|
|
2
|
+
export { LayoutDomain, MenuItemConfig, MenuScreenItem, ScreenConfig, ScreenId, ScreenLoader, ScreensetCategory, ScreensetDefinition, ScreensetId } from './types.cjs';
|
|
3
|
+
import 'react';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @hai3/screensets - Screenset Registry
|
|
7
|
+
*
|
|
8
|
+
* Pure storage implementation for screenset registration.
|
|
9
|
+
* This is a simple Map wrapper with no side effects.
|
|
10
|
+
* ~20 lines of implementation - minimal and focused.
|
|
11
|
+
*
|
|
12
|
+
* NOTE: i18n wiring happens in @hai3/framework when it re-exports this registry.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Create a new screenset registry instance.
|
|
17
|
+
* This is a pure storage implementation with no dependencies.
|
|
18
|
+
*/
|
|
19
|
+
declare function createScreensetRegistry(): ScreensetRegistry;
|
|
20
|
+
/**
|
|
21
|
+
* Singleton screenset registry instance.
|
|
22
|
+
* Use this for screenset registration throughout the application.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* import { screensetRegistry } from '@hai3/screensets';
|
|
27
|
+
*
|
|
28
|
+
* // Register a screenset
|
|
29
|
+
* screensetRegistry.register(myScreenset);
|
|
30
|
+
*
|
|
31
|
+
* // Get all screensets
|
|
32
|
+
* const all = screensetRegistry.getAll();
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
declare const screensetRegistry: ScreensetRegistry;
|
|
36
|
+
|
|
37
|
+
export { ScreensetRegistry, createScreensetRegistry, screensetRegistry };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ScreensetRegistry } from './types.js';
|
|
2
|
+
export { LayoutDomain, MenuItemConfig, MenuScreenItem, ScreenConfig, ScreenId, ScreenLoader, ScreensetCategory, ScreensetDefinition, ScreensetId } from './types.js';
|
|
3
|
+
import 'react';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @hai3/screensets - Screenset Registry
|
|
7
|
+
*
|
|
8
|
+
* Pure storage implementation for screenset registration.
|
|
9
|
+
* This is a simple Map wrapper with no side effects.
|
|
10
|
+
* ~20 lines of implementation - minimal and focused.
|
|
11
|
+
*
|
|
12
|
+
* NOTE: i18n wiring happens in @hai3/framework when it re-exports this registry.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Create a new screenset registry instance.
|
|
17
|
+
* This is a pure storage implementation with no dependencies.
|
|
18
|
+
*/
|
|
19
|
+
declare function createScreensetRegistry(): ScreensetRegistry;
|
|
20
|
+
/**
|
|
21
|
+
* Singleton screenset registry instance.
|
|
22
|
+
* Use this for screenset registration throughout the application.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* import { screensetRegistry } from '@hai3/screensets';
|
|
27
|
+
*
|
|
28
|
+
* // Register a screenset
|
|
29
|
+
* screensetRegistry.register(myScreenset);
|
|
30
|
+
*
|
|
31
|
+
* // Get all screensets
|
|
32
|
+
* const all = screensetRegistry.getAll();
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
declare const screensetRegistry: ScreensetRegistry;
|
|
36
|
+
|
|
37
|
+
export { ScreensetRegistry, createScreensetRegistry, screensetRegistry };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// src/registry.ts
|
|
2
|
+
function createScreensetRegistry() {
|
|
3
|
+
const screensets = /* @__PURE__ */ new Map();
|
|
4
|
+
return {
|
|
5
|
+
register(screenset) {
|
|
6
|
+
screensets.set(screenset.id, screenset);
|
|
7
|
+
},
|
|
8
|
+
registerMany(configs) {
|
|
9
|
+
for (const config of configs) {
|
|
10
|
+
screensets.set(config.id, config);
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
get(id) {
|
|
14
|
+
return screensets.get(id);
|
|
15
|
+
},
|
|
16
|
+
getAll() {
|
|
17
|
+
return Array.from(screensets.values());
|
|
18
|
+
},
|
|
19
|
+
has(id) {
|
|
20
|
+
return screensets.has(id);
|
|
21
|
+
},
|
|
22
|
+
unregister(id) {
|
|
23
|
+
return screensets.delete(id);
|
|
24
|
+
},
|
|
25
|
+
clear() {
|
|
26
|
+
screensets.clear();
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
var screensetRegistry = createScreensetRegistry();
|
|
31
|
+
|
|
32
|
+
// src/types.ts
|
|
33
|
+
var LayoutDomain = /* @__PURE__ */ ((LayoutDomain2) => {
|
|
34
|
+
LayoutDomain2["Header"] = "header";
|
|
35
|
+
LayoutDomain2["Footer"] = "footer";
|
|
36
|
+
LayoutDomain2["Menu"] = "menu";
|
|
37
|
+
LayoutDomain2["Sidebar"] = "sidebar";
|
|
38
|
+
LayoutDomain2["Screen"] = "screen";
|
|
39
|
+
LayoutDomain2["Popup"] = "popup";
|
|
40
|
+
LayoutDomain2["Overlay"] = "overlay";
|
|
41
|
+
return LayoutDomain2;
|
|
42
|
+
})(LayoutDomain || {});
|
|
43
|
+
var ScreensetCategory = /* @__PURE__ */ ((ScreensetCategory2) => {
|
|
44
|
+
ScreensetCategory2["Drafts"] = "drafts";
|
|
45
|
+
ScreensetCategory2["Mockups"] = "mockups";
|
|
46
|
+
ScreensetCategory2["Production"] = "production";
|
|
47
|
+
return ScreensetCategory2;
|
|
48
|
+
})(ScreensetCategory || {});
|
|
49
|
+
export {
|
|
50
|
+
LayoutDomain,
|
|
51
|
+
ScreensetCategory,
|
|
52
|
+
createScreensetRegistry,
|
|
53
|
+
screensetRegistry
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/registry.ts","../src/types.ts"],"sourcesContent":["/**\n * @hai3/screensets - Screenset Registry\n *\n * Pure storage implementation for screenset registration.\n * This is a simple Map wrapper with no side effects.\n * ~20 lines of implementation - minimal and focused.\n *\n * NOTE: i18n wiring happens in @hai3/framework when it re-exports this registry.\n */\n\nimport type { ScreensetDefinition, ScreensetRegistry } from './types';\n\n/**\n * Create a new screenset registry instance.\n * This is a pure storage implementation with no dependencies.\n */\nfunction createScreensetRegistry(): ScreensetRegistry {\n const screensets = new Map<string, ScreensetDefinition>();\n\n return {\n register(screenset: ScreensetDefinition): void {\n screensets.set(screenset.id, screenset);\n },\n\n registerMany(configs: ScreensetDefinition[]): void {\n for (const config of configs) {\n screensets.set(config.id, config);\n }\n },\n\n get(id: string): ScreensetDefinition | undefined {\n return screensets.get(id);\n },\n\n getAll(): ScreensetDefinition[] {\n return Array.from(screensets.values());\n },\n\n has(id: string): boolean {\n return screensets.has(id);\n },\n\n unregister(id: string): boolean {\n return screensets.delete(id);\n },\n\n clear(): void {\n screensets.clear();\n },\n };\n}\n\n/**\n * Singleton screenset registry instance.\n * Use this for screenset registration throughout the application.\n *\n * @example\n * ```typescript\n * import { screensetRegistry } from '@hai3/screensets';\n *\n * // Register a screenset\n * screensetRegistry.register(myScreenset);\n *\n * // Get all screensets\n * const all = screensetRegistry.getAll();\n * ```\n */\nexport const screensetRegistry: ScreensetRegistry = createScreensetRegistry();\n\n// Also export the factory for testing purposes\nexport { createScreensetRegistry };\n","/**\n * @hai3/screensets - Type Definitions\n *\n * Pure TypeScript contracts for HAI3 screenset management.\n * This package has ZERO dependencies - pure types and contracts only.\n *\n * NOTE: Layout state shapes (HeaderState, MenuState, etc.) are in @hai3/framework\n */\n\nimport type { ComponentType } from 'react';\n\n// ============================================================================\n// Layout Domain Enum\n// ============================================================================\n\n/**\n * Layout Domain Enum\n * Defines all layout domains that can be orchestrated.\n */\nexport enum LayoutDomain {\n Header = 'header',\n Footer = 'footer',\n Menu = 'menu',\n Sidebar = 'sidebar',\n Screen = 'screen',\n Popup = 'popup',\n Overlay = 'overlay',\n}\n\n// ============================================================================\n// Branded Types for Type Safety\n// ============================================================================\n\n/**\n * Branded type for Screenset IDs\n * Provides compile-time safety for screenset identification.\n *\n * @example\n * ```typescript\n * const chatScreensetId = 'chat' as ScreensetId;\n * const demoScreensetId = 'demo' as ScreensetId;\n * ```\n */\nexport type ScreensetId = string & { readonly __brand: 'ScreensetId' };\n\n/**\n * Branded type for Screen IDs\n * Provides compile-time safety for screen identification.\n *\n * @example\n * ```typescript\n * const homeScreenId = 'home' as ScreenId;\n * const profileScreenId = 'profile' as ScreenId;\n * ```\n */\nexport type ScreenId = string & { readonly __brand: 'ScreenId' };\n\n// ============================================================================\n// Screenset Category\n// ============================================================================\n\n/**\n * Screenset Category Enum\n * Defines the three-stage development workflow categories.\n */\nexport enum ScreensetCategory {\n /** AI-generated initial layouts */\n Drafts = 'drafts',\n /** Designer-refined versions */\n Mockups = 'mockups',\n /** Engineer-finalized, production-ready screens */\n Production = 'production',\n}\n\n// ============================================================================\n// Menu Item Configuration\n// ============================================================================\n\n/**\n * Menu Item Configuration\n * Defines the structure of a menu item.\n *\n * @example\n * ```typescript\n * const menuItem: MenuItemConfig = {\n * id: 'dashboard',\n * label: 'screen.dashboard:title', // Translation key\n * icon: 'dashboard:home', // Icon ID\n * screenId: 'dashboard',\n * };\n * ```\n */\nexport interface MenuItemConfig {\n /** Unique identifier for the menu item */\n id: string;\n /** Translation key for the label */\n label: string;\n /** Icon identifier (format: screensetId:iconName) */\n icon?: string;\n /** Screen ID to navigate to on click */\n screenId?: string;\n /** External URL (mutually exclusive with screenId) */\n href?: string;\n /** Click handler (for custom actions) */\n onClick?: () => void;\n /** Child menu items for nested menus */\n children?: MenuItemConfig[];\n /** Badge content (string or number) */\n badge?: string | number;\n}\n\n// ============================================================================\n// Screen Configuration\n// ============================================================================\n\n/**\n * Screen Loader Function Type\n * Returns a Promise resolving to a module with a default React component.\n *\n * @example\n * ```typescript\n * const loader: ScreenLoader = () => import('./screens/HomeScreen');\n * ```\n */\nexport type ScreenLoader = () => Promise<{ default: ComponentType }>;\n\n/**\n * Screen Configuration\n * Defines the structure of a screen.\n *\n * @example\n * ```typescript\n * const screen: ScreenConfig = {\n * id: 'home',\n * loader: () => import('./screens/HomeScreen'),\n * };\n * ```\n */\nexport interface ScreenConfig {\n /** Unique identifier for the screen */\n id: string;\n /** Lazy loader function for the screen component */\n loader: ScreenLoader;\n}\n\n// ============================================================================\n// Screenset Definition\n// ============================================================================\n\n/**\n * Menu Screen Item\n * Combines menu item config with its screen loader.\n */\nexport interface MenuScreenItem {\n /** Menu item configuration */\n menuItem: MenuItemConfig;\n /** Screen loader function */\n screen: ScreenLoader;\n}\n\n/**\n * Screenset Definition\n * Complete definition of a screenset including screens and menu.\n *\n * NOTE: Translations are NOT part of screenset definition.\n * Screensets register translations directly with i18nRegistry via framework.\n *\n * @example\n * ```typescript\n * const demoScreenset: ScreensetDefinition = {\n * id: 'demo',\n * name: 'Demo Screenset',\n * category: ScreensetCategory.Drafts,\n * defaultScreen: 'home',\n * menu: [\n * { menuItem: homeMenuItem, screen: () => import('./screens/HomeScreen') },\n * ],\n * };\n * ```\n */\nexport interface ScreensetDefinition {\n /** Unique identifier for the screenset */\n id: string;\n /** Display name for the screenset */\n name: string;\n /** Category (drafts, mockups, production) */\n category: ScreensetCategory;\n /** Default screen ID to show when screenset is selected */\n defaultScreen: string;\n /** Menu items with their associated screens */\n menu: MenuScreenItem[];\n}\n\n// ============================================================================\n// Screenset Registry Interface\n// ============================================================================\n\n/**\n * Screenset Registry Interface\n * Pure storage interface for screenset registration.\n * Implementation is a simple Map wrapper with no side effects.\n */\nexport interface ScreensetRegistry {\n /** Register a screenset */\n register(screenset: ScreensetDefinition): void;\n /** Get a screenset by ID */\n get(id: string): ScreensetDefinition | undefined;\n /** Register multiple screensets at once */\n registerMany(configs: ScreensetDefinition[]): void;\n /** Get all registered screensets */\n getAll(): ScreensetDefinition[];\n /** Check if a screenset is registered */\n has(id: string): boolean;\n /** Unregister a screenset */\n unregister(id: string): boolean;\n /** Clear all screensets (useful for testing) */\n clear(): void;\n}\n"],"mappings":";AAgBA,SAAS,0BAA6C;AACpD,QAAM,aAAa,oBAAI,IAAiC;AAExD,SAAO;AAAA,IACL,SAAS,WAAsC;AAC7C,iBAAW,IAAI,UAAU,IAAI,SAAS;AAAA,IACxC;AAAA,IAEA,aAAa,SAAsC;AACjD,iBAAW,UAAU,SAAS;AAC5B,mBAAW,IAAI,OAAO,IAAI,MAAM;AAAA,MAClC;AAAA,IACF;AAAA,IAEA,IAAI,IAA6C;AAC/C,aAAO,WAAW,IAAI,EAAE;AAAA,IAC1B;AAAA,IAEA,SAAgC;AAC9B,aAAO,MAAM,KAAK,WAAW,OAAO,CAAC;AAAA,IACvC;AAAA,IAEA,IAAI,IAAqB;AACvB,aAAO,WAAW,IAAI,EAAE;AAAA,IAC1B;AAAA,IAEA,WAAW,IAAqB;AAC9B,aAAO,WAAW,OAAO,EAAE;AAAA,IAC7B;AAAA,IAEA,QAAc;AACZ,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AACF;AAiBO,IAAM,oBAAuC,wBAAwB;;;AChDrE,IAAK,eAAL,kBAAKA,kBAAL;AACL,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,UAAO;AACP,EAAAA,cAAA,aAAU;AACV,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,WAAQ;AACR,EAAAA,cAAA,aAAU;AAPA,SAAAA;AAAA,GAAA;AA8CL,IAAK,oBAAL,kBAAKC,uBAAL;AAEL,EAAAA,mBAAA,YAAS;AAET,EAAAA,mBAAA,aAAU;AAEV,EAAAA,mBAAA,gBAAa;AANH,SAAAA;AAAA,GAAA;","names":["LayoutDomain","ScreensetCategory"]}
|
package/dist/types.cjs
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/types.ts
|
|
21
|
+
var types_exports = {};
|
|
22
|
+
__export(types_exports, {
|
|
23
|
+
LayoutDomain: () => LayoutDomain,
|
|
24
|
+
ScreensetCategory: () => ScreensetCategory
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(types_exports);
|
|
27
|
+
var LayoutDomain = /* @__PURE__ */ ((LayoutDomain2) => {
|
|
28
|
+
LayoutDomain2["Header"] = "header";
|
|
29
|
+
LayoutDomain2["Footer"] = "footer";
|
|
30
|
+
LayoutDomain2["Menu"] = "menu";
|
|
31
|
+
LayoutDomain2["Sidebar"] = "sidebar";
|
|
32
|
+
LayoutDomain2["Screen"] = "screen";
|
|
33
|
+
LayoutDomain2["Popup"] = "popup";
|
|
34
|
+
LayoutDomain2["Overlay"] = "overlay";
|
|
35
|
+
return LayoutDomain2;
|
|
36
|
+
})(LayoutDomain || {});
|
|
37
|
+
var ScreensetCategory = /* @__PURE__ */ ((ScreensetCategory2) => {
|
|
38
|
+
ScreensetCategory2["Drafts"] = "drafts";
|
|
39
|
+
ScreensetCategory2["Mockups"] = "mockups";
|
|
40
|
+
ScreensetCategory2["Production"] = "production";
|
|
41
|
+
return ScreensetCategory2;
|
|
42
|
+
})(ScreensetCategory || {});
|
|
43
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
44
|
+
0 && (module.exports = {
|
|
45
|
+
LayoutDomain,
|
|
46
|
+
ScreensetCategory
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=types.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["/**\n * @hai3/screensets - Type Definitions\n *\n * Pure TypeScript contracts for HAI3 screenset management.\n * This package has ZERO dependencies - pure types and contracts only.\n *\n * NOTE: Layout state shapes (HeaderState, MenuState, etc.) are in @hai3/framework\n */\n\nimport type { ComponentType } from 'react';\n\n// ============================================================================\n// Layout Domain Enum\n// ============================================================================\n\n/**\n * Layout Domain Enum\n * Defines all layout domains that can be orchestrated.\n */\nexport enum LayoutDomain {\n Header = 'header',\n Footer = 'footer',\n Menu = 'menu',\n Sidebar = 'sidebar',\n Screen = 'screen',\n Popup = 'popup',\n Overlay = 'overlay',\n}\n\n// ============================================================================\n// Branded Types for Type Safety\n// ============================================================================\n\n/**\n * Branded type for Screenset IDs\n * Provides compile-time safety for screenset identification.\n *\n * @example\n * ```typescript\n * const chatScreensetId = 'chat' as ScreensetId;\n * const demoScreensetId = 'demo' as ScreensetId;\n * ```\n */\nexport type ScreensetId = string & { readonly __brand: 'ScreensetId' };\n\n/**\n * Branded type for Screen IDs\n * Provides compile-time safety for screen identification.\n *\n * @example\n * ```typescript\n * const homeScreenId = 'home' as ScreenId;\n * const profileScreenId = 'profile' as ScreenId;\n * ```\n */\nexport type ScreenId = string & { readonly __brand: 'ScreenId' };\n\n// ============================================================================\n// Screenset Category\n// ============================================================================\n\n/**\n * Screenset Category Enum\n * Defines the three-stage development workflow categories.\n */\nexport enum ScreensetCategory {\n /** AI-generated initial layouts */\n Drafts = 'drafts',\n /** Designer-refined versions */\n Mockups = 'mockups',\n /** Engineer-finalized, production-ready screens */\n Production = 'production',\n}\n\n// ============================================================================\n// Menu Item Configuration\n// ============================================================================\n\n/**\n * Menu Item Configuration\n * Defines the structure of a menu item.\n *\n * @example\n * ```typescript\n * const menuItem: MenuItemConfig = {\n * id: 'dashboard',\n * label: 'screen.dashboard:title', // Translation key\n * icon: 'dashboard:home', // Icon ID\n * screenId: 'dashboard',\n * };\n * ```\n */\nexport interface MenuItemConfig {\n /** Unique identifier for the menu item */\n id: string;\n /** Translation key for the label */\n label: string;\n /** Icon identifier (format: screensetId:iconName) */\n icon?: string;\n /** Screen ID to navigate to on click */\n screenId?: string;\n /** External URL (mutually exclusive with screenId) */\n href?: string;\n /** Click handler (for custom actions) */\n onClick?: () => void;\n /** Child menu items for nested menus */\n children?: MenuItemConfig[];\n /** Badge content (string or number) */\n badge?: string | number;\n}\n\n// ============================================================================\n// Screen Configuration\n// ============================================================================\n\n/**\n * Screen Loader Function Type\n * Returns a Promise resolving to a module with a default React component.\n *\n * @example\n * ```typescript\n * const loader: ScreenLoader = () => import('./screens/HomeScreen');\n * ```\n */\nexport type ScreenLoader = () => Promise<{ default: ComponentType }>;\n\n/**\n * Screen Configuration\n * Defines the structure of a screen.\n *\n * @example\n * ```typescript\n * const screen: ScreenConfig = {\n * id: 'home',\n * loader: () => import('./screens/HomeScreen'),\n * };\n * ```\n */\nexport interface ScreenConfig {\n /** Unique identifier for the screen */\n id: string;\n /** Lazy loader function for the screen component */\n loader: ScreenLoader;\n}\n\n// ============================================================================\n// Screenset Definition\n// ============================================================================\n\n/**\n * Menu Screen Item\n * Combines menu item config with its screen loader.\n */\nexport interface MenuScreenItem {\n /** Menu item configuration */\n menuItem: MenuItemConfig;\n /** Screen loader function */\n screen: ScreenLoader;\n}\n\n/**\n * Screenset Definition\n * Complete definition of a screenset including screens and menu.\n *\n * NOTE: Translations are NOT part of screenset definition.\n * Screensets register translations directly with i18nRegistry via framework.\n *\n * @example\n * ```typescript\n * const demoScreenset: ScreensetDefinition = {\n * id: 'demo',\n * name: 'Demo Screenset',\n * category: ScreensetCategory.Drafts,\n * defaultScreen: 'home',\n * menu: [\n * { menuItem: homeMenuItem, screen: () => import('./screens/HomeScreen') },\n * ],\n * };\n * ```\n */\nexport interface ScreensetDefinition {\n /** Unique identifier for the screenset */\n id: string;\n /** Display name for the screenset */\n name: string;\n /** Category (drafts, mockups, production) */\n category: ScreensetCategory;\n /** Default screen ID to show when screenset is selected */\n defaultScreen: string;\n /** Menu items with their associated screens */\n menu: MenuScreenItem[];\n}\n\n// ============================================================================\n// Screenset Registry Interface\n// ============================================================================\n\n/**\n * Screenset Registry Interface\n * Pure storage interface for screenset registration.\n * Implementation is a simple Map wrapper with no side effects.\n */\nexport interface ScreensetRegistry {\n /** Register a screenset */\n register(screenset: ScreensetDefinition): void;\n /** Get a screenset by ID */\n get(id: string): ScreensetDefinition | undefined;\n /** Register multiple screensets at once */\n registerMany(configs: ScreensetDefinition[]): void;\n /** Get all registered screensets */\n getAll(): ScreensetDefinition[];\n /** Check if a screenset is registered */\n has(id: string): boolean;\n /** Unregister a screenset */\n unregister(id: string): boolean;\n /** Clear all screensets (useful for testing) */\n clear(): void;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBO,IAAK,eAAL,kBAAKA,kBAAL;AACL,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,UAAO;AACP,EAAAA,cAAA,aAAU;AACV,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,WAAQ;AACR,EAAAA,cAAA,aAAU;AAPA,SAAAA;AAAA,GAAA;AA8CL,IAAK,oBAAL,kBAAKC,uBAAL;AAEL,EAAAA,mBAAA,YAAS;AAET,EAAAA,mBAAA,aAAU;AAEV,EAAAA,mBAAA,gBAAa;AANH,SAAAA;AAAA,GAAA;","names":["LayoutDomain","ScreensetCategory"]}
|
package/dist/types.d.cts
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { ComponentType } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @hai3/screensets - Type Definitions
|
|
5
|
+
*
|
|
6
|
+
* Pure TypeScript contracts for HAI3 screenset management.
|
|
7
|
+
* This package has ZERO dependencies - pure types and contracts only.
|
|
8
|
+
*
|
|
9
|
+
* NOTE: Layout state shapes (HeaderState, MenuState, etc.) are in @hai3/framework
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Layout Domain Enum
|
|
14
|
+
* Defines all layout domains that can be orchestrated.
|
|
15
|
+
*/
|
|
16
|
+
declare enum LayoutDomain {
|
|
17
|
+
Header = "header",
|
|
18
|
+
Footer = "footer",
|
|
19
|
+
Menu = "menu",
|
|
20
|
+
Sidebar = "sidebar",
|
|
21
|
+
Screen = "screen",
|
|
22
|
+
Popup = "popup",
|
|
23
|
+
Overlay = "overlay"
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Branded type for Screenset IDs
|
|
27
|
+
* Provides compile-time safety for screenset identification.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const chatScreensetId = 'chat' as ScreensetId;
|
|
32
|
+
* const demoScreensetId = 'demo' as ScreensetId;
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
type ScreensetId = string & {
|
|
36
|
+
readonly __brand: 'ScreensetId';
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Branded type for Screen IDs
|
|
40
|
+
* Provides compile-time safety for screen identification.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const homeScreenId = 'home' as ScreenId;
|
|
45
|
+
* const profileScreenId = 'profile' as ScreenId;
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
type ScreenId = string & {
|
|
49
|
+
readonly __brand: 'ScreenId';
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Screenset Category Enum
|
|
53
|
+
* Defines the three-stage development workflow categories.
|
|
54
|
+
*/
|
|
55
|
+
declare enum ScreensetCategory {
|
|
56
|
+
/** AI-generated initial layouts */
|
|
57
|
+
Drafts = "drafts",
|
|
58
|
+
/** Designer-refined versions */
|
|
59
|
+
Mockups = "mockups",
|
|
60
|
+
/** Engineer-finalized, production-ready screens */
|
|
61
|
+
Production = "production"
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Menu Item Configuration
|
|
65
|
+
* Defines the structure of a menu item.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const menuItem: MenuItemConfig = {
|
|
70
|
+
* id: 'dashboard',
|
|
71
|
+
* label: 'screen.dashboard:title', // Translation key
|
|
72
|
+
* icon: 'dashboard:home', // Icon ID
|
|
73
|
+
* screenId: 'dashboard',
|
|
74
|
+
* };
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
interface MenuItemConfig {
|
|
78
|
+
/** Unique identifier for the menu item */
|
|
79
|
+
id: string;
|
|
80
|
+
/** Translation key for the label */
|
|
81
|
+
label: string;
|
|
82
|
+
/** Icon identifier (format: screensetId:iconName) */
|
|
83
|
+
icon?: string;
|
|
84
|
+
/** Screen ID to navigate to on click */
|
|
85
|
+
screenId?: string;
|
|
86
|
+
/** External URL (mutually exclusive with screenId) */
|
|
87
|
+
href?: string;
|
|
88
|
+
/** Click handler (for custom actions) */
|
|
89
|
+
onClick?: () => void;
|
|
90
|
+
/** Child menu items for nested menus */
|
|
91
|
+
children?: MenuItemConfig[];
|
|
92
|
+
/** Badge content (string or number) */
|
|
93
|
+
badge?: string | number;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Screen Loader Function Type
|
|
97
|
+
* Returns a Promise resolving to a module with a default React component.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* const loader: ScreenLoader = () => import('./screens/HomeScreen');
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
type ScreenLoader = () => Promise<{
|
|
105
|
+
default: ComponentType;
|
|
106
|
+
}>;
|
|
107
|
+
/**
|
|
108
|
+
* Screen Configuration
|
|
109
|
+
* Defines the structure of a screen.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* const screen: ScreenConfig = {
|
|
114
|
+
* id: 'home',
|
|
115
|
+
* loader: () => import('./screens/HomeScreen'),
|
|
116
|
+
* };
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
interface ScreenConfig {
|
|
120
|
+
/** Unique identifier for the screen */
|
|
121
|
+
id: string;
|
|
122
|
+
/** Lazy loader function for the screen component */
|
|
123
|
+
loader: ScreenLoader;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Menu Screen Item
|
|
127
|
+
* Combines menu item config with its screen loader.
|
|
128
|
+
*/
|
|
129
|
+
interface MenuScreenItem {
|
|
130
|
+
/** Menu item configuration */
|
|
131
|
+
menuItem: MenuItemConfig;
|
|
132
|
+
/** Screen loader function */
|
|
133
|
+
screen: ScreenLoader;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Screenset Definition
|
|
137
|
+
* Complete definition of a screenset including screens and menu.
|
|
138
|
+
*
|
|
139
|
+
* NOTE: Translations are NOT part of screenset definition.
|
|
140
|
+
* Screensets register translations directly with i18nRegistry via framework.
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```typescript
|
|
144
|
+
* const demoScreenset: ScreensetDefinition = {
|
|
145
|
+
* id: 'demo',
|
|
146
|
+
* name: 'Demo Screenset',
|
|
147
|
+
* category: ScreensetCategory.Drafts,
|
|
148
|
+
* defaultScreen: 'home',
|
|
149
|
+
* menu: [
|
|
150
|
+
* { menuItem: homeMenuItem, screen: () => import('./screens/HomeScreen') },
|
|
151
|
+
* ],
|
|
152
|
+
* };
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
interface ScreensetDefinition {
|
|
156
|
+
/** Unique identifier for the screenset */
|
|
157
|
+
id: string;
|
|
158
|
+
/** Display name for the screenset */
|
|
159
|
+
name: string;
|
|
160
|
+
/** Category (drafts, mockups, production) */
|
|
161
|
+
category: ScreensetCategory;
|
|
162
|
+
/** Default screen ID to show when screenset is selected */
|
|
163
|
+
defaultScreen: string;
|
|
164
|
+
/** Menu items with their associated screens */
|
|
165
|
+
menu: MenuScreenItem[];
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Screenset Registry Interface
|
|
169
|
+
* Pure storage interface for screenset registration.
|
|
170
|
+
* Implementation is a simple Map wrapper with no side effects.
|
|
171
|
+
*/
|
|
172
|
+
interface ScreensetRegistry {
|
|
173
|
+
/** Register a screenset */
|
|
174
|
+
register(screenset: ScreensetDefinition): void;
|
|
175
|
+
/** Get a screenset by ID */
|
|
176
|
+
get(id: string): ScreensetDefinition | undefined;
|
|
177
|
+
/** Register multiple screensets at once */
|
|
178
|
+
registerMany(configs: ScreensetDefinition[]): void;
|
|
179
|
+
/** Get all registered screensets */
|
|
180
|
+
getAll(): ScreensetDefinition[];
|
|
181
|
+
/** Check if a screenset is registered */
|
|
182
|
+
has(id: string): boolean;
|
|
183
|
+
/** Unregister a screenset */
|
|
184
|
+
unregister(id: string): boolean;
|
|
185
|
+
/** Clear all screensets (useful for testing) */
|
|
186
|
+
clear(): void;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export { LayoutDomain, type MenuItemConfig, type MenuScreenItem, type ScreenConfig, type ScreenId, type ScreenLoader, ScreensetCategory, type ScreensetDefinition, type ScreensetId, type ScreensetRegistry };
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { ComponentType } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @hai3/screensets - Type Definitions
|
|
5
|
+
*
|
|
6
|
+
* Pure TypeScript contracts for HAI3 screenset management.
|
|
7
|
+
* This package has ZERO dependencies - pure types and contracts only.
|
|
8
|
+
*
|
|
9
|
+
* NOTE: Layout state shapes (HeaderState, MenuState, etc.) are in @hai3/framework
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Layout Domain Enum
|
|
14
|
+
* Defines all layout domains that can be orchestrated.
|
|
15
|
+
*/
|
|
16
|
+
declare enum LayoutDomain {
|
|
17
|
+
Header = "header",
|
|
18
|
+
Footer = "footer",
|
|
19
|
+
Menu = "menu",
|
|
20
|
+
Sidebar = "sidebar",
|
|
21
|
+
Screen = "screen",
|
|
22
|
+
Popup = "popup",
|
|
23
|
+
Overlay = "overlay"
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Branded type for Screenset IDs
|
|
27
|
+
* Provides compile-time safety for screenset identification.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const chatScreensetId = 'chat' as ScreensetId;
|
|
32
|
+
* const demoScreensetId = 'demo' as ScreensetId;
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
type ScreensetId = string & {
|
|
36
|
+
readonly __brand: 'ScreensetId';
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Branded type for Screen IDs
|
|
40
|
+
* Provides compile-time safety for screen identification.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const homeScreenId = 'home' as ScreenId;
|
|
45
|
+
* const profileScreenId = 'profile' as ScreenId;
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
type ScreenId = string & {
|
|
49
|
+
readonly __brand: 'ScreenId';
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Screenset Category Enum
|
|
53
|
+
* Defines the three-stage development workflow categories.
|
|
54
|
+
*/
|
|
55
|
+
declare enum ScreensetCategory {
|
|
56
|
+
/** AI-generated initial layouts */
|
|
57
|
+
Drafts = "drafts",
|
|
58
|
+
/** Designer-refined versions */
|
|
59
|
+
Mockups = "mockups",
|
|
60
|
+
/** Engineer-finalized, production-ready screens */
|
|
61
|
+
Production = "production"
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Menu Item Configuration
|
|
65
|
+
* Defines the structure of a menu item.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const menuItem: MenuItemConfig = {
|
|
70
|
+
* id: 'dashboard',
|
|
71
|
+
* label: 'screen.dashboard:title', // Translation key
|
|
72
|
+
* icon: 'dashboard:home', // Icon ID
|
|
73
|
+
* screenId: 'dashboard',
|
|
74
|
+
* };
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
interface MenuItemConfig {
|
|
78
|
+
/** Unique identifier for the menu item */
|
|
79
|
+
id: string;
|
|
80
|
+
/** Translation key for the label */
|
|
81
|
+
label: string;
|
|
82
|
+
/** Icon identifier (format: screensetId:iconName) */
|
|
83
|
+
icon?: string;
|
|
84
|
+
/** Screen ID to navigate to on click */
|
|
85
|
+
screenId?: string;
|
|
86
|
+
/** External URL (mutually exclusive with screenId) */
|
|
87
|
+
href?: string;
|
|
88
|
+
/** Click handler (for custom actions) */
|
|
89
|
+
onClick?: () => void;
|
|
90
|
+
/** Child menu items for nested menus */
|
|
91
|
+
children?: MenuItemConfig[];
|
|
92
|
+
/** Badge content (string or number) */
|
|
93
|
+
badge?: string | number;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Screen Loader Function Type
|
|
97
|
+
* Returns a Promise resolving to a module with a default React component.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* const loader: ScreenLoader = () => import('./screens/HomeScreen');
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
type ScreenLoader = () => Promise<{
|
|
105
|
+
default: ComponentType;
|
|
106
|
+
}>;
|
|
107
|
+
/**
|
|
108
|
+
* Screen Configuration
|
|
109
|
+
* Defines the structure of a screen.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* const screen: ScreenConfig = {
|
|
114
|
+
* id: 'home',
|
|
115
|
+
* loader: () => import('./screens/HomeScreen'),
|
|
116
|
+
* };
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
interface ScreenConfig {
|
|
120
|
+
/** Unique identifier for the screen */
|
|
121
|
+
id: string;
|
|
122
|
+
/** Lazy loader function for the screen component */
|
|
123
|
+
loader: ScreenLoader;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Menu Screen Item
|
|
127
|
+
* Combines menu item config with its screen loader.
|
|
128
|
+
*/
|
|
129
|
+
interface MenuScreenItem {
|
|
130
|
+
/** Menu item configuration */
|
|
131
|
+
menuItem: MenuItemConfig;
|
|
132
|
+
/** Screen loader function */
|
|
133
|
+
screen: ScreenLoader;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Screenset Definition
|
|
137
|
+
* Complete definition of a screenset including screens and menu.
|
|
138
|
+
*
|
|
139
|
+
* NOTE: Translations are NOT part of screenset definition.
|
|
140
|
+
* Screensets register translations directly with i18nRegistry via framework.
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```typescript
|
|
144
|
+
* const demoScreenset: ScreensetDefinition = {
|
|
145
|
+
* id: 'demo',
|
|
146
|
+
* name: 'Demo Screenset',
|
|
147
|
+
* category: ScreensetCategory.Drafts,
|
|
148
|
+
* defaultScreen: 'home',
|
|
149
|
+
* menu: [
|
|
150
|
+
* { menuItem: homeMenuItem, screen: () => import('./screens/HomeScreen') },
|
|
151
|
+
* ],
|
|
152
|
+
* };
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
interface ScreensetDefinition {
|
|
156
|
+
/** Unique identifier for the screenset */
|
|
157
|
+
id: string;
|
|
158
|
+
/** Display name for the screenset */
|
|
159
|
+
name: string;
|
|
160
|
+
/** Category (drafts, mockups, production) */
|
|
161
|
+
category: ScreensetCategory;
|
|
162
|
+
/** Default screen ID to show when screenset is selected */
|
|
163
|
+
defaultScreen: string;
|
|
164
|
+
/** Menu items with their associated screens */
|
|
165
|
+
menu: MenuScreenItem[];
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Screenset Registry Interface
|
|
169
|
+
* Pure storage interface for screenset registration.
|
|
170
|
+
* Implementation is a simple Map wrapper with no side effects.
|
|
171
|
+
*/
|
|
172
|
+
interface ScreensetRegistry {
|
|
173
|
+
/** Register a screenset */
|
|
174
|
+
register(screenset: ScreensetDefinition): void;
|
|
175
|
+
/** Get a screenset by ID */
|
|
176
|
+
get(id: string): ScreensetDefinition | undefined;
|
|
177
|
+
/** Register multiple screensets at once */
|
|
178
|
+
registerMany(configs: ScreensetDefinition[]): void;
|
|
179
|
+
/** Get all registered screensets */
|
|
180
|
+
getAll(): ScreensetDefinition[];
|
|
181
|
+
/** Check if a screenset is registered */
|
|
182
|
+
has(id: string): boolean;
|
|
183
|
+
/** Unregister a screenset */
|
|
184
|
+
unregister(id: string): boolean;
|
|
185
|
+
/** Clear all screensets (useful for testing) */
|
|
186
|
+
clear(): void;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export { LayoutDomain, type MenuItemConfig, type MenuScreenItem, type ScreenConfig, type ScreenId, type ScreenLoader, ScreensetCategory, type ScreensetDefinition, type ScreensetId, type ScreensetRegistry };
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// src/types.ts
|
|
2
|
+
var LayoutDomain = /* @__PURE__ */ ((LayoutDomain2) => {
|
|
3
|
+
LayoutDomain2["Header"] = "header";
|
|
4
|
+
LayoutDomain2["Footer"] = "footer";
|
|
5
|
+
LayoutDomain2["Menu"] = "menu";
|
|
6
|
+
LayoutDomain2["Sidebar"] = "sidebar";
|
|
7
|
+
LayoutDomain2["Screen"] = "screen";
|
|
8
|
+
LayoutDomain2["Popup"] = "popup";
|
|
9
|
+
LayoutDomain2["Overlay"] = "overlay";
|
|
10
|
+
return LayoutDomain2;
|
|
11
|
+
})(LayoutDomain || {});
|
|
12
|
+
var ScreensetCategory = /* @__PURE__ */ ((ScreensetCategory2) => {
|
|
13
|
+
ScreensetCategory2["Drafts"] = "drafts";
|
|
14
|
+
ScreensetCategory2["Mockups"] = "mockups";
|
|
15
|
+
ScreensetCategory2["Production"] = "production";
|
|
16
|
+
return ScreensetCategory2;
|
|
17
|
+
})(ScreensetCategory || {});
|
|
18
|
+
export {
|
|
19
|
+
LayoutDomain,
|
|
20
|
+
ScreensetCategory
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["/**\n * @hai3/screensets - Type Definitions\n *\n * Pure TypeScript contracts for HAI3 screenset management.\n * This package has ZERO dependencies - pure types and contracts only.\n *\n * NOTE: Layout state shapes (HeaderState, MenuState, etc.) are in @hai3/framework\n */\n\nimport type { ComponentType } from 'react';\n\n// ============================================================================\n// Layout Domain Enum\n// ============================================================================\n\n/**\n * Layout Domain Enum\n * Defines all layout domains that can be orchestrated.\n */\nexport enum LayoutDomain {\n Header = 'header',\n Footer = 'footer',\n Menu = 'menu',\n Sidebar = 'sidebar',\n Screen = 'screen',\n Popup = 'popup',\n Overlay = 'overlay',\n}\n\n// ============================================================================\n// Branded Types for Type Safety\n// ============================================================================\n\n/**\n * Branded type for Screenset IDs\n * Provides compile-time safety for screenset identification.\n *\n * @example\n * ```typescript\n * const chatScreensetId = 'chat' as ScreensetId;\n * const demoScreensetId = 'demo' as ScreensetId;\n * ```\n */\nexport type ScreensetId = string & { readonly __brand: 'ScreensetId' };\n\n/**\n * Branded type for Screen IDs\n * Provides compile-time safety for screen identification.\n *\n * @example\n * ```typescript\n * const homeScreenId = 'home' as ScreenId;\n * const profileScreenId = 'profile' as ScreenId;\n * ```\n */\nexport type ScreenId = string & { readonly __brand: 'ScreenId' };\n\n// ============================================================================\n// Screenset Category\n// ============================================================================\n\n/**\n * Screenset Category Enum\n * Defines the three-stage development workflow categories.\n */\nexport enum ScreensetCategory {\n /** AI-generated initial layouts */\n Drafts = 'drafts',\n /** Designer-refined versions */\n Mockups = 'mockups',\n /** Engineer-finalized, production-ready screens */\n Production = 'production',\n}\n\n// ============================================================================\n// Menu Item Configuration\n// ============================================================================\n\n/**\n * Menu Item Configuration\n * Defines the structure of a menu item.\n *\n * @example\n * ```typescript\n * const menuItem: MenuItemConfig = {\n * id: 'dashboard',\n * label: 'screen.dashboard:title', // Translation key\n * icon: 'dashboard:home', // Icon ID\n * screenId: 'dashboard',\n * };\n * ```\n */\nexport interface MenuItemConfig {\n /** Unique identifier for the menu item */\n id: string;\n /** Translation key for the label */\n label: string;\n /** Icon identifier (format: screensetId:iconName) */\n icon?: string;\n /** Screen ID to navigate to on click */\n screenId?: string;\n /** External URL (mutually exclusive with screenId) */\n href?: string;\n /** Click handler (for custom actions) */\n onClick?: () => void;\n /** Child menu items for nested menus */\n children?: MenuItemConfig[];\n /** Badge content (string or number) */\n badge?: string | number;\n}\n\n// ============================================================================\n// Screen Configuration\n// ============================================================================\n\n/**\n * Screen Loader Function Type\n * Returns a Promise resolving to a module with a default React component.\n *\n * @example\n * ```typescript\n * const loader: ScreenLoader = () => import('./screens/HomeScreen');\n * ```\n */\nexport type ScreenLoader = () => Promise<{ default: ComponentType }>;\n\n/**\n * Screen Configuration\n * Defines the structure of a screen.\n *\n * @example\n * ```typescript\n * const screen: ScreenConfig = {\n * id: 'home',\n * loader: () => import('./screens/HomeScreen'),\n * };\n * ```\n */\nexport interface ScreenConfig {\n /** Unique identifier for the screen */\n id: string;\n /** Lazy loader function for the screen component */\n loader: ScreenLoader;\n}\n\n// ============================================================================\n// Screenset Definition\n// ============================================================================\n\n/**\n * Menu Screen Item\n * Combines menu item config with its screen loader.\n */\nexport interface MenuScreenItem {\n /** Menu item configuration */\n menuItem: MenuItemConfig;\n /** Screen loader function */\n screen: ScreenLoader;\n}\n\n/**\n * Screenset Definition\n * Complete definition of a screenset including screens and menu.\n *\n * NOTE: Translations are NOT part of screenset definition.\n * Screensets register translations directly with i18nRegistry via framework.\n *\n * @example\n * ```typescript\n * const demoScreenset: ScreensetDefinition = {\n * id: 'demo',\n * name: 'Demo Screenset',\n * category: ScreensetCategory.Drafts,\n * defaultScreen: 'home',\n * menu: [\n * { menuItem: homeMenuItem, screen: () => import('./screens/HomeScreen') },\n * ],\n * };\n * ```\n */\nexport interface ScreensetDefinition {\n /** Unique identifier for the screenset */\n id: string;\n /** Display name for the screenset */\n name: string;\n /** Category (drafts, mockups, production) */\n category: ScreensetCategory;\n /** Default screen ID to show when screenset is selected */\n defaultScreen: string;\n /** Menu items with their associated screens */\n menu: MenuScreenItem[];\n}\n\n// ============================================================================\n// Screenset Registry Interface\n// ============================================================================\n\n/**\n * Screenset Registry Interface\n * Pure storage interface for screenset registration.\n * Implementation is a simple Map wrapper with no side effects.\n */\nexport interface ScreensetRegistry {\n /** Register a screenset */\n register(screenset: ScreensetDefinition): void;\n /** Get a screenset by ID */\n get(id: string): ScreensetDefinition | undefined;\n /** Register multiple screensets at once */\n registerMany(configs: ScreensetDefinition[]): void;\n /** Get all registered screensets */\n getAll(): ScreensetDefinition[];\n /** Check if a screenset is registered */\n has(id: string): boolean;\n /** Unregister a screenset */\n unregister(id: string): boolean;\n /** Clear all screensets (useful for testing) */\n clear(): void;\n}\n"],"mappings":";AAmBO,IAAK,eAAL,kBAAKA,kBAAL;AACL,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,UAAO;AACP,EAAAA,cAAA,aAAU;AACV,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,WAAQ;AACR,EAAAA,cAAA,aAAU;AAPA,SAAAA;AAAA,GAAA;AA8CL,IAAK,oBAAL,kBAAKC,uBAAL;AAEL,EAAAA,mBAAA,YAAS;AAET,EAAAA,mBAAA,aAAU;AAEV,EAAAA,mBAAA,gBAAa;AANH,SAAAA;AAAA,GAAA;","names":["LayoutDomain","ScreensetCategory"]}
|
package/llms.txt
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# @hai3/layout
|
|
2
|
+
|
|
3
|
+
> Layout domain slices, selectors, and types for HAI3 SDK. Manages header, footer, menu, sidebar, screen, popup, overlay state.
|
|
4
|
+
|
|
5
|
+
Part of the HAI3 SDK Layer (L1) - can be used independently without other @hai3 packages. Peer dependency on @reduxjs/toolkit.
|
|
6
|
+
|
|
7
|
+
## Core API
|
|
8
|
+
|
|
9
|
+
- [Layout Slices](https://hai3.dev/docs/layout/slices): headerSlice, footerSlice, menuSlice, sidebarSlice, screenSlice, popupSlice, overlaySlice
|
|
10
|
+
- [Layout Selectors](https://hai3.dev/docs/layout/selectors): selectHeader, selectMenu, selectActiveScreen, etc.
|
|
11
|
+
- [Layout Types](https://hai3.dev/docs/layout/types): LayoutState, ScreensetDefinition, MenuItemConfig
|
|
12
|
+
|
|
13
|
+
## Key Patterns
|
|
14
|
+
|
|
15
|
+
- Each domain has its own slice (header, footer, menu, sidebar, screen, popup, overlay)
|
|
16
|
+
- Selectors for accessing layout state
|
|
17
|
+
- Screenset definitions with menu items and screens
|
|
18
|
+
- Category-based organization (drafts, mockups, production)
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import {
|
|
24
|
+
selectActiveScreen,
|
|
25
|
+
selectMenuCollapsed,
|
|
26
|
+
ScreensetDefinition,
|
|
27
|
+
ScreensetCategory
|
|
28
|
+
} from '@hai3/layout';
|
|
29
|
+
|
|
30
|
+
// Define screenset
|
|
31
|
+
const myScreenset: ScreensetDefinition = {
|
|
32
|
+
id: 'myScreenset',
|
|
33
|
+
name: 'My Screenset',
|
|
34
|
+
category: ScreensetCategory.Drafts,
|
|
35
|
+
defaultScreen: 'home',
|
|
36
|
+
menu: [
|
|
37
|
+
{
|
|
38
|
+
menuItem: { id: 'home', label: 'Home', icon: 'home' },
|
|
39
|
+
screen: () => import('./screens/Home')
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// Use selectors
|
|
45
|
+
const activeScreen = selectActiveScreen(state);
|
|
46
|
+
const isCollapsed = selectMenuCollapsed(state);
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Optional
|
|
50
|
+
|
|
51
|
+
- [Migration Guide](https://hai3.dev/docs/layout/migration): Migrating from @hai3/uicore
|
|
52
|
+
- [Custom Layouts](https://hai3.dev/docs/layout/custom): Building custom layout components
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hai3/screensets",
|
|
3
|
+
"version": "0.2.0-alpha.0",
|
|
4
|
+
"description": "Pure TypeScript contracts and registry for HAI3 screenset management",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./types": {
|
|
16
|
+
"types": "./dist/types.d.ts",
|
|
17
|
+
"import": "./dist/types.js",
|
|
18
|
+
"require": "./dist/types.cjs"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"CLAUDE.md",
|
|
24
|
+
"llms.txt"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsup",
|
|
28
|
+
"type-check": "tsc --noEmit"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"tsup": "^8.0.0",
|
|
33
|
+
"typescript": "^5.4.2"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"hai3",
|
|
38
|
+
"screensets",
|
|
39
|
+
"contracts",
|
|
40
|
+
"typescript",
|
|
41
|
+
"vertical-slices"
|
|
42
|
+
],
|
|
43
|
+
"author": "HAI3",
|
|
44
|
+
"license": "Apache-2.0"
|
|
45
|
+
}
|