@indietabletop/appkit 6.1.6 → 7.0.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 (269) hide show
  1. package/dist/AppConfig/AppConfig.d.ts +29 -0
  2. package/dist/AuthCard/AuthCard.d.ts +10 -0
  3. package/dist/AuthCard/AuthCard.stories.d.ts +34 -0
  4. package/dist/AuthCard/style.css.d.ts +23 -0
  5. package/dist/DialogTrigger/index.d.ts +13 -0
  6. package/dist/DocumentTitle/DocumentTitle.d.ts +3 -0
  7. package/dist/EnumMapper.d.ts +25 -0
  8. package/dist/ExternalLink.d.ts +3 -0
  9. package/dist/FullscreenDismissBlocker.d.ts +5 -0
  10. package/{lib/HistoryState.ts → dist/HistoryState.d.ts} +2 -5
  11. package/dist/IndieTabletopClubLogo.d.ts +7 -0
  12. package/dist/IndieTabletopClubSymbol.d.ts +7 -0
  13. package/dist/InfoPage/index.d.ts +8 -0
  14. package/dist/InfoPage/pages.d.ts +2 -0
  15. package/dist/InfoPage/style.css.d.ts +5 -0
  16. package/dist/Letterhead/index.d.ts +19 -0
  17. package/dist/Letterhead/stories.d.ts +13 -0
  18. package/dist/Letterhead/style.css.d.ts +46 -0
  19. package/dist/LetterheadForm/LetterheadReadonlyTextField.stories.d.ts +17 -0
  20. package/dist/LetterheadForm/LetterheadSubmitError.stories.d.ts +11 -0
  21. package/dist/LetterheadForm/LetterheadTextField.stories.d.ts +336 -0
  22. package/dist/LetterheadForm/index.d.ts +44 -0
  23. package/dist/LetterheadForm/style.css.d.ts +8 -0
  24. package/dist/LoadingIndicator.d.ts +3 -0
  25. package/dist/MiddotSeparated/MiddotSeparated.d.ts +8 -0
  26. package/dist/MiddotSeparated/MiddotSeparated.stories.d.ts +586 -0
  27. package/dist/MiddotSeparated/style.css.d.ts +1 -0
  28. package/dist/ModalDialog/index.d.ts +12 -0
  29. package/dist/ModalDialog/style.css.d.ts +58 -0
  30. package/dist/ModernIDB/Cursor.d.ts +56 -0
  31. package/dist/ModernIDB/ModernIDB.d.ts +66 -0
  32. package/dist/ModernIDB/ModernIDBError.d.ts +3 -0
  33. package/dist/ModernIDB/ObjectStore.d.ts +112 -0
  34. package/dist/ModernIDB/ObjectStoreIndex.d.ts +53 -0
  35. package/dist/ModernIDB/Transaction.d.ts +16 -0
  36. package/dist/ModernIDB/VersionChangeManager.d.ts +30 -0
  37. package/dist/ModernIDB/bindings/factory.d.ts +12 -0
  38. package/dist/ModernIDB/bindings/index.d.ts +2 -0
  39. package/{lib/ModernIDB/bindings/types.ts → dist/ModernIDB/bindings/types.d.ts} +13 -32
  40. package/dist/ModernIDB/bindings/utils.d.ts +2 -0
  41. package/dist/ModernIDB/index.d.ts +10 -0
  42. package/dist/ModernIDB/types.d.ts +88 -0
  43. package/dist/ModernIDB/utils.d.ts +4 -0
  44. package/dist/QRCode/QRCode.d.ts +7 -0
  45. package/dist/QRCode/QRCode.stories.d.ts +33 -0
  46. package/dist/QRCode/style.css.d.ts +4 -0
  47. package/dist/ReleaseInfo/index.d.ts +5 -0
  48. package/dist/RulesetResolver.d.ts +87 -0
  49. package/dist/SafariCheck/SafariCheck.d.ts +23 -0
  50. package/dist/SafariCheck/SafariCheck.stories.d.ts +73 -0
  51. package/dist/SafariCheck/style.css.d.ts +17 -0
  52. package/dist/ServiceWorkerHandler.d.ts +11 -0
  53. package/dist/ShareButton/ShareButton.d.ts +57 -0
  54. package/dist/ShareButton/ShareButton.stories.d.ts +1577 -0
  55. package/dist/ShareButton/test.css.d.ts +1 -0
  56. package/dist/SubscribeCard/LetterheadInfoCard.d.ts +2 -0
  57. package/dist/SubscribeCard/SubscribeByEmailCard.d.ts +24 -0
  58. package/dist/SubscribeCard/SubscribeByEmailCard.stories.d.ts +10 -0
  59. package/dist/SubscribeCard/SubscribeByPledgeCard.d.ts +36 -0
  60. package/dist/SubscribeCard/SubscribeByPledgeCard.stories.d.ts +65 -0
  61. package/dist/SubscribeCard/style.css.d.ts +4 -0
  62. package/dist/account/AccountIssueView.d.ts +3 -0
  63. package/dist/account/AlreadyLoggedInView.d.ts +5 -0
  64. package/dist/account/CurrentUserFetcher.d.ts +20 -0
  65. package/dist/account/CurrentUserFetcher.stories.d.ts +136 -0
  66. package/dist/account/FailureFallbackView.d.ts +1 -0
  67. package/dist/account/JoinCard.d.ts +14 -0
  68. package/dist/account/JoinCard.stories.d.ts +143 -0
  69. package/dist/account/LoadingView.d.ts +1 -0
  70. package/dist/account/LoginCard.d.ts +39 -0
  71. package/dist/account/LoginCard.stories.d.ts +217 -0
  72. package/dist/account/LoginView.d.ts +10 -0
  73. package/dist/account/NoConnectionView.d.ts +4 -0
  74. package/dist/account/PasswordResetCard.d.ts +15 -0
  75. package/dist/account/PasswordResetCard.stories.d.ts +128 -0
  76. package/dist/account/UserMismatchView.d.ts +6 -0
  77. package/dist/account/VerifyPage.d.ts +13 -0
  78. package/dist/account/style.css.d.ts +10 -0
  79. package/{lib/account/types.ts → dist/account/types.d.ts} +3 -6
  80. package/dist/account/useFetchCurrentUser.d.ts +28 -0
  81. package/dist/account/useRedirectPath.d.ts +6 -0
  82. package/dist/animations.css.d.ts +3 -0
  83. package/dist/append-copy-to-text.d.ts +10 -0
  84. package/dist/append-copy-to-text.test.d.ts +1 -0
  85. package/dist/appkit.css +1 -0
  86. package/dist/appkit.js +10692 -0
  87. package/dist/async-op.d.ts +101 -0
  88. package/dist/atomic.css.d.ts +6 -0
  89. package/{lib/caught-value.ts → dist/caught-value.d.ts} +1 -11
  90. package/{lib/class-names.ts → dist/class-names.d.ts} +6 -17
  91. package/dist/client.d.ts +424 -0
  92. package/dist/common.css.d.ts +5 -0
  93. package/dist/copyrightRange.d.ts +1 -0
  94. package/dist/copyrightRange.test.d.ts +1 -0
  95. package/dist/createSafeStorage.d.ts +34 -0
  96. package/dist/failureMessages.d.ts +20 -0
  97. package/dist/failureMessages.test.d.ts +1 -0
  98. package/dist/form/FormSubmitButton.d.ts +17 -0
  99. package/dist/form/SubmitErrorAlert.d.ts +5 -0
  100. package/dist/form/style.css.d.ts +3 -0
  101. package/dist/globals.css.d.ts +0 -0
  102. package/dist/groupBy.d.ts +1 -0
  103. package/dist/groupBy.test.d.ts +1 -0
  104. package/dist/hrefs.d.ts +32 -0
  105. package/dist/hrefs.test.d.ts +1 -0
  106. package/dist/idToDate.d.ts +5 -0
  107. package/dist/idToDate.test.d.ts +1 -0
  108. package/dist/ids.d.ts +1 -0
  109. package/dist/ids.test.d.ts +1 -0
  110. package/dist/index.d.ts +64 -0
  111. package/dist/internal.css.d.ts +2 -0
  112. package/dist/mailto.d.ts +8 -0
  113. package/dist/mailto.test.d.ts +1 -0
  114. package/dist/media.d.ts +39 -0
  115. package/dist/random.d.ts +3 -0
  116. package/dist/result/swr.d.ts +4 -0
  117. package/{lib/sleep.ts → dist/sleep.d.ts} +1 -3
  118. package/dist/store/index.d.ts +237 -0
  119. package/dist/store/store.d.ts +144 -0
  120. package/dist/store/types.d.ts +49 -0
  121. package/dist/store/utils.d.ts +10 -0
  122. package/dist/storybook/decorators.d.ts +3 -0
  123. package/dist/structs.d.ts +1 -0
  124. package/{lib/typeguards.ts → dist/typeguards.d.ts} +1 -3
  125. package/dist/typeguards.test.d.ts +1 -0
  126. package/{lib/types.ts → dist/types.d.ts} +12 -23
  127. package/dist/unique.d.ts +10 -0
  128. package/dist/unique.test.d.ts +1 -0
  129. package/dist/use-async-op.d.ts +6 -0
  130. package/dist/use-document-background-color.d.ts +4 -0
  131. package/dist/use-form.d.ts +29 -0
  132. package/dist/use-is-installed.d.ts +8 -0
  133. package/dist/use-media-query.d.ts +1 -0
  134. package/dist/use-reverting-state.d.ts +5 -0
  135. package/dist/use-scroll-restoration.d.ts +25 -0
  136. package/dist/useEnsureValue.d.ts +6 -0
  137. package/dist/useInvokeClient.d.ts +25 -0
  138. package/dist/useIsVisible.d.ts +4 -0
  139. package/dist/utm.d.ts +58 -0
  140. package/dist/utm.test.d.ts +1 -0
  141. package/dist/validations.d.ts +3 -0
  142. package/dist/vars.css.d.ts +10 -0
  143. package/package.json +12 -5
  144. package/lib/AppConfig/AppConfig.tsx +0 -61
  145. package/lib/AuthCard/AuthCard.stories.ts +0 -34
  146. package/lib/AuthCard/AuthCard.tsx +0 -64
  147. package/lib/AuthCard/style.css.ts +0 -49
  148. package/lib/DialogTrigger/index.tsx +0 -36
  149. package/lib/DocumentTitle/DocumentTitle.tsx +0 -10
  150. package/lib/EnumMapper.ts +0 -50
  151. package/lib/ExternalLink.tsx +0 -10
  152. package/lib/FullscreenDismissBlocker.tsx +0 -23
  153. package/lib/IndieTabletopClubLogo.tsx +0 -44
  154. package/lib/IndieTabletopClubSymbol.tsx +0 -37
  155. package/lib/InfoPage/index.tsx +0 -46
  156. package/lib/InfoPage/pages.tsx +0 -36
  157. package/lib/InfoPage/style.css.ts +0 -36
  158. package/lib/Letterhead/index.tsx +0 -85
  159. package/lib/Letterhead/stories.tsx +0 -41
  160. package/lib/Letterhead/style.css.ts +0 -152
  161. package/lib/LetterheadForm/LetterheadReadonlyTextField.stories.tsx +0 -17
  162. package/lib/LetterheadForm/LetterheadSubmitError.stories.tsx +0 -19
  163. package/lib/LetterheadForm/LetterheadTextField.stories.tsx +0 -19
  164. package/lib/LetterheadForm/index.tsx +0 -137
  165. package/lib/LetterheadForm/style.css.ts +0 -89
  166. package/lib/LoadingIndicator.tsx +0 -40
  167. package/lib/MiddotSeparated/MiddotSeparated.stories.ts +0 -26
  168. package/lib/MiddotSeparated/MiddotSeparated.tsx +0 -26
  169. package/lib/MiddotSeparated/style.css.ts +0 -10
  170. package/lib/ModalDialog/index.tsx +0 -28
  171. package/lib/ModalDialog/style.css.ts +0 -88
  172. package/lib/ModernIDB/Cursor.ts +0 -91
  173. package/lib/ModernIDB/ModernIDB.ts +0 -337
  174. package/lib/ModernIDB/ModernIDBError.ts +0 -9
  175. package/lib/ModernIDB/ObjectStore.ts +0 -195
  176. package/lib/ModernIDB/ObjectStoreIndex.ts +0 -102
  177. package/lib/ModernIDB/README.md +0 -9
  178. package/lib/ModernIDB/Transaction.ts +0 -40
  179. package/lib/ModernIDB/VersionChangeManager.ts +0 -57
  180. package/lib/ModernIDB/bindings/factory.tsx +0 -165
  181. package/lib/ModernIDB/bindings/index.ts +0 -2
  182. package/lib/ModernIDB/bindings/utils.tsx +0 -32
  183. package/lib/ModernIDB/index.ts +0 -10
  184. package/lib/ModernIDB/types.ts +0 -120
  185. package/lib/ModernIDB/utils.ts +0 -51
  186. package/lib/QRCode/QRCode.stories.tsx +0 -41
  187. package/lib/QRCode/QRCode.tsx +0 -54
  188. package/lib/QRCode/style.css.ts +0 -23
  189. package/lib/ReleaseInfo/index.tsx +0 -29
  190. package/lib/RulesetResolver.ts +0 -214
  191. package/lib/SafariCheck/SafariCheck.stories.tsx +0 -99
  192. package/lib/SafariCheck/SafariCheck.tsx +0 -273
  193. package/lib/SafariCheck/addToDock.svg +0 -13
  194. package/lib/SafariCheck/addToHomeScreen.svg +0 -12
  195. package/lib/SafariCheck/safari.svg +0 -32
  196. package/lib/SafariCheck/shareIcon.svg +0 -11
  197. package/lib/SafariCheck/style.css.ts +0 -106
  198. package/lib/ServiceWorkerHandler.tsx +0 -53
  199. package/lib/ShareButton/ShareButton.stories.tsx +0 -58
  200. package/lib/ShareButton/ShareButton.tsx +0 -153
  201. package/lib/ShareButton/test.css.ts +0 -3
  202. package/lib/SubscribeCard/LetterheadInfoCard.tsx +0 -23
  203. package/lib/SubscribeCard/SubscribeByEmailCard.stories.tsx +0 -69
  204. package/lib/SubscribeCard/SubscribeByEmailCard.tsx +0 -183
  205. package/lib/SubscribeCard/SubscribeByPledgeCard.stories.tsx +0 -133
  206. package/lib/SubscribeCard/SubscribeByPledgeCard.tsx +0 -127
  207. package/lib/SubscribeCard/style.css.ts +0 -14
  208. package/lib/account/AccountIssueView.tsx +0 -44
  209. package/lib/account/AlreadyLoggedInView.tsx +0 -47
  210. package/lib/account/CurrentUserFetcher.stories.tsx +0 -292
  211. package/lib/account/CurrentUserFetcher.tsx +0 -118
  212. package/lib/account/FailureFallbackView.tsx +0 -36
  213. package/lib/account/JoinCard.stories.tsx +0 -257
  214. package/lib/account/JoinCard.tsx +0 -301
  215. package/lib/account/LoadingView.tsx +0 -14
  216. package/lib/account/LoginCard.stories.tsx +0 -288
  217. package/lib/account/LoginCard.tsx +0 -100
  218. package/lib/account/LoginView.tsx +0 -151
  219. package/lib/account/NoConnectionView.tsx +0 -34
  220. package/lib/account/PasswordResetCard.stories.tsx +0 -242
  221. package/lib/account/PasswordResetCard.tsx +0 -296
  222. package/lib/account/UserMismatchView.tsx +0 -62
  223. package/lib/account/VerifyPage.tsx +0 -195
  224. package/lib/account/style.css.ts +0 -57
  225. package/lib/account/useFetchCurrentUser.tsx +0 -63
  226. package/lib/account/useRedirectPath.ts +0 -21
  227. package/lib/animations.css.ts +0 -17
  228. package/lib/append-copy-to-text.ts +0 -35
  229. package/lib/async-op.ts +0 -286
  230. package/lib/atomic.css.ts +0 -11
  231. package/lib/client.ts +0 -662
  232. package/lib/common.css.ts +0 -48
  233. package/lib/copyrightRange.ts +0 -10
  234. package/lib/createSafeStorage.ts +0 -91
  235. package/lib/failureMessages.ts +0 -108
  236. package/lib/form/FormSubmitButton.tsx +0 -58
  237. package/lib/form/SubmitErrorAlert.tsx +0 -21
  238. package/lib/form/style.css.ts +0 -9
  239. package/lib/globals.css.ts +0 -62
  240. package/lib/groupBy.ts +0 -25
  241. package/lib/hrefs.ts +0 -48
  242. package/lib/idToDate.ts +0 -8
  243. package/lib/ids.ts +0 -6
  244. package/lib/index.ts +0 -71
  245. package/lib/internal.css.ts +0 -10
  246. package/lib/mailto.ts +0 -40
  247. package/lib/media.ts +0 -50
  248. package/lib/random.ts +0 -19
  249. package/lib/result/swr.ts +0 -18
  250. package/lib/store/index.tsx +0 -241
  251. package/lib/store/store.ts +0 -479
  252. package/lib/store/types.ts +0 -45
  253. package/lib/store/utils.ts +0 -54
  254. package/lib/storybook/decorators.tsx +0 -10
  255. package/lib/structs.ts +0 -3
  256. package/lib/unique.ts +0 -24
  257. package/lib/use-async-op.ts +0 -16
  258. package/lib/use-document-background-color.ts +0 -16
  259. package/lib/use-form.ts +0 -78
  260. package/lib/use-is-installed.ts +0 -17
  261. package/lib/use-media-query.ts +0 -21
  262. package/lib/use-reverting-state.ts +0 -32
  263. package/lib/use-scroll-restoration.ts +0 -99
  264. package/lib/useEnsureValue.ts +0 -31
  265. package/lib/useInvokeClient.ts +0 -54
  266. package/lib/useIsVisible.ts +0 -27
  267. package/lib/utm.ts +0 -92
  268. package/lib/validations.ts +0 -25
  269. package/lib/vars.css.ts +0 -13
