@owlmeans/mui-panel 0.1.3

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 (226) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +96 -0
  3. package/build/.gitkeep +0 -0
  4. package/build/auth/context.d.ts +5 -0
  5. package/build/auth/context.d.ts.map +1 -0
  6. package/build/auth/context.js +19 -0
  7. package/build/auth/context.js.map +1 -0
  8. package/build/auth/exports.d.ts +25 -0
  9. package/build/auth/exports.d.ts.map +1 -0
  10. package/build/auth/exports.js +19 -0
  11. package/build/auth/exports.js.map +1 -0
  12. package/build/auth/index.d.ts +5 -0
  13. package/build/auth/index.d.ts.map +1 -0
  14. package/build/auth/index.js +4 -0
  15. package/build/auth/index.js.map +1 -0
  16. package/build/auth/modules.d.ts +2 -0
  17. package/build/auth/modules.d.ts.map +1 -0
  18. package/build/auth/modules.js +4 -0
  19. package/build/auth/modules.js.map +1 -0
  20. package/build/auth/plugins/basic-ed25519.d.ts +3 -0
  21. package/build/auth/plugins/basic-ed25519.d.ts.map +1 -0
  22. package/build/auth/plugins/basic-ed25519.js +40 -0
  23. package/build/auth/plugins/basic-ed25519.js.map +1 -0
  24. package/build/auth/plugins/exports.d.ts +4 -0
  25. package/build/auth/plugins/exports.d.ts.map +1 -0
  26. package/build/auth/plugins/exports.js +4 -0
  27. package/build/auth/plugins/exports.js.map +1 -0
  28. package/build/auth/plugins/index.d.ts +6 -0
  29. package/build/auth/plugins/index.d.ts.map +1 -0
  30. package/build/auth/plugins/index.js +10 -0
  31. package/build/auth/plugins/index.js.map +1 -0
  32. package/build/auth/plugins/re-captcha.d.ts +3 -0
  33. package/build/auth/plugins/re-captcha.d.ts.map +1 -0
  34. package/build/auth/plugins/re-captcha.js +51 -0
  35. package/build/auth/plugins/re-captcha.js.map +1 -0
  36. package/build/auth/plugins/tunnel-consumer.d.ts +3 -0
  37. package/build/auth/plugins/tunnel-consumer.d.ts.map +1 -0
  38. package/build/auth/plugins/tunnel-consumer.js +38 -0
  39. package/build/auth/plugins/tunnel-consumer.js.map +1 -0
  40. package/build/auth/types.d.ts +10 -0
  41. package/build/auth/types.d.ts.map +1 -0
  42. package/build/auth/types.js +2 -0
  43. package/build/auth/types.js.map +1 -0
  44. package/build/components/block.d.ts +4 -0
  45. package/build/components/block.d.ts.map +1 -0
  46. package/build/components/block.js +15 -0
  47. package/build/components/block.js.map +1 -0
  48. package/build/components/button/index.d.ts +3 -0
  49. package/build/components/button/index.d.ts.map +1 -0
  50. package/build/components/button/index.js +2 -0
  51. package/build/components/button/index.js.map +1 -0
  52. package/build/components/button/selector.d.ts +4 -0
  53. package/build/components/button/selector.d.ts.map +1 -0
  54. package/build/components/button/selector.js +8 -0
  55. package/build/components/button/selector.js.map +1 -0
  56. package/build/components/button/types.d.ts +7 -0
  57. package/build/components/button/types.d.ts.map +1 -0
  58. package/build/components/button/types.js +2 -0
  59. package/build/components/button/types.js.map +1 -0
  60. package/build/components/form/button/component.d.ts +5 -0
  61. package/build/components/form/button/component.d.ts.map +1 -0
  62. package/build/components/form/button/component.js +34 -0
  63. package/build/components/form/button/component.js.map +1 -0
  64. package/build/components/form/button/index.d.ts +3 -0
  65. package/build/components/form/button/index.d.ts.map +1 -0
  66. package/build/components/form/button/index.js +3 -0
  67. package/build/components/form/button/index.js.map +1 -0
  68. package/build/components/form/button/types.d.ts +15 -0
  69. package/build/components/form/button/types.d.ts.map +1 -0
  70. package/build/components/form/button/types.js +2 -0
  71. package/build/components/form/button/types.js.map +1 -0
  72. package/build/components/form/component.d.ts +4 -0
  73. package/build/components/form/component.d.ts.map +1 -0
  74. package/build/components/form/component.js +59 -0
  75. package/build/components/form/component.js.map +1 -0
  76. package/build/components/form/index.d.ts +3 -0
  77. package/build/components/form/index.d.ts.map +1 -0
  78. package/build/components/form/index.js +2 -0
  79. package/build/components/form/index.js.map +1 -0
  80. package/build/components/form/text/component.d.ts +4 -0
  81. package/build/components/form/text/component.d.ts.map +1 -0
  82. package/build/components/form/text/component.js +34 -0
  83. package/build/components/form/text/component.js.map +1 -0
  84. package/build/components/form/text/index.d.ts +3 -0
  85. package/build/components/form/text/index.d.ts.map +1 -0
  86. package/build/components/form/text/index.js +3 -0
  87. package/build/components/form/text/index.js.map +1 -0
  88. package/build/components/form/text/types.d.ts +11 -0
  89. package/build/components/form/text/types.d.ts.map +1 -0
  90. package/build/components/form/text/types.js +2 -0
  91. package/build/components/form/text/types.js.map +1 -0
  92. package/build/components/form/types.d.ts +6 -0
  93. package/build/components/form/types.d.ts.map +1 -0
  94. package/build/components/form/types.js +2 -0
  95. package/build/components/form/types.js.map +1 -0
  96. package/build/components/helper.d.ts +6 -0
  97. package/build/components/helper.d.ts.map +1 -0
  98. package/build/components/helper.js +70 -0
  99. package/build/components/helper.js.map +1 -0
  100. package/build/components/index.d.ts +14 -0
  101. package/build/components/index.d.ts.map +1 -0
  102. package/build/components/index.js +13 -0
  103. package/build/components/index.js.map +1 -0
  104. package/build/components/layout/component.d.ts +4 -0
  105. package/build/components/layout/component.d.ts.map +1 -0
  106. package/build/components/layout/component.js +6 -0
  107. package/build/components/layout/component.js.map +1 -0
  108. package/build/components/layout/index.d.ts +3 -0
  109. package/build/components/layout/index.d.ts.map +1 -0
  110. package/build/components/layout/index.js +3 -0
  111. package/build/components/layout/index.js.map +1 -0
  112. package/build/components/layout/types.d.ts +4 -0
  113. package/build/components/layout/types.d.ts.map +1 -0
  114. package/build/components/layout/types.js +2 -0
  115. package/build/components/layout/types.js.map +1 -0
  116. package/build/components/link.d.ts +4 -0
  117. package/build/components/link.d.ts.map +1 -0
  118. package/build/components/link.js +27 -0
  119. package/build/components/link.js.map +1 -0
  120. package/build/components/panel-app/component.d.ts +4 -0
  121. package/build/components/panel-app/component.d.ts.map +1 -0
  122. package/build/components/panel-app/component.js +11 -0
  123. package/build/components/panel-app/component.js.map +1 -0
  124. package/build/components/panel-app/index.d.ts +3 -0
  125. package/build/components/panel-app/index.d.ts.map +1 -0
  126. package/build/components/panel-app/index.js +3 -0
  127. package/build/components/panel-app/index.js.map +1 -0
  128. package/build/components/panel-app/types.d.ts +6 -0
  129. package/build/components/panel-app/types.d.ts.map +1 -0
  130. package/build/components/panel-app/types.js +2 -0
  131. package/build/components/panel-app/types.js.map +1 -0
  132. package/build/components/status.d.ts +4 -0
  133. package/build/components/status.d.ts.map +1 -0
  134. package/build/components/status.js +19 -0
  135. package/build/components/status.js.map +1 -0
  136. package/build/components/text.d.ts +4 -0
  137. package/build/components/text.d.ts.map +1 -0
  138. package/build/components/text.js +9 -0
  139. package/build/components/text.js.map +1 -0
  140. package/build/components/types.d.ts +32 -0
  141. package/build/components/types.d.ts.map +1 -0
  142. package/build/components/types.js +2 -0
  143. package/build/components/types.js.map +1 -0
  144. package/build/components/uploader/image.d.ts +4 -0
  145. package/build/components/uploader/image.d.ts.map +1 -0
  146. package/build/components/uploader/image.js +24 -0
  147. package/build/components/uploader/image.js.map +1 -0
  148. package/build/components/uploader/index.d.ts +2 -0
  149. package/build/components/uploader/index.d.ts.map +1 -0
  150. package/build/components/uploader/index.js +2 -0
  151. package/build/components/uploader/index.js.map +1 -0
  152. package/build/components/uploader/types.d.ts +5 -0
  153. package/build/components/uploader/types.d.ts.map +1 -0
  154. package/build/components/uploader/types.js +2 -0
  155. package/build/components/uploader/types.js.map +1 -0
  156. package/build/context.d.ts +4 -0
  157. package/build/context.d.ts.map +1 -0
  158. package/build/context.js +12 -0
  159. package/build/context.js.map +1 -0
  160. package/build/exports.d.ts +19 -0
  161. package/build/exports.d.ts.map +1 -0
  162. package/build/exports.js +17 -0
  163. package/build/exports.js.map +1 -0
  164. package/build/index.d.ts +8 -0
  165. package/build/index.d.ts.map +1 -0
  166. package/build/index.js +7 -0
  167. package/build/index.js.map +1 -0
  168. package/build/main.d.ts +5 -0
  169. package/build/main.d.ts.map +1 -0
  170. package/build/main.js +14 -0
  171. package/build/main.js.map +1 -0
  172. package/build/modules.d.ts +2 -0
  173. package/build/modules.d.ts.map +1 -0
  174. package/build/modules.js +4 -0
  175. package/build/modules.js.map +1 -0
  176. package/build/types.d.ts +9 -0
  177. package/build/types.d.ts.map +1 -0
  178. package/build/types.js +2 -0
  179. package/build/types.js.map +1 -0
  180. package/package.json +95 -0
  181. package/src/auth/context.ts +27 -0
  182. package/src/auth/exports.ts +29 -0
  183. package/src/auth/index.ts +5 -0
  184. package/src/auth/modules.ts +5 -0
  185. package/src/auth/plugins/basic-ed25519.tsx +57 -0
  186. package/src/auth/plugins/exports.ts +4 -0
  187. package/src/auth/plugins/index.ts +15 -0
  188. package/src/auth/plugins/re-captcha.tsx +73 -0
  189. package/src/auth/plugins/tunnel-consumer.tsx +65 -0
  190. package/src/auth/types.ts +11 -0
  191. package/src/components/block.tsx +27 -0
  192. package/src/components/button/index.ts +3 -0
  193. package/src/components/button/selector.tsx +16 -0
  194. package/src/components/button/types.ts +7 -0
  195. package/src/components/form/button/component.tsx +53 -0
  196. package/src/components/form/button/index.ts +3 -0
  197. package/src/components/form/button/types.ts +16 -0
  198. package/src/components/form/component.tsx +101 -0
  199. package/src/components/form/index.ts +3 -0
  200. package/src/components/form/text/component.tsx +45 -0
  201. package/src/components/form/text/index.ts +3 -0
  202. package/src/components/form/text/types.ts +11 -0
  203. package/src/components/form/types.ts +6 -0
  204. package/src/components/helper.ts +79 -0
  205. package/src/components/index.ts +17 -0
  206. package/src/components/layout/component.tsx +7 -0
  207. package/src/components/layout/index.ts +3 -0
  208. package/src/components/layout/types.ts +4 -0
  209. package/src/components/link.tsx +34 -0
  210. package/src/components/panel-app/component.tsx +20 -0
  211. package/src/components/panel-app/index.ts +3 -0
  212. package/src/components/panel-app/types.ts +6 -0
  213. package/src/components/status.tsx +23 -0
  214. package/src/components/text.tsx +14 -0
  215. package/src/components/types.ts +35 -0
  216. package/src/components/uploader/image.tsx +31 -0
  217. package/src/components/uploader/index.ts +2 -0
  218. package/src/components/uploader/types.ts +6 -0
  219. package/src/context.ts +18 -0
  220. package/src/exports.ts +22 -0
  221. package/src/index.ts +9 -0
  222. package/src/main.tsx +19 -0
  223. package/src/modules.ts +5 -0
  224. package/src/types.ts +11 -0
  225. package/tests/smoke.spec.ts +24 -0
  226. package/tsconfig.json +11 -0
