aidos-ui 3.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 (339) hide show
  1. package/.prettierrc +4 -0
  2. package/LICENSE +21 -0
  3. package/README.md +55 -0
  4. package/dist/Badge.d.ts +7 -0
  5. package/dist/Badge.js +22 -0
  6. package/dist/Badge.js.map +1 -0
  7. package/dist/BaseButton.d.ts +13 -0
  8. package/dist/BaseButton.js +22 -0
  9. package/dist/BaseButton.js.map +1 -0
  10. package/dist/BaseInput.d.ts +15 -0
  11. package/dist/BaseInput.js +14 -0
  12. package/dist/BaseInput.js.map +1 -0
  13. package/dist/BaseLink.d.ts +17 -0
  14. package/dist/BaseLink.js +28 -0
  15. package/dist/BaseLink.js.map +1 -0
  16. package/dist/BaseList.d.ts +6 -0
  17. package/dist/BaseList.js +14 -0
  18. package/dist/BaseList.js.map +1 -0
  19. package/dist/BaseListAddOn.d.ts +5 -0
  20. package/dist/BaseListAddOn.js +7 -0
  21. package/dist/BaseListAddOn.js.map +1 -0
  22. package/dist/BaseListItem.d.ts +27 -0
  23. package/dist/BaseListItem.js +26 -0
  24. package/dist/BaseListItem.js.map +1 -0
  25. package/dist/BaseView.d.ts +12 -0
  26. package/dist/BaseView.js +26 -0
  27. package/dist/BaseView.js.map +1 -0
  28. package/dist/Box.d.ts +5 -0
  29. package/dist/Box.js +6 -0
  30. package/dist/Box.js.map +1 -0
  31. package/dist/Button.d.ts +20 -0
  32. package/dist/Button.js +20 -0
  33. package/dist/Button.js.map +1 -0
  34. package/dist/Calendar.d.ts +18 -0
  35. package/dist/Calendar.js +57 -0
  36. package/dist/Calendar.js.map +1 -0
  37. package/dist/Card.d.ts +4 -0
  38. package/dist/Card.js +12 -0
  39. package/dist/Card.js.map +1 -0
  40. package/dist/Checkbox.d.ts +12 -0
  41. package/dist/Checkbox.js +32 -0
  42. package/dist/Checkbox.js.map +1 -0
  43. package/dist/Circle.d.ts +6 -0
  44. package/dist/Circle.js +12 -0
  45. package/dist/Circle.js.map +1 -0
  46. package/dist/Column.d.ts +6 -0
  47. package/dist/Column.js +7 -0
  48. package/dist/Column.js.map +1 -0
  49. package/dist/DarkMode.d.ts +13 -0
  50. package/dist/DarkMode.js +61 -0
  51. package/dist/DarkMode.js.map +1 -0
  52. package/dist/DateInput.d.ts +13 -0
  53. package/dist/DateInput.js +29 -0
  54. package/dist/DateInput.js.map +1 -0
  55. package/dist/DatePicker.d.ts +12 -0
  56. package/dist/DatePicker.js +34 -0
  57. package/dist/DatePicker.js.map +1 -0
  58. package/dist/DatetimeInput.d.ts +13 -0
  59. package/dist/DatetimeInput.js +31 -0
  60. package/dist/DatetimeInput.js.map +1 -0
  61. package/dist/DesignBook.d.ts +2 -0
  62. package/dist/DesignBook.js +55 -0
  63. package/dist/DesignBook.js.map +1 -0
  64. package/dist/Dialog.d.ts +17 -0
  65. package/dist/Dialog.js +86 -0
  66. package/dist/Dialog.js.map +1 -0
  67. package/dist/Dropdown.d.ts +10 -0
  68. package/dist/Dropdown.js +64 -0
  69. package/dist/Dropdown.js.map +1 -0
  70. package/dist/Emitter.d.ts +6 -0
  71. package/dist/Emitter.js +19 -0
  72. package/dist/Emitter.js.map +1 -0
  73. package/dist/FlexLayout.d.ts +11 -0
  74. package/dist/FlexLayout.js +18 -0
  75. package/dist/FlexLayout.js.map +1 -0
  76. package/dist/Icon.d.ts +12 -0
  77. package/dist/Icon.js +69 -0
  78. package/dist/Icon.js.map +1 -0
  79. package/dist/IconButton.d.ts +9 -0
  80. package/dist/IconButton.js +31 -0
  81. package/dist/IconButton.js.map +1 -0
  82. package/dist/IconLink.d.ts +9 -0
  83. package/dist/IconLink.js +31 -0
  84. package/dist/IconLink.js.map +1 -0
  85. package/dist/IconType.d.ts +1 -0
  86. package/dist/IconType.js +2 -0
  87. package/dist/IconType.js.map +1 -0
  88. package/dist/Interactable.d.ts +48 -0
  89. package/dist/Interactable.js +131 -0
  90. package/dist/Interactable.js.map +1 -0
  91. package/dist/Link.d.ts +20 -0
  92. package/dist/Link.js +22 -0
  93. package/dist/Link.js.map +1 -0
  94. package/dist/List.d.ts +11 -0
  95. package/dist/List.js +17 -0
  96. package/dist/List.js.map +1 -0
  97. package/dist/ListButtonItem.d.ts +15 -0
  98. package/dist/ListButtonItem.js +9 -0
  99. package/dist/ListButtonItem.js.map +1 -0
  100. package/dist/ListDivider.d.ts +2 -0
  101. package/dist/ListDivider.js +12 -0
  102. package/dist/ListDivider.js.map +1 -0
  103. package/dist/ListHeaderItem.d.ts +11 -0
  104. package/dist/ListHeaderItem.js +13 -0
  105. package/dist/ListHeaderItem.js.map +1 -0
  106. package/dist/ListItem.d.ts +10 -0
  107. package/dist/ListItem.js +7 -0
  108. package/dist/ListItem.js.map +1 -0
  109. package/dist/ListLinkItem.d.ts +17 -0
  110. package/dist/ListLinkItem.js +9 -0
  111. package/dist/ListLinkItem.js.map +1 -0
  112. package/dist/ListSpacer.d.ts +2 -0
  113. package/dist/ListSpacer.js +13 -0
  114. package/dist/ListSpacer.js.map +1 -0
  115. package/dist/OnVisible.d.ts +5 -0
  116. package/dist/OnVisible.js +28 -0
  117. package/dist/OnVisible.js.map +1 -0
  118. package/dist/Popover.d.ts +21 -0
  119. package/dist/Popover.js +88 -0
  120. package/dist/Popover.js.map +1 -0
  121. package/dist/ProgressBar.d.ts +8 -0
  122. package/dist/ProgressBar.js +42 -0
  123. package/dist/ProgressBar.js.map +1 -0
  124. package/dist/ProgressCircle.d.ts +6 -0
  125. package/dist/ProgressCircle.js +12 -0
  126. package/dist/ProgressCircle.js.map +1 -0
  127. package/dist/Providers.d.ts +9 -0
  128. package/dist/Providers.js +16 -0
  129. package/dist/Providers.js.map +1 -0
  130. package/dist/RangeInput.d.ts +14 -0
  131. package/dist/RangeInput.js +32 -0
  132. package/dist/RangeInput.js.map +1 -0
  133. package/dist/ResultOrError.d.ts +13 -0
  134. package/dist/ResultOrError.js +7 -0
  135. package/dist/ResultOrError.js.map +1 -0
  136. package/dist/RootView.d.ts +5 -0
  137. package/dist/RootView.js +35 -0
  138. package/dist/RootView.js.map +1 -0
  139. package/dist/Router.d.ts +2 -0
  140. package/dist/Router.js +37 -0
  141. package/dist/Router.js.map +1 -0
  142. package/dist/RouterState.d.ts +38 -0
  143. package/dist/RouterState.js +111 -0
  144. package/dist/RouterState.js.map +1 -0
  145. package/dist/Row.d.ts +6 -0
  146. package/dist/Row.js +7 -0
  147. package/dist/Row.js.map +1 -0
  148. package/dist/StackContext.d.ts +8 -0
  149. package/dist/StackContext.js +25 -0
  150. package/dist/StackContext.js.map +1 -0
  151. package/dist/StaticCheckbox.d.ts +17 -0
  152. package/dist/StaticCheckbox.js +48 -0
  153. package/dist/StaticCheckbox.js.map +1 -0
  154. package/dist/Storage.d.ts +12 -0
  155. package/dist/Storage.js +148 -0
  156. package/dist/Storage.js.map +1 -0
  157. package/dist/Stream.d.ts +9 -0
  158. package/dist/Stream.js +36 -0
  159. package/dist/Stream.js.map +1 -0
  160. package/dist/Sublist.d.ts +12 -0
  161. package/dist/Sublist.js +18 -0
  162. package/dist/Sublist.js.map +1 -0
  163. package/dist/SubmitIconInput.d.ts +9 -0
  164. package/dist/SubmitIconInput.js +25 -0
  165. package/dist/SubmitIconInput.js.map +1 -0
  166. package/dist/Tabs.d.ts +20 -0
  167. package/dist/Tabs.js +35 -0
  168. package/dist/Tabs.js.map +1 -0
  169. package/dist/Text.d.ts +25 -0
  170. package/dist/Text.js +50 -0
  171. package/dist/Text.js.map +1 -0
  172. package/dist/TextArea.d.ts +10 -0
  173. package/dist/TextArea.js +22 -0
  174. package/dist/TextArea.js.map +1 -0
  175. package/dist/TextInput.d.ts +14 -0
  176. package/dist/TextInput.js +52 -0
  177. package/dist/TextInput.js.map +1 -0
  178. package/dist/TextInputWithState.d.ts +10 -0
  179. package/dist/TextInputWithState.js +14 -0
  180. package/dist/TextInputWithState.js.map +1 -0
  181. package/dist/TextPairing.d.ts +21 -0
  182. package/dist/TextPairing.js +26 -0
  183. package/dist/TextPairing.js.map +1 -0
  184. package/dist/TimeInput.d.ts +15 -0
  185. package/dist/TimeInput.js +58 -0
  186. package/dist/TimeInput.js.map +1 -0
  187. package/dist/Tooltip.d.ts +11 -0
  188. package/dist/Tooltip.js +72 -0
  189. package/dist/Tooltip.js.map +1 -0
  190. package/dist/aria.d.ts +8 -0
  191. package/dist/aria.js +42 -0
  192. package/dist/aria.js.map +1 -0
  193. package/dist/guid.d.ts +1 -0
  194. package/dist/guid.js +7 -0
  195. package/dist/guid.js.map +1 -0
  196. package/dist/hash.d.ts +1 -0
  197. package/dist/hash.js +20 -0
  198. package/dist/hash.js.map +1 -0
  199. package/dist/index.d.ts +65 -0
  200. package/dist/index.js +66 -0
  201. package/dist/index.js.map +1 -0
  202. package/dist/jss.d.ts +110 -0
  203. package/dist/jss.js +438 -0
  204. package/dist/jss.js.map +1 -0
  205. package/dist/numberToBase.d.ts +1 -0
  206. package/dist/numberToBase.js +44 -0
  207. package/dist/numberToBase.js.map +1 -0
  208. package/dist/stateMachineContextFactory.d.ts +36 -0
  209. package/dist/stateMachineContextFactory.js +48 -0
  210. package/dist/stateMachineContextFactory.js.map +1 -0
  211. package/dist/useCookie.d.ts +9 -0
  212. package/dist/useCookie.js +65 -0
  213. package/dist/useCookie.js.map +1 -0
  214. package/dist/useKeyboard.d.ts +8 -0
  215. package/dist/useKeyboard.js +26 -0
  216. package/dist/useKeyboard.js.map +1 -0
  217. package/dist/useNavigation.d.ts +5 -0
  218. package/dist/useNavigation.js +79 -0
  219. package/dist/useNavigation.js.map +1 -0
  220. package/dist/usePromise.d.ts +1 -0
  221. package/dist/usePromise.js +12 -0
  222. package/dist/usePromise.js.map +1 -0
  223. package/dist/useRefEffect.d.ts +1 -0
  224. package/dist/useRefEffect.js +15 -0
  225. package/dist/useRefEffect.js.map +1 -0
  226. package/next-env.d.ts +5 -0
  227. package/next.config.js +21 -0
  228. package/package.json +40 -0
  229. package/scripts/publish.js +27 -0
  230. package/src/Badge.tsx +36 -0
  231. package/src/BaseButton.tsx +58 -0
  232. package/src/BaseInput.tsx +57 -0
  233. package/src/BaseLink.tsx +77 -0
  234. package/src/BaseList.tsx +29 -0
  235. package/src/BaseListAddOn.tsx +10 -0
  236. package/src/BaseListItem.tsx +117 -0
  237. package/src/BaseView.tsx +57 -0
  238. package/src/Box.tsx +20 -0
  239. package/src/Button.tsx +84 -0
  240. package/src/Calendar.tsx +125 -0
  241. package/src/Card.tsx +17 -0
  242. package/src/Checkbox.tsx +63 -0
  243. package/src/Circle.tsx +24 -0
  244. package/src/Column.tsx +12 -0
  245. package/src/DarkMode.tsx +99 -0
  246. package/src/DateInput.tsx +63 -0
  247. package/src/DatePicker.tsx +67 -0
  248. package/src/DatetimeInput.tsx +71 -0
  249. package/src/DesignBook.tsx +697 -0
  250. package/src/Dialog.tsx +144 -0
  251. package/src/Dropdown.tsx +129 -0
  252. package/src/Emitter.ts +26 -0
  253. package/src/FlexLayout.tsx +53 -0
  254. package/src/Icon.tsx +96 -0
  255. package/src/IconButton.tsx +66 -0
  256. package/src/IconLink.tsx +58 -0
  257. package/src/IconType.ts +787 -0
  258. package/src/Interactable.tsx +159 -0
  259. package/src/Link.tsx +86 -0
  260. package/src/List.tsx +41 -0
  261. package/src/ListButtonItem.tsx +69 -0
  262. package/src/ListDivider.tsx +13 -0
  263. package/src/ListHeaderItem.tsx +45 -0
  264. package/src/ListItem.tsx +27 -0
  265. package/src/ListLinkItem.tsx +76 -0
  266. package/src/ListSpacer.tsx +14 -0
  267. package/src/OnVisible.tsx +42 -0
  268. package/src/Popover.tsx +141 -0
  269. package/src/ProgressBar.tsx +63 -0
  270. package/src/ProgressCircle.tsx +38 -0
  271. package/src/Providers.tsx +33 -0
  272. package/src/RangeInput.tsx +82 -0
  273. package/src/ResultOrError.ts +15 -0
  274. package/src/RootView.tsx +55 -0
  275. package/src/Router.tsx +62 -0
  276. package/src/RouterState.tsx +154 -0
  277. package/src/Row.tsx +12 -0
  278. package/src/StackContext.tsx +52 -0
  279. package/src/StaticCheckbox.tsx +74 -0
  280. package/src/Storage.tsx +200 -0
  281. package/src/Stream.tsx +50 -0
  282. package/src/Sublist.tsx +62 -0
  283. package/src/SubmitIconInput.tsx +45 -0
  284. package/src/Tabs.tsx +103 -0
  285. package/src/Text.tsx +102 -0
  286. package/src/TextArea.tsx +45 -0
  287. package/src/TextInput.tsx +111 -0
  288. package/src/TextInputWithState.tsx +35 -0
  289. package/src/TextPairing.tsx +115 -0
  290. package/src/TimeInput.tsx +109 -0
  291. package/src/Tooltip.tsx +108 -0
  292. package/src/aria.ts +72 -0
  293. package/src/examples/ExampleDialog.tsx +28 -0
  294. package/src/guid.ts +7 -0
  295. package/src/hash.ts +21 -0
  296. package/src/index.ts +65 -0
  297. package/src/jss.tsx +607 -0
  298. package/src/numberToBase.ts +52 -0
  299. package/src/pages/Badge.mdx +30 -0
  300. package/src/pages/Button.mdx +57 -0
  301. package/src/pages/Calendar.mdx +60 -0
  302. package/src/pages/Checkbox.mdx +56 -0
  303. package/src/pages/Dialog.mdx +32 -0
  304. package/src/pages/FlexLayout.mdx +77 -0
  305. package/src/pages/Hashing.mdx +20 -0
  306. package/src/pages/Icon.mdx +63 -0
  307. package/src/pages/IconButton.mdx +144 -0
  308. package/src/pages/Link.mdx +57 -0
  309. package/src/pages/List.mdx +292 -0
  310. package/src/pages/ListHeader.mdx +94 -0
  311. package/src/pages/Popover.mdx +101 -0
  312. package/src/pages/ProgressBar.mdx +20 -0
  313. package/src/pages/ProgressCircle.mdx +35 -0
  314. package/src/pages/RangeInput.mdx +109 -0
  315. package/src/pages/Tabs.mdx +168 -0
  316. package/src/pages/Text.mdx +133 -0
  317. package/src/pages/TextInput.mdx +110 -0
  318. package/src/pages/TextPairing.mdx +155 -0
  319. package/src/pages/TimeInput.mdx +73 -0
  320. package/src/pages/Tooltip.mdx +28 -0
  321. package/src/pages/_app.tsx +561 -0
  322. package/src/pages/_document.tsx +30 -0
  323. package/src/pages/css-in-js.mdx +127 -0
  324. package/src/pages/index.mdx +58 -0
  325. package/src/pages/navigation.mdx +56 -0
  326. package/src/pages/prism.css +3 -0
  327. package/src/pages/useCookie.mdx +15 -0
  328. package/src/pages/useKeyboard.mdx +20 -0
  329. package/src/pages/useNavigation.mdx +30 -0
  330. package/src/pages/usePromise.mdx +15 -0
  331. package/src/pages/useRefEffect.mdx +49 -0
  332. package/src/stateMachineContextFactory.tsx +111 -0
  333. package/src/useCookie.tsx +89 -0
  334. package/src/useKeyboard.tsx +43 -0
  335. package/src/useNavigation.tsx +89 -0
  336. package/src/usePromise.tsx +18 -0
  337. package/src/useRefEffect.tsx +18 -0
  338. package/tsconfig.build.json +23 -0
  339. package/tsconfig.json +23 -0
