@aehrc/smart-forms-renderer 1.0.0-alpha.93 → 1.0.0-alpha.94

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.
@@ -0,0 +1,24 @@
1
+ import type { ReactNode } from 'react';
2
+ import React from 'react';
3
+ type ThemeMode = 'light' | 'dark' | 'system';
4
+ interface RendererThemeContextType {
5
+ mode: ThemeMode;
6
+ setMode: (mode: ThemeMode) => void;
7
+ resolvedMode: 'light' | 'dark';
8
+ }
9
+ export type { RendererThemeContextType };
10
+ declare const RendererThemeContext: React.Context<RendererThemeContextType | undefined>;
11
+ export { RendererThemeContext };
12
+ export interface RendererDynamicThemeProviderProps {
13
+ children: ReactNode;
14
+ /** Initial theme mode. Defaults to 'system' */
15
+ defaultMode?: ThemeMode;
16
+ /** Storage key for persisting theme preference. Set to null to disable persistence */
17
+ storageKey?: string | null;
18
+ }
19
+ /**
20
+ * Advanced theme provider with dynamic theme switching and system theme detection.
21
+ * Provides theme context for child components to access and control theme mode.
22
+ */
23
+ export declare function RendererDynamicThemeProvider({ children, defaultMode, storageKey }: RendererDynamicThemeProviderProps): import("react/jsx-runtime").JSX.Element;
24
+ export default RendererDynamicThemeProvider;
@@ -0,0 +1,65 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useEffect, useState } from 'react';
3
+ import { createTheme, StyledEngineProvider, ThemeProvider as MUIThemeProvider } from '@mui/material/styles';
4
+ import { rendererThemeComponentOverrides } from './overrides/rendererThemeComponentOverrides';
5
+ import { rendererLightThemeOptions, rendererDarkThemeOptions } from './rendererThemeOptions';
6
+ import { ScopedCssBaseline } from '@mui/material';
7
+ const RendererThemeContext = createContext(undefined);
8
+ export { RendererThemeContext };
9
+ /**
10
+ * Advanced theme provider with dynamic theme switching and system theme detection.
11
+ * Provides theme context for child components to access and control theme mode.
12
+ */
13
+ export function RendererDynamicThemeProvider({ children, defaultMode = 'system', storageKey = 'smart-forms-theme' }) {
14
+ const [mode, setModeState] = useState(() => {
15
+ if (typeof window === 'undefined')
16
+ return defaultMode;
17
+ if (storageKey) {
18
+ const stored = localStorage.getItem(storageKey);
19
+ if (stored && ['light', 'dark', 'system'].includes(stored)) {
20
+ return stored;
21
+ }
22
+ }
23
+ return defaultMode;
24
+ });
25
+ const [resolvedMode, setResolvedMode] = useState(() => {
26
+ if (typeof window === 'undefined')
27
+ return 'light';
28
+ if (mode === 'system') {
29
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
30
+ }
31
+ return mode;
32
+ });
33
+ useEffect(() => {
34
+ if (mode === 'system') {
35
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
36
+ const handleChange = () => {
37
+ setResolvedMode(mediaQuery.matches ? 'dark' : 'light');
38
+ };
39
+ // Set initial value
40
+ setResolvedMode(mediaQuery.matches ? 'dark' : 'light');
41
+ mediaQuery.addEventListener('change', handleChange);
42
+ return () => mediaQuery.removeEventListener('change', handleChange);
43
+ }
44
+ else {
45
+ setResolvedMode(mode);
46
+ }
47
+ }, [mode]);
48
+ const setMode = (newMode) => {
49
+ setModeState(newMode);
50
+ if (storageKey) {
51
+ localStorage.setItem(storageKey, newMode);
52
+ }
53
+ };
54
+ const themeOptions = resolvedMode === 'dark' ? rendererDarkThemeOptions : rendererLightThemeOptions;
55
+ const theme = createTheme(themeOptions);
56
+ theme.components = rendererThemeComponentOverrides(theme);
57
+ const contextValue = {
58
+ mode,
59
+ setMode,
60
+ resolvedMode
61
+ };
62
+ return (_jsx(RendererThemeContext.Provider, { value: contextValue, children: _jsx(StyledEngineProvider, { injectFirst: true, children: _jsx(MUIThemeProvider, { theme: theme, children: _jsx(ScopedCssBaseline, { enableColorScheme: true, children: children }) }) }) }));
63
+ }
64
+ export default RendererDynamicThemeProvider;
65
+ //# sourceMappingURL=RendererDynamicThemeProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RendererDynamicThemeProvider.js","sourceRoot":"","sources":["../../src/theme/RendererDynamicThemeProvider.tsx"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ import { ScopedCssBaseline } from '@mui/material';
12
12
  export function RendererThemeProvider({ children }) {
13
13
  const theme = createTheme(rendererThemeOptions);
14
14
  theme.components = rendererThemeComponentOverrides(theme);
15
- return (_jsx(StyledEngineProvider, { injectFirst: true, children: _jsx(MUIThemeProvider, { theme: theme, children: _jsx(ScopedCssBaseline, { children: children }) }) }));
15
+ return (_jsx(StyledEngineProvider, { injectFirst: true, children: _jsx(MUIThemeProvider, { theme: theme, children: _jsx(ScopedCssBaseline, { enableColorScheme: true, children: children }) }) }));
16
16
  }