@@ -0,0 +1,23 @@
1
+ import type { FC } from 'react'
2
+ import { useMemo } from 'react'
3
+ import type { StatusProps } from './types.js'
4
+ import { usePanelI18n } from '@owlmeans/client-panel'
5
+ import { ResilientError } from '@owlmeans/error'
6
+ import Alert from '@mui/material/Alert'
7
+
8
+ const prepareMessage = (msg: string) => msg.replace(/\:/g, '.')
9
+
10
+ export const Status: FC<StatusProps> = ({ ok, name, i18n, children, variant, message, error }) => {
11
+ variant = useMemo(() => variant ?? (ok ? 'success' : 'error'), [ok, variant])
12
+ const t = usePanelI18n(name ?? variant, i18n)
13
+ message = useMemo(() => {
14
+ const resilient = error != null ? ResilientError.ensure(error) : null
15
+ return message != null ? t(message) : resilient != null ? t(
16
+ [
17
+ `${resilient.type}.${prepareMessage(resilient.message)}`,
18
+ prepareMessage(resilient.message)
19
+ ],
20
+ ) : t(variant)
21
+ }, [message, error?.name, ok, variant])
22
+ return <Alert severity={variant as any}>{children ?? message}</Alert>
23
+ }
@@ -0,0 +1,14 @@
1
+
2
+ import { usePanelI18n } from '@owlmeans/client-panel'
3
+ import type { FC } from 'react'
4
+ import type { TextProps } from './types.js'
5
+ import Typography from '@mui/material/Typography'
6
+ import type { TypographyOwnProps } from '@mui/material'
7
+
8
+ export const Text: FC<TextProps> = ({ variant, name, children, center, styles, nested, i18n }) => {
9
+ const t = usePanelI18n(undefined, i18n)
10
+
11
+ const label = name != null ? t(name) : undefined
12
+ return <Typography component={nested ? 'span' : 'p'} variant={variant as TypographyOwnProps['variant']}
13
+ sx={{ textAlign: center ? 'center' : 'inherit', ...styles }}>{label ?? children}</Typography>
14
+ }
@@ -0,0 +1,35 @@
1
+ import type { SxProps } from '@mui/material/styles'
2
+ import type { I18nProps } from '@owlmeans/client-i18n'
3
+ import type { BlockScaling } from '@owlmeans/client-panel'
4
+ import type { FC, PropsWithChildren } from 'react'
5
+ import type { TypographyOwnProps } from '@mui/material'
6
+ import type { ClientEntrypoint } from '@owlmeans/client-entrypoint'
7
+
8
+ export interface BlockProps extends PropsWithChildren<I18nProps> {
9
+ horizontal?: BlockScaling
10
+ vertical?: BlockScaling
11
+ Actions?: FC
12
+ styles?: SxProps
13
+ }
14
+
15
+ export interface TextProps extends PropsWithChildren<I18nProps> {
16
+ name?: string
17
+ variant?: TypographyOwnProps['variant']
18
+ center?: boolean
19
+ styles?: SxProps
20
+ nested?: boolean
21
+ }
22
+
23
+ export interface LinkProps extends TextProps {
24
+ src?: string
25
+ module?: string | ClientEntrypoint
26
+ open?: boolean
27
+ }
28
+
29
+ export interface StatusProps extends PropsWithChildren<I18nProps> {
30
+ name?: string
31
+ ok?: boolean
32
+ variant?: string
33
+ error?: Error
34
+ message?: string
35
+ }
@@ -0,0 +1,31 @@
1
+ import type { FC } from 'react'
2
+ import { ImageUploader as Uploader } from '@owlmeans/web-client'
3
+ import Paper from '@mui/material/Paper'
4
+ import type { ImageUploaderProps } from './types.js'
5
+ import AddPhotoAlternateOutlinedIcon from '@mui/icons-material/AddPhotoAlternateOutlined';
6
+ import Box from '@mui/material/Box'
7
+
8
+ export const ImageUploader: FC<ImageUploaderProps> = ({ Root, rootProps, previewUrl, ...others }) => {
9
+ return <Uploader Root={Root ?? Paper} rootProps={{
10
+ elevation: 2,
11
+ sx: {
12
+ width: wrapperSize,
13
+ height: wrapperSize,
14
+ display: "flex",
15
+ justifyContent: "center",
16
+ alignItems: "center",
17
+ cursor: 'pointer',
18
+ },
19
+ ...rootProps
20
+ }} {...others}>
21
+ {
22
+ previewUrl != null
23
+ ? <Box component="img" src={previewUrl}
24
+ sx={{ maxWidth: previewSize, maxHeight: previewSize }} />
25
+ : <AddPhotoAlternateOutlinedIcon sx={{ fontSize: previewSize }} color="primary" />
26
+ }
27
+ </Uploader>
28
+ }
29
+
30
+ const previewSize = { xs: 60, md: 120, lg: 200 }
31
+ const wrapperSize = { xs: 65, md: 125, lg: 205 }
@@ -0,0 +1,2 @@
1
+
2
+ export * from './image.js'
@@ -0,0 +1,6 @@
1
+
2
+ import type { UploaderProps as BasicUploaderProps } from '@owlmeans/web-client'
3
+
4
+ export interface ImageUploaderProps extends BasicUploaderProps {
5
+ previewUrl?: string
6
+ }
package/src/context.ts ADDED
@@ -0,0 +1,18 @@
1
+ import { appendFlowService } from '@owlmeans/web-flow'
2
+ import type { AppConfig , AppContext } from './types.js'
3
+ import { makeContext as makeClientContext, useContext as useCtx } from '@owlmeans/web-client'
4
+ import { apiConfigMiddleware } from '@owlmeans/api-config-client'
5
+
6
+ export const makeContext = <C extends AppConfig, T extends AppContext<C>>(cfg: C): T => {
7
+ const context = makeClientContext(cfg) as T
8
+
9
+ context.registerMiddleware(apiConfigMiddleware)
10
+
11
+ appendFlowService<C, T>(context)
12
+ context.flow = () => context.service('flow')
13
+
14
+ return context
15
+ }
16
+
17
+ export const useContext = <C extends AppConfig = AppConfig,T extends AppContext<C> = AppContext<C>>() =>
18
+ useCtx<C,T>()
package/src/exports.ts ADDED
@@ -0,0 +1,22 @@
1
+
2
+ export { handler, useNavigate, useValue, useModule } from '@owlmeans/client'
3
+ export { config } from '@owlmeans/client-context'
4
+ export { service } from '@owlmeans/config'
5
+ export { guard, parent } from '@owlmeans/entrypoint'
6
+ export { addWebService } from '@owlmeans/client-config'
7
+ export { entrypoint, elevate, provideRequest, stab } from '@owlmeans/client-entrypoint'
8
+ export type { ClientEntrypoint as Module } from '@owlmeans/client-entrypoint'
9
+ export { route as croute } from '@owlmeans/client-route'
10
+ export { route, frontend } from '@owlmeans/route'
11
+ export { DEFAULT_ALIAS as DAUTH_GUARD, setupExternalAuthentication } from '@owlmeans/client-auth'
12
+
13
+ export { AppType, HOME, ROOT, BASE, GUEST } from '@owlmeans/context'
14
+
15
+ export { DISPATCHER, CAUTHEN_FLOW_ENTER } from '@owlmeans/auth'
16
+ export type { AuthToken } from '@owlmeans/auth'
17
+
18
+ export { useCommonI18n, useI18nApp, useI18nLib } from '@owlmeans/client-i18n'
19
+ export { addCommonI18n, addI18nApp } from '@owlmeans/i18n'
20
+ export { flow, configureFlows } from '@owlmeans/flow'
21
+ export { QUERY_PARAM as FLOW_PARAM, SERVICE_PARAM, useFlow } from '@owlmeans/web-flow'
22
+ export { Dispatcher, appendWebAuthService } from '@owlmeans/web-client'
package/src/index.ts ADDED
@@ -0,0 +1,9 @@
1
+
2
+ export type * from './types.js'
3
+ export * from './main.js'
4
+ export * from './exports.js'
5
+ export * from './context.js'
6
+ export * from './modules.js'
7
+ export * from './components/index.js'
8
+
9
+ export * from '@owlmeans/client-panel'
package/src/main.tsx ADDED
@@ -0,0 +1,19 @@
1
+ import type { RenderOptions, AppContext } from '@owlmeans/web-client'
2
+ import type { ClientConfig, ClientContext } from '@owlmeans/client-context'
3
+ import { render as basicRender, provide } from '@owlmeans/web-client'
4
+ import type { FC } from 'react'
5
+ import { useI18nInstance } from '@owlmeans/client-i18n/utils'
6
+ import detector from 'i18next-browser-languagedetector'
7
+ import { PanelApp } from './components/panel-app/component.js'
8
+ import type { Theme } from '@mui/material/styles'
9
+
10
+ export const render = <C extends ClientConfig, T extends ClientContext<C>>(context: T, theme?: Theme, opts?: RenderOptions) => {
11
+ basicRender(<App context={context as unknown as AppContext} theme={theme}/>, opts)
12
+ }
13
+
14
+ const App: FC<{ context: AppContext<any>, theme?: Theme }> = ({ context, theme }) => {
15
+ const i18nInstance = useI18nInstance(context.cfg)
16
+ i18nInstance.use(detector)
17
+
18
+ return <PanelApp context={context} provide={provide} theme={theme} />
19
+ }
package/src/modules.ts ADDED
@@ -0,0 +1,5 @@
1
+
2
+ import { modules as list } from '@owlmeans/web-client'
3
+ import { modules as config } from '@owlmeans/api-config-client'
4
+
5
+ export const modules = [...list, ...config]
package/src/types.ts ADDED
@@ -0,0 +1,11 @@
1
+
2
+ import type { WithFlowConfig } from '@owlmeans/flow'
3
+ import type { AppConfig as Config, AppContext as Context } from '@owlmeans/web-client'
4
+ import type { FlowService } from '@owlmeans/web-flow'
5
+
6
+ export interface AppConfig extends Config, WithFlowConfig {
7
+ }
8
+
9
+ export interface AppContext<C extends AppConfig = AppConfig> extends Context<C> {
10
+ flow: () => FlowService
11
+ }
@@ -0,0 +1,24 @@
1
+ import { afterAll, describe, expect, test } from 'bun:test'
2
+ import { closeBrowser, mountComponent } from '@owlmeans/test-ui'
3
+
4
+ const harness = `data:text/html,${encodeURIComponent(`
5
+ <!doctype html>
6
+ <html><body>
7
+ <h1 id="title">@owlmeans/mui-panel pilot</h1>
8
+ </body></html>
9
+ `)}`
10
+
11
+ afterAll(async () => {
12
+ await closeBrowser()
13
+ })
14
+
15
+ describe('@owlmeans/mui-panel — Playwright-library smoke', () => {
16
+ test('mounts a static page in chromium and reads the heading', async () => {
17
+ const { page, close } = await mountComponent({ url: harness })
18
+ try {
19
+ expect(await page.locator('#title').textContent()).toBe('@owlmeans/mui-panel pilot')
20
+ } finally {
21
+ await close()
22
+ }
23
+ })
24
+ })
package/tsconfig.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": [
3
+ "@owlmeans/dep-config/tsconfig.base.json",
4
+ "@owlmeans/dep-config/tsconfig.react.json"
5
+ ],
6
+ "compilerOptions": {
7
+ "rootDir": "./src/",
8
+ "outDir": "./build/"
9
+ },
10
+ "exclude": ["./dist/**/*", "./build/**/*", "./tests/**/*", "./*.ts"]
11
+ }