@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,72 @@
1
+ /**
2
+ * Solid.js primitives for push notifications.
3
+ *
4
+ * @module
5
+ */
6
+ import { createSignal } from 'solid-js';
7
+ import { getProvider } from '@molecule/app-push';
8
+ /**
9
+ * Create push notification primitives.
10
+ *
11
+ * @returns Push primitives object
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * import { createPush } from '@molecule/app-solid'
16
+ *
17
+ * function NotificationButton() {
18
+ * const { permission, requestPermission, register } = createPush()
19
+ *
20
+ * const handleEnable = async () => {
21
+ * const status = await requestPermission()
22
+ * if (status === 'granted') {
23
+ * await register()
24
+ * }
25
+ * }
26
+ *
27
+ * return (
28
+ * <Show when={permission() !== 'granted'}>
29
+ * <button onClick={handleEnable}>Enable Notifications</button>
30
+ * </Show>
31
+ * )
32
+ * }
33
+ * ```
34
+ */
35
+ export function createPush() {
36
+ const provider = getProvider();
37
+ const [permission, setPermission] = createSignal(null);
38
+ const [token, setToken] = createSignal(null);
39
+ const checkPermission = async () => {
40
+ const status = await provider.checkPermission();
41
+ setPermission(status);
42
+ return status;
43
+ };
44
+ const requestPermission = async () => {
45
+ const status = await provider.requestPermission();
46
+ setPermission(status);
47
+ return status;
48
+ };
49
+ const register = async (options) => {
50
+ const pushToken = await provider.register(options);
51
+ setToken(pushToken);
52
+ return pushToken;
53
+ };
54
+ const unregister = async () => {
55
+ await provider.unregister();
56
+ setToken(null);
57
+ };
58
+ return {
59
+ permission,
60
+ token,
61
+ checkPermission,
62
+ requestPermission,
63
+ register,
64
+ unregister,
65
+ onNotificationReceived: (listener) => provider.onNotificationReceived(listener),
66
+ onNotificationAction: (listener) => provider.onNotificationAction(listener),
67
+ onTokenChange: (listener) => provider.onTokenChange(listener),
68
+ setBadge: (count) => provider.setBadge(count),
69
+ clearBadge: () => provider.clearBadge(),
70
+ };
71
+ }
72
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/primitives/push.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAiB,YAAY,EAAE,MAAM,UAAU,CAAA;AAUtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAmBhD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAE9B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,YAAY,CAA0B,IAAI,CAAC,CAAA;IAC/E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAmB,IAAI,CAAC,CAAA;IAE9D,MAAM,eAAe,GAAG,KAAK,IAA+B,EAAE;QAC5D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAA;QAC/C,aAAa,CAAC,MAAM,CAAC,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAED,MAAM,iBAAiB,GAAG,KAAK,IAA+B,EAAE;QAC9D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,CAAA;QACjD,aAAa,CAAC,MAAM,CAAC,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,KAAK,EAAE,OAA6B,EAAsB,EAAE;QAC3E,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAClD,QAAQ,CAAC,SAAS,CAAC,CAAA;QACnB,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;QAC3C,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;QAC3B,QAAQ,CAAC,IAAI,CAAC,CAAA;IAChB,CAAC,CAAA;IAED,OAAO;QACL,UAAU;QACV,KAAK;QACL,eAAe;QACf,iBAAiB;QACjB,QAAQ;QACR,UAAU;QACV,sBAAsB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC,QAAQ,CAAC;QAC/E,oBAAoB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,QAAQ,CAAC;QAC3E,aAAa,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;QAC7D,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC7C,UAAU,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE;KACxC,CAAA;AACH,CAAC"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Solid.js primitives for routing.
3
+ *
4
+ * @module
5
+ */
6
+ import { type Accessor } from 'solid-js';
7
+ import type { NavigateOptions, QueryParams, RouteLocation, RouteParams, Router } from '@molecule/app-routing';
8
+ import type { RouterPrimitives } from '../types.js';
9
+ /**
10
+ * Create router primitives for navigation state and actions.
11
+ *
12
+ * @returns Router primitives object
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * import { createRouter } from '@molecule/app-solid'
17
+ *
18
+ * function Navigation() {
19
+ * const { location, navigate, isActive } = createRouter()
20
+ *
21
+ * return (
22
+ * <nav>
23
+ * <a
24
+ * href="/home"
25
+ * class={isActive('/home') ? 'active' : ''}
26
+ * onClick={(e) => {
27
+ * e.preventDefault()
28
+ * navigate('/home')
29
+ * }}
30
+ * >
31
+ * Home
32
+ * </a>
33
+ * <span>Current: {location().pathname}</span>
34
+ * </nav>
35
+ * )
36
+ * }
37
+ * ```
38
+ */
39
+ export declare function createRouter(): RouterPrimitives;
40
+ /**
41
+ * Get current route location as accessor.
42
+ *
43
+ * @returns Accessor for current location
44
+ *
45
+ * @example
46
+ * ```tsx
47
+ * function Breadcrumb() {
48
+ * const location = useLocation()
49
+ * return <span>{location().pathname}</span>
50
+ * }
51
+ * ```
52
+ */
53
+ export declare function useLocation(): Accessor<RouteLocation>;
54
+ /**
55
+ * Get current route params as accessor.
56
+ *
57
+ * @returns Accessor for route params
58
+ *
59
+ * @example
60
+ * ```tsx
61
+ * function UserProfile() {
62
+ * const params = useParams()
63
+ * return <div>User ID: {params().userId}</div>
64
+ * }
65
+ * ```
66
+ */
67
+ export declare function useParams(): Accessor<RouteParams>;
68
+ /**
69
+ * Get current query params as accessor.
70
+ *
71
+ * @returns Accessor for query params
72
+ *
73
+ * @example
74
+ * ```tsx
75
+ * function SearchResults() {
76
+ * const query = useQuery()
77
+ * return <div>Search: {query().q}</div>
78
+ * }
79
+ * ```
80
+ */
81
+ export declare function useQuery(): Accessor<QueryParams>;
82
+ /**
83
+ * Get navigate function.
84
+ *
85
+ * @returns Navigate function
86
+ *
87
+ * @example
88
+ * ```tsx
89
+ * function LoginButton() {
90
+ * const navigate = useNavigate()
91
+ *
92
+ * const handleLogin = async () => {
93
+ * await login()
94
+ * navigate('/dashboard')
95
+ * }
96
+ *
97
+ * return <button onClick={handleLogin}>Login</button>
98
+ * }
99
+ * ```
100
+ */
101
+ export declare function useNavigate(): (path: string, options?: NavigateOptions) => void;
102
+ /**
103
+ * Create a match accessor for a path pattern.
104
+ *
105
+ * @param pattern - Path pattern to match
106
+ * @returns Accessor indicating if current path matches
107
+ *
108
+ * @example
109
+ * ```tsx
110
+ * function NavLink(props: { href: string; children: JSX.Element }) {
111
+ * const isActive = useMatch(props.href)
112
+ * return <a class={isActive() ? 'active' : ''} href={props.href}>{props.children}</a>
113
+ * }
114
+ * ```
115
+ */
116
+ export declare function useMatch(pattern: string): Accessor<boolean>;
117
+ /**
118
+ * Create a reactive boolean accessor that tracks whether a given path is active.
119
+ *
120
+ * Unlike `useMatch` which only accepts a static pattern, this factory returns
121
+ * a signal that re-evaluates on every route change and supports the `exact`
122
+ * parameter from the router's `isActive` method.
123
+ *
124
+ * @param path - Path to check against the current location
125
+ * @param exact - Whether to require an exact match (default: false)
126
+ * @returns Accessor<boolean> that is true when the path is active
127
+ *
128
+ * @example
129
+ * ```tsx
130
+ * function SideNav() {
131
+ * const dashboardActive = createIsActive('/dashboard')
132
+ * const settingsExact = createIsActive('/settings', true)
133
+ *
134
+ * return (
135
+ * <nav>
136
+ * <a class={dashboardActive() ? 'active' : ''} href="/dashboard">Dashboard</a>
137
+ * <a class={settingsExact() ? 'active' : ''} href="/settings">Settings</a>
138
+ * </nav>
139
+ * )
140
+ * }
141
+ * ```
142
+ */
143
+ export declare function createIsActive(path: string, exact?: boolean): Accessor<boolean>;
144
+ /**
145
+ * Create router helpers from context.
146
+ *
147
+ * @returns Router helper functions
148
+ */
149
+ /**
150
+ * Creates a router helpers.
151
+ * @returns The created result.
152
+ */
153
+ export declare function createRouterHelpers(): {
154
+ navigate: (path: string, options?: NavigateOptions) => void;
155
+ navigateTo: (name: string, params?: RouteParams, query?: QueryParams, options?: NavigateOptions) => void;
156
+ back: () => void;
157
+ forward: () => void;
158
+ getLocation: () => RouteLocation;
159
+ getParams: () => RouteParams;
160
+ getQuery: () => QueryParams;
161
+ isActive: (path: string) => boolean;
162
+ };
163
+ /**
164
+ * Create router primitives from a specific router.
165
+ *
166
+ * @param router - Router instance
167
+ * @returns Router primitives
168
+ */
169
+ export declare function createRouterFromInstance(router: Router): RouterPrimitives;
170
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/primitives/router.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAAyC,MAAM,UAAU,CAAA;AAE/E,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,aAAa,EACb,WAAW,EACX,MAAM,EACP,MAAM,uBAAuB,CAAA;AAG9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,YAAY,IAAI,gBAAgB,CA4B/C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAAC,aAAa,CAAC,CAGrD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,IAAI,QAAQ,CAAC,WAAW,CAAC,CAGjD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,IAAI,QAAQ,CAAC,WAAW,CAAC,CAGhD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,IAAI,CAG/E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAc3D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAa/E;AAED;;;;GAIG;AAEH;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,IAAI,CAAA;IAC3D,UAAU,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,eAAe,KACtB,IAAI,CAAA;IACT,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,WAAW,EAAE,MAAM,aAAa,CAAA;IAChC,SAAS,EAAE,MAAM,WAAW,CAAA;IAC5B,QAAQ,EAAE,MAAM,WAAW,CAAA;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CACpC,CAkBA;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAyBzE"}
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Solid.js primitives for routing.
3
+ *
4
+ * @module
5
+ */
6
+ import { createEffect, createSignal, onCleanup } from 'solid-js';
7
+ import { getRouter } from '../context.js';
8
+ /**
9
+ * Create router primitives for navigation state and actions.
10
+ *
11
+ * @returns Router primitives object
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * import { createRouter } from '@molecule/app-solid'
16
+ *
17
+ * function Navigation() {
18
+ * const { location, navigate, isActive } = createRouter()
19
+ *
20
+ * return (
21
+ * <nav>
22
+ * <a
23
+ * href="/home"
24
+ * class={isActive('/home') ? 'active' : ''}
25
+ * onClick={(e) => {
26
+ * e.preventDefault()
27
+ * navigate('/home')
28
+ * }}
29
+ * >
30
+ * Home
31
+ * </a>
32
+ * <span>Current: {location().pathname}</span>
33
+ * </nav>
34
+ * )
35
+ * }
36
+ * ```
37
+ */
38
+ export function createRouter() {
39
+ const router = getRouter();
40
+ const [location, setLocation] = createSignal(router.getLocation());
41
+ const [params, setParams] = createSignal(router.getParams());
42
+ const [query, setQuery] = createSignal(router.getQuery());
43
+ // Subscribe to route changes
44
+ createEffect(() => {
45
+ const unsubscribe = router.subscribe((newLocation) => {
46
+ setLocation(newLocation);
47
+ setParams(router.getParams());
48
+ setQuery(router.getQuery());
49
+ });
50
+ onCleanup(unsubscribe);
51
+ });
52
+ return {
53
+ location,
54
+ params,
55
+ query,
56
+ navigate: router.navigate.bind(router),
57
+ navigateTo: router.navigateTo.bind(router),
58
+ back: router.back.bind(router),
59
+ forward: router.forward.bind(router),
60
+ isActive: router.isActive.bind(router),
61
+ };
62
+ }
63
+ /**
64
+ * Get current route location as accessor.
65
+ *
66
+ * @returns Accessor for current location
67
+ *
68
+ * @example
69
+ * ```tsx
70
+ * function Breadcrumb() {
71
+ * const location = useLocation()
72
+ * return <span>{location().pathname}</span>
73
+ * }
74
+ * ```
75
+ */
76
+ export function useLocation() {
77
+ const { location } = createRouter();
78
+ return location;
79
+ }
80
+ /**
81
+ * Get current route params as accessor.
82
+ *
83
+ * @returns Accessor for route params
84
+ *
85
+ * @example
86
+ * ```tsx
87
+ * function UserProfile() {
88
+ * const params = useParams()
89
+ * return <div>User ID: {params().userId}</div>
90
+ * }
91
+ * ```
92
+ */
93
+ export function useParams() {
94
+ const { params } = createRouter();
95
+ return params;
96
+ }
97
+ /**
98
+ * Get current query params as accessor.
99
+ *
100
+ * @returns Accessor for query params
101
+ *
102
+ * @example
103
+ * ```tsx
104
+ * function SearchResults() {
105
+ * const query = useQuery()
106
+ * return <div>Search: {query().q}</div>
107
+ * }
108
+ * ```
109
+ */
110
+ export function useQuery() {
111
+ const { query } = createRouter();
112
+ return query;
113
+ }
114
+ /**
115
+ * Get navigate function.
116
+ *
117
+ * @returns Navigate function
118
+ *
119
+ * @example
120
+ * ```tsx
121
+ * function LoginButton() {
122
+ * const navigate = useNavigate()
123
+ *
124
+ * const handleLogin = async () => {
125
+ * await login()
126
+ * navigate('/dashboard')
127
+ * }
128
+ *
129
+ * return <button onClick={handleLogin}>Login</button>
130
+ * }
131
+ * ```
132
+ */
133
+ export function useNavigate() {
134
+ const { navigate } = createRouter();
135
+ return navigate;
136
+ }
137
+ /**
138
+ * Create a match accessor for a path pattern.
139
+ *
140
+ * @param pattern - Path pattern to match
141
+ * @returns Accessor indicating if current path matches
142
+ *
143
+ * @example
144
+ * ```tsx
145
+ * function NavLink(props: { href: string; children: JSX.Element }) {
146
+ * const isActive = useMatch(props.href)
147
+ * return <a class={isActive() ? 'active' : ''} href={props.href}>{props.children}</a>
148
+ * }
149
+ * ```
150
+ */
151
+ export function useMatch(pattern) {
152
+ const { isActive } = createRouter();
153
+ const [matches, setMatches] = createSignal(isActive(pattern));
154
+ createEffect(() => {
155
+ const router = getRouter();
156
+ const unsubscribe = router.subscribe(() => {
157
+ setMatches(isActive(pattern));
158
+ });
159
+ onCleanup(unsubscribe);
160
+ });
161
+ return matches;
162
+ }
163
+ /**
164
+ * Create a reactive boolean accessor that tracks whether a given path is active.
165
+ *
166
+ * Unlike `useMatch` which only accepts a static pattern, this factory returns
167
+ * a signal that re-evaluates on every route change and supports the `exact`
168
+ * parameter from the router's `isActive` method.
169
+ *
170
+ * @param path - Path to check against the current location
171
+ * @param exact - Whether to require an exact match (default: false)
172
+ * @returns Accessor<boolean> that is true when the path is active
173
+ *
174
+ * @example
175
+ * ```tsx
176
+ * function SideNav() {
177
+ * const dashboardActive = createIsActive('/dashboard')
178
+ * const settingsExact = createIsActive('/settings', true)
179
+ *
180
+ * return (
181
+ * <nav>
182
+ * <a class={dashboardActive() ? 'active' : ''} href="/dashboard">Dashboard</a>
183
+ * <a class={settingsExact() ? 'active' : ''} href="/settings">Settings</a>
184
+ * </nav>
185
+ * )
186
+ * }
187
+ * ```
188
+ */
189
+ export function createIsActive(path, exact) {
190
+ const router = getRouter();
191
+ const [active, setActive] = createSignal(router.isActive(path, exact));
192
+ createEffect(() => {
193
+ const unsubscribe = router.subscribe(() => {
194
+ setActive(router.isActive(path, exact));
195
+ });
196
+ onCleanup(unsubscribe);
197
+ });
198
+ return active;
199
+ }
200
+ /**
201
+ * Create router helpers from context.
202
+ *
203
+ * @returns Router helper functions
204
+ */
205
+ /**
206
+ * Creates a router helpers.
207
+ * @returns The created result.
208
+ */
209
+ export function createRouterHelpers() {
210
+ const router = getRouter();
211
+ return {
212
+ navigate: (path, options) => router.navigate(path, options),
213
+ navigateTo: (name, params, query, options) => router.navigateTo(name, params, query, options),
214
+ back: () => router.back(),
215
+ forward: () => router.forward(),
216
+ getLocation: () => router.getLocation(),
217
+ getParams: () => router.getParams(),
218
+ getQuery: () => router.getQuery(),
219
+ isActive: (path) => router.isActive(path),
220
+ };
221
+ }
222
+ /**
223
+ * Create router primitives from a specific router.
224
+ *
225
+ * @param router - Router instance
226
+ * @returns Router primitives
227
+ */
228
+ export function createRouterFromInstance(router) {
229
+ const [location, setLocation] = createSignal(router.getLocation());
230
+ const [params, setParams] = createSignal(router.getParams());
231
+ const [query, setQuery] = createSignal(router.getQuery());
232
+ createEffect(() => {
233
+ const unsubscribe = router.subscribe((newLocation) => {
234
+ setLocation(newLocation);
235
+ setParams(router.getParams());
236
+ setQuery(router.getQuery());
237
+ });
238
+ onCleanup(unsubscribe);
239
+ });
240
+ return {
241
+ location,
242
+ params,
243
+ query,
244
+ navigate: router.navigate.bind(router),
245
+ navigateTo: router.navigateTo.bind(router),
246
+ back: router.back.bind(router),
247
+ forward: router.forward.bind(router),
248
+ isActive: router.isActive.bind(router),
249
+ };
250
+ }
251
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/primitives/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Solid.js primitive for registration with async state tracking.
3
+ *
4
+ * @module
5
+ */
6
+ import type { Accessor } from 'solid-js';
7
+ import type { AuthResult, RegisterData } from '@molecule/app-auth';
8
+ import type { PromiseState } from '@molecule/app-utilities';
9
+ /**
10
+ * Return type for createSignup primitive.
11
+ */
12
+ export interface CreateSignupReturn<T = unknown> {
13
+ state: Accessor<PromiseState<AuthResult<T>>>;
14
+ signup: (data: RegisterData) => Promise<AuthResult<T>>;
15
+ reset: () => void;
16
+ }
17
+ /**
18
+ * Creates a signup primitive with async state tracking.
19
+ *
20
+ * @returns Signup state and action
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * const { state, signup } = createSignup()
25
+ *
26
+ * return (
27
+ * <button
28
+ * onClick={() => signup({ email: email(), password: password() })}
29
+ * disabled={state().status === 'pending'}
30
+ * >
31
+ * {state().status === 'pending' ? 'Signing up...' : 'Sign Up'}
32
+ * </button>
33
+ * )
34
+ * ```
35
+ */
36
+ export declare function createSignup<T = unknown>(): CreateSignupReturn<T>;
37
+ //# sourceMappingURL=signup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signup.d.ts","sourceRoot":"","sources":["../../src/primitives/signup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAK3D;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,OAAO;IAC7C,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IACtD,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,CAAC,GAAG,OAAO,KAAK,kBAAkB,CAAC,CAAC,CAAC,CAKjE"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Solid.js primitive for registration with async state tracking.
3
+ *
4
+ * @module
5
+ */
6
+ import { getAuthClient } from '../context.js';
7
+ import { createPromise } from './promise.js';
8
+ /**
9
+ * Creates a signup primitive with async state tracking.
10
+ *
11
+ * @returns Signup state and action
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * const { state, signup } = createSignup()
16
+ *
17
+ * return (
18
+ * <button
19
+ * onClick={() => signup({ email: email(), password: password() })}
20
+ * disabled={state().status === 'pending'}
21
+ * >
22
+ * {state().status === 'pending' ? 'Signing up...' : 'Sign Up'}
23
+ * </button>
24
+ * )
25
+ * ```
26
+ */
27
+ export function createSignup() {
28
+ const client = getAuthClient();
29
+ const { state, call, reset } = createPromise((data) => client.register(data));
30
+ return { state, signup: call, reset };
31
+ }
32
+ //# sourceMappingURL=signup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signup.js","sourceRoot":"","sources":["../../src/primitives/signup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAW5C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,aAAa,EAAK,CAAA;IACjC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,CAAC,IAAkB,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IAE3F,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACvC,CAAC"}