17
17
  export default RendererThemeProvider;
18
18
  //# sourceMappingURL=RendererThemeProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RendererThemeProvider.js","sourceRoot":"","sources":["../../src/theme/RendererThemeProvider.tsx"],"names":[],"mappings":";AAmBA,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,IAAI,gBAAgB,EAClC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,+BAA+B,EAAE,MAAM,6CAA6C,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAE,QAAQ,EAA2B;IACzE,MAAM,KAAK,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAChD,KAAK,CAAC,UAAU,GAAG,+BAA+B,CAAC,KAAK,CAAC,CAAC;IAE1D,OAAO,CACL,KAAC,oBAAoB,IAAC,WAAW,kBAC/B,KAAC,gBAAgB,IAAC,KAAK,EAAE,KAAK,YAC5B,KAAC,iBAAiB,cAAE,QAAQ,GAAqB,GAChC,GACE,CACxB,CAAC;AACJ,CAAC;AAED,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"RendererThemeProvider.js","sourceRoot":"","sources":["../../src/theme/RendererThemeProvider.tsx"],"names":[],"mappings":";AAmBA,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,IAAI,gBAAgB,EAClC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,+BAA+B,EAAE,MAAM,6CAA6C,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAE,QAAQ,EAA2B;IACzE,MAAM,KAAK,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAChD,KAAK,CAAC,UAAU,GAAG,+BAA+B,CAAC,KAAK,CAAC,CAAC;IAE1D,OAAO,CACL,KAAC,oBAAoB,IAAC,WAAW,kBAC/B,KAAC,gBAAgB,IAAC,KAAK,EAAE,KAAK,YAC5B,KAAC,iBAAiB,IAAC,iBAAiB,kBAAE,QAAQ,GAAqB,GAClD,GACE,CACxB,CAAC;AACJ,CAAC;AAED,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * A simple theme toggle button that cycles through light, dark, and system themes.
