@plumile/ui 0.1.125 → 0.1.131

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 (140) hide show
  1. package/README.md +6 -0
  2. package/lib/esm/admin/organisms/admin_sidebar/adminSidebar.css.js +2 -1
  3. package/lib/esm/admin/organisms/admin_topbar/adminTopbar.css.js +1 -1
  4. package/lib/esm/admin/theme/BackofficeThemeProvider.js +43 -0
  5. package/lib/esm/admin/theme/BackofficeThemeProvider.js.map +1 -0
  6. package/lib/esm/admin/theme/adminDensity.css.js +1 -1
  7. package/lib/esm/admin/theme/adminSurface.css.js +1 -1
  8. package/lib/esm/atomic/atoms/badge/badge.css.js.map +1 -1
  9. package/lib/esm/atomic/atoms/button/button.css.js +2 -2
  10. package/lib/esm/atomic/atoms/button/button.css.js.map +1 -1
  11. package/lib/esm/atomic/atoms/checkbox/checkbox.css.js.map +1 -1
  12. package/lib/esm/atomic/atoms/input/input.css.js.map +1 -1
  13. package/lib/esm/atomic/atoms/textarea/textarea.css.js.map +1 -1
  14. package/lib/esm/atomic/molecules/breadcrumb_navigation/breadcrumbNavigation.css.js.map +1 -1
  15. package/lib/esm/atomic/molecules/checkbox_field/checkboxField.css.js.map +1 -1
  16. package/lib/esm/atomic/molecules/form/formStyles.css.js.map +1 -1
  17. package/lib/esm/atomic/molecules/markdown/LazyMarkdownRenderer.css.js +1 -1
  18. package/lib/esm/atomic/molecules/markdown/components/MarkdownArticleContainer.css.js +1 -0
  19. package/lib/esm/atomic/molecules/markdown/components/MarkdownArticleContainer.css.js.map +1 -1
  20. package/lib/esm/atomic/molecules/markdown/components/MarkdownCodeCopyButton.css.js.map +1 -1
  21. package/lib/esm/atomic/molecules/markdown/components/MarkdownDelete.css.js.map +1 -1
  22. package/lib/esm/atomic/molecules/markdown/components/MarkdownEmphasis.css.js.map +1 -1
  23. package/lib/esm/atomic/molecules/markdown/components/MarkdownFootnoteReference.css.js.map +1 -1
  24. package/lib/esm/atomic/molecules/markdown/components/MarkdownHeading.css.js +0 -1
  25. package/lib/esm/atomic/molecules/markdown/components/MarkdownHeading.css.js.map +1 -1
  26. package/lib/esm/atomic/molecules/markdown/components/MarkdownInlineCode.css.js.map +1 -1
  27. package/lib/esm/atomic/molecules/markdown/components/MarkdownLink.css.js.map +1 -1
  28. package/lib/esm/atomic/molecules/markdown/components/MarkdownList.css.js.map +1 -1
  29. package/lib/esm/atomic/molecules/markdown/components/MarkdownListItem.css.js.map +1 -1
  30. package/lib/esm/atomic/molecules/markdown/components/MarkdownMark.css.js.map +1 -1
  31. package/lib/esm/atomic/molecules/markdown/components/MarkdownMermaidBlock.js +1 -1
  32. package/lib/esm/atomic/molecules/markdown/components/MarkdownMermaidBlock.js.map +1 -1
  33. package/lib/esm/atomic/molecules/markdown/components/MarkdownParagraph.css.js.map +1 -1
  34. package/lib/esm/atomic/molecules/markdown/components/MarkdownStrong.css.js.map +1 -1
  35. package/lib/esm/atomic/molecules/markdown/components/MarkdownSubscript.css.js.map +1 -1
  36. package/lib/esm/atomic/molecules/markdown/components/MarkdownSuperscript.css.js.map +1 -1
  37. package/lib/esm/atomic/molecules/markdown/components/MarkdownTable.css.js.map +1 -1
  38. package/lib/esm/atomic/molecules/markdown/components/MarkdownTableCaption.css.js.map +1 -1
  39. package/lib/esm/atomic/molecules/markdown/components/MarkdownTableCell.css.js.map +1 -1
  40. package/lib/esm/atomic/molecules/markdown/components/MarkdownTableRow.css.js.map +1 -1
  41. package/lib/esm/atomic/molecules/markdown/components/MarkdownTaskListItem.css.js.map +1 -1
  42. package/lib/esm/atomic/molecules/markdown/components/MarkdownText.css.js.map +1 -1
  43. package/lib/esm/atomic/molecules/tabs/tabs.css.js.map +1 -1
  44. package/lib/esm/atomic/molecules/toast/toast.css.js.map +1 -1
  45. package/lib/esm/atomic/organisms/sidebar/navigationSidebar.css.js.map +1 -1
  46. package/lib/esm/atomic/organisms/sidebar/sidebar.css.js.map +1 -1
  47. package/lib/esm/backoffice/atoms/tag/Tag.js +9 -8
  48. package/lib/esm/backoffice/atoms/tag/Tag.js.map +1 -1
  49. package/lib/esm/backoffice/layout/backofficeLayoutTokens.js +1 -1
  50. package/lib/esm/backoffice/layout/backofficeLayoutTokens.js.map +1 -1
  51. package/lib/esm/backoffice/molecules/backoffice_filter_drawer/backofficeFilterDrawer.css.js.map +1 -1
  52. package/lib/esm/backoffice/molecules/backoffice_relations_menu/backofficeRelationsMenu.css.js.map +1 -1
  53. package/lib/esm/backoffice/molecules/backoffice_tabs/backofficeTabs.css.js +2 -2
  54. package/lib/esm/backoffice/molecules/backoffice_tabs/backofficeTabs.css.js.map +1 -1
  55. package/lib/esm/backoffice/molecules/filter_chip_row/filterChipRow.css.js.map +1 -1
  56. package/lib/esm/backoffice/molecules/sidebar_nav_item/sidebarNavItem.css.js +1 -1
  57. package/lib/esm/backoffice/molecules/sidebar_nav_item/sidebarNavItem.css.js.map +1 -1
  58. package/lib/esm/backoffice/molecules/sidebar_nav_section/sidebarNavSection.css.js.map +1 -1
  59. package/lib/esm/backoffice/molecules/sidebar_profile_menu/sidebarProfileMenu.css.js.map +1 -1
  60. package/lib/esm/backoffice/templates/detail_page_template/detailPageTemplate.css.js +1 -1
  61. package/lib/esm/backoffice/templates/list_page_template/listPageTemplate.css.js +1 -1
  62. package/lib/esm/backoffice/templates/list_page_template/listPageTemplate.css.js.map +1 -1
  63. package/lib/esm/components/charts/MetricHistoryChart.js +1 -1
  64. package/lib/esm/components/charts/MetricHistoryChart.js.map +1 -1
  65. package/lib/esm/components/charts/TimeSeriesLineChart.js +34 -34
  66. package/lib/esm/components/charts/TimeSeriesLineChart.js.map +1 -1
  67. package/lib/esm/components/dashboard/section_nav/SectionNav.css.js.map +1 -1
  68. package/lib/esm/components/dashboard/segmented_nav/SegmentedNav.css.js.map +1 -1
  69. package/lib/esm/components/data-table/DataTable.css.js +44 -44
  70. package/lib/esm/components/data-table/DataTable.css.js.map +1 -1
  71. package/lib/esm/components/data-table/ResponsiveRecordList.css.js +1 -1
  72. package/lib/esm/components/data-table/ResponsiveRecordList.css.js.map +1 -1
  73. package/lib/esm/components/data-table/VirtualizedConnectionTable.js +1 -1
  74. package/lib/esm/components/layout/PageShell.css.js.map +1 -1
  75. package/lib/esm/components/media/imagePreviewModal.css.js.map +1 -1
  76. package/lib/esm/components/routing/routePendingBar.css.js.map +1 -1
  77. package/lib/esm/components/select/SimpleSelect.css.js.map +1 -1
  78. package/lib/esm/index.js +255 -256
  79. package/lib/esm/internal/charts/timeSeriesLineChartHelpers.js +54 -4
  80. package/lib/esm/internal/charts/timeSeriesLineChartHelpers.js.map +1 -1
  81. package/lib/esm/shared/backofficeTableDensity.css.js +1 -1
  82. package/lib/esm/shared/currencyAmount.js +36 -23
  83. package/lib/esm/shared/currencyAmount.js.map +1 -1
  84. package/lib/esm/style.css +1 -1
  85. package/lib/esm/theme/ThemeProvider.js +28 -26
  86. package/lib/esm/theme/ThemeProvider.js.map +1 -1
  87. package/lib/esm/theme/backofficeTheme.css.js +4092 -0
  88. package/lib/esm/theme/backofficeTheme.css.js.map +1 -0
  89. package/lib/esm/theme/index.js +11 -11
  90. package/lib/esm/theme/publicTheme.css.js +4091 -0
  91. package/lib/esm/theme/publicTheme.css.js.map +1 -0
  92. package/lib/esm/theme/sprinkles.css.js.map +1 -1
  93. package/lib/esm/theme/theme.css.js +6129 -3
  94. package/lib/esm/theme/theme.css.js.map +1 -1
  95. package/lib/esm/theme/themeContract.css.js +2329 -0
  96. package/lib/esm/theme/themeContract.css.js.map +1 -0
  97. package/lib/types/admin/theme/BackofficeThemeProvider.d.ts +18 -0
  98. package/lib/types/admin/theme/BackofficeThemeProvider.d.ts.map +1 -0
  99. package/lib/types/backoffice/atoms/tag/Tag.d.ts +2 -1
  100. package/lib/types/backoffice/atoms/tag/Tag.d.ts.map +1 -1
  101. package/lib/types/components/charts/TimeSeriesLineChart.d.ts +2 -0
  102. package/lib/types/components/charts/TimeSeriesLineChart.d.ts.map +1 -1
  103. package/lib/types/components/data-table/DataTable.css.d.ts.map +1 -1
  104. package/lib/types/index.d.ts +2 -3
  105. package/lib/types/index.d.ts.map +1 -1
  106. package/lib/types/internal/charts/timeSeriesLineChartHelpers.d.ts +20 -0
  107. package/lib/types/internal/charts/timeSeriesLineChartHelpers.d.ts.map +1 -1
  108. package/lib/types/shared/currencyAmount.d.ts +5 -1
  109. package/lib/types/shared/currencyAmount.d.ts.map +1 -1
  110. package/lib/types/theme/ThemeProvider.d.ts +3 -1
  111. package/lib/types/theme/ThemeProvider.d.ts.map +1 -1
  112. package/lib/types/theme/backofficeTheme.css.d.ts +4291 -0
  113. package/lib/types/theme/backofficeTheme.css.d.ts.map +1 -0
  114. package/lib/types/theme/index.d.ts +1 -1
  115. package/lib/types/theme/index.d.ts.map +1 -1
  116. package/lib/types/theme/publicTheme.css.d.ts +4296 -0
  117. package/lib/types/theme/publicTheme.css.d.ts.map +1 -0
  118. package/lib/types/theme/theme.css.d.ts +3 -3
  119. package/lib/types/theme/theme.css.d.ts.map +1 -1
  120. package/lib/types/theme/{themeContract.d.ts → themeContract.css.d.ts} +1 -1
  121. package/lib/types/theme/{theme-light.css.d.ts.map → themeContract.css.d.ts.map} +1 -1
  122. package/package.json +3 -3
  123. package/lib/esm/admin/theme/AdminThemeProvider.js +0 -15
  124. package/lib/esm/admin/theme/AdminThemeProvider.js.map +0 -1
  125. package/lib/esm/admin/theme/adminTheme.css.js +0 -13
  126. package/lib/esm/admin/theme/adminTheme.css.js.map +0 -1
  127. package/lib/esm/theme/theme-dark.css.js +0 -8
  128. package/lib/esm/theme/theme-dark.css.js.map +0 -1
  129. package/lib/esm/theme/theme-light.css.js +0 -2049
  130. package/lib/esm/theme/theme-light.css.js.map +0 -1
  131. package/lib/esm/theme/themeContract.js +0 -1051
  132. package/lib/esm/theme/themeContract.js.map +0 -1
  133. package/lib/types/admin/theme/AdminThemeProvider.d.ts +0 -9
  134. package/lib/types/admin/theme/AdminThemeProvider.d.ts.map +0 -1
  135. package/lib/types/admin/theme/adminTheme.css.d.ts +0 -2
  136. package/lib/types/admin/theme/adminTheme.css.d.ts.map +0 -1
  137. package/lib/types/theme/theme-dark.css.d.ts +0 -2
  138. package/lib/types/theme/theme-dark.css.d.ts.map +0 -1
  139. package/lib/types/theme/theme-light.css.d.ts +0 -2146
  140. package/lib/types/theme/themeContract.d.ts.map +0 -1