@@ -1,91 +0,0 @@
1
- import { type Struct, validate } from "superstruct";
2
- import { fromTryCatch } from "./async-op.ts";
3
-
4
- type AnyStruct = Struct<any, any>;
5
-
6
- type StructsConfig = Record<string, AnyStruct>;
7
-
8
- type SafeStorage<T extends Record<string, AnyStruct>> = ReturnType<
9
- typeof createSafeStorage<T>
10
- >;
11
-
12
- export type SafeStorageKey<T extends SafeStorage<StructsConfig>> = ReturnType<
13
- T["keys"]
14
- >[number];
15
-
16
- type StructValue<T> = T extends Struct<infer V> ? V : never;
17
-
18
- /**
19
- * Creates an object with an interface similar to localStorage, but that
20
- * enforces that values are parsed and validated before being retrieved,
21
- * stringified when being set, and that both keys and values typecheck.
22
- *
23
- * @example
24
- * ```ts
25
- * const safeStorage = createSafeStorage({
26
- * currentUser: currentUser(),
27
- * sessionInfo: sessionInfo(),
28
- * lastSuccessfulSyncTs: number(),
29
- * });
30
- *
31
- * safeStorage.getItem("currentUser") // Will be valid current user or `null`
32
- * safeStorage.setItem("currentUser", { ... }) // Typechecked key and value
33
- * safeStorage.removeItem("currentUser") // Typechecked key
34
- * safeStorage.clear() // Removes all "owned" keys
35
- *
36
- * ```
37
- */
38
- export function createSafeStorage<T extends StructsConfig>(structs: T) {
39
- return {
40
- getItem<K extends keyof T & string>(key: K) {
41
- const struct = structs[key];
42
- if (!struct) {
43
- throw new Error(`No struct found for ${key}`);
44
- }
45
-
46
- const storedValue = localStorage.getItem(key);
47
-
48
- if (storedValue === null) {
49
- return null;
50
- }
51
-
52
- const parsedResult = fromTryCatch<unknown>(() => JSON.parse(storedValue));
53
-
54
- if (parsedResult.isFailure) {
55
- console.warn(`Could not parse localStorage value at key '${key}'.`);
56
- return null;
57
- }
58
-
59
- const [error, value] = validate(parsedResult.value, struct, {
60
- coerce: true,
61
- mask: true,
62
- });
63
-
64
- if (error) {
65
- console.warn(
66
- `Validation failed for localStorage value at key '${key}'. ${error.message}`,
67
- );
68
- }
69
-
70
- return value as StructValue<T[K]> | null;
71
- },
72
-
73
- setItem<K extends keyof T & string>(key: K, value: StructValue<T[K]>) {
74
- localStorage.setItem(key, JSON.stringify(value));
75
- },
76
-
77
- removeItem(key: keyof T & string) {
78
- localStorage.removeItem(key);
79
- },
80
-
81
- clear() {
82
- for (const key in structs) {
83
- localStorage.removeItem(key);
84
- }
85
- },
86
-
87
- keys() {
88
- return Object.keys(structs) as (keyof T)[];
89
- },
90
- };
91
- }
@@ -1,108 +0,0 @@
1
- import type { FailurePayload } from "./types.ts";
2
-
3
- type OnOverride<T> = (fallback: T, override?: Partial<T>) => T;
4
-
5
- function createFailureMessageGetter<T>(
6
- defaults: Record<number | "fallback" | "connection", T>,
7
- options: { onOverride: OnOverride<T> },
8
- ) {
9
- return function getMessage(
10
- failure: FailurePayload,
11
- overrides: Record<number, Partial<T>> = {},
12
- ) {
13
- switch (failure.type) {
14
- case "API_ERROR": {
15
- return options.onOverride(
16
- defaults[failure.code] ?? defaults.fallback,
17
- overrides[failure.code],
18
- );
19
- }
20
-
21
- case "NETWORK_ERROR": {
22
- return defaults.connection;
23
- }
24
-
25
- default: {
26
- return defaults.fallback;
27
- }
28
- }
29
- };
30
- }
31
-
32
- export type FetchFailureAction =
33
- | {
34
- type: "LINK";
35
- href: string;
36
- label: string;
37
- }
38
- | {
39
- type: "RELOAD" | "REFETCH";
40
- label: string;
41
- };
42
-
43
- export type FetchFailureMessages = {
44
- title: string;
45
- description: string;
46
- action: FetchFailureAction;
47
- };
48
-
49
- export const getFetchFailureMessages =
50
- createFailureMessageGetter<FetchFailureMessages>(
51
- {
52
- 401: {
53
- title: "Not logged in",
54
- description: "You must be logged in to view this page.",
55
- action: { type: "LINK", href: "~/login", label: "Go to login" },
56
- },
57
- 403: {
58
- title: "Not authorized",
59
- description: "You might be logged into the wrong account.",
60
- action: { type: "LINK", href: "~/login", label: "Go to login" },
61
- },
62
- 404: {
63
- title: `Not found`,
64
- description: `The link you have followed might be broken.`,
65
- action: { type: "LINK", href: "~/", label: "Go back" },
66
- },
67
- 500: {
68
- title: `Ooops, something went wrong`,
69
- description: `This is probably an issue with our servers. You can try refreshing.`,
70
- action: { type: "RELOAD", label: "Reload app" },
71
- },
72
- connection: {
73
- title: `No connection`,
74
- description: `Check your interent connection and try again.`,
75
- action: { type: "REFETCH", label: "Retry request" },
76
- },
77
- fallback: {
78
- title: `Ooops, something went wrong`,
79
- description: `This is probably an issue on our side. You can try refreshing.`,
80
- action: { type: "RELOAD", label: "Reload app" },
81
- },
82
- },
83
- {
84
- onOverride(fallback, override) {
85
- return { ...fallback, ...override };
86
- },
87
- },
88
- );
89
-
90
- export const getSubmitFailureMessage = createFailureMessageGetter(
91
- {
92
- 500: `Could not submit form due to an unexpected server error. Please refresh the page and try again.`,
93
- connection: `Could not submit form due to network error. Make sure you are connected to the internet and try again.`,
94
- fallback: `Could not submit form due to an unexpected error. Please refresh the page and try again.`,
95
- },
96
- {
97
- onOverride(fallback, override) {
98
- return override ?? fallback;
99
- },
100
- },
101
- );
102
-
103
- /**
104
- * @deprecated Use {@link getSubmitFailureMessage} instead.
105
- */
106
- export function toKnownFailureMessage(failure: FailurePayload) {
107
- return getSubmitFailureMessage(failure);
108
- }
@@ -1,58 +0,0 @@
1
- import {
2
- type FormSubmitProps,
3
- FormSubmit,
4
- useFormContext,
5
- useStoreState,
6
- } from "@ariakit/react";
7
- import type { ReactNode } from "react";
8
- import { fadeIn } from "../animations.css.ts";
9
-
10
- export type FormSubmitButtonProps = FormSubmitProps & {
11
- children: ReactNode;
12
- loading: ReactNode;
13
- };
14
-
15
- /**
16
- * Renders Ariakit FormSubmit component.
17
- *
18
- * It's main responsibility is to render the loading component (provided via
19
- * the `loading` prop) when the form is in the submitting state. This component
20
- * will be rendered over the usual content of the button, which will be hidden
21
- * as long as the form is submitting.
22
- *
23
- * @remarks Must be rendered within Ariakit Form Context.
24
- */
25
- export function FormSubmitButton(props: FormSubmitButtonProps) {
26
- const { children, className, style, loading, ...submitProps } = props;
27
- const form = useFormContext();
28
- const isSubmitting = useStoreState(form, (s) => s?.submitting);
29
-
30
- return (
31
- <FormSubmit
32
- {...submitProps}
33
- className={className}
34
- style={{ position: "relative", ...style }}
35
- >
36
- <span
37
- style={{ opacity: isSubmitting ? 0 : 1, transition: "200ms opacity" }}
38
- >
39
- {children}
40
- </span>
41
-
42
- {isSubmitting && (
43
- <div
44
- style={{
45
- display: "flex",
46
- position: "absolute",
47
- inset: "0",
48
- alignItems: "center",
49
- justifyContent: "center",
50
- animation: `${fadeIn} 200ms 200ms both`,
51
- }}
52
- >
53
- {loading}
54
- </div>
55
- )}
56
- </FormSubmit>
57
- );
58
- }
@@ -1,21 +0,0 @@
1
- import { useFormContext, useStoreState } from "@ariakit/react";
2
- import { cx } from "../class-names.ts";
3
- import { submitErrorAlert } from "./style.css.ts";
4
-
5
- export type SubmitErrorMessageProps = {
6
- name: string;
7
- className?: string;
8
- };
9
-
10
- export function SubmitErrorAlert(props: SubmitErrorMessageProps) {
11
- const form = useFormContext();
12
- const message = useStoreState(form, (s) => {
13
- return s?.errors[props.name] as string | undefined;
14
- });
15
-
16
- return (
17
- <div role="alert" {...cx(props, submitErrorAlert.container)}>
18
- {message}
19
- </div>
20
- );
21
- }
@@ -1,9 +0,0 @@
1
- import { style } from "@vanilla-extract/css";
2
-
3
- export const submitErrorAlert = {
4
- container: style({
5
- ":empty": {
6
- display: "none",
7
- },
8
- }),
9
- };
@@ -1,62 +0,0 @@
1
- import { globalStyle } from "@vanilla-extract/css";
2
-
3
- // Apply global vars
4
- import "./vars.css.ts";
5
-
6
- globalStyle(":root", {
7
- interpolateSize: "allow-keywords",
8
- fontSynthesis: "none",
9
- textRendering: "optimizeLegibility",
10
- WebkitFontSmoothing: "antialiased",
11
- MozOsxFontSmoothing: "grayscale",
12
- WebkitTapHighlightColor: "transparent",
13
- });
14
-
15
- globalStyle("*", {
16
- boxSizing: "border-box",
17
- });
18
-
19
- globalStyle("img, picture, svg", {
20
- display: "block",
21
- });
22
-
23
- globalStyle("a", {
24
- display: "block",
25
- color: "inherit",
26
- textDecoration: "none",
27
- });
28
-
29
- globalStyle("input, textarea", {
30
- fontFamily: "inherit",
31
- });
32
-
33
- globalStyle("button", {
34
- display: "block",
35
- fontSize: "inherit",
36
- fontFamily: "inherit",
37
- backgroundColor: "transparent",
38
- border: "none",
39
- color: "inherit",
40
- cursor: "pointer",
41
- padding: 0,
42
- });
43
-
44
- globalStyle("body, h1, h2, h3, h4, h5, h6, p, ul, li, ol", {
45
- margin: 0,
46
- padding: 0,
47
- });
48
-
49
- globalStyle("ul, ol", {
50
- listStyle: "none",
51
- });
52
-
53
- // Fathom SPA support depends on this image being added to the DOM, but they
54
- // are sloppy about taking out of the document flow, meaning that on pages
55
- // that are 100vh, there is a scrollbar flicker as the img element is added
56
- // to the DOM and then removed. This fixes said issue.
57
- globalStyle(`img[src^="https://cdn.usefathom.com/"]`, {
58
- position: "absolute",
59
- top: 0,
60
- left: 0,
61
- opacity: 0.01,
62
- });
package/lib/groupBy.ts DELETED
@@ -1,25 +0,0 @@
1
- export function groupBy<T, K extends string>(
2
- items: T[],
3
- getKey: (item: T) => K,
4
- ) {
5
- const groups: Partial<Record<K, T[]>> = {};
6
-
7
- for (const item of items) {
8
- const key = getKey(item);
9
- const group = groups[key];
10
- if (group) {
11
- group.push(item);
12
- } else {
13
- groups[key] = [item];
14
- }
15
- }
16
-
17
- // Using a Proxy to make sure that even if one of the possible group keys
18
- // was not included in the provided list, that group will still return
19
- // an empty list rather than `undefined`.
20
- return new Proxy(groups, {
21
- get(target, prop, receiver) {
22
- return Reflect.get(target, prop, receiver) ?? [];
23
- },
24
- }) as Record<K, T[]>;
25
- }
package/lib/hrefs.ts DELETED
@@ -1,48 +0,0 @@
1
- import type { LinkUtmParams, createUtm } from "./utm.ts";
2
-
3
- type InputAppHrefs = {
4
- login: () => string;
5
- password: () => string;
6
- join: () => string;
7
- dashboard: () => string;
8
- account: () => string;
9
-
10
- // These are usually external links to the root domain, so we want to be
11
- // able to set some tracking params.
12
- terms?: (linkUtm?: LinkUtmParams) => string;
13
- privacy?: (linkUtm?: LinkUtmParams) => string;
14
- cookies?: (linkUtm?: LinkUtmParams) => string;
15
- };
16
-
17
- export type AppHrefs = Required<InputAppHrefs>;
18
-
19
- export function createHrefs<T extends InputAppHrefs>(params: {
20
- /**
21
- * Hrefs to be used for the given app. At minimum, you need to provide
22
- * the core hrefs required by Appkit.
23
- */
24
- hrefs: T;
25
-
26
- /**
27
- * The function responsible for generating UTM tags. You should
28
- * use the return value of {@link createUtm} unless you are doing something
29
- * unusual.
30
- */
31
- utm: ReturnType<typeof createUtm>;
32
- }) {
33
- const { utm, hrefs } = params;
34
-
35
- return {
36
- terms: (linkUtm?: LinkUtmParams) =>
37
- `https://indietabletop.club/terms?${utm(linkUtm)}`,
38
- privacy: (linkUtm?: LinkUtmParams) =>
39
- `https://indietabletop.club/privacy?${utm(linkUtm)}`,
40
- cookies: (linkUtm?: LinkUtmParams) =>
41
- `https://indietabletop.club/cookies?${utm(linkUtm)}`,
42
- itc: (linkUtm?: LinkUtmParams) =>
43
- `https://indietabletop.club?${utm(linkUtm)}`,
44
- fathom: () => `https://usefathom.com`,
45
-
46
- ...hrefs,
47
- };
48
- }
package/lib/idToDate.ts DELETED
@@ -1,8 +0,0 @@
1
- /**
2
- * Given an doc id like `2025-01-01-some-name`, will return a date matching
3
- * the starting portion of the id.
4
- */
5
- export function idToDate(id: string, fallback: () => Date) {
6
- const dateString = /^(?<date>\d{4}-\d{2}-\d{2})/.exec(id)?.groups?.date;
7
- return dateString ? new Date(dateString) : fallback();
8
- }
package/lib/ids.ts DELETED
@@ -1,6 +0,0 @@
1
- import { customAlphabet } from "nanoid";
2
-
3
- export const getId = customAlphabet(
4
- "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
5
- 12,
6
- );
package/lib/index.ts DELETED
@@ -1,71 +0,0 @@
1
- // Components
2
- export * from "./account/CurrentUserFetcher.tsx";
3
- export * from "./account/JoinCard.tsx";
4
- export * from "./account/LoginCard.tsx";
5
- export * from "./account/PasswordResetCard.tsx";
6
- export * from "./AppConfig/AppConfig.tsx";
7
- export * from "./AuthCard/AuthCard.tsx";
8
- export * from "./DialogTrigger/index.tsx";
9
- export * from "./DocumentTitle/DocumentTitle.tsx";
10
- export * from "./ExternalLink.tsx";
11
- export * from "./form/FormSubmitButton.tsx";
12
- export * from "./form/SubmitErrorAlert.tsx";
13
- export * from "./FullscreenDismissBlocker.tsx";
14
- export * from "./IndieTabletopClubLogo.tsx";
15
- export * from "./IndieTabletopClubSymbol.tsx";
16
- export * from "./Letterhead/index.tsx";
17
- export * from "./LetterheadForm/index.tsx";
18
- export * from "./LoadingIndicator.tsx";
19
- export * from "./MiddotSeparated/MiddotSeparated.tsx";
20
- export * from "./ModalDialog/index.tsx";
21
- export * from "./QRCode/QRCode.tsx";
22
- export * from "./ReleaseInfo/index.tsx";
23
- export * from "./SafariCheck/SafariCheck.tsx";
24
- export * from "./ServiceWorkerHandler.tsx";
25
- export * from "./ShareButton/ShareButton.tsx";
26
- export * from "./SubscribeCard/SubscribeByEmailCard.tsx";
27
- export * from "./SubscribeCard/SubscribeByPledgeCard.tsx";
28
-
29
- // Hooks
30
- export * from "./RulesetResolver.ts";
31
- export * from "./use-async-op.ts";
32
- export * from "./use-document-background-color.ts";
33
- export * from "./use-form.ts";
34
- export * from "./use-is-installed.ts";
35
- export * from "./use-media-query.ts";
36
- export * from "./use-reverting-state.ts";
37
- export * from "./use-scroll-restoration.ts";
38
- export * from "./useEnsureValue.ts";
39
- export * from "./useInvokeClient.ts";
40
- export * from "./useIsVisible.ts";
41
-
42
- // Utils
43
- export * from "./append-copy-to-text.ts";
44
- export * from "./async-op.ts";
45
- export * from "./caught-value.ts";
46
- export * from "./class-names.ts";
47
- export * from "./client.ts";
48
- export * from "./copyrightRange.ts";
49
- export * from "./createSafeStorage.ts";
50
- export * from "./failureMessages.ts";
51
- export * from "./groupBy.ts";
52
- export * from "./HistoryState.ts";
53
- export * from "./hrefs.ts";
54
- export * from "./ids.ts";
55
- export * from "./idToDate.ts";
56
- export * from "./mailto.ts";
57
- export * from "./media.ts";
58
- export * from "./random.ts";
59
- export * from "./result/swr.ts";
60
- export * from "./sleep.ts";
61
- export * from "./structs.ts";
62
- export * from "./typeguards.ts";
63
- export * from "./types.ts";
64
- export * from "./unique.ts";
65
- export * from "./utm.ts";
66
- export * from "./validations.ts";
67
-
68
- // Other
69
- export * from "./EnumMapper.ts";
70
- export * from "./ModernIDB/index.ts";
71
- export * from "./store/index.tsx";
@@ -1,10 +0,0 @@
1
- import { createVar, style } from "@vanilla-extract/css";
2
- import { bounce } from "./animations.css.ts";
3
-
4
- export const animationDelay = createVar();
5
-
6
- export const dot = style({
7
- fill: "currentcolor",
8
- opacity: 0.8,
9
- animation: `${bounce} 2s ${animationDelay} infinite`,
10
- });
package/lib/mailto.ts DELETED
@@ -1,40 +0,0 @@
1
- /**
2
- * Encodes values to be used in mailto protocol.
3
- *
4
- * Note that we cannot simply use URLSeachParams because they, for example, encode a space
5
- * as plus (+), which cannot be used in mailto if we want to have consistent behaviour in
6
- * all email clients.
7
- */
8
- function encodeValuesForMailto<T extends object>(object: T) {
9
- return Object.entries(object)
10
- .filter(([_, v]) => !!v)
11
- .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)
12
- .join("&");
13
- }
14
-
15
- function serializeArray(value?: string | string[] | null) {
16
- return Array.isArray(value) ? value.join(",") : value;
17
- }
18
-
19
- type MailtoPayload = {
20
- body?: string | null;
21
- subject?: string | null;
22
- cc?: string | string[] | null;
23
- bcc?: string | string[] | null;
24
- };
25
-
26
- export function mailto(recipient: string | null, payload?: MailtoPayload) {
27
- // If the recipient is falsy the user can choose who to send the email to.
28
- const to = recipient ?? "";
29
-
30
- const serialized = payload
31
- ? `?${encodeValuesForMailto({
32
- body: payload.body,
33
- subject: payload.subject,
34
- cc: serializeArray(payload.cc),
35
- bcc: serializeArray(payload.bcc),
36
- })}`
37
- : "";
38
-
39
- return `mailto:${to}${serialized}`;
40
- }
package/lib/media.ts DELETED
@@ -1,50 +0,0 @@
1
- /**
2
- * @see https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme
3
- */
4
-
5
- export enum PrefersColorScheme {
6
- LIGHT = "(prefers-color-scheme: light)",
7
- DARK = "(prefers-color-scheme: dark)",
8
- }
9
- /**
10
- * @see https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion
11
- */
12
-
13
- export enum PrefersReducedMotion {
14
- NO_PREFERENCE = "(prefers-reduced-motion: no-preference)",
15
- REDUCE = "(prefers-reduced-motion: reduce)",
16
- }
17
-
18
- export enum Hover {
19
- NONE = "(hover: none)",
20
-
21
- // Some Samsung phones incorrectly report that they have "hover" even though they
22
- // do not. Adding the pointer query correctly filters these phones out.
23
- HOVER = "(hover: hover) and (pointer: fine)",
24
- }
25
-
26
- export enum MediaType {
27
- PRINT = "print",
28
- SCREEN = "screen",
29
- }
30
-
31
- export enum MinHeight {
32
- TALL = "(min-height: 40em)",
33
- }
34
-
35
- export enum MinWidth {
36
- SMALL = "(min-width: 28em)",
37
- MEDIUM = "(min-width: 50em)",
38
- WIDE = "(min-width: 66em)",
39
- X_WIDE = "(min-width: 80em)",
40
- XX_WIDE = "(min-width: 140em)",
41
- }
42
-
43
- export enum DisplayMode {
44
- STANDALONE = "(display-mode: standalone)",
45
- }
46
-
47
- export enum Pointer {
48
- COARSE = "(pointer: coarse)",
49
- FINE = "(pointer: fine)",
50
- }
package/lib/random.ts DELETED
@@ -1,19 +0,0 @@
1
- export function random(max: number) {
2
- return Math.floor(Math.random() * max);
3
- }
4
-
5
- export function randomItem<T>(array: T[]) {
6
- return array[random(array.length)];
7
- }
8
-
9
- export function randomItemOrThrow<T>(array: T[]) {
10
- const item = array[random(array.length)];
11
-
12
- if (!item) {
13
- throw new Error(
14
- "Could not select a random item from list. Perhaps the list is empty?",
15
- );
16
- }
17
-
18
- return item;
19
- }
package/lib/result/swr.ts DELETED
@@ -1,18 +0,0 @@
1
- import type { SWRResponse } from "swr";
2
- import { Failure, Pending } from "../async-op.ts";
3
- import type { FailurePayload } from "../types.ts";
4
-
5
- export function swrResponseToResult<T>(response: SWRResponse<T, unknown>) {
6
- const { data, error } = response;
7
-
8
- if (data !== undefined) {
9
- return data;
10
- }
11
-
12
- if (error !== undefined) {
13
- console.error(error);
14
- return new Failure<FailurePayload>({ type: "UNKNOWN_ERROR" });
15
- }
16
-
17
- return new Pending();
18
- }