@indietabletop/appkit 7.0.0-0 → 7.0.0-rc.1

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 (286) hide show
  1. package/lib/AppConfig/AppConfig.tsx +80 -0
  2. package/lib/AppConfig/formatters.tsx +48 -0
  3. package/lib/AuthCard/AuthCard.stories.ts +34 -0
  4. package/lib/AuthCard/AuthCard.tsx +64 -0
  5. package/lib/AuthCard/style.css.ts +49 -0
  6. package/lib/CacheProvider.tsx +20 -0
  7. package/lib/DialogTrigger/index.tsx +36 -0
  8. package/lib/DocumentTitle/DocumentTitle.tsx +10 -0
  9. package/lib/EnumMapper.ts +50 -0
  10. package/lib/ExternalLink.tsx +10 -0
  11. package/lib/FullscreenDismissBlocker.tsx +23 -0
  12. package/{dist/HistoryState.d.ts → lib/HistoryState.ts} +5 -2
  13. package/lib/IndieTabletopClubLogo.tsx +44 -0
  14. package/lib/IndieTabletopClubSymbol.tsx +37 -0
  15. package/lib/InfoPage/index.tsx +46 -0
  16. package/lib/InfoPage/pages.tsx +36 -0
  17. package/lib/InfoPage/style.css.ts +36 -0
  18. package/lib/Letterhead/index.tsx +85 -0
  19. package/lib/Letterhead/stories.tsx +41 -0
  20. package/lib/Letterhead/style.css.ts +152 -0
  21. package/lib/LetterheadForm/LetterheadReadonlyTextField.stories.tsx +17 -0
  22. package/lib/LetterheadForm/LetterheadSubmitError.stories.tsx +19 -0
  23. package/lib/LetterheadForm/LetterheadTextField.stories.tsx +19 -0
  24. package/lib/LetterheadForm/index.tsx +137 -0
  25. package/lib/LetterheadForm/style.css.ts +89 -0
  26. package/lib/ListView/ListView.stories.tsx +36 -0
  27. package/lib/ListView/ListView.tsx +80 -0
  28. package/lib/ListView/style.css.ts +90 -0
  29. package/lib/LoadingIndicator.tsx +40 -0
  30. package/lib/MiddotSeparated/MiddotSeparated.stories.ts +26 -0
  31. package/lib/MiddotSeparated/MiddotSeparated.tsx +26 -0
  32. package/lib/MiddotSeparated/style.css.ts +10 -0
  33. package/lib/ModalDialog/index.tsx +28 -0
  34. package/lib/ModalDialog/style.css.ts +88 -0
  35. package/lib/ModernIDB/Cursor.ts +91 -0
  36. package/lib/ModernIDB/ModernIDB.ts +337 -0
  37. package/lib/ModernIDB/ModernIDBError.ts +9 -0
  38. package/lib/ModernIDB/ObjectStore.ts +195 -0
  39. package/lib/ModernIDB/ObjectStoreIndex.ts +102 -0
  40. package/lib/ModernIDB/README.md +9 -0
  41. package/lib/ModernIDB/Transaction.ts +40 -0
  42. package/lib/ModernIDB/VersionChangeManager.ts +57 -0
  43. package/lib/ModernIDB/bindings/factory.tsx +165 -0
  44. package/lib/ModernIDB/bindings/index.ts +2 -0
  45. package/{dist/ModernIDB/bindings/types.d.ts → lib/ModernIDB/bindings/types.ts} +32 -13
  46. package/lib/ModernIDB/bindings/utils.tsx +32 -0
  47. package/lib/ModernIDB/index.ts +10 -0
  48. package/lib/ModernIDB/types.ts +120 -0
  49. package/lib/ModernIDB/utils.ts +51 -0
  50. package/lib/QRCode/QRCode.stories.tsx +41 -0
  51. package/lib/QRCode/QRCode.tsx +54 -0
  52. package/lib/QRCode/style.css.ts +23 -0
  53. package/lib/ReleaseInfo/index.tsx +29 -0
  54. package/lib/RichText/RichText.tsx +55 -0
  55. package/lib/RichText/style.css.ts +147 -0
  56. package/lib/RulesetResolver.ts +214 -0
  57. package/lib/SafariCheck/SafariCheck.stories.tsx +99 -0
  58. package/lib/SafariCheck/SafariCheck.tsx +273 -0
  59. package/lib/SafariCheck/addToDock.svg +13 -0
  60. package/lib/SafariCheck/addToHomeScreen.svg +12 -0
  61. package/lib/SafariCheck/safari.svg +32 -0
  62. package/lib/SafariCheck/shareIcon.svg +11 -0
  63. package/lib/SafariCheck/style.css.ts +106 -0
  64. package/lib/ServiceWorkerHandler.tsx +53 -0
  65. package/lib/ShareButton/ShareButton.stories.tsx +58 -0
  66. package/lib/ShareButton/ShareButton.tsx +153 -0
  67. package/lib/ShareButton/test.css.ts +3 -0
  68. package/lib/SubscribeCard/LetterheadInfoCard.tsx +23 -0
  69. package/lib/SubscribeCard/SubscribeByEmailCard.stories.tsx +69 -0
  70. package/lib/SubscribeCard/SubscribeByEmailCard.tsx +183 -0
  71. package/lib/SubscribeCard/SubscribeByPledgeCard.stories.tsx +133 -0
  72. package/lib/SubscribeCard/SubscribeByPledgeCard.tsx +127 -0
  73. package/lib/SubscribeCard/style.css.ts +14 -0
  74. package/lib/Sync/SyncIcon.stories.tsx +67 -0
  75. package/lib/Sync/SyncIcon.tsx +102 -0
  76. package/lib/Sync/SyncLog.tsx +222 -0
  77. package/lib/Sync/SyncLogList.stories.tsx +219 -0
  78. package/lib/Sync/style.css.ts +126 -0
  79. package/lib/account/AccountIcon.tsx +15 -0
  80. package/lib/account/AccountIssueView.tsx +44 -0
  81. package/lib/account/AlreadyLoggedInView.tsx +47 -0
  82. package/lib/account/CurrentUserFetcher.stories.tsx +292 -0
  83. package/lib/account/CurrentUserFetcher.tsx +118 -0
  84. package/lib/account/FailureFallbackView.tsx +36 -0
  85. package/lib/account/JoinCard.stories.tsx +257 -0
  86. package/lib/account/JoinCard.tsx +301 -0
  87. package/lib/account/LoadingView.tsx +14 -0
  88. package/lib/account/LoginCard.stories.tsx +288 -0
  89. package/lib/account/LoginCard.tsx +100 -0
  90. package/lib/account/LoginView.tsx +151 -0
  91. package/lib/account/NoConnectionView.tsx +34 -0
  92. package/lib/account/PasswordResetCard.stories.tsx +242 -0
  93. package/lib/account/PasswordResetCard.tsx +296 -0
  94. package/lib/account/UserMismatchView.tsx +62 -0
  95. package/lib/account/VerifyPage.tsx +195 -0
  96. package/lib/account/iconMask.svg +3 -0
  97. package/lib/account/style.css.ts +81 -0
  98. package/{dist/account/types.d.ts → lib/account/types.ts} +6 -3
  99. package/lib/account/useFetchCurrentUser.tsx +63 -0
  100. package/lib/account/useRedirectPath.ts +21 -0
  101. package/lib/animations.css.ts +17 -0
  102. package/lib/append-copy-to-text.ts +35 -0
  103. package/lib/async-op.ts +298 -0
  104. package/lib/atomic.css.ts +11 -0
  105. package/{dist/caught-value.d.ts → lib/caught-value.ts} +11 -1
  106. package/{dist/class-names.d.ts → lib/class-names.ts} +17 -6
  107. package/lib/client.ts +662 -0
  108. package/lib/common.css.ts +48 -0
  109. package/lib/copyrightRange.ts +10 -0
  110. package/lib/createSafeStorage.ts +91 -0
  111. package/lib/createStrictContext.ts +15 -0
  112. package/lib/failureMessages.ts +108 -0
  113. package/lib/form/FormSubmitButton.tsx +58 -0
  114. package/lib/form/SubmitErrorAlert.tsx +21 -0
  115. package/lib/form/style.css.ts +9 -0
  116. package/lib/globals.css.ts +62 -0
  117. package/lib/groupBy.ts +25 -0
  118. package/lib/hrefs.ts +48 -0
  119. package/lib/idToDate.ts +8 -0
  120. package/lib/ids.ts +6 -0
  121. package/lib/index.ts +78 -0
  122. package/lib/internal.css.ts +10 -0
  123. package/lib/layers.css.ts +3 -0
  124. package/lib/mailto.ts +40 -0
  125. package/lib/media.ts +50 -0
  126. package/lib/random.ts +19 -0
  127. package/lib/result/swr.ts +18 -0
  128. package/{dist/sleep.d.ts → lib/sleep.ts} +3 -1
  129. package/lib/store/index.tsx +292 -0
  130. package/lib/store/store.ts +482 -0
  131. package/lib/store/types.ts +45 -0
  132. package/lib/store/utils.ts +54 -0
  133. package/lib/storybook/decorators.tsx +10 -0
  134. package/lib/structs.ts +3 -0
  135. package/{dist/typeguards.d.ts → lib/typeguards.ts} +3 -1
  136. package/{dist/types.d.ts → lib/types.ts} +23 -12
  137. package/lib/unique.ts +24 -0
  138. package/lib/use-async-op.ts +16 -0
  139. package/lib/use-document-background-color.ts +16 -0
  140. package/lib/use-form.ts +78 -0
  141. package/lib/use-is-installed.ts +17 -0
  142. package/lib/use-media-query.ts +21 -0
  143. package/lib/use-reverting-state.ts +32 -0
  144. package/lib/use-scroll-restoration.ts +99 -0
  145. package/lib/useEnsureValue.ts +31 -0
  146. package/lib/useFetchJson.tsx +52 -0
  147. package/lib/useInvokeClient.ts +54 -0
  148. package/lib/useIsVisible.ts +27 -0
  149. package/lib/utm.ts +92 -0
  150. package/lib/validations.ts +25 -0
  151. package/lib/vars.css.ts +13 -0
  152. package/package.json +23 -29
  153. package/dist/AppConfig/AppConfig.d.ts +0 -29
  154. package/dist/AuthCard/AuthCard.d.ts +0 -10
  155. package/dist/AuthCard/AuthCard.stories.d.ts +0 -34
  156. package/dist/AuthCard/style.css.d.ts +0 -23
  157. package/dist/DialogTrigger/index.d.ts +0 -13
  158. package/dist/DocumentTitle/DocumentTitle.d.ts +0 -3
  159. package/dist/EnumMapper.d.ts +0 -25
  160. package/dist/ExternalLink.d.ts +0 -3
  161. package/dist/FullscreenDismissBlocker.d.ts +0 -5
  162. package/dist/IndieTabletopClubLogo.d.ts +0 -7
  163. package/dist/IndieTabletopClubSymbol.d.ts +0 -7
  164. package/dist/InfoPage/index.d.ts +0 -8
  165. package/dist/InfoPage/pages.d.ts +0 -2
  166. package/dist/InfoPage/style.css.d.ts +0 -5
  167. package/dist/Letterhead/index.d.ts +0 -19
  168. package/dist/Letterhead/stories.d.ts +0 -13
  169. package/dist/Letterhead/style.css.d.ts +0 -46
  170. package/dist/LetterheadForm/LetterheadReadonlyTextField.stories.d.ts +0 -17
  171. package/dist/LetterheadForm/LetterheadSubmitError.stories.d.ts +0 -11
  172. package/dist/LetterheadForm/LetterheadTextField.stories.d.ts +0 -336
  173. package/dist/LetterheadForm/index.d.ts +0 -44
  174. package/dist/LetterheadForm/style.css.d.ts +0 -8
  175. package/dist/LoadingIndicator.d.ts +0 -3
  176. package/dist/MiddotSeparated/MiddotSeparated.d.ts +0 -8
  177. package/dist/MiddotSeparated/MiddotSeparated.stories.d.ts +0 -586
  178. package/dist/MiddotSeparated/style.css.d.ts +0 -1
  179. package/dist/ModalDialog/index.d.ts +0 -12
  180. package/dist/ModalDialog/style.css.d.ts +0 -58
  181. package/dist/ModernIDB/Cursor.d.ts +0 -56
  182. package/dist/ModernIDB/ModernIDB.d.ts +0 -66
  183. package/dist/ModernIDB/ModernIDBError.d.ts +0 -3
  184. package/dist/ModernIDB/ObjectStore.d.ts +0 -112
  185. package/dist/ModernIDB/ObjectStoreIndex.d.ts +0 -53
  186. package/dist/ModernIDB/Transaction.d.ts +0 -16
  187. package/dist/ModernIDB/VersionChangeManager.d.ts +0 -30
  188. package/dist/ModernIDB/bindings/factory.d.ts +0 -12
  189. package/dist/ModernIDB/bindings/index.d.ts +0 -2
  190. package/dist/ModernIDB/bindings/utils.d.ts +0 -2
  191. package/dist/ModernIDB/index.d.ts +0 -10
  192. package/dist/ModernIDB/types.d.ts +0 -88
  193. package/dist/ModernIDB/utils.d.ts +0 -4
  194. package/dist/QRCode/QRCode.d.ts +0 -7
  195. package/dist/QRCode/QRCode.stories.d.ts +0 -33
  196. package/dist/QRCode/style.css.d.ts +0 -4
  197. package/dist/ReleaseInfo/index.d.ts +0 -5
  198. package/dist/RulesetResolver.d.ts +0 -87
  199. package/dist/SafariCheck/SafariCheck.d.ts +0 -23
  200. package/dist/SafariCheck/SafariCheck.stories.d.ts +0 -73
  201. package/dist/SafariCheck/style.css.d.ts +0 -17
  202. package/dist/ServiceWorkerHandler.d.ts +0 -11
  203. package/dist/ShareButton/ShareButton.d.ts +0 -57
  204. package/dist/ShareButton/ShareButton.stories.d.ts +0 -1577
  205. package/dist/ShareButton/test.css.d.ts +0 -1
  206. package/dist/SubscribeCard/LetterheadInfoCard.d.ts +0 -2
  207. package/dist/SubscribeCard/SubscribeByEmailCard.d.ts +0 -24
  208. package/dist/SubscribeCard/SubscribeByEmailCard.stories.d.ts +0 -10
  209. package/dist/SubscribeCard/SubscribeByPledgeCard.d.ts +0 -36
  210. package/dist/SubscribeCard/SubscribeByPledgeCard.stories.d.ts +0 -65
  211. package/dist/SubscribeCard/style.css.d.ts +0 -4
  212. package/dist/account/AccountIssueView.d.ts +0 -3
  213. package/dist/account/AlreadyLoggedInView.d.ts +0 -5
  214. package/dist/account/CurrentUserFetcher.d.ts +0 -20
  215. package/dist/account/CurrentUserFetcher.stories.d.ts +0 -136
  216. package/dist/account/FailureFallbackView.d.ts +0 -1
  217. package/dist/account/JoinCard.d.ts +0 -14
  218. package/dist/account/JoinCard.stories.d.ts +0 -143
  219. package/dist/account/LoadingView.d.ts +0 -1
  220. package/dist/account/LoginCard.d.ts +0 -39
  221. package/dist/account/LoginCard.stories.d.ts +0 -217
  222. package/dist/account/LoginView.d.ts +0 -10
  223. package/dist/account/NoConnectionView.d.ts +0 -4
  224. package/dist/account/PasswordResetCard.d.ts +0 -15
  225. package/dist/account/PasswordResetCard.stories.d.ts +0 -128
  226. package/dist/account/UserMismatchView.d.ts +0 -6
  227. package/dist/account/VerifyPage.d.ts +0 -13
  228. package/dist/account/style.css.d.ts +0 -10
  229. package/dist/account/useFetchCurrentUser.d.ts +0 -28
  230. package/dist/account/useRedirectPath.d.ts +0 -6
  231. package/dist/animations.css.d.ts +0 -3
  232. package/dist/append-copy-to-text.d.ts +0 -10
  233. package/dist/append-copy-to-text.test.d.ts +0 -1
  234. package/dist/appkit.css +0 -1
  235. package/dist/appkit.js +0 -10692
  236. package/dist/async-op.d.ts +0 -101
  237. package/dist/atomic.css.d.ts +0 -6
  238. package/dist/client.d.ts +0 -424
  239. package/dist/common.css.d.ts +0 -5
  240. package/dist/copyrightRange.d.ts +0 -1
  241. package/dist/copyrightRange.test.d.ts +0 -1
  242. package/dist/createSafeStorage.d.ts +0 -34
  243. package/dist/failureMessages.d.ts +0 -20
  244. package/dist/failureMessages.test.d.ts +0 -1
  245. package/dist/form/FormSubmitButton.d.ts +0 -17
  246. package/dist/form/SubmitErrorAlert.d.ts +0 -5
  247. package/dist/form/style.css.d.ts +0 -3
  248. package/dist/globals.css.d.ts +0 -0
  249. package/dist/groupBy.d.ts +0 -1
  250. package/dist/groupBy.test.d.ts +0 -1
  251. package/dist/hrefs.d.ts +0 -32
  252. package/dist/hrefs.test.d.ts +0 -1
  253. package/dist/idToDate.d.ts +0 -5
  254. package/dist/idToDate.test.d.ts +0 -1
  255. package/dist/ids.d.ts +0 -1
  256. package/dist/ids.test.d.ts +0 -1
  257. package/dist/index.d.ts +0 -64
  258. package/dist/internal.css.d.ts +0 -2
  259. package/dist/mailto.d.ts +0 -8
  260. package/dist/mailto.test.d.ts +0 -1
  261. package/dist/media.d.ts +0 -39
  262. package/dist/random.d.ts +0 -3
  263. package/dist/result/swr.d.ts +0 -4
  264. package/dist/store/index.d.ts +0 -237
  265. package/dist/store/store.d.ts +0 -144
  266. package/dist/store/types.d.ts +0 -49
  267. package/dist/store/utils.d.ts +0 -10
  268. package/dist/storybook/decorators.d.ts +0 -3
  269. package/dist/structs.d.ts +0 -1
  270. package/dist/typeguards.test.d.ts +0 -1
  271. package/dist/unique.d.ts +0 -10
  272. package/dist/unique.test.d.ts +0 -1
  273. package/dist/use-async-op.d.ts +0 -6
  274. package/dist/use-document-background-color.d.ts +0 -4
  275. package/dist/use-form.d.ts +0 -29
  276. package/dist/use-is-installed.d.ts +0 -8
  277. package/dist/use-media-query.d.ts +0 -1
  278. package/dist/use-reverting-state.d.ts +0 -5
  279. package/dist/use-scroll-restoration.d.ts +0 -25
  280. package/dist/useEnsureValue.d.ts +0 -6
  281. package/dist/useInvokeClient.d.ts +0 -25
  282. package/dist/useIsVisible.d.ts +0 -4
  283. package/dist/utm.d.ts +0 -58
  284. package/dist/utm.test.d.ts +0 -1
  285. package/dist/validations.d.ts +0 -3
  286. package/dist/vars.css.d.ts +0 -10