@@ -1,56 +1,58 @@
1
1
  import "./accessibility.css.js";
2
2
  import "./global.css.js";
3
- import { darkThemeClass as e, lightThemeClass as t } from "./theme.css.js";
3
+ import { publicDarkThemeClass as e, publicLightThemeClass as t } from "./theme.css.js";
4
4
  import { createContext as n, useContext as r, useEffect as i, useMemo as a, useState as o } from "react";
5
5
  import { jsx as s } from "react/jsx-runtime";
6
6
  //#region src/theme/ThemeProvider.tsx
7
- var c = n(void 0), l = "plumile-theme-mode", u = () => typeof window > "u" || typeof window.matchMedia != "function" ? "light" : window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light", d = (e, t) => e === "system" ? t : e, f = (e) => {
7
+ var c = n(void 0), l = "plumile-theme-mode", u = () => typeof window > "u" || typeof window.matchMedia != "function" ? "light" : window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light", d = (e, t) => e === "system" ? t : e, f = (e) => e === "system" || e === "light" || e === "dark", p = (e, t = l) => {
8
8
  if (typeof window > "u") return e;
9
- let t = window.localStorage.getItem(l);
10
- return t === "system" || t === "light" || t === "dark" ? t : e;
11
- }, p = ({ children: n, defaultMode: r = "system" }) => {
12
- let [p, m] = o(() => f(r)), [h, g] = o(() => u()), _ = d(p, h);
9
+ let n = window.localStorage.getItem(t);
10
+ return f(n) ? n : e;
11
+ }, m = (e) => e.split(/\s+/).filter(Boolean), h = ({ children: n, defaultMode: r = "system" }) => {
12
+ let [f, h] = o(() => p(r)), [g, _] = o(() => u()), v = d(f, g);
13
13
  i(() => {
14
- if (p === "system" && typeof window < "u" && typeof window.matchMedia == "function") {
14
+ if (f === "system" && typeof window < "u" && typeof window.matchMedia == "function") {
15
15
  let e = window.matchMedia("(prefers-color-scheme: dark)"), t = (t) => {
16
16
  if (t?.matches ?? e.matches) {
17
- g("dark");
17
+ _("dark");
18
18
  return;
19
19
  }
20
- g("light");
20
+ _("light");
21
21
  };
22
22
  return t(e), e.addEventListener("change", t), () => {
23
23
  e.removeEventListener("change", t);
24
24
  };
25
25
  }
26
- }, [p]), i(() => {
27
- typeof window > "u" || window.localStorage.setItem(l, p);
28
- }, [p]), i(() => {
26
+ }, [f]), i(() => {
27
+ typeof window > "u" || window.localStorage.setItem(l, f);
28
+ }, [f]), i(() => {
29
29
  if (typeof document > "u") return;
30
- let n = document.documentElement, r = t;
31
- return _ === "dark" && (r = e), n.classList.remove(t, e), n.classList.add(r), () => {
32
- n.classList.remove(t, e);
30
+ let n = document.body, r = t;
31
+ return v === "dark" && (r = e), n.classList.remove(...m(t), ...m(e)), n.classList.add(...m(r)), () => {
32
+ n.classList.remove(...m(t), ...m(e));
33
33
  };
34
- }, [_]);
35
- let v = a(() => ({
36
- mode: p,
37
- resolvedTheme: _,
38
- setMode: m
39
- }), [p, _]);
34
+ }, [v]);
35
+ let y = a(() => ({
36
+ mode: f,
37
+ resolvedTheme: v,
38
+ setMode: h
39
+ }), [f, v]);
40
40
  return /* @__PURE__ */ s(c.Provider, {
41
- value: v,
41
+ value: y,
42
42
  children: n
43
43
  });
44
- }, m = () => {
44
+ }, g = () => {
45
45
  let e = r(c);
46
46
  if (e == null) throw Error("useTheme must be used within a ThemeProvider");
47
47
  return e;
48
- }, h = {
48
+ }, _ = {
49
49
  getSystemTheme: u,
50
+ isThemeMode: f,
50
51
  resolveTheme: d,
51
- readStoredMode: f
52
+ readStoredMode: p,
53
+ splitClassName: m
52
54
  };