3
+ * Must be used within a RendererDynamicThemeProvider.
4
+ */
5
+ export declare function RendererThemeToggle(): import("react/jsx-runtime").JSX.Element;
6
+ export default RendererThemeToggle;
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { IconButton, Tooltip } from '@mui/material';
3
+ import { Brightness4 as DarkIcon, Brightness7 as LightIcon, SettingsBrightness as SystemIcon } from '@mui/icons-material';
4
+ import { useRendererTheme } from './useRendererTheme';
5
+ /**
6
+ * A simple theme toggle button that cycles through light, dark, and system themes.
7
+ * Must be used within a RendererDynamicThemeProvider.
8
+ */
9
+ export function RendererThemeToggle() {
10
+ const { mode, setMode } = useRendererTheme();
11
+ const handleToggle = () => {
12
+ if (mode === 'light') {
13
+ setMode('dark');
14
+ }
15
+ else if (mode === 'dark') {
16
+ setMode('system');
17
+ }
18
+ else {
19
+ setMode('light');
20
+ }
21
+ };
22
+ const getIcon = () => {
23
+ switch (mode) {
24
+ case 'light':
25
+ return _jsx(LightIcon, {});
26
+ case 'dark':
27
+ return _jsx(DarkIcon, {});
28
+ case 'system':
29
+ return _jsx(SystemIcon, {});
30
+ }
31
+ };
32
+ const getTooltip = () => {
33
+ switch (mode) {
34
+ case 'light':
35
+ return 'Switch to dark mode';
36
+ case 'dark':
37
+ return 'Switch to system theme';
38
+ case 'system':
39
+ return 'Switch to light mode';
40
+ }
41
+ };
42
+ return (_jsx(Tooltip, { title: getTooltip(), children: _jsx(IconButton, { onClick: handleToggle, color: "inherit", children: getIcon() }) }));
43
+ }
44
+ export default RendererThemeToggle;
45
+ //# sourceMappingURL=RendererThemeToggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RendererThemeToggle.js","sourceRoot":"","sources":["../../src/theme/RendererThemeToggle.tsx"],"names":[],"mappings":";AAkBA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,WAAW,IAAI,QAAQ,EACvB,WAAW,IAAI,SAAS,EACxB,kBAAkB,IAAI,UAAU,EACjC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAE7C,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,OAAO;gBACV,OAAO,KAAC,SAAS,KAAG,CAAC;YACvB,KAAK,MAAM;gBACT,OAAO,KAAC,QAAQ,KAAG,CAAC;YACtB,KAAK,QAAQ;gBACX,OAAO,KAAC,UAAU,KAAG,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,OAAO;gBACV,OAAO,qBAAqB,CAAC;YAC/B,KAAK,MAAM;gBACT,OAAO,wBAAwB,CAAC;YAClC,KAAK,QAAQ;gBACX,OAAO,sBAAsB,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,OAAO,IAAC,KAAK,EAAE,UAAU,EAAE,YAC1B,KAAC,UAAU,IAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAC,SAAS,YAC/C,OAAO,EAAE,GACC,GACL,CACX,CAAC;AACJ,CAAC;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Hook to access and control the renderer theme.
3
+ * Must be used within a RendererDynamicThemeProvider.
4
+ */
5
+ export declare function useRendererTheme(): import("./RendererDynamicThemeProvider").RendererThemeContextType;
@@ -0,0 +1,30 @@
1
+ /*
2
+ * Copyright 2025 Commonwealth Scientific and Industrial Research
3
+ * Organisation (CSIRO) ABN 41 687 119 230.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { useContext } from 'react';
18
+ import { RendererThemeContext } from './RendererDynamicThemeProvider';
19
+ /**
20
+ * Hook to access and control the renderer theme.
21
+ * Must be used within a RendererDynamicThemeProvider.
22
+ */
23
+ export function useRendererTheme() {
24
+ const context = useContext(RendererThemeContext);
25
+ if (context === undefined) {
26
+ throw new Error('useRendererTheme must be used within a RendererDynamicThemeProvider');
27
+ }
28
+ return context;
29
+ }
30
+ //# sourceMappingURL=useRendererTheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRendererTheme.js","sourceRoot":"","sources":["../../src/theme/useRendererTheme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACjD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aehrc/smart-forms-renderer",
3
- "version": "1.0.0-alpha.93",
3
+ "version": "1.0.0-alpha.94",
4
4
  "description": "FHIR Structured Data Captured (SDC) rendering engine for Smart Forms",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -39,7 +39,7 @@ export function RendererThemeProvider({ children }: { children: ReactNode }) {
39
39
  return (
40
40
  <StyledEngineProvider injectFirst>
41
41
  <MUIThemeProvider theme={theme}>
42
- <ScopedCssBaseline>{children}</ScopedCssBaseline>
42
+ <ScopedCssBaseline enableColorScheme>{children}</ScopedCssBaseline>
43
43
  </MUIThemeProvider>
44
44
  </StyledEngineProvider>
45
45
  );