@@ -0,0 +1,90 @@
1
+ import { createThemeContract, fallbackVar, style } from "@vanilla-extract/css";
2
+ import { appkit } from "../layers.css.ts";
3
+
4
+ export const listViewTheme = createThemeContract({
5
+ headingFont: null,
6
+ headingSize: null,
7
+ summaryFont: null,
8
+ summarySize: null,
9
+ blockSpace: null,
10
+ inlineSpace: null,
11
+ });
12
+
13
+ export const item = {
14
+ container: style({
15
+ "@layer": {
16
+ [appkit]: {
17
+ display: "flex",
18
+ gap: fallbackVar(listViewTheme.inlineSpace, "1rem"),
19
+ },
20
+ },
21
+ }),
22
+
23
+ content: style({
24
+ "@layer": {
25
+ [appkit]: {
26
+ flexGrow: 1,
27
+ },
28
+ },
29
+ }),
30
+
31
+ heading: style({
32
+ "@layer": {
33
+ [appkit]: {
34
+ fontFamily: listViewTheme.headingFont,
35
+ fontSize: fallbackVar(listViewTheme.headingSize, "1.25rem"),
36
+ lineHeight: "1lh",
37
+ },
38
+ },
39
+ }),
40
+
41
+ summary: style({
42
+ "@layer": {
43
+ [appkit]: {
44
+ fontFamily: listViewTheme.summaryFont,
45
+ fontSize: fallbackVar(listViewTheme.summarySize, "1rem"),
46
+ marginBlockStart: "0.5em",
47
+ lineHeight: 1.25,
48
+
49
+ ":empty": {
50
+ display: "none",
51
+ },
52
+ },
53
+ },
54
+ }),
55
+ };
56
+
57
+ const listContainerHook = style({});
58
+
59
+ export const list = {
60
+ container: style([
61
+ listContainerHook,
62
+ {
63
+ "@layer": {
64
+ [appkit]: {
65
+ display: "flex",
66
+ flexDirection: "column",
67
+ gap: fallbackVar(listViewTheme.blockSpace, "1.5rem"),
68
+
69
+ ":empty": {
70
+ display: "none",
71
+ },
72
+ },
73
+ },
74
+ },
75
+ ]),
76
+
77
+ empty: style({
78
+ "@layer": {
79
+ [appkit]: {
80
+ display: "none",
81
+
82
+ selectors: {
83
+ [`${listContainerHook}:empty + &`]: {
84
+ display: "initial",
85
+ },
86
+ },
87
+ },
88
+ },
89
+ }),
90
+ };
@@ -0,0 +1,40 @@
1
+ import { assignInlineVars } from "@vanilla-extract/dynamic";
2
+ import { animationDelay, dot } from "./internal.css.ts";
3
+
4
+ export function LoadingIndicator(props: { className?: string }) {
5
+ const diameter = 10;
6
+ const radius = diameter / 2;
7
+ const gap = diameter;
8
+ const cy = diameter;
9
+ const height = cy * 2;
10
+ const width = diameter * 3 + gap;
11
+ const initialDelay = 300;
12
+ const interBounceDelay = 150;
13
+
14
+ return (
15
+ <svg
16
+ viewBox={`0 0 ${width} ${height}`}
17
+ width={width}
18
+ height={height}
19
+ className={props.className}
20
+ preserveAspectRatio="xMidYMid meet"
21
+ >
22
+ <g stroke="none" fill="inherit">
23
+ {Array.from({ length: 3 }, (_, index) => {
24
+ const delay = `${initialDelay + interBounceDelay * index}ms`;
25
+
26
+ return (
27
+ <circle
28
+ key={index}
29
+ cx={radius * (index + 1) + gap * index}
30
+ cy={cy}
31
+ r={radius}
32
+ className={dot}
33
+ style={assignInlineVars({ [animationDelay]: delay })}
34
+ />
35
+ );
36
+ })}
37
+ </g>
38
+ </svg>
39
+ );
40
+ }
@@ -0,0 +1,26 @@
1
+ import preview from "../../.storybook/preview.tsx";
2
+ import { MiddotSeparated } from "./MiddotSeparated.tsx";
3
+
4
+ const meta = preview.meta({
5
+ title: "Components/Middot Separated",
6
+ component: MiddotSeparated,
7
+ tags: ["autodocs"],
8
+ });
9
+
10
+ /**
11
+ * The default case in which all steps of the flow succeed.
12
+ */
13
+ export const Default = meta.story({
14
+ args: {
15
+ children: ["Lorem", "Ipsum", " Dolor"],
16
+ },
17
+ });
18
+
19
+ /**
20
+ * Edge case when it comes to handling children in React.
21
+ */
22
+ export const SingleElement = meta.story({
23
+ args: {
24
+ children: "Lorem",
25
+ },
26
+ });
@@ -0,0 +1,26 @@
1
+ import { type HTMLAttributes, Children } from "react";
2
+ import { withMiddlot } from "./style.css.ts";
3
+
4
+ type MiddotSeparatedProps = HTMLAttributes<HTMLDivElement>;
5
+
6
+ /**
7
+ * A utility component that wraps children into spans and adds middledots
8
+ * between each item using CSS ::before pseudo elements.
9
+ */
10
+ export function MiddotSeparated(props: MiddotSeparatedProps) {
11
+ const { children, ...divProps } = props;
12
+
13
+ return (
14
+ <div {...divProps}>
15
+ {Children.toArray(children)
16
+ .filter((item) => item !== "")
17
+ .map((item, index) => {
18
+ return (
19
+ <span className={withMiddlot} key={index}>
20
+ {item}
21
+ </span>
22
+ );
23
+ })}
24
+ </div>
25
+ );
26
+ }
@@ -0,0 +1,10 @@
1
+ import { style } from "@vanilla-extract/css";
2
+
3
+ export const withMiddlot = style({
4
+ selectors: {
5
+ "& + &::before": {
6
+ content: " · ",
7
+ opacity: 0.6,
8
+ },
9
+ },
10
+ });
@@ -0,0 +1,28 @@
1
+ import { Dialog, type DialogProps } from "@ariakit/react";
2
+ import type { RecipeVariants } from "@vanilla-extract/recipes";
3
+ import type { ReactNode } from "react";
4
+ import { cx } from "../class-names.ts";
5
+ import * as css from "./style.css.ts";
6
+
7
+ type Size = NonNullable<NonNullable<RecipeVariants<typeof css.dialog>>["size"]>;
8
+
9
+ export type ModalDialogProps = Omit<DialogProps, "modal" | "backdrop"> & {
10
+ children: ReactNode;
11
+ size: Size;
12
+ backdropClassName?: string;
13
+ };
14
+
15
+ export function ModalDialog(props: ModalDialogProps) {
16
+ const { size, backdropClassName, className, ...dialogProps } = props;
17
+
18
+ return (
19
+ <Dialog
20
+ {...dialogProps}
21
+ {...cx(className, css.dialog({ size }))}
22
+ backdrop={<div {...cx(css.backdrop, backdropClassName)} />}
23
+ modal
24
+ >
25
+ {props.children}
26
+ </Dialog>
27
+ );
28
+ }
@@ -0,0 +1,88 @@
1
+ import { style } from "@vanilla-extract/css";
2
+ import { recipe } from "@vanilla-extract/recipes";
3
+ import { MinWidth } from "../media.ts";
4
+ import { ZIndex } from "../vars.css.ts";
5
+
6
+ const scaleTransition = {
7
+ transition: "transform 200ms, opacity 200ms",
8
+ transform: "scale(1.1)",
9
+
10
+ selectors: {
11
+ "&[data-enter]": {
12
+ opacity: 1,
13
+ transform: "scale(1)",
14
+ },
15
+
16
+ "&[data-leave]": {
17
+ opacity: 0,
18
+ transform: "scale(0.9)",
19
+ },
20
+ },
21
+ };
22
+
23
+ const translateTransition = {
24
+ transition: "transform 200ms, opacity 200ms",
25
+ transform: "translateY(5rem)",
26
+
27
+ selectors: {
28
+ "&[data-enter]": {
29
+ opacity: 1,
30
+ transform: "translateY(0)",
31
+ },
32
+
33
+ "&[data-leave]": {
34
+ opacity: 0,
35
+ transform: "translateY(5rem)",
36
+ },
37
+ },
38
+ };
39
+
40
+ export const dialog = recipe({
41
+ base: {
42
+ position: "fixed",
43
+ inset: 0,
44
+ zIndex: ZIndex.DIALOG,
45
+ margin: "auto",
46
+ overflow: "auto",
47
+ opacity: 0,
48
+ backgroundColor: "white",
49
+ },
50
+
51
+ variants: {
52
+ size: {
53
+ large: {
54
+ ...translateTransition,
55
+ inlineSize: "100%",
56
+ blockSize: "100%",
57
+
58
+ "@media": {
59
+ [MinWidth.MEDIUM]: {
60
+ ...scaleTransition,
61
+ blockSize: "fit-content",
62
+ maxInlineSize: "40rem",
63
+ maxBlockSize: "90%",
64
+ borderRadius: "1rem",
65
+ },
66
+ },
67
+ },
68
+
69
+ small: {
70
+ ...scaleTransition,
71
+ inlineSize: "min(24rem, 90svw)",
72
+ blockSize: "fit-content",
73
+ borderRadius: "1rem",
74
+ },
75
+ },
76
+ },
77
+ });
78
+
79
+ export const backdrop = style({
80
+ backgroundColor: "black",
81
+ opacity: 0,
82
+ transition: "opacity 200ms",
83
+ selectors: {
84
+ "&[data-enter]": {
85
+ opacity: 0.4,
86
+ },
87
+ },
88
+ });
@@ -0,0 +1,91 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
2
+
3
+ import { requestToPromise } from "./utils.ts";
4
+
5
+ export class Cursor<C extends IDBCursor = IDBCursor> {
6
+ idbCursor: C;
7
+
8
+ constructor(idbCursor: C) {
9
+ this.idbCursor = idbCursor;
10
+ }
11
+
12
+ get key() {
13
+ return this.idbCursor.key;
14
+ }
15
+
16
+ get primaryKey() {
17
+ return this.idbCursor.primaryKey;
18
+ }
19
+
20
+ get direction() {
21
+ return this.idbCursor.direction;
22
+ }
23
+
24
+ /**
25
+ * Advances the cursor through the next count records in range.
26
+ *
27
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/IDBCursor/advance
28
+ */
29
+ advance(count: number): void {
30
+ this.idbCursor.advance(count);
31
+ }
32
+ /**
33
+ * Advances the cursor to the next record in range.
34
+ *
35
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/IDBCursor/continue)
36
+ */
37
+ continue(key?: IDBValidKey): void {
38
+ this.idbCursor.continue(key);
39
+ }
40
+ }
41
+
42
+ export class CursorWithValue<Item> extends Cursor<IDBCursorWithValue> {
43
+ get value(): Item {
44
+ return this.idbCursor.value;
45
+ }
46
+
47
+ /**
48
+ * Delete the record pointed at by the cursor.
49
+ *
50
+ * If successful, request's result will be undefined.
51
+ *
52
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/IDBCursor/delete)
53
+ */
54
+ delete(): Promise<undefined> {
55
+ return requestToPromise(this.idbCursor.delete());
56
+ }
57
+ /**
58
+ * Updated the record pointed at by the cursor with a new value.
59
+ *
60
+ * Throws a "DataError" DOMException if the effective object store uses in-line keys and the key would have changed.
61
+ *
62
+ * If successful, request's result will be the record's key.
63
+ *
64
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/IDBCursor/update)
65
+ */
66
+ update(value: Item): Promise<IDBValidKey> {
67
+ return requestToPromise(this.idbCursor.update(value));
68
+ }
69
+ }
70
+
71
+ export class IndexCursor extends Cursor {
72
+ /**
73
+ * Advances the cursor to the next record in range matching or after key and primaryKey. Throws an "InvalidAccessError" DOMException if the source is not an index.
74
+ *
75
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/IDBCursor/continuePrimaryKey)
76
+ */
77
+ continuePrimaryKey(key: IDBValidKey, primaryKey: IDBValidKey): void {
78
+ this.idbCursor.continuePrimaryKey(key, primaryKey);
79
+ }
80
+ }
81
+
82
+ export class IndexCursorWithValue<Item> extends CursorWithValue<Item> {
83
+ /**
84
+ * Advances the cursor to the next record in range matching or after key and primaryKey. Throws an "InvalidAccessError" DOMException if the source is not an index.
85
+ *
86
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/IDBCursor/continuePrimaryKey)
87
+ */
88
+ continuePrimaryKey(key: IDBValidKey, primaryKey: IDBValidKey): void {
89
+ this.idbCursor.continuePrimaryKey(key, primaryKey);
90
+ }
91
+ }