53
55
  //#endregion
54
- export { l as THEME_MODE_KEY, p as ThemeProvider, h as __test, m as useTheme };
56
+ export { l as THEME_MODE_KEY, h as ThemeProvider, _ as __test, g as useTheme };
55
57
 
56
58
  //# sourceMappingURL=ThemeProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.js","names":[],"sources":["../../../src/theme/ThemeProvider.tsx"],"sourcesContent":["import {\n type JSX,\n type ReactNode,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nimport './accessibility.css.js';\nimport './global.css.js';\nimport { darkThemeClass, lightThemeClass } from './theme.css.js';\n\nexport type ThemeMode = 'system' | 'light' | 'dark';\nexport type ResolvedTheme = 'light' | 'dark';\n\ntype ThemeContextValue = {\n mode: ThemeMode;\n resolvedTheme: ResolvedTheme;\n setMode: (mode: ThemeMode) => void;\n};\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nexport const THEME_MODE_KEY = 'plumile-theme-mode';\n\ntype ThemeProviderProps = {\n children: ReactNode;\n defaultMode?: ThemeMode;\n};\n\nconst getSystemTheme = (): ResolvedTheme => {\n if (\n typeof window === 'undefined' ||\n typeof window.matchMedia !== 'function'\n ) {\n return 'light';\n }\n\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n\n return 'light';\n};\n\nconst resolveTheme = (\n mode: ThemeMode,\n systemTheme: ResolvedTheme,\n): ResolvedTheme => {\n if (mode === 'system') {\n return systemTheme;\n }\n\n return mode;\n};\n\nconst readStoredMode = (defaultMode: ThemeMode): ThemeMode => {\n if (typeof window === 'undefined') {\n return defaultMode;\n }\n\n const savedMode = window.localStorage.getItem(THEME_MODE_KEY);\n\n if (savedMode === 'system' || savedMode === 'light' || savedMode === 'dark') {\n return savedMode;\n }\n\n return defaultMode;\n};\n\nexport const ThemeProvider = ({\n children,\n defaultMode = 'system',\n}: ThemeProviderProps): JSX.Element => {\n const [mode, setMode] = useState<ThemeMode>(() => {\n return readStoredMode(defaultMode);\n });\n const [systemTheme, setSystemTheme] = useState<ResolvedTheme>(() => {\n return getSystemTheme();\n });\n const resolvedTheme = resolveTheme(mode, systemTheme);\n\n useEffect(() => {\n if (\n mode === 'system' &&\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function'\n ) {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const updateSystemTheme = (\n event?: MediaQueryList | MediaQueryListEvent,\n ): void => {\n const matchesDarkTheme = event?.matches ?? mediaQuery.matches;\n\n if (matchesDarkTheme) {\n setSystemTheme('dark');\n return;\n }\n\n setSystemTheme('light');\n };\n\n updateSystemTheme(mediaQuery);\n mediaQuery.addEventListener('change', updateSystemTheme);\n\n return () => {\n mediaQuery.removeEventListener('change', updateSystemTheme);\n };\n }\n\n return undefined;\n }, [mode]);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n window.localStorage.setItem(THEME_MODE_KEY, mode);\n return undefined;\n }, [mode]);\n\n useEffect(() => {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n const root = document.documentElement;\n let themeClass = lightThemeClass;\n\n if (resolvedTheme === 'dark') {\n themeClass = darkThemeClass;\n }\n\n root.classList.remove(lightThemeClass, darkThemeClass);\n root.classList.add(themeClass);\n\n return () => {\n root.classList.remove(lightThemeClass, darkThemeClass);\n };\n }, [resolvedTheme]);\n\n const value = useMemo(() => {\n return {\n mode,\n resolvedTheme,\n setMode,\n };\n }, [mode, resolvedTheme]);\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n};\n\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n\n if (context == null) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n\n return context;\n};\n\nexport const __test = {\n getSystemTheme,\n resolveTheme,\n readStoredMode,\n} as const;\n"],"mappings":";;;;;;AAuBA,IAAM,IAAe,EAA6C,KAAA,EAAU,EAE/D,IAAiB,sBAOxB,UAEF,OAAO,SAAW,OAClB,OAAO,OAAO,cAAe,aAEtB,UAGL,OAAO,WAAW,+BAA+B,CAAC,UAC7C,SAGF,SAGH,KACJ,GACA,MAEI,MAAS,WACJ,IAGF,GAGH,KAAkB,MAAsC;CAC5D,IAAI,OAAO,SAAW,KACpB,OAAO;CAGT,IAAM,IAAY,OAAO,aAAa,QAAQ,EAAe;CAM7D,OAJI,MAAc,YAAY,MAAc,WAAW,MAAc,SAC5D,IAGF;GAGI,KAAiB,EAC5B,aACA,iBAAc,eACuB;CACrC,IAAM,CAAC,GAAM,KAAW,QACf,EAAe,EAAY,CAClC,EACI,CAAC,GAAa,KAAkB,QAC7B,GAAgB,CACvB,EACI,IAAgB,EAAa,GAAM,EAAY;CA2CrD,AAzCA,QAAgB;EACd,IACE,MAAS,YACT,OAAO,SAAW,OAClB,OAAO,OAAO,cAAe,YAC7B;GACA,IAAM,IAAa,OAAO,WAAW,+BAA+B,EAE9D,KACJ,MACS;IAGT,IAFyB,GAAO,WAAW,EAAW,SAEhC;KACpB,EAAe,OAAO;KACtB;;IAGF,EAAe,QAAQ;;GAMzB,OAHA,EAAkB,EAAW,EAC7B,EAAW,iBAAiB,UAAU,EAAkB,QAE3C;IACX,EAAW,oBAAoB,UAAU,EAAkB;;;IAK9D,CAAC,EAAK,CAAC,EAEV,QAAgB;EACV,OAAO,SAAW,OAItB,OAAO,aAAa,QAAQ,GAAgB,EAAK;IAEhD,CAAC,EAAK,CAAC,EAEV,QAAgB;EACd,IAAI,OAAO,WAAa,KACtB;EAGF,IAAM,IAAO,SAAS,iBAClB,IAAa;EASjB,OAPI,MAAkB,WACpB,IAAa,IAGf,EAAK,UAAU,OAAO,GAAiB,EAAe,EACtD,EAAK,UAAU,IAAI,EAAW,QAEjB;GACX,EAAK,UAAU,OAAO,GAAiB,EAAe;;IAEvD,CAAC,EAAc,CAAC;CAEnB,IAAM,IAAQ,SACL;EACL;EACA;EACA;EACD,GACA,CAAC,GAAM,EAAc,CAAC;CAEzB,OACE,kBAAC,EAAa,UAAd;EAA8B;EAAQ;EAAiC,CAAA;GAI9D,UAAoC;CAC/C,IAAM,IAAU,EAAW,EAAa;CAExC,IAAI,KAAW,MACb,MAAU,MAAM,+CAA+C;CAGjE,OAAO;GAGI,IAAS;CACpB;CACA;CACA;CACD"}