@@ -0,0 +1,561 @@
1
+ import type { AppProps } from "next/app";
2
+ import Link from "next/link";
3
+ import Head from "next/head";
4
+ import React, { useEffect, useRef, useState } from "react";
5
+ import {
6
+ Size,
7
+ TABLET,
8
+ cssVar,
9
+ darkTheme,
10
+ desktop,
11
+ getPadding,
12
+ laptop,
13
+ lightTheme,
14
+ mobile,
15
+ tablet,
16
+ } from "../jss";
17
+ import { MDXProvider } from "@mdx-js/react";
18
+ import { Providers } from "../Providers";
19
+ import { BaseView } from "../BaseView";
20
+ import { H1, H2, H3, Li, P, Span } from "../Text";
21
+ import { ListDivider } from "../ListDivider";
22
+ import { ListHeaderItem } from "../ListHeaderItem";
23
+ import { Roboto } from "next/font/google";
24
+ import { List } from "../List";
25
+ import { ListLinkItem } from "../ListLinkItem";
26
+ import { Row } from "../Row";
27
+ import { useRouter } from "next/dist/client/router";
28
+ import { highlightAll } from "prismjs";
29
+ import { IconLink } from "../IconLink";
30
+ import { TextInput } from "../TextInput";
31
+ import { DarkModeToggle } from "../DarkMode";
32
+ import { useKeyboard } from "../useKeyboard";
33
+ import { Sublist } from "../Sublist";
34
+
35
+ import "./prism.css";
36
+ import { IconButton } from "../IconButton";
37
+ import { Column } from "../Column";
38
+ import { Icon } from "../Icon";
39
+ import { BaseLink, BaseLinkComponentOverrideContext } from "../BaseLink";
40
+
41
+ const monospace = Roboto({ weight: "400", subsets: ["latin"] });
42
+
43
+ type PageLink = {
44
+ type: "link";
45
+ page: string;
46
+ name?: string;
47
+ headlineSize?: Size;
48
+ headlineBold?: boolean;
49
+ };
50
+
51
+ type Page =
52
+ | PageLink
53
+ | {
54
+ type: "section";
55
+ label: string;
56
+ content: Array<PageLink>;
57
+ };
58
+
59
+ const pages: Array<Page> = [
60
+ {
61
+ type: "link",
62
+ page: "",
63
+ name: "Aidos UI",
64
+ headlineSize: "large",
65
+ headlineBold: true,
66
+ },
67
+ {
68
+ type: "section",
69
+ label: "CSS",
70
+ content: [{ type: "link", page: "css-in-js", name: "jss" }],
71
+ },
72
+ {
73
+ type: "section",
74
+ label: "Primary components",
75
+ content: [
76
+ { type: "link", page: "FlexLayout" },
77
+ { type: "link", page: "Text" },
78
+ { type: "link", page: "TextPairing" },
79
+ { type: "link", page: "Icon" },
80
+ ],
81
+ },
82
+ {
83
+ type: "section",
84
+ label: "Buttons and links",
85
+ content: [
86
+ { type: "link", page: "Button" },
87
+ { type: "link", page: "Link" },
88
+ { type: "link", page: "IconButton" },
89
+ ],
90
+ },
91
+ {
92
+ type: "section",
93
+ label: "Inputs",
94
+ content: [
95
+ { type: "link", page: "TextInput" },
96
+ { type: "link", page: "RangeInput" },
97
+ { type: "link", page: "TimeInput" },
98
+ { type: "link", page: "Checkbox" },
99
+ ],
100
+ },
101
+ {
102
+ type: "section",
103
+ label: "List",
104
+ content: [
105
+ { type: "link", page: "List" },
106
+ { type: "link", page: "ListHeader" },
107
+ { type: "link", page: "navigation", name: "List navigation" },
108
+ ],
109
+ },
110
+ {
111
+ type: "section",
112
+ label: "Modals",
113
+ content: [
114
+ { type: "link", page: "Dialog" },
115
+ { type: "link", page: "Popover" },
116
+ { type: "link", page: "Tooltip" },
117
+ ],
118
+ },
119
+ {
120
+ type: "section",
121
+ label: "Visual indicators",
122
+ content: [
123
+ { type: "link", page: "Badge" },
124
+ { type: "link", page: "ProgressBar" },
125
+ { type: "link", page: "ProgressCircle" },
126
+ ],
127
+ },
128
+ {
129
+ type: "section",
130
+ label: "Complex components",
131
+ content: [
132
+ { type: "link", page: "Tabs" },
133
+ { type: "link", page: "Calendar" },
134
+ ],
135
+ },
136
+ {
137
+ type: "section",
138
+ label: "Hooks",
139
+ content: [
140
+ { type: "link", page: "useCookie" },
141
+ { type: "link", page: "useNavigation" },
142
+ { type: "link", page: "useKeyboard" },
143
+ { type: "link", page: "useRefEffect" },
144
+ { type: "link", page: "usePromise" },
145
+ ],
146
+ },
147
+ {
148
+ type: "section",
149
+ label: "Utils",
150
+ content: [{ type: "link", page: "Hashing" }],
151
+ },
152
+ ];
153
+
154
+ const components = {
155
+ h1: (props) => (
156
+ <H1 jsStyle={{ marginBottom: cssVar("--spacing-xl") }} {...props} />
157
+ ),
158
+ h2: (props) => (
159
+ <H2
160
+ id={props.children
161
+ .replace(/[A-Z]/g, (m) => m.toLowerCase())
162
+ .replace(/\s/g, "-")
163
+ .replace(/\?/g, "")}
164
+ jsStyle={{ marginBottom: cssVar("--spacing-l") }}
165
+ {...props}
166
+ />
167
+ ),
168
+ h3: (props) => {
169
+ return <H3 {...props} />;
170
+ },
171
+ p: (props) => (
172
+ <P jsStyle={{ marginBottom: cssVar("--spacing-m") }} {...props} />
173
+ ),
174
+ span: (props) => <Span {...props} />,
175
+ li: (props) => (
176
+ <Li jsStyle={{ marginBottom: cssVar("--spacing-s") }} {...props} />
177
+ ),
178
+ a: (props) => {
179
+ return (
180
+ <BaseLink
181
+ bare
182
+ color="positive"
183
+ jsStyle={{
184
+ display: "inline-block",
185
+ paddingBottom: cssVar("--spacing-s"),
186
+ paddingTop: cssVar("--spacing-s"),
187
+ }}
188
+ href={props.href}
189
+ >
190
+ {props.children}
191
+ </BaseLink>
192
+ );
193
+ },
194
+ hr: () => (
195
+ <BaseView
196
+ jsStyle={{
197
+ marginBottom: cssVar("--spacing-xxl"),
198
+ marginTop: cssVar("--spacing-xxl"),
199
+ }}
200
+ >
201
+ <ListDivider />
202
+ </BaseView>
203
+ ),
204
+ pre: (props) => {
205
+ return (
206
+ <pre
207
+ style={{ borderRadius: cssVar("--border-radius-l") }}
208
+ className={props.children.props.className}
209
+ tabIndex={0}
210
+ >
211
+ <code className={props.children.props.className}>
212
+ {props.children.props.children}
213
+ </code>
214
+ </pre>
215
+ );
216
+ },
217
+ code: ({ children }) => (
218
+ <span
219
+ className={monospace.className}
220
+ style={{
221
+ color: cssVar("--primary-text"),
222
+ backgroundColor: cssVar("--secondary-background"),
223
+ borderRadius: cssVar("--border-radius-m"),
224
+ padding: cssVar("--spacing-xs"),
225
+ border: `1px solid ${cssVar("--divider")}`,
226
+ display: "inline-block",
227
+ }}
228
+ >
229
+ {children}
230
+ </span>
231
+ ),
232
+ };
233
+
234
+ export default function App({ Component, pageProps }: AppProps) {
235
+ const router = useRouter();
236
+
237
+ const [pathname, setPathname] = useState(router.pathname);
238
+ const [showList, setShowList] = useState(false);
239
+ const [query, setQuery] = useState("");
240
+ const filteredPagesRef = useRef<Array<Page>>([]);
241
+ const queryIndexRef = useRef<void | number>(undefined);
242
+ const queryInputRef = useKeyboard<HTMLInputElement>([
243
+ {
244
+ key: "K",
245
+ metaKey: true,
246
+ action: (root) => root.focus(),
247
+ },
248
+ {
249
+ key: "ArrowUp",
250
+ onlyWhenFocused: true,
251
+ action: () => {
252
+ setQueryIndex((current) => Math.max((current ?? 0) - 1, 0));
253
+ },
254
+ },
255
+ {
256
+ key: "K",
257
+ ctrlKey: true,
258
+ onlyWhenFocused: true,
259
+ action: () => {
260
+ setQueryIndex((current) => Math.max((current ?? 0) - 1, 0));
261
+ },
262
+ },
263
+ {
264
+ key: "ArrowDown",
265
+ onlyWhenFocused: true,
266
+ action: () => {
267
+ setQueryIndex((current) =>
268
+ Math.min((current ?? 0) + 1, filteredPagesRef.current.length - 1)
269
+ );
270
+ },
271
+ },
272
+ {
273
+ key: "J",
274
+ onlyWhenFocused: true,
275
+ ctrlKey: true,
276
+ action: () => {
277
+ setQueryIndex((current) =>
278
+ Math.min((current ?? 0) + 1, filteredPagesRef.current.length - 1)
279
+ );
280
+ },
281
+ },
282
+ {
283
+ key: "Enter",
284
+ onlyWhenFocused: true,
285
+ action: () => {
286
+ if (queryIndexRef.current === undefined) {
287
+ return;
288
+ } else {
289
+ const element = filteredPagesRef.current[queryIndexRef.current];
290
+ if (element.type === "link") {
291
+ window.open(`/${element.page}`, "_self");
292
+ }
293
+ }
294
+ },
295
+ },
296
+ {
297
+ key: "Escape",
298
+ onlyWhenFocused: true,
299
+ action: () => {
300
+ setQuery("");
301
+ },
302
+ },
303
+ ]);
304
+ const [queryIndex, setQueryIndex] = useState<void | number>(undefined);
305
+
306
+ const sanetisedQuery = query
307
+ .replace(/[^a-zA-Z]+/g, "")
308
+ .trim()
309
+ .toLowerCase();
310
+
311
+ useEffect(() => {
312
+ if (sanetisedQuery.length === 0) {
313
+ setQueryIndex(undefined);
314
+ if (window.innerWidth <= TABLET) {
315
+ setShowList(false);
316
+ }
317
+ } else {
318
+ setQueryIndex(0);
319
+ if (window.innerWidth <= TABLET) {
320
+ setShowList(true);
321
+ }
322
+ }
323
+ }, [sanetisedQuery]);
324
+
325
+ useEffect(() => {
326
+ queryIndexRef.current = queryIndex;
327
+ }, [queryIndex]);
328
+
329
+ filteredPagesRef.current =
330
+ sanetisedQuery.length > 0
331
+ ? pages
332
+ .flatMap((element) =>
333
+ element.type === "section" ? element.content : element
334
+ )
335
+ .filter((element) => {
336
+ return (
337
+ element.page.toLowerCase().includes(sanetisedQuery) ||
338
+ element?.name?.toLowerCase()?.includes(sanetisedQuery)
339
+ );
340
+ })
341
+ : pages;
342
+
343
+ useEffect(() => {
344
+ highlightAll();
345
+ });
346
+
347
+ return (
348
+ <>
349
+ <Head>
350
+ <title>Aidos UI</title>
351
+ <meta name="description" content="A humble UI toolkit" />
352
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
353
+ </Head>
354
+ <BaseLinkComponentOverrideContext.Provider value={Link}>
355
+ <Providers themes={{ light: lightTheme, dark: darkTheme }}>
356
+ {/* @ts-ignore */}
357
+ <MDXProvider components={components}>
358
+ <BaseView
359
+ jsStyle={[
360
+ {
361
+ height: "100%",
362
+ overflow: "hidden",
363
+ display: "grid",
364
+ },
365
+ mobile({
366
+ gridTemplateColumns: "1fr",
367
+ gridTemplateRows: "auto 1fr",
368
+ gridTemplateAreas: `
369
+ "header"
370
+ "content"
371
+ `,
372
+ }),
373
+ tablet({
374
+ gridTemplateColumns: "1fr",
375
+ gridTemplateRows: "auto 1fr",
376
+ gridTemplateAreas: `
377
+ "header"
378
+ "content"
379
+ `,
380
+ }),
381
+ laptop({
382
+ gridTemplateColumns: "350px 1fr",
383
+ gridTemplateRows: "auto 1fr",
384
+ gridTemplateAreas: `
385
+ "header content"
386
+ "list content"
387
+ `,
388
+ }),
389
+ desktop({
390
+ gridTemplateColumns: "400px 1fr",
391
+ gridTemplateRows: "auto 1fr",
392
+ gridTemplateAreas: `
393
+ "header content"
394
+ "list content"
395
+ `,
396
+ }),
397
+ ]}
398
+ >
399
+ <Row
400
+ jsStyle={{
401
+ gridArea: "header",
402
+ borderBottom: `1px solid ${cssVar("--divider")}`,
403
+ }}
404
+ gap="medium"
405
+ padding="medium"
406
+ align="center"
407
+ justify="space-between"
408
+ >
409
+ <TextInput
410
+ rootJSStyle={{ flexGrow: 1 }}
411
+ ref={queryInputRef}
412
+ placeholder="Search (⌘K)"
413
+ value={query}
414
+ onValueChange={(value) => {
415
+ setQuery(value);
416
+ }}
417
+ addOn={
418
+ <Icon icon="fa-search" size="medium" color="secondary" />
419
+ }
420
+ />
421
+ <Row gap="medium" align="center">
422
+ <DarkModeToggle />
423
+ <IconLink
424
+ aria-label="github"
425
+ target="_blank"
426
+ href="https://github.com/germtb/simple-ui"
427
+ icon="fa-github"
428
+ size="medium"
429
+ color="secondary"
430
+ bare
431
+ />
432
+ <IconButton
433
+ aria-label={showList ? "Hide list" : "Open list"}
434
+ jsStyle={[
435
+ laptop({ display: "none" }),
436
+ desktop({ display: "none" }),
437
+ ]}
438
+ icon={showList ? "fa-close" : "fa-bars"}
439
+ color="secondary"
440
+ onClick={() => setShowList((x) => !x)}
441
+ size="medium"
442
+ bare
443
+ />
444
+ </Row>
445
+ </Row>
446
+ <ListDivider />
447
+ <Column
448
+ jsStyle={[
449
+ {
450
+ gridArea: "list",
451
+ zIndex: 1,
452
+ padding: cssVar("--spacing-m"),
453
+ overflow: "hidden",
454
+ backgroundColor: cssVar("--primary-background"),
455
+ },
456
+ mobile({
457
+ position: "absolute",
458
+ display: showList ? "flex" : "none",
459
+ left: 0,
460
+ right: 0,
461
+ top: 59,
462
+ bottom: 0,
463
+ }),
464
+ tablet({
465
+ position: "absolute",
466
+ display: showList ? "flex" : "none",
467
+ left: 0,
468
+ right: 0,
469
+ top: 59,
470
+ bottom: 0,
471
+ }),
472
+ ]}
473
+ >
474
+ <List
475
+ bare
476
+ id="main-list"
477
+ navigation={true}
478
+ jsStyle={[{ overflow: "scroll" }]}
479
+ ariaLabel={"API"}
480
+ >
481
+ {(filteredPagesRef.current.length > 0
482
+ ? filteredPagesRef.current
483
+ : pages
484
+ ).map((element, index) => {
485
+ if (element.type === "link") {
486
+ const page = element.page;
487
+ return (
488
+ <ListLinkItem
489
+ key={page}
490
+ bare
491
+ onClick={() => {
492
+ setPathname(`/${page}`);
493
+ setShowList(false);
494
+ }}
495
+ selected={
496
+ sanetisedQuery.length > 0
497
+ ? index === queryIndex
498
+ : pathname === `/${page}`
499
+ }
500
+ href={`/${page}`}
501
+ headline={element.name ?? page}
502
+ headlineSize={element.headlineSize}
503
+ headlineBold={element.headlineBold}
504
+ />
505
+ );
506
+ } else if (element.type === "section") {
507
+ return (
508
+ <Sublist
509
+ key={`section-${element.label}`}
510
+ label={element.label}
511
+ bare
512
+ >
513
+ {element.content.map((element) => {
514
+ const page = element.page;
515
+ return (
516
+ <ListLinkItem
517
+ key={page}
518
+ bare
519
+ onClick={() => {
520
+ setPathname(`/${page}`);
521
+ setShowList(false);
522
+ }}
523
+ selected={
524
+ sanetisedQuery.length > 0
525
+ ? index === queryIndex
526
+ : pathname === `/${page}`
527
+ }
528
+ href={`/${page}`}
529
+ headline={element.name ?? page}
530
+ headlineSize={element.headlineSize}
531
+ headlineBold={element.headlineBold}
532
+ />
533
+ );
534
+ })}
535
+ </Sublist>
536
+ );
537
+ } else {
538
+ const _: never = element;
539
+ }
540
+ })}
541
+ </List>
542
+ </Column>
543
+ <BaseView
544
+ jsStyle={[
545
+ {
546
+ borderLeft: `1px solid ${cssVar("--divider")}`,
547
+ gridArea: "content",
548
+ overflow: "scroll",
549
+ },
550
+ getPadding(["large", "xlarge"]),
551
+ ]}
552
+ >
553
+ <Component {...pageProps} />
554
+ </BaseView>
555
+ </BaseView>
556
+ </MDXProvider>
557
+ </Providers>
558
+ </BaseLinkComponentOverrideContext.Provider>
559
+ </>
560
+ );
561
+ }
@@ -0,0 +1,30 @@
1
+ import { Html, Head, Main, NextScript } from "next/document";
2
+ import React from "react";
3
+ import { useCookie } from "../useCookie";
4
+ import { JSServerStyles } from "../jss";
5
+
6
+ export default function Document() {
7
+ const [darkModeEnabled] = useCookie("dark-mode", {
8
+ initialValue: false,
9
+ loadingValue: false,
10
+ });
11
+
12
+ return (
13
+ <Html lang="en">
14
+ <Head>
15
+ <JSServerStyles />
16
+ </Head>
17
+ <body className={darkModeEnabled ? "dark-mode" : ""}>
18
+ <Main />
19
+ <NextScript />
20
+ <style>{`
21
+ #__next {
22
+ height: 100%;
23
+ width: 100%;
24
+ overflow-y: auto;
25
+ }
26
+ `}</style>
27
+ </body>
28
+ </Html>
29
+ );
30
+ }
@@ -0,0 +1,127 @@
1
+ import { Button } from "../Button";
2
+ import { Row } from "../Row";
3
+ import { cssVar } from "../jss";
4
+
5
+ # CSS in JS
6
+
7
+ Aidos UI has a mechanism to do css in js, which, for lack of a better name, is called `jss`, which is the name of the only function that is needed. The idea is similar to other css in js frameworks: colocation is nice, adding javascrip features to CSS solves many of the problems CSS has.
8
+
9
+ ## How it works
10
+
11
+ The way the library works looks similar to inline styles:
12
+
13
+ ```js
14
+ <div className={jss({ background: "red", padding: 12 })} />
15
+ ```
16
+
17
+ Internally what is happening is that each property gets atomized into a single CSS classname with a unique hash that gets re-used.
18
+
19
+ ```html
20
+ <style>
21
+ .x1uc1pme {
22
+ background: red;
23
+ }
24
+
25
+ .x1kbdebd {
26
+ padding: 12;
27
+ }
28
+ </style>
29
+ <div class="x1uc1pme x1kbdebd" />
30
+ ```
31
+
32
+ The CSS class name is a hash based on each key-pair. This makes it deterministic, which enables for this system to work with server rendered hydrated react.
33
+
34
+ ## Selectors
35
+
36
+ Because of how this system works not all selectors can be written, but this is a good thing because arguably CSS selectors are so powerful that it is very easy to make something too hard to understand. These are some examples of how selectors are generated:
37
+
38
+ ```js
39
+ jss({[':hover']: { background: 'blue' }})
40
+ .x1uc1pme:hover {
41
+ background: blue;
42
+ }
43
+ ```
44
+
45
+ ```js
46
+ jss({[':first-child']: { background: 'blue' }})
47
+ .x1uc1pme:first-child {
48
+ background: blue;
49
+ }
50
+ ```
51
+
52
+ ```js
53
+ jss({[' div']: { background: 'blue' }})
54
+ .x1uc1pme div {
55
+ background: blue;
56
+ }
57
+ ```
58
+
59
+ ```js
60
+ jss({['@media (min-width: 750px)']: { maxWidth: 750 }})
61
+ @media (min-width: 750px) .x1uc1pme {
62
+ maxWidth: 750
63
+ }
64
+ ```
65
+
66
+ ## CSS variables
67
+
68
+ Aidos UI comes with two default themes that can be overridden. These come with the following css variables that can be safely used (in typescript) with the `cssVar` utility:
69
+
70
+ - `--overlay-background`
71
+ - `--primary-background`
72
+ - `--secondary-background`
73
+ - `--divider`
74
+ - `--strong-divider`
75
+ - `--pressed-background`
76
+ - `--hovered-background`
77
+ - `--selected-background`
78
+ - `--nav-bar`
79
+ - `--warning`
80
+ - `--highlight`
81
+ - `--outline`
82
+ - `--light-highlight`
83
+ - `--primary-text`
84
+ - `--secondary-text`
85
+ - `--subtle-text`
86
+ - `--highlight-text`
87
+ - `--negative-text`
88
+ - `--light-text`
89
+ - `--background-button-positive`
90
+ - `--background-button-secondary`
91
+ - `--background-button-negative`
92
+ - `--background-button-disabled`
93
+ - `--spacing-xs`
94
+ - `--spacing-s`
95
+ - `--spacing-m`
96
+ - `--spacing-l`
97
+ - `--spacing-xl`
98
+ - `--spacing-xxl`
99
+ - `--spacing-xxxl`
100
+ - `--border-radius-s`
101
+ - `--border-radius-m`
102
+ - `--border-radius-l`
103
+ - `--nav-bar-height`
104
+
105
+ For example:
106
+
107
+ <Row justify="center">
108
+ <Button
109
+ jsStyle={{ border: `10px solid ${cssVar("--warning")}` }}
110
+ label="Hello"
111
+ color="positive"
112
+ onClick={() => {}}
113
+ />
114
+ </Row>
115
+
116
+ ```js
117
+ <Row justify="center">
118
+ <Button
119
+ jsStyle={{ border: `10px solid ${cssVar("--warning")}` }}
120
+ label="Hello"
121
+ color="positive"
122
+ onClick={() => {}}
123
+ />
124
+ </Row>
125
+ ```
126
+
127
+ ---