@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 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"]}
@@ -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 };
@@ -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"]}
@@ -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 };
@@ -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
+ }