@molecule/app-solid 1.0.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.
Files changed (107) hide show
  1. package/LICENSE +115 -0
  2. package/README.md +2543 -0
  3. package/dist/context.d.ts +82 -0
  4. package/dist/context.d.ts.map +1 -0
  5. package/dist/context.js +141 -0
  6. package/dist/context.js.map +1 -0
  7. package/dist/index.d.ts +61 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +61 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/primitives/async-state.d.ts +46 -0
  12. package/dist/primitives/async-state.d.ts.map +1 -0
  13. package/dist/primitives/async-state.js +83 -0
  14. package/dist/primitives/async-state.js.map +1 -0
  15. package/dist/primitives/auth.d.ts +85 -0
  16. package/dist/primitives/auth.d.ts.map +1 -0
  17. package/dist/primitives/auth.js +147 -0
  18. package/dist/primitives/auth.js.map +1 -0
  19. package/dist/primitives/capacitor-app.d.ts +46 -0
  20. package/dist/primitives/capacitor-app.d.ts.map +1 -0
  21. package/dist/primitives/capacitor-app.js +57 -0
  22. package/dist/primitives/capacitor-app.js.map +1 -0
  23. package/dist/primitives/change-password.d.ts +36 -0
  24. package/dist/primitives/change-password.d.ts.map +1 -0
  25. package/dist/primitives/change-password.js +32 -0
  26. package/dist/primitives/change-password.js.map +1 -0
  27. package/dist/primitives/device.d.ts +48 -0
  28. package/dist/primitives/device.d.ts.map +1 -0
  29. package/dist/primitives/device.js +47 -0
  30. package/dist/primitives/device.js.map +1 -0
  31. package/dist/primitives/forms.d.ts +193 -0
  32. package/dist/primitives/forms.d.ts.map +1 -0
  33. package/dist/primitives/forms.js +309 -0
  34. package/dist/primitives/forms.js.map +1 -0
  35. package/dist/primitives/http.d.ts +176 -0
  36. package/dist/primitives/http.d.ts.map +1 -0
  37. package/dist/primitives/http.js +254 -0
  38. package/dist/primitives/http.js.map +1 -0
  39. package/dist/primitives/i18n.d.ts +146 -0
  40. package/dist/primitives/i18n.d.ts.map +1 -0
  41. package/dist/primitives/i18n.js +223 -0
  42. package/dist/primitives/i18n.js.map +1 -0
  43. package/dist/primitives/index.d.ts +27 -0
  44. package/dist/primitives/index.d.ts.map +1 -0
  45. package/dist/primitives/index.js +27 -0
  46. package/dist/primitives/index.js.map +1 -0
  47. package/dist/primitives/logger.d.ts +143 -0
  48. package/dist/primitives/logger.d.ts.map +1 -0
  49. package/dist/primitives/logger.js +165 -0
  50. package/dist/primitives/logger.js.map +1 -0
  51. package/dist/primitives/login.d.ts +37 -0
  52. package/dist/primitives/login.d.ts.map +1 -0
  53. package/dist/primitives/login.js +32 -0
  54. package/dist/primitives/login.js.map +1 -0
  55. package/dist/primitives/oauth.d.ts +102 -0
  56. package/dist/primitives/oauth.d.ts.map +1 -0
  57. package/dist/primitives/oauth.js +232 -0
  58. package/dist/primitives/oauth.js.map +1 -0
  59. package/dist/primitives/password-reset.d.ts +46 -0
  60. package/dist/primitives/password-reset.d.ts.map +1 -0
  61. package/dist/primitives/password-reset.js +49 -0
  62. package/dist/primitives/password-reset.js.map +1 -0
  63. package/dist/primitives/platform.d.ts +48 -0
  64. package/dist/primitives/platform.d.ts.map +1 -0
  65. package/dist/primitives/platform.js +47 -0
  66. package/dist/primitives/platform.js.map +1 -0
  67. package/dist/primitives/promise.d.ts +46 -0
  68. package/dist/primitives/promise.d.ts.map +1 -0
  69. package/dist/primitives/promise.js +104 -0
  70. package/dist/primitives/promise.js.map +1 -0
  71. package/dist/primitives/push.d.ts +52 -0
  72. package/dist/primitives/push.d.ts.map +1 -0
  73. package/dist/primitives/push.js +72 -0
  74. package/dist/primitives/push.js.map +1 -0
  75. package/dist/primitives/router.d.ts +170 -0
  76. package/dist/primitives/router.d.ts.map +1 -0
  77. package/dist/primitives/router.js +251 -0
  78. package/dist/primitives/router.js.map +1 -0
  79. package/dist/primitives/signup.d.ts +37 -0
  80. package/dist/primitives/signup.d.ts.map +1 -0
  81. package/dist/primitives/signup.js +32 -0
  82. package/dist/primitives/signup.js.map +1 -0
  83. package/dist/primitives/state.d.ts +132 -0
  84. package/dist/primitives/state.d.ts.map +1 -0
  85. package/dist/primitives/state.js +167 -0
  86. package/dist/primitives/state.js.map +1 -0
  87. package/dist/primitives/storage.d.ts +132 -0
  88. package/dist/primitives/storage.d.ts.map +1 -0
  89. package/dist/primitives/storage.js +275 -0
  90. package/dist/primitives/storage.js.map +1 -0
  91. package/dist/primitives/theme.d.ts +106 -0
  92. package/dist/primitives/theme.d.ts.map +1 -0
  93. package/dist/primitives/theme.js +187 -0
  94. package/dist/primitives/theme.js.map +1 -0
  95. package/dist/primitives/version.d.ts +50 -0
  96. package/dist/primitives/version.d.ts.map +1 -0
  97. package/dist/primitives/version.js +62 -0
  98. package/dist/primitives/version.js.map +1 -0
  99. package/dist/provider.d.ts +36 -0
  100. package/dist/provider.d.ts.map +1 -0
  101. package/dist/provider.jsx +71 -0
  102. package/dist/provider.jsx.map +1 -0
  103. package/dist/types.d.ts +82 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +7 -0
  106. package/dist/types.js.map +1 -0
  107. package/package.json +58 -0
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Solid.js primitives for authentication.
3
+ *
4
+ * @module
5
+ */
6
+ import { createEffect, createSignal, onCleanup } from 'solid-js';
7
+ import { getAuthClient } from '../context.js';
8
+ /**
9
+ * Create auth primitives for authentication state and actions.
10
+ *
11
+ * @returns Auth primitives object
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * import { createAuth } from '@molecule/app-solid'
16
+ *
17
+ * function LoginButton() {
18
+ * const { isAuthenticated, user, login, logout } = createAuth()
19
+ *
20
+ * return (
21
+ * <Show
22
+ * when={isAuthenticated()}
23
+ * fallback={
24
+ * <button onClick={() => login({ email: '...', password: '...' })}>
25
+ * Login
26
+ * </button>
27
+ * }
28
+ * >
29
+ * <div>
30
+ * <span>Welcome, {user()?.name}</span>
31
+ * <button onClick={() => logout()}>Logout</button>
32
+ * </div>
33
+ * </Show>
34
+ * )
35
+ * }
36
+ * ```
37
+ */
38
+ export function createAuth() {
39
+ const client = getAuthClient();
40
+ const [state, setState] = createSignal(client.getState());
41
+ // Subscribe to auth changes
42
+ createEffect(() => {
43
+ const unsubscribe = client.onAuthChange((newState) => {
44
+ setState(newState);
45
+ });
46
+ onCleanup(unsubscribe);
47
+ });
48
+ // Initialize auth state
49
+ createEffect(() => {
50
+ client.refresh().catch(() => {
51
+ setState((prev) => ({ ...prev, loading: false }));
52
+ });
53
+ });
54
+ const user = () => state().user;
55
+ const isAuthenticated = () => state().authenticated;
56
+ const isLoading = () => state().loading;
57
+ return {
58
+ state,
59
+ user,
60
+ isAuthenticated,
61
+ isLoading,
62
+ login: client.login.bind(client),
63
+ logout: client.logout.bind(client),
64
+ register: client.register.bind(client),
65
+ refresh: client.refresh.bind(client),
66
+ };
67
+ }
68
+ /**
69
+ * Create a guard primitive that redirects unauthenticated users.
70
+ *
71
+ * @param redirectTo - Path to redirect to
72
+ * @returns Accessor indicating if user is allowed
73
+ *
74
+ * @example
75
+ * ```tsx
76
+ * function ProtectedPage() {
77
+ * const isAllowed = createAuthGuard('/login')
78
+ *
79
+ * return (
80
+ * <Show when={isAllowed()} fallback={<div>Redirecting...</div>}>
81
+ * <ProtectedContent />
82
+ * </Show>
83
+ * )
84
+ * }
85
+ * ```
86
+ */
87
+ export function createAuthGuard(redirectTo) {
88
+ const { isAuthenticated, isLoading } = createAuth();
89
+ createEffect(() => {
90
+ if (!isLoading() && !isAuthenticated()) {
91
+ window.location.href = redirectTo;
92
+ }
93
+ });
94
+ return () => isAuthenticated();
95
+ }
96
+ /**
97
+ * Create auth helpers from context.
98
+ *
99
+ * @returns Auth helper functions
100
+ */
101
+ /**
102
+ * Creates a auth helpers.
103
+ * @returns The created result.
104
+ */
105
+ export function createAuthHelpers() {
106
+ const client = getAuthClient();
107
+ return {
108
+ login: (credentials) => client.login(credentials),
109
+ logout: () => client.logout(),
110
+ register: (data) => client.register(data),
111
+ refresh: () => client.refresh(),
112
+ getUser: () => client.getUser(),
113
+ getToken: () => client.getToken?.() ?? null,
114
+ isAuthenticated: () => client.isAuthenticated(),
115
+ };
116
+ }
117
+ /**
118
+ * Create auth primitives from a specific client.
119
+ *
120
+ * @param client - Auth client
121
+ * @returns Auth primitives
122
+ */
123
+ export function createAuthFromClient(client) {
124
+ const [state, setState] = createSignal(client.getState());
125
+ createEffect(() => {
126
+ const unsubscribe = client.onAuthChange((newState) => {
127
+ setState(newState);
128
+ });
129
+ onCleanup(unsubscribe);
130
+ });
131
+ createEffect(() => {
132
+ client.refresh().catch(() => {
133
+ setState((prev) => ({ ...prev, loading: false }));
134
+ });
135
+ });
136
+ return {
137
+ state,
138
+ user: () => state().user,
139
+ isAuthenticated: () => state().authenticated,
140
+ isLoading: () => state().loading,
141
+ login: client.login.bind(client),
142
+ logout: client.logout.bind(client),
143
+ register: client.register.bind(client),
144
+ refresh: client.refresh.bind(client),
145
+ };
146
+ }
147
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/primitives/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Solid.js primitives for Capacitor app initialization.
3
+ *
4
+ * @module
5
+ */
6
+ import { type Accessor } from 'solid-js';
7
+ import type { CapacitorAppOptions, CapacitorAppState } from '@molecule/app-platform';
8
+ /**
9
+ * Capacitor app primitives return type.
10
+ */
11
+ export interface CapacitorAppPrimitives {
12
+ state: Accessor<CapacitorAppState>;
13
+ ready: Accessor<boolean>;
14
+ initialize: () => Promise<void>;
15
+ }
16
+ /**
17
+ * Create Capacitor app primitives for native app initialization.
18
+ *
19
+ * Wraps the core `createCapacitorApp` coordinator with Solid signals,
20
+ * automatically initializing and cleaning up on disposal.
21
+ *
22
+ * @param options - Capacitor app configuration options.
23
+ * @returns Capacitor app primitives object
24
+ *
25
+ * @example
26
+ * ```tsx
27
+ * import { createCapacitorApp } from '@molecule/app-solid'
28
+ *
29
+ * function App() {
30
+ * const { state, ready } = createCapacitorApp({
31
+ * pushNotifications: true,
32
+ * deepLinks: true,
33
+ * onDeepLink: (url) => console.log('Deep link:', url),
34
+ * onReady: () => console.log('App ready!'),
35
+ * })
36
+ *
37
+ * return (
38
+ * <Show when={ready()} fallback={<p>Loading...</p>}>
39
+ * <Main />
40
+ * </Show>
41
+ * )
42
+ * }
43
+ * ```
44
+ */
45
+ export declare function createCapacitorApp(options?: CapacitorAppOptions): CapacitorAppPrimitives;
46
+ //# sourceMappingURL=capacitor-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capacitor-app.d.ts","sourceRoot":"","sources":["../../src/primitives/capacitor-app.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAA2B,MAAM,UAAU,CAAA;AAEjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAGpF;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAA;IAClC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IACxB,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,sBAAsB,CAwBxF"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Solid.js primitives for Capacitor app initialization.
3
+ *
4
+ * @module
5
+ */
6
+ import { createSignal, onCleanup } from 'solid-js';
7
+ import { createCapacitorApp as createCapacitorAppCore } from '@molecule/app-platform';
8
+ /**
9
+ * Create Capacitor app primitives for native app initialization.
10
+ *
11
+ * Wraps the core `createCapacitorApp` coordinator with Solid signals,
12
+ * automatically initializing and cleaning up on disposal.
13
+ *
14
+ * @param options - Capacitor app configuration options.
15
+ * @returns Capacitor app primitives object
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * import { createCapacitorApp } from '@molecule/app-solid'
20
+ *
21
+ * function App() {
22
+ * const { state, ready } = createCapacitorApp({
23
+ * pushNotifications: true,
24
+ * deepLinks: true,
25
+ * onDeepLink: (url) => console.log('Deep link:', url),
26
+ * onReady: () => console.log('App ready!'),
27
+ * })
28
+ *
29
+ * return (
30
+ * <Show when={ready()} fallback={<p>Loading...</p>}>
31
+ * <Main />
32
+ * </Show>
33
+ * )
34
+ * }
35
+ * ```
36
+ */
37
+ export function createCapacitorApp(options) {
38
+ const app = createCapacitorAppCore(options);
39
+ const [state, setState] = createSignal(app.getState());
40
+ const unsubscribe = app.subscribe((newState) => {
41
+ setState(newState);
42
+ });
43
+ // Auto-initialize
44
+ app.initialize().catch(() => {
45
+ // Error is captured in state.error via the core coordinator
46
+ });
47
+ onCleanup(() => {
48
+ unsubscribe();
49
+ app.destroy();
50
+ });
51
+ return {
52
+ state,
53
+ ready: () => state().ready,
54
+ initialize: () => app.initialize(),
55
+ };
56
+ }
57
+ //# sourceMappingURL=capacitor-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capacitor-app.js","sourceRoot":"","sources":["../../src/primitives/capacitor-app.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGjE,OAAO,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAWrF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA6B;IAC9D,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAA;IAE3C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAoB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEzE,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC7C,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;IAEF,kBAAkB;IAClB,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QAC1B,4DAA4D;IAC9D,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,EAAE,CAAA;QACb,GAAG,CAAC,OAAO,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,KAAK;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK;QAC1B,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE;KACnC,CAAA;AACH,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Solid.js primitive for changing password with async state tracking.
3
+ *
4
+ * @module
5
+ */
6
+ import type { Accessor } from 'solid-js';
7
+ import type { PromiseState } from '@molecule/app-utilities';
8
+ /**
9
+ * Return type for createChangePassword primitive.
10
+ */
11
+ export interface CreateChangePasswordReturn {
12
+ state: Accessor<PromiseState<void>>;
13
+ changePassword: (oldPassword: string, newPassword: string) => Promise<void>;
14
+ reset: () => void;
15
+ }
16
+ /**
17
+ * Creates a change password primitive with async state tracking.
18
+ *
19
+ * @returns Change password state and action
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * const { state, changePassword } = createChangePassword()
24
+ *
25
+ * return (
26
+ * <button
27
+ * onClick={() => changePassword(oldPassword(), newPassword())}
28
+ * disabled={state().status === 'pending'}
29
+ * >
30
+ * {state().status === 'pending' ? 'Changing...' : 'Change Password'}
31
+ * </button>
32
+ * )
33
+ * ```
34
+ */
35
+ export declare function createChangePassword(): CreateChangePasswordReturn;
36
+ //# sourceMappingURL=change-password.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-password.d.ts","sourceRoot":"","sources":["../../src/primitives/change-password.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAK3D;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;IACnC,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3E,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,oBAAoB,IAAI,0BAA0B,CAOjE"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Solid.js primitive for changing password with async state tracking.
3
+ *
4
+ * @module
5
+ */
6
+ import { getAuthClient } from '../context.js';
7
+ import { createPromise } from './promise.js';
8
+ /**
9
+ * Creates a change password primitive with async state tracking.
10
+ *
11
+ * @returns Change password state and action
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * const { state, changePassword } = createChangePassword()
16
+ *
17
+ * return (
18
+ * <button
19
+ * onClick={() => changePassword(oldPassword(), newPassword())}
20
+ * disabled={state().status === 'pending'}
21
+ * >
22
+ * {state().status === 'pending' ? 'Changing...' : 'Change Password'}
23
+ * </button>
24
+ * )
25
+ * ```
26
+ */
27
+ export function createChangePassword() {
28
+ const client = getAuthClient();
29
+ const { state, call, reset } = createPromise((oldPassword, newPassword) => client.changePassword(oldPassword, newPassword));
30
+ return { state, changePassword: call, reset };
31
+ }
32
+ //# sourceMappingURL=change-password.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-password.js","sourceRoot":"","sources":["../../src/primitives/change-password.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAW5C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,CAAC,WAAmB,EAAE,WAAmB,EAAE,EAAE,CACxF,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAChD,CAAA;IAED,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AAC/C,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Solid.js primitives for device information.
3
+ *
4
+ * @module
5
+ */
6
+ import type { DeviceInfo, FeatureSupport, HardwareInfo, ScreenInfo } from '@molecule/app-device';
7
+ /**
8
+ * Device primitives return type.
9
+ */
10
+ export interface DevicePrimitives {
11
+ deviceInfo: DeviceInfo;
12
+ screenInfo: ScreenInfo;
13
+ hardwareInfo: HardwareInfo;
14
+ featureSupport: FeatureSupport;
15
+ supports: (feature: keyof FeatureSupport) => boolean;
16
+ isOnline: () => boolean;
17
+ isStandalone: () => boolean;
18
+ language: string;
19
+ languages: string[];
20
+ }
21
+ /**
22
+ * Create device primitives for accessing device information.
23
+ *
24
+ * This is a static primitive (no reactive signals) since device info
25
+ * does not change during the lifecycle of the app.
26
+ *
27
+ * @returns Device primitives object
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * import { createDevice } from '@molecule/app-solid'
32
+ *
33
+ * function DeviceDetails() {
34
+ * const { deviceInfo, screenInfo, supports } = createDevice()
35
+ *
36
+ * return (
37
+ * <div>
38
+ * <p>Browser: {deviceInfo.browser.name}</p>
39
+ * <p>OS: {deviceInfo.os.name}</p>
40
+ * <p>Screen: {screenInfo.width}x{screenInfo.height}</p>
41
+ * <p>Push supported: {supports('pushNotifications') ? 'Yes' : 'No'}</p>
42
+ * </div>
43
+ * )
44
+ * }
45
+ * ```
46
+ */
47
+ export declare function createDevice(): DevicePrimitives;
48
+ //# sourceMappingURL=device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/primitives/device.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGhG;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,cAAc,EAAE,cAAc,CAAA;IAC9B,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,cAAc,KAAK,OAAO,CAAA;IACpD,QAAQ,EAAE,MAAM,OAAO,CAAA;IACvB,YAAY,EAAE,MAAM,OAAO,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,IAAI,gBAAgB,CAc/C"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Solid.js primitives for device information.
3
+ *
4
+ * @module
5
+ */
6
+ import { getProvider } from '@molecule/app-device';
7
+ /**
8
+ * Create device primitives for accessing device information.
9
+ *
10
+ * This is a static primitive (no reactive signals) since device info
11
+ * does not change during the lifecycle of the app.
12
+ *
13
+ * @returns Device primitives object
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * import { createDevice } from '@molecule/app-solid'
18
+ *
19
+ * function DeviceDetails() {
20
+ * const { deviceInfo, screenInfo, supports } = createDevice()
21
+ *
22
+ * return (
23
+ * <div>
24
+ * <p>Browser: {deviceInfo.browser.name}</p>
25
+ * <p>OS: {deviceInfo.os.name}</p>
26
+ * <p>Screen: {screenInfo.width}x{screenInfo.height}</p>
27
+ * <p>Push supported: {supports('pushNotifications') ? 'Yes' : 'No'}</p>
28
+ * </div>
29
+ * )
30
+ * }
31
+ * ```
32
+ */
33
+ export function createDevice() {
34
+ const provider = getProvider();
35
+ return {
36
+ deviceInfo: provider.getDeviceInfo(),
37
+ screenInfo: provider.getScreenInfo(),
38
+ hardwareInfo: provider.getHardwareInfo(),
39
+ featureSupport: provider.getFeatureSupport(),
40
+ supports: (feature) => provider.supports(feature),
41
+ isOnline: () => provider.isOnline(),
42
+ isStandalone: () => provider.isStandalone(),
43
+ language: provider.getLanguage(),
44
+ languages: provider.getLanguages(),
45
+ };
46
+ }
47
+ //# sourceMappingURL=device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/primitives/device.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAiBlD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAE9B,OAAO;QACL,UAAU,EAAE,QAAQ,CAAC,aAAa,EAAE;QACpC,UAAU,EAAE,QAAQ,CAAC,aAAa,EAAE;QACpC,YAAY,EAAE,QAAQ,CAAC,eAAe,EAAE;QACxC,cAAc,EAAE,QAAQ,CAAC,iBAAiB,EAAE;QAC5C,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QACjD,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACnC,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE;QAC3C,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;QAChC,SAAS,EAAE,QAAQ,CAAC,YAAY,EAAE;KACnC,CAAA;AACH,CAAC"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Solid.js primitives for form handling.
3
+ *
4
+ * @module
5
+ */
6
+ import { type Accessor } from 'solid-js';
7
+ import type { FieldRegistration, FieldState, FormController, FormOptions, FormProvider, FormState, RegisterOptions } from '@molecule/app-forms';
8
+ /**
9
+ * Result of createForm primitive.
10
+ */
11
+ export interface CreateFormResult<T extends Record<string, unknown>> {
12
+ /** Reactive form state accessor. */
13
+ formState: Accessor<FormState<T>>;
14
+ /** Whether the form is currently valid. */
15
+ isValid: Accessor<boolean>;
16
+ /** Whether any field has been modified. */
17
+ isDirty: Accessor<boolean>;
18
+ /** Whether the form is currently submitting. */
19
+ isSubmitting: Accessor<boolean>;
20
+ /** Current field errors. */
21
+ errors: Accessor<Partial<Record<keyof T, string>>>;
22
+ /** Register a field for form management. */
23
+ register: (name: keyof T, options?: RegisterOptions) => FieldRegistration;
24
+ /** Get the current value of a field. */
25
+ getValue: <K extends keyof T>(name: K) => T[K];
26
+ /** Set the value of a field. */
27
+ setValue: <K extends keyof T>(name: K, value: T[K]) => void;
28
+ /** Get the error message for a field. */
29
+ getError: (name: keyof T) => string | undefined;
30
+ /** Set an error message for a field. */
31
+ setError: (name: keyof T, error: string | undefined) => void;
32
+ /** Clear all field errors. */
33
+ clearErrors: () => void;
34
+ /** Create a submit handler function. */
35
+ handleSubmit: (onSubmit: (values: T) => void | Promise<void>) => (event?: {
36
+ preventDefault?: () => void;
37
+ }) => Promise<void>;
38
+ /** Reset the form to initial or provided values. */
39
+ reset: (values?: Partial<T>) => void;
40
+ /** Validate all fields. */
41
+ validate: () => Promise<boolean>;
42
+ /** The raw FormController instance for advanced use. */
43
+ controller: FormController<T>;
44
+ }
45
+ /**
46
+ * Create form primitives for form state management and validation.
47
+ *
48
+ * @param provider - Form provider that creates controllers
49
+ * @param options - Form configuration options
50
+ * @returns Form primitives object
51
+ *
52
+ * @example
53
+ * ```tsx
54
+ * import { createForm } from '@molecule/app-solid'
55
+ * import { createNativeFormProvider } from '@molecule/app-forms'
56
+ *
57
+ * const provider = createNativeFormProvider()
58
+ *
59
+ * function LoginForm() {
60
+ * const { register, handleSubmit, formState, isSubmitting, errors } = createForm(provider, {
61
+ * defaultValues: { email: '', password: '' },
62
+ * })
63
+ *
64
+ * const onSubmit = async (values: { email: string; password: string }) => {
65
+ * await login(values)
66
+ * }
67
+ *
68
+ * return (
69
+ * <form onSubmit={handleSubmit(onSubmit)}>
70
+ * <input {...register('email', { required: true, email: true })} />
71
+ * <Show when={errors().email}>
72
+ * <span>{errors().email}</span>
73
+ * </Show>
74
+ *
75
+ * <input {...register('password', { required: true, minLength: 8 })} type="password" />
76
+ * <Show when={errors().password}>
77
+ * <span>{errors().password}</span>
78
+ * </Show>
79
+ *
80
+ * <button type="submit" disabled={isSubmitting()}>
81
+ * {isSubmitting() ? 'Logging in...' : 'Log In'}
82
+ * </button>
83
+ * </form>
84
+ * )
85
+ * }
86
+ * ```
87
+ */
88
+ export declare function createForm<T extends Record<string, unknown>>(provider: FormProvider, options: FormOptions<T>): CreateFormResult<T>;
89
+ /**
90
+ * Create a reactive accessor for a single field's state.
91
+ *
92
+ * @param controller - Form controller
93
+ * @param name - Field name to track
94
+ * @returns Accessor for the field state
95
+ *
96
+ * @example
97
+ * ```tsx
98
+ * function EmailField(props: { controller: FormController<LoginValues> }) {
99
+ * const fieldState = createFieldSignal(props.controller, 'email')
100
+ *
101
+ * return (
102
+ * <div>
103
+ * <input value={fieldState().value as string} />
104
+ * <Show when={fieldState().error}>
105
+ * <span class="error">{fieldState().error}</span>
106
+ * </Show>
107
+ * <Show when={fieldState().touched && !fieldState().valid}>
108
+ * <span class="invalid">Invalid</span>
109
+ * </Show>
110
+ * </div>
111
+ * )
112
+ * }
113
+ * ```
114
+ */
115
+ export declare function createFieldSignal<T extends Record<string, unknown>>(controller: FormController<T>, name: keyof T): Accessor<FieldState<T[keyof T]>>;
116
+ /**
117
+ * Create a reactive accessor that tracks a single field's value.
118
+ *
119
+ * @param controller - Form controller
120
+ * @param name - Field name to watch
121
+ * @returns Accessor for the field value
122
+ *
123
+ * @example
124
+ * ```tsx
125
+ * function PasswordStrength(props: { controller: FormController<SignUpValues> }) {
126
+ * const password = createWatchSignal(props.controller, 'password')
127
+ *
128
+ * const strength = () => {
129
+ * const val = password()
130
+ * if (!val || (val as string).length < 4) return 'weak'
131
+ * if ((val as string).length < 8) return 'medium'
132
+ * return 'strong'
133
+ * }
134
+ *
135
+ * return <div class={`strength-${strength()}`}>Password: {strength()}</div>
136
+ * }
137
+ * ```
138
+ */
139
+ export declare function createWatchSignal<T extends Record<string, unknown>, K extends keyof T>(controller: FormController<T>, name: K): Accessor<T[K]>;
140
+ /**
141
+ * Create form helpers bound to a specific form provider.
142
+ *
143
+ * Returns a factory object so you can create multiple forms from the same provider
144
+ * without passing it each time.
145
+ *
146
+ * @param provider - Form provider
147
+ * @returns Object with a bound createForm function
148
+ *
149
+ * @example
150
+ * ```tsx
151
+ * import { createFormHelpers } from '@molecule/app-solid'
152
+ * import { createNativeFormProvider } from '@molecule/app-forms'
153
+ *
154
+ * const { createForm } = createFormHelpers(createNativeFormProvider())
155
+ *
156
+ * function LoginForm() {
157
+ * const { register, handleSubmit, isSubmitting } = createForm({
158
+ * defaultValues: { email: '', password: '' },
159
+ * })
160
+ *
161
+ * // ...
162
+ * }
163
+ * ```
164
+ */
165
+ /**
166
+ * Creates a form helpers.
167
+ * @param provider - The provider implementation.
168
+ * @returns The created result.
169
+ */
170
+ export declare function createFormHelpers(provider: FormProvider): {
171
+ createForm: <T extends Record<string, unknown>>(options: FormOptions<T>) => CreateFormResult<T>;
172
+ };
173
+ /**
174
+ * Create form primitives from an existing controller.
175
+ *
176
+ * Useful when you have a controller created externally and want to
177
+ * wrap it with Solid reactivity.
178
+ *
179
+ * @param controller - An existing FormController
180
+ * @returns Form primitives object
181
+ *
182
+ * @example
183
+ * ```tsx
184
+ * const controller = provider.createForm({ defaultValues: { name: '' } })
185
+ *
186
+ * function NameForm() {
187
+ * const { formState, register, handleSubmit } = createFormFromController(controller)
188
+ * // ...
189
+ * }
190
+ * ```
191
+ */
192
+ export declare function createFormFromController<T extends Record<string, unknown>>(controller: FormController<T>): CreateFormResult<T>;
193
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../src/primitives/forms.ts"],"names":[],"mappings":"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"}