1
+ {"version":3,"file":"ThemeProvider.js","names":[],"sources":["../../../src/theme/ThemeProvider.tsx"],"sourcesContent":["import {\n type JSX,\n type ReactNode,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nimport './accessibility.css.js';\nimport './global.css.js';\nimport { publicDarkThemeClass, publicLightThemeClass } from './theme.css.js';\n\nexport type ThemeMode = 'system' | 'light' | 'dark';\nexport type ResolvedTheme = 'light' | 'dark';\n\ntype ThemeContextValue = {\n mode: ThemeMode;\n resolvedTheme: ResolvedTheme;\n setMode: (mode: ThemeMode) => void;\n};\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nexport const THEME_MODE_KEY = 'plumile-theme-mode';\n\ntype ThemeProviderProps = {\n children: ReactNode;\n defaultMode?: ThemeMode;\n};\n\nconst getSystemTheme = (): ResolvedTheme => {\n if (\n typeof window === 'undefined' ||\n typeof window.matchMedia !== 'function'\n ) {\n return 'light';\n }\n\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n\n return 'light';\n};\n\nconst resolveTheme = (\n mode: ThemeMode,\n systemTheme: ResolvedTheme,\n): ResolvedTheme => {\n if (mode === 'system') {\n return systemTheme;\n }\n\n return mode;\n};\n\nconst isThemeMode = (value: string | null): value is ThemeMode => {\n return value === 'system' || value === 'light' || value === 'dark';\n};\n\nconst readStoredMode = (\n defaultMode: ThemeMode,\n storageKey = THEME_MODE_KEY,\n): ThemeMode => {\n if (typeof window === 'undefined') {\n return defaultMode;\n }\n\n const storage = window.localStorage;\n const savedMode = storage.getItem(storageKey);\n\n if (isThemeMode(savedMode)) {\n return savedMode;\n }\n\n return defaultMode;\n};\n\nconst splitClassName = (className: string): string[] => {\n return className.split(/\\s+/).filter(Boolean);\n};\n\nexport const ThemeProvider = ({\n children,\n defaultMode = 'system',\n}: ThemeProviderProps): JSX.Element => {\n const [mode, setMode] = useState<ThemeMode>(() => {\n return readStoredMode(defaultMode);\n });\n const [systemTheme, setSystemTheme] = useState<ResolvedTheme>(() => {\n return getSystemTheme();\n });\n const resolvedTheme = resolveTheme(mode, systemTheme);\n\n useEffect(() => {\n if (\n mode === 'system' &&\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function'\n ) {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const updateSystemTheme = (\n event?: MediaQueryList | MediaQueryListEvent,\n ): void => {\n const matchesDarkTheme = event?.matches ?? mediaQuery.matches;\n\n if (matchesDarkTheme) {\n setSystemTheme('dark');\n return;\n }\n\n setSystemTheme('light');\n };\n\n updateSystemTheme(mediaQuery);\n mediaQuery.addEventListener('change', updateSystemTheme);\n\n return () => {\n mediaQuery.removeEventListener('change', updateSystemTheme);\n };\n }\n\n return undefined;\n }, [mode]);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const storage = window.localStorage;\n storage.setItem(THEME_MODE_KEY, mode);\n return undefined;\n }, [mode]);\n\n useEffect(() => {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n const root = document.body;\n let themeClass = publicLightThemeClass;\n\n if (resolvedTheme === 'dark') {\n themeClass = publicDarkThemeClass;\n }\n\n root.classList.remove(\n ...splitClassName(publicLightThemeClass),\n ...splitClassName(publicDarkThemeClass),\n );\n root.classList.add(...splitClassName(themeClass));\n\n return () => {\n root.classList.remove(\n ...splitClassName(publicLightThemeClass),\n ...splitClassName(publicDarkThemeClass),\n );\n };\n }, [resolvedTheme]);\n\n const value = useMemo(() => {\n return {\n mode,\n resolvedTheme,\n setMode,\n };\n }, [mode, resolvedTheme]);\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n};\n\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n\n if (context == null) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n\n return context;\n};\n\nexport const __test = {\n getSystemTheme,\n isThemeMode,\n resolveTheme,\n readStoredMode,\n splitClassName,\n} as const;\n"],"mappings":";;;;;;AAuBA,IAAM,IAAe,EAA6C,KAAA,EAAU,EAE/D,IAAiB,sBAOxB,UAEF,OAAO,SAAW,OAClB,OAAO,OAAO,cAAe,aAEtB,UAGL,OAAO,WAAW,+BAA+B,CAAC,UAC7C,SAGF,SAGH,KACJ,GACA,MAEI,MAAS,WACJ,IAGF,GAGH,KAAe,MACZ,MAAU,YAAY,MAAU,WAAW,MAAU,QAGxD,KACJ,GACA,IAAa,MACC;CACd,IAAI,OAAO,SAAW,KACpB,OAAO;CAIT,IAAM,IADU,OAAO,aACG,QAAQ,EAAW;CAM7C,OAJI,EAAY,EAAU,GACjB,IAGF;GAGH,KAAkB,MACf,EAAU,MAAM,MAAM,CAAC,OAAO,QAAQ,EAGlC,KAAiB,EAC5B,aACA,iBAAc,eACuB;CACrC,IAAM,CAAC,GAAM,KAAW,QACf,EAAe,EAAY,CAClC,EACI,CAAC,GAAa,KAAkB,QAC7B,GAAgB,CACvB,EACI,IAAgB,EAAa,GAAM,EAAY;CA4CrD,AA1CA,QAAgB;EACd,IACE,MAAS,YACT,OAAO,SAAW,OAClB,OAAO,OAAO,cAAe,YAC7B;GACA,IAAM,IAAa,OAAO,WAAW,+BAA+B,EAE9D,KACJ,MACS;IAGT,IAFyB,GAAO,WAAW,EAAW,SAEhC;KACpB,EAAe,OAAO;KACtB;;IAGF,EAAe,QAAQ;;GAMzB,OAHA,EAAkB,EAAW,EAC7B,EAAW,iBAAiB,UAAU,EAAkB,QAE3C;IACX,EAAW,oBAAoB,UAAU,EAAkB;;;IAK9D,CAAC,EAAK,CAAC,EAEV,QAAgB;EACV,OAAO,SAAW,OAKtB,OADuB,aACf,QAAQ,GAAgB,EAAK;IAEpC,CAAC,EAAK,CAAC,EAEV,QAAgB;EACd,IAAI,OAAO,WAAa,KACtB;EAGF,IAAM,IAAO,SAAS,MAClB,IAAa;EAYjB,OAVI,MAAkB,WACpB,IAAa,IAGf,EAAK,UAAU,OACb,GAAG,EAAe,EAAsB,EACxC,GAAG,EAAe,EAAqB,CACxC,EACD,EAAK,UAAU,IAAI,GAAG,EAAe,EAAW,CAAC,QAEpC;GACX,EAAK,UAAU,OACb,GAAG,EAAe,EAAsB,EACxC,GAAG,EAAe,EAAqB,CACxC;;IAEF,CAAC,EAAc,CAAC;CAEnB,IAAM,IAAQ,SACL;EACL;EACA;EACA;EACD,GACA,CAAC,GAAM,EAAc,CAAC;CAEzB,OACE,kBAAC,EAAa,UAAd;EAA8B;EAAQ;EAAiC,CAAA;GAI9D,UAAoC;CAC/C,IAAM,IAAU,EAAW,EAAa;CAExC,IAAI,KAAW,MACb,MAAU,MAAM,+CAA+C;CAGjE,OAAO;GAGI,IAAS;CACpB;CACA;CACA;CACA;CACA;CACD"}