@handijit/ui 1.0.0 → 2.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.
- package/README.md +485 -571
- package/build/base.css +1 -1
- package/build/charts.cjs +1 -1
- package/build/charts.cjs.map +1 -1
- package/build/charts.css +1 -1
- package/build/charts.js +350 -349
- package/build/charts.js.map +1 -1
- package/build/chat.cjs +3 -3
- package/build/chat.cjs.map +1 -1
- package/build/chat.css +1 -1
- package/build/chat.js +344 -343
- package/build/chat.js.map +1 -1
- package/build/components/Accordion/style.css +1 -1
- package/build/components/Alert/style.css +1 -1
- package/build/components/Avatar/style.css +1 -1
- package/build/components/Badge/index.cjs +1 -1
- package/build/components/Badge/index.cjs.map +1 -1
- package/build/components/Badge/index.d.ts +8 -13
- package/build/components/Badge/index.js +1 -1
- package/build/components/Badge/index.js.map +1 -1
- package/build/components/Badge/style.css +1 -1
- package/build/components/BottomSheet/style.css +1 -1
- package/build/components/Breadcrumb/style.css +1 -1
- package/build/components/Button/index.cjs +1 -1
- package/build/components/Button/index.cjs.map +1 -1
- package/build/components/Button/index.js +2 -2
- package/build/components/Button/index.js.map +1 -1
- package/build/components/Button/style.css +1 -1
- package/build/components/Card/style.css +1 -1
- package/build/components/Carousel/style.css +1 -1
- package/build/components/Checkbox/style.css +1 -1
- package/build/components/Chip/style.css +1 -1
- package/build/components/ChipGroup/style.css +1 -1
- package/build/components/CodeBadge/style.css +1 -1
- package/build/components/Combobox/index.cjs +1 -1
- package/build/components/Combobox/index.cjs.map +1 -1
- package/build/components/Combobox/index.js +51 -51
- package/build/components/Combobox/index.js.map +1 -1
- package/build/components/Combobox/style.css +1 -1
- package/build/components/CommandPalette/style.css +1 -1
- package/build/components/CopyField/style.css +1 -1
- package/build/components/DataTable/style.css +1 -1
- package/build/components/DateField/index.d.ts +1 -1
- package/build/components/DateField/style.css +1 -1
- package/build/components/Directory/style.css +1 -1
- package/build/components/Disclosure/style.css +1 -1
- package/build/components/Divider/style.css +1 -1
- package/build/components/Drawer/style.css +1 -1
- package/build/components/EmptyState/style.css +1 -1
- package/build/components/Field/style.css +1 -1
- package/build/components/FileUpload/style.css +1 -1
- package/build/components/FilterBar/style.css +1 -1
- package/build/components/IconButton/index.cjs +1 -1
- package/build/components/IconButton/index.cjs.map +1 -1
- package/build/components/IconButton/index.d.ts +2 -2
- package/build/components/IconButton/index.js +1 -1
- package/build/components/IconButton/index.js.map +1 -1
- package/build/components/IconButton/style.css +1 -1
- package/build/components/Input/index.d.ts +1 -1
- package/build/components/Input/style.css +1 -1
- package/build/components/Kbd/style.css +1 -1
- package/build/components/Menu/style.css +1 -1
- package/build/components/Modal/style.css +1 -1
- package/build/components/PageHeader/style.css +1 -1
- package/build/components/Pagination/style.css +1 -1
- package/build/components/Panel/style.css +1 -1
- package/build/components/PasswordInput/style.css +1 -1
- package/build/components/Popover/style.css +1 -1
- package/build/components/Price/style.css +1 -1
- package/build/components/Progress/style.css +1 -1
- package/build/components/PromptDialog/style.css +1 -1
- package/build/components/QuantityStepper/style.css +1 -1
- package/build/components/Radio/style.css +1 -1
- package/build/components/RadioCard/style.css +1 -1
- package/build/components/RangeSlider/style.css +1 -1
- package/build/components/Rating/style.css +1 -1
- package/build/components/RatingInput/style.css +1 -1
- package/build/components/ScrollArea/style.css +1 -1
- package/build/components/SectionHeader/style.css +1 -1
- package/build/components/SegmentedControl/style.css +1 -1
- package/build/components/Select/index.cjs +1 -1
- package/build/components/Select/index.cjs.map +1 -1
- package/build/components/Select/index.js +28 -28
- package/build/components/Select/index.js.map +1 -1
- package/build/components/Select/style.css +1 -1
- package/build/components/Skeleton/style.css +1 -1
- package/build/components/Spinner/style.css +1 -1
- package/build/components/Stat/style.css +1 -1
- package/build/components/StatusDot/style.css +1 -1
- package/build/components/Steps/style.css +1 -1
- package/build/components/SummaryCard/style.css +1 -1
- package/build/components/Switch/index.d.ts +1 -1
- package/build/components/Switch/style.css +1 -1
- package/build/components/Table/style.css +1 -1
- package/build/components/TableCheckbox/style.css +1 -1
- package/build/components/Tabs/style.css +1 -1
- package/build/components/TagInput/style.css +1 -1
- package/build/components/TextLink/style.css +1 -1
- package/build/components/Textarea/style.css +1 -1
- package/build/components/Tile/style.css +1 -1
- package/build/components/Timeline/style.css +1 -1
- package/build/components/Toast/style.css +1 -1
- package/build/components/Tooltip/style.css +1 -1
- package/build/constants/breakpoint.constants.cjs +1 -1
- package/build/constants/breakpoint.constants.cjs.map +1 -1
- package/build/constants/breakpoint.constants.d.ts +13 -8
- package/build/constants/breakpoint.constants.js +7 -5
- package/build/constants/breakpoint.constants.js.map +1 -1
- package/build/enums/ui-size.enum.cjs.map +1 -1
- package/build/enums/ui-size.enum.d.ts +5 -2
- package/build/enums/ui-size.enum.js.map +1 -1
- package/build/enums/ui-variant.enum.cjs +1 -1
- package/build/enums/ui-variant.enum.cjs.map +1 -1
- package/build/enums/ui-variant.enum.d.ts +13 -13
- package/build/enums/ui-variant.enum.js +1 -1
- package/build/enums/ui-variant.enum.js.map +1 -1
- package/build/helpers/theme.helper.cjs +1 -23
- package/build/helpers/theme.helper.cjs.map +1 -1
- package/build/helpers/theme.helper.d.ts +13 -44
- package/build/helpers/theme.helper.js +31 -69
- package/build/helpers/theme.helper.js.map +1 -1
- package/build/hooks/useUiTheme.cjs +1 -1
- package/build/hooks/useUiTheme.cjs.map +1 -1
- package/build/hooks/useUiTheme.d.ts +4 -1
- package/build/hooks/useUiTheme.js +34 -28
- package/build/hooks/useUiTheme.js.map +1 -1
- package/build/hooks/useUiTokens.cjs +1 -1
- package/build/hooks/useUiTokens.cjs.map +1 -1
- package/build/hooks/useUiTokens.d.ts +8 -8
- package/build/hooks/useUiTokens.js +24 -27
- package/build/hooks/useUiTokens.js.map +1 -1
- package/build/index.cjs +1 -1
- package/build/index.d.ts +3 -5
- package/build/index.js +194 -202
- package/build/index.js.map +1 -1
- package/build/scss/_index.scss +4 -3
- package/build/scss/_mixins.scss +264 -146
- package/build/scss/_variables.scss +216 -24
- package/build/styles.css +67 -67
- package/build/theme/UiProvider.cjs +1 -1
- package/build/theme/UiProvider.cjs.map +1 -1
- package/build/theme/UiProvider.d.ts +10 -9
- package/build/theme/UiProvider.js +7 -25
- package/build/theme/UiProvider.js.map +1 -1
- package/build/theme/UiThemeScript.cjs +1 -1
- package/build/theme/UiThemeScript.cjs.map +1 -1
- package/build/theme/UiThemeScript.d.ts +13 -10
- package/build/theme/UiThemeScript.js +2 -2
- package/build/theme/UiThemeScript.js.map +1 -1
- package/build/theme/context.js +2 -2
- package/build/types/charts/core/palette.d.ts +6 -8
- package/build/types/chat/Legend/index.d.ts +3 -2
- package/build/types/theme.type.d.ts +6 -48
- package/build/types/types/theme.type.d.ts +6 -48
- package/package.json +10 -10
- package/build/scss/_colors.generated.scss +0 -119
- package/build/scss/_metrics.generated.scss +0 -49
- package/build/theme/initUi.cjs +0 -2
- package/build/theme/initUi.cjs.map +0 -1
- package/build/theme/initUi.d.ts +0 -7
- package/build/theme/initUi.js +0 -10
- package/build/theme/initUi.js.map +0 -1
- package/build/theme/palette.cjs +0 -2
- package/build/theme/palette.cjs.map +0 -1
- package/build/theme/palette.d.ts +0 -219
- package/build/theme/palette.js +0 -148
- package/build/theme/palette.js.map +0 -1
- package/build/theme/tokens.cjs +0 -2
- package/build/theme/tokens.cjs.map +0 -1
- package/build/theme/tokens.d.ts +0 -225
- package/build/theme/tokens.js +0 -384
- package/build/theme/tokens.js.map +0 -1
- package/build/types/theme/palette.d.ts +0 -219
- package/build/types/theme/tokens.d.ts +0 -225
|
@@ -1,75 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
return
|
|
6
|
-
},
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}`
|
|
14
|
-
);
|
|
15
|
-
const d = t.metrics ?? {};
|
|
16
|
-
if (Object.keys(d).length > 0) {
|
|
17
|
-
const s = n(d);
|
|
18
|
-
e.push(`${o} {
|
|
19
|
-
${s}
|
|
20
|
-
}`), e.push(`${o}[${p}='compact'] {
|
|
21
|
-
${s}
|
|
22
|
-
}`);
|
|
1
|
+
import { THEME_STORAGE_KEY as r, THEME_ATTRIBUTE as o } from "@handijit/design";
|
|
2
|
+
import { isClient as e } from "@handijit/utils";
|
|
3
|
+
const a = "ui-theme-switching", n = "(prefers-color-scheme: dark)", s = (t) => t === "light" || t === "dark", m = () => {
|
|
4
|
+
var t;
|
|
5
|
+
return e() && ((t = window.matchMedia) != null && t.call(window, n).matches) ? "dark" : "light";
|
|
6
|
+
}, d = () => {
|
|
7
|
+
if (!e()) return "system";
|
|
8
|
+
try {
|
|
9
|
+
const t = window.localStorage.getItem(r);
|
|
10
|
+
return s(t) ? t : "system";
|
|
11
|
+
} catch {
|
|
12
|
+
return "system";
|
|
23
13
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
`@media (prefers-color-scheme: dark) {
|
|
38
|
-
${o}:not([${l}]) {
|
|
39
|
-
${n(
|
|
40
|
-
t.dark,
|
|
41
|
-
" "
|
|
42
|
-
)}
|
|
43
|
-
}
|
|
44
|
-
}`
|
|
14
|
+
}, h = () => {
|
|
15
|
+
if (!e()) return "light";
|
|
16
|
+
const t = document.documentElement.getAttribute(o);
|
|
17
|
+
return s(t) ? t : m();
|
|
18
|
+
}, l = (t) => {
|
|
19
|
+
if (e()) {
|
|
20
|
+
try {
|
|
21
|
+
t === "system" ? window.localStorage.removeItem(r) : window.localStorage.setItem(r, t);
|
|
22
|
+
} catch {
|
|
23
|
+
}
|
|
24
|
+
document.documentElement.setAttribute(
|
|
25
|
+
o,
|
|
26
|
+
t === "system" ? m() : t
|
|
45
27
|
);
|
|
46
28
|
}
|
|
47
|
-
|
|
48
|
-
${e.join(`
|
|
49
|
-
|
|
50
|
-
`).replace(/^(?=.)/gm, " ")}
|
|
51
|
-
}`;
|
|
52
|
-
}, O = (t) => t.replace(/<\/style/gi, "<\\/style"), S = (t) => {
|
|
53
|
-
if (!u()) return;
|
|
54
|
-
const e = t ? k(t) : "", n = document.getElementById(m);
|
|
55
|
-
if (e === "") {
|
|
56
|
-
n == null || n.remove();
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
const r = n ?? document.createElement("style");
|
|
60
|
-
r.id = m, r.textContent = e, n || document.head.appendChild(r);
|
|
61
|
-
}, j = ({ storageKey: t }) => `(function(){try{var t=localStorage.getItem(${JSON.stringify(t)});if(t==="light"||t==="dark")document.documentElement.setAttribute("${l}",t)}catch(e){}})()`;
|
|
29
|
+
};
|
|
62
30
|
export {
|
|
63
|
-
|
|
64
|
-
l as
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
i as TOKEN_PREFIX,
|
|
69
|
-
S as applyThemeConfig,
|
|
70
|
-
k as buildThemeCss,
|
|
71
|
-
I as resolveTokens,
|
|
72
|
-
j as themeBootScript,
|
|
73
|
-
O as toStyleHtml
|
|
31
|
+
a as THEME_SWITCHING_CLASS,
|
|
32
|
+
l as applyThemePreference,
|
|
33
|
+
h as readActiveTheme,
|
|
34
|
+
d as readStoredPreference,
|
|
35
|
+
m as readSystemTheme
|
|
74
36
|
};
|
|
75
37
|
//# sourceMappingURL=theme.helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.helper.js","sources":["../../src/helpers/theme.helper.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"theme.helper.js","sources":["../../src/helpers/theme.helper.ts"],"sourcesContent":["import {\n THEME_ATTRIBUTE,\n THEME_STORAGE_KEY,\n type ThemeName,\n type ThemePreference,\n} from '@handijit/design';\nimport { isClient } from '@handijit/utils';\n\n/** Turns transitions off for one frame while the theme flips (see `base.scss`). */\nexport const THEME_SWITCHING_CLASS = 'ui-theme-switching';\n\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\n\nconst isThemeName = (value: unknown): value is ThemeName => value === 'light' || value === 'dark';\n\n/** The operating system's setting; `light` on the server. */\nexport const readSystemTheme = (): ThemeName =>\n isClient() && window.matchMedia?.(DARK_QUERY).matches ? 'dark' : 'light';\n\n/**\n * The user's stored choice. \"System\" is the absence of the key, and a storage that throws (private\n * window, blocked site data) counts as no choice — the same reading as the design boot script.\n */\nexport const readStoredPreference = (): ThemePreference => {\n if (!isClient()) return 'system';\n\n try {\n const stored = window.localStorage.getItem(THEME_STORAGE_KEY);\n return isThemeName(stored) ? stored : 'system';\n } catch {\n return 'system';\n }\n};\n\n/** The theme drawn on the page: the root attribute when it names a theme, else the system's. */\nexport const readActiveTheme = (): ThemeName => {\n if (!isClient()) return 'light';\n\n const attribute = document.documentElement.getAttribute(THEME_ATTRIBUTE);\n return isThemeName(attribute) ? attribute : readSystemTheme();\n};\n\n/**\n * Stores the choice and applies it to the root element, the way `@handijit/design` documents it:\n * only `light` / `dark` are stored, \"system\" removes the key, and the attribute always carries the\n * resolved theme so the boot script and this function agree.\n */\nexport const applyThemePreference = (preference: ThemePreference): void => {\n if (!isClient()) return;\n\n try {\n if (preference === 'system') window.localStorage.removeItem(THEME_STORAGE_KEY);\n else window.localStorage.setItem(THEME_STORAGE_KEY, preference);\n } catch {\n /* The choice still applies for this page view; it just cannot be remembered. */\n }\n\n document.documentElement.setAttribute(\n THEME_ATTRIBUTE,\n preference === 'system' ? readSystemTheme() : preference,\n );\n};\n"],"names":["THEME_SWITCHING_CLASS","DARK_QUERY","isThemeName","value","readSystemTheme","isClient","_a","readStoredPreference","stored","THEME_STORAGE_KEY","readActiveTheme","attribute","THEME_ATTRIBUTE","applyThemePreference","preference"],"mappings":";;AASO,MAAMA,IAAwB,sBAE/BC,IAAa,gCAEbC,IAAc,CAACC,MAAuCA,MAAU,WAAWA,MAAU,QAG9EC,IAAkB,MAAA;;AAC7B,SAAAC,EAAA,OAAcC,IAAA,OAAO,eAAP,QAAAA,EAAA,aAAoBL,GAAY,WAAU,SAAS;AAAA,GAMtDM,IAAuB,MAAuB;AACzD,MAAI,CAACF,EAAA,EAAY,QAAO;AAExB,MAAI;AACF,UAAMG,IAAS,OAAO,aAAa,QAAQC,CAAiB;AAC5D,WAAOP,EAAYM,CAAM,IAAIA,IAAS;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAGaE,IAAkB,MAAiB;AAC9C,MAAI,CAACL,EAAA,EAAY,QAAO;AAExB,QAAMM,IAAY,SAAS,gBAAgB,aAAaC,CAAe;AACvE,SAAOV,EAAYS,CAAS,IAAIA,IAAYP,EAAA;AAC9C,GAOaS,IAAuB,CAACC,MAAsC;AACzE,MAAKT,KAEL;AAAA,QAAI;AACF,MAAIS,MAAe,WAAU,OAAO,aAAa,WAAWL,CAAiB,IACxE,OAAO,aAAa,QAAQA,GAAmBK,CAAU;AAAA,IAChE,QAAQ;AAAA,IAER;AAEA,aAAS,gBAAgB;AAAA,MACvBF;AAAA,MACAE,MAAe,WAAWV,MAAoBU;AAAA,IAAA;AAAA;AAElD;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const
|
|
1
|
+
"use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("react"),T=require("@handijit/design"),l=require("@handijit/utils"),e=require("../helpers/theme.helper.cjs"),E=()=>{const[m,o]=r.useState("system"),[c,i]=r.useState("light"),[h,S]=r.useState(!1);r.useEffect(()=>{var d;if(!l.isClient())return;const t=()=>{o(e.readStoredPreference()),i(e.readActiveTheme())};t(),S(!0);const n=new MutationObserver(t);n.observe(document.documentElement,{attributes:!0,attributeFilter:[T.THEME_ATTRIBUTE]});const s=(d=window.matchMedia)==null?void 0:d.call(window,"(prefers-color-scheme: dark)"),u=()=>{e.readStoredPreference()==="system"&&e.applyThemePreference("system"),t()};return s==null||s.addEventListener("change",u),()=>{n.disconnect(),s==null||s.removeEventListener("change",u)}},[]);const a=r.useCallback(t=>{if(!l.isClient())return;const n=document.documentElement;n.classList.add(e.THEME_SWITCHING_CLASS),e.applyThemePreference(t),o(t),i(e.readActiveTheme()),window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>n.classList.remove(e.THEME_SWITCHING_CLASS))})},[]),f=r.useCallback(()=>a(c==="dark"?"light":"dark"),[c,a]);return{scheme:c,preference:m,setScheme:a,toggle:f,isReady:h}};exports.default=E;
|
|
2
2
|
//# sourceMappingURL=useUiTheme.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUiTheme.cjs","sources":["../../src/hooks/useUiTheme.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { isClient } from '@handijit/utils';\n\nimport {
|
|
1
|
+
{"version":3,"file":"useUiTheme.cjs","sources":["../../src/hooks/useUiTheme.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { THEME_ATTRIBUTE } from '@handijit/design';\nimport { isClient } from '@handijit/utils';\n\nimport {\n applyThemePreference,\n readActiveTheme,\n readStoredPreference,\n THEME_SWITCHING_CLASS,\n} from '../helpers/theme.helper';\nimport type { UiColorPreference, UiColorScheme, UiThemeState } from '@/types/theme.type';\n\n/**\n * Reads and changes the light/dark choice, on the `data-theme` contract of `@handijit/design`.\n *\n * The choice lives where the design boot script reads it (`localStorage[\"hd-theme\"]`), so a choice\n * made here survives a reload without a flash when `UiThemeScript` is in `<head>`.\n * @example const { scheme, toggle, isReady } = useUiTheme();\n */\nconst useUiTheme = (): UiThemeState => {\n /*\n * The first value is a constant: the server has no `document`, and reading the real value during\n * the first client render produced a hydration mismatch. `isReady` tells when it is real.\n */\n const [preference, setPreferenceState] = useState<UiColorPreference>('system');\n const [scheme, setSchemeState] = useState<UiColorScheme>('light');\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n if (!isClient()) return;\n\n const sync = () => {\n setPreferenceState(readStoredPreference());\n setSchemeState(readActiveTheme());\n };\n\n sync();\n setIsReady(true);\n\n /* The boot script, another hook instance or the application may write the attribute. */\n const observer = new MutationObserver(sync);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [THEME_ATTRIBUTE],\n });\n\n /*\n * Without the boot script nobody rewrites the attribute when the system setting changes; a page\n * that follows the system has to be moved here.\n */\n const query = window.matchMedia?.('(prefers-color-scheme: dark)');\n const handleSystemChange = () => {\n if (readStoredPreference() === 'system') applyThemePreference('system');\n sync();\n };\n query?.addEventListener('change', handleSystemChange);\n\n return () => {\n observer.disconnect();\n query?.removeEventListener('change', handleSystemChange);\n };\n }, []);\n\n const setScheme = useCallback((next: UiColorPreference) => {\n if (!isClient()) return;\n\n const root = document.documentElement;\n\n root.classList.add(THEME_SWITCHING_CLASS);\n applyThemePreference(next);\n setPreferenceState(next);\n setSchemeState(readActiveTheme());\n\n /* The class comes off on the NEXT frame, after the new colours have been painted once. */\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => root.classList.remove(THEME_SWITCHING_CLASS));\n });\n }, []);\n\n const toggle = useCallback(\n () => setScheme(scheme === 'dark' ? 'light' : 'dark'),\n [scheme, setScheme],\n );\n\n return { scheme, preference, setScheme, toggle, isReady };\n};\n\nexport default useUiTheme;\n"],"names":["useUiTheme","preference","setPreferenceState","useState","scheme","setSchemeState","isReady","setIsReady","useEffect","isClient","sync","readStoredPreference","readActiveTheme","observer","THEME_ATTRIBUTE","query","_a","handleSystemChange","applyThemePreference","setScheme","useCallback","next","root","THEME_SWITCHING_CLASS","toggle"],"mappings":"sPAqBMA,EAAa,IAAoB,CAKrC,KAAM,CAACC,EAAYC,CAAkB,EAAIC,EAAAA,SAA4B,QAAQ,EACvE,CAACC,EAAQC,CAAc,EAAIF,EAAAA,SAAwB,OAAO,EAC1D,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAAS,EAAK,EAE5CK,EAAAA,UAAU,IAAM,OACd,GAAI,CAACC,EAAAA,WAAY,OAEjB,MAAMC,EAAO,IAAM,CACjBR,EAAmBS,EAAAA,sBAAsB,EACzCN,EAAeO,EAAAA,iBAAiB,CAClC,EAEAF,EAAA,EACAH,EAAW,EAAI,EAGf,MAAMM,EAAW,IAAI,iBAAiBH,CAAI,EAC1CG,EAAS,QAAQ,SAAS,gBAAiB,CACzC,WAAY,GACZ,gBAAiB,CAACC,EAAAA,eAAe,CAAA,CAClC,EAMD,MAAMC,GAAQC,EAAA,OAAO,aAAP,YAAAA,EAAA,YAAoB,gCAC5BC,EAAqB,IAAM,CAC3BN,uBAAA,IAA2B,UAAUO,EAAAA,qBAAqB,QAAQ,EACtER,EAAA,CACF,EACA,OAAAK,GAAA,MAAAA,EAAO,iBAAiB,SAAUE,GAE3B,IAAM,CACXJ,EAAS,WAAA,EACTE,GAAA,MAAAA,EAAO,oBAAoB,SAAUE,EACvC,CACF,EAAG,CAAA,CAAE,EAEL,MAAME,EAAYC,cAAaC,GAA4B,CACzD,GAAI,CAACZ,EAAAA,WAAY,OAEjB,MAAMa,EAAO,SAAS,gBAEtBA,EAAK,UAAU,IAAIC,uBAAqB,EACxCL,EAAAA,qBAAqBG,CAAI,EACzBnB,EAAmBmB,CAAI,EACvBhB,EAAeO,EAAAA,iBAAiB,EAGhC,OAAO,sBAAsB,IAAM,CACjC,OAAO,sBAAsB,IAAMU,EAAK,UAAU,OAAOC,EAAAA,qBAAqB,CAAC,CACjF,CAAC,CACH,EAAG,CAAA,CAAE,EAECC,EAASJ,EAAAA,YACb,IAAMD,EAAUf,IAAW,OAAS,QAAU,MAAM,EACpD,CAACA,EAAQe,CAAS,CAAA,EAGpB,MAAO,CAAE,OAAAf,EAAQ,WAAAH,EAAY,UAAAkB,EAAW,OAAAK,EAAQ,QAAAlB,CAAA,CAClD"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { UiThemeState } from '../types/theme.type';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Reads and changes the light/dark choice, on the `data-theme` contract of `@handijit/design`.
|
|
4
|
+
*
|
|
5
|
+
* The choice lives where the design boot script reads it (`localStorage["hd-theme"]`), so a choice
|
|
6
|
+
* made here survives a reload without a flash when `UiThemeScript` is in `<head>`.
|
|
4
7
|
* @example const { scheme, toggle, isReady } = useUiTheme();
|
|
5
8
|
*/
|
|
6
9
|
declare const useUiTheme: () => UiThemeState;
|
|
@@ -1,36 +1,42 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useState as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
2
|
+
import { useState as o, useEffect as g, useCallback as d } from "react";
|
|
3
|
+
import { THEME_ATTRIBUTE as w } from "@handijit/design";
|
|
4
|
+
import { isClient as u } from "@handijit/utils";
|
|
5
|
+
import { THEME_SWITCHING_CLASS as l, applyThemePreference as f, readActiveTheme as h, readStoredPreference as E } from "../helpers/theme.helper.js";
|
|
6
|
+
const L = () => {
|
|
7
|
+
const [S, c] = o("system"), [r, a] = o("light"), [p, T] = o(!1);
|
|
8
|
+
g(() => {
|
|
9
|
+
var m;
|
|
10
|
+
if (!u()) return;
|
|
11
|
+
const e = () => {
|
|
12
|
+
c(E()), a(h());
|
|
13
|
+
};
|
|
14
|
+
e(), T(!0);
|
|
15
|
+
const s = new MutationObserver(e);
|
|
16
|
+
s.observe(document.documentElement, {
|
|
17
|
+
attributes: !0,
|
|
18
|
+
attributeFilter: [w]
|
|
19
|
+
});
|
|
20
|
+
const t = (m = window.matchMedia) == null ? void 0 : m.call(window, "(prefers-color-scheme: dark)"), i = () => {
|
|
21
|
+
E() === "system" && f("system"), e();
|
|
22
|
+
};
|
|
23
|
+
return t == null || t.addEventListener("change", i), () => {
|
|
24
|
+
s.disconnect(), t == null || t.removeEventListener("change", i);
|
|
25
|
+
};
|
|
20
26
|
}, []);
|
|
21
|
-
const n =
|
|
22
|
-
if (!
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
window.requestAnimationFrame(() =>
|
|
27
|
+
const n = d((e) => {
|
|
28
|
+
if (!u()) return;
|
|
29
|
+
const s = document.documentElement;
|
|
30
|
+
s.classList.add(l), f(e), c(e), a(h()), window.requestAnimationFrame(() => {
|
|
31
|
+
window.requestAnimationFrame(() => s.classList.remove(l));
|
|
26
32
|
});
|
|
27
|
-
}, []),
|
|
28
|
-
() =>
|
|
29
|
-
[
|
|
33
|
+
}, []), v = d(
|
|
34
|
+
() => n(r === "dark" ? "light" : "dark"),
|
|
35
|
+
[r, n]
|
|
30
36
|
);
|
|
31
|
-
return { scheme:
|
|
37
|
+
return { scheme: r, preference: S, setScheme: n, toggle: v, isReady: p };
|
|
32
38
|
};
|
|
33
39
|
export {
|
|
34
|
-
|
|
40
|
+
L as default
|
|
35
41
|
};
|
|
36
42
|
//# sourceMappingURL=useUiTheme.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUiTheme.js","sources":["../../src/hooks/useUiTheme.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { isClient } from '@handijit/utils';\n\nimport {
|
|
1
|
+
{"version":3,"file":"useUiTheme.js","sources":["../../src/hooks/useUiTheme.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { THEME_ATTRIBUTE } from '@handijit/design';\nimport { isClient } from '@handijit/utils';\n\nimport {\n applyThemePreference,\n readActiveTheme,\n readStoredPreference,\n THEME_SWITCHING_CLASS,\n} from '../helpers/theme.helper';\nimport type { UiColorPreference, UiColorScheme, UiThemeState } from '@/types/theme.type';\n\n/**\n * Reads and changes the light/dark choice, on the `data-theme` contract of `@handijit/design`.\n *\n * The choice lives where the design boot script reads it (`localStorage[\"hd-theme\"]`), so a choice\n * made here survives a reload without a flash when `UiThemeScript` is in `<head>`.\n * @example const { scheme, toggle, isReady } = useUiTheme();\n */\nconst useUiTheme = (): UiThemeState => {\n /*\n * The first value is a constant: the server has no `document`, and reading the real value during\n * the first client render produced a hydration mismatch. `isReady` tells when it is real.\n */\n const [preference, setPreferenceState] = useState<UiColorPreference>('system');\n const [scheme, setSchemeState] = useState<UiColorScheme>('light');\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n if (!isClient()) return;\n\n const sync = () => {\n setPreferenceState(readStoredPreference());\n setSchemeState(readActiveTheme());\n };\n\n sync();\n setIsReady(true);\n\n /* The boot script, another hook instance or the application may write the attribute. */\n const observer = new MutationObserver(sync);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [THEME_ATTRIBUTE],\n });\n\n /*\n * Without the boot script nobody rewrites the attribute when the system setting changes; a page\n * that follows the system has to be moved here.\n */\n const query = window.matchMedia?.('(prefers-color-scheme: dark)');\n const handleSystemChange = () => {\n if (readStoredPreference() === 'system') applyThemePreference('system');\n sync();\n };\n query?.addEventListener('change', handleSystemChange);\n\n return () => {\n observer.disconnect();\n query?.removeEventListener('change', handleSystemChange);\n };\n }, []);\n\n const setScheme = useCallback((next: UiColorPreference) => {\n if (!isClient()) return;\n\n const root = document.documentElement;\n\n root.classList.add(THEME_SWITCHING_CLASS);\n applyThemePreference(next);\n setPreferenceState(next);\n setSchemeState(readActiveTheme());\n\n /* The class comes off on the NEXT frame, after the new colours have been painted once. */\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => root.classList.remove(THEME_SWITCHING_CLASS));\n });\n }, []);\n\n const toggle = useCallback(\n () => setScheme(scheme === 'dark' ? 'light' : 'dark'),\n [scheme, setScheme],\n );\n\n return { scheme, preference, setScheme, toggle, isReady };\n};\n\nexport default useUiTheme;\n"],"names":["useUiTheme","preference","setPreferenceState","useState","scheme","setSchemeState","isReady","setIsReady","useEffect","isClient","sync","readStoredPreference","readActiveTheme","observer","THEME_ATTRIBUTE","query","_a","handleSystemChange","applyThemePreference","setScheme","useCallback","next","root","THEME_SWITCHING_CLASS","toggle"],"mappings":";;;;;AAqBA,MAAMA,IAAa,MAAoB;AAKrC,QAAM,CAACC,GAAYC,CAAkB,IAAIC,EAA4B,QAAQ,GACvE,CAACC,GAAQC,CAAc,IAAIF,EAAwB,OAAO,GAC1D,CAACG,GAASC,CAAU,IAAIJ,EAAS,EAAK;AAE5C,EAAAK,EAAU,MAAM;;AACd,QAAI,CAACC,IAAY;AAEjB,UAAMC,IAAO,MAAM;AACjB,MAAAR,EAAmBS,GAAsB,GACzCN,EAAeO,GAAiB;AAAA,IAClC;AAEA,IAAAF,EAAA,GACAH,EAAW,EAAI;AAGf,UAAMM,IAAW,IAAI,iBAAiBH,CAAI;AAC1C,IAAAG,EAAS,QAAQ,SAAS,iBAAiB;AAAA,MACzC,YAAY;AAAA,MACZ,iBAAiB,CAACC,CAAe;AAAA,IAAA,CAClC;AAMD,UAAMC,KAAQC,IAAA,OAAO,eAAP,gBAAAA,EAAA,aAAoB,iCAC5BC,IAAqB,MAAM;AAC/B,MAAIN,EAAA,MAA2B,YAAUO,EAAqB,QAAQ,GACtER,EAAA;AAAA,IACF;AACA,WAAAK,KAAA,QAAAA,EAAO,iBAAiB,UAAUE,IAE3B,MAAM;AACX,MAAAJ,EAAS,WAAA,GACTE,KAAA,QAAAA,EAAO,oBAAoB,UAAUE;AAAA,IACvC;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAME,IAAYC,EAAY,CAACC,MAA4B;AACzD,QAAI,CAACZ,IAAY;AAEjB,UAAMa,IAAO,SAAS;AAEtB,IAAAA,EAAK,UAAU,IAAIC,CAAqB,GACxCL,EAAqBG,CAAI,GACzBnB,EAAmBmB,CAAI,GACvBhB,EAAeO,GAAiB,GAGhC,OAAO,sBAAsB,MAAM;AACjC,aAAO,sBAAsB,MAAMU,EAAK,UAAU,OAAOC,CAAqB,CAAC;AAAA,IACjF,CAAC;AAAA,EACH,GAAG,CAAA,CAAE,GAECC,IAASJ;AAAA,IACb,MAAMD,EAAUf,MAAW,SAAS,UAAU,MAAM;AAAA,IACpD,CAACA,GAAQe,CAAS;AAAA,EAAA;AAGpB,SAAO,EAAE,QAAAf,GAAQ,YAAAH,GAAY,WAAAkB,GAAW,QAAAK,GAAQ,SAAAlB,EAAA;AAClD;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const
|
|
1
|
+
"use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const d=require("react"),m=require("@handijit/design"),E=require("@handijit/utils"),b="currentColor",g=(e,t)=>{const s=getComputedStyle(t);return Object.fromEntries(e.map(r=>[r,s.getPropertyValue(m.cssVarName(r)).trim()||b]))},v=(e,t)=>Object.keys(e).every(s=>e[s]===t[s]),h=e=>{const t=e.join("|"),[s,r]=d.useState(()=>Object.fromEntries(e.map(c=>[c,b])));return d.useEffect(()=>{var l;if(!E.isClient())return;const c=t.split("|"),o=()=>r(i=>{const a=g(c,document.documentElement);return v(i,a)&&Object.keys(i).length===c.length?i:a});o();const u=new MutationObserver(o);u.observe(document.documentElement,{attributes:!0,attributeFilter:[m.THEME_ATTRIBUTE,"style","class"]}),u.observe(document.head,{childList:!0});const n=(l=window.matchMedia)==null?void 0:l.call(window,"(prefers-color-scheme: dark)");return n==null||n.addEventListener("change",o),()=>{u.disconnect(),n==null||n.removeEventListener("change",o)}},[t]),s};exports.default=h;
|
|
2
2
|
//# sourceMappingURL=useUiTokens.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUiTokens.cjs","sources":["../../src/hooks/useUiTokens.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport {
|
|
1
|
+
{"version":3,"file":"useUiTokens.cjs","sources":["../../src/hooks/useUiTokens.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport { cssVarName, THEME_ATTRIBUTE, type TokenName } from '@handijit/design';\nimport { isClient } from '@handijit/utils';\n\n/** Returned on the server and in the first frame: drawing libraries paint an empty string black. */\nconst FALLBACK = 'currentColor';\n\nconst read = <TName extends TokenName>(\n names: readonly TName[],\n element: Element,\n): Record<TName, string> => {\n const style = getComputedStyle(element);\n\n return Object.fromEntries(\n names.map(name => [name, style.getPropertyValue(cssVarName(name)).trim() || FALLBACK]),\n ) as Record<TName, string>;\n};\n\nconst isSame = (first: Record<string, string>, second: Record<string, string>): boolean =>\n Object.keys(first).every(key => first[key] === second[key]);\n\n/**\n * The RESOLVED values of design tokens — for drawing libraries that cannot read a CSS variable\n * (a canvas, an SVG attribute that rejects `var(--…)`).\n * Names are the token names of `@handijit/design` without the `--hd-` prefix. The values follow the\n * root theme (`data-theme`, the system setting, an inline override on `<html>`).\n * ⚠ Every value is `currentColor` in the server output and in the first frame before hydration.\n * @example const colors = useUiTokens(['chart-1', 'chart-2', 'border']);\n */\nconst useUiTokens = <TName extends TokenName>(names: readonly TName[]): Record<TName, string> => {\n /* The array may be a new object on every render; the subscription follows the NAMES. */\n const key = names.join('|');\n\n const [values, setValues] = useState(\n () => Object.fromEntries(names.map(name => [name, FALLBACK])) as Record<TName, string>,\n );\n\n useEffect(() => {\n if (!isClient()) return;\n\n const list = key.split('|') as TName[];\n const update = () =>\n setValues(previous => {\n const next = read(list, document.documentElement);\n return isSame(previous, next) && Object.keys(previous).length === list.length\n ? previous\n : next;\n });\n\n update();\n\n const observer = new MutationObserver(update);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [THEME_ATTRIBUTE, 'style', 'class'],\n });\n /* A stylesheet added later (the application's brand override) changes the values too. */\n observer.observe(document.head, { childList: true });\n\n const query = window.matchMedia?.('(prefers-color-scheme: dark)');\n query?.addEventListener('change', update);\n\n return () => {\n observer.disconnect();\n query?.removeEventListener('change', update);\n };\n }, [key]);\n\n return values;\n};\n\nexport default useUiTokens;\n"],"names":["FALLBACK","read","names","element","style","name","cssVarName","isSame","first","second","key","useUiTokens","values","setValues","useState","useEffect","isClient","list","update","previous","next","observer","THEME_ATTRIBUTE","query","_a"],"mappings":"6MAOMA,EAAW,eAEXC,EAAO,CACXC,EACAC,IAC0B,CAC1B,MAAMC,EAAQ,iBAAiBD,CAAO,EAEtC,OAAO,OAAO,YACZD,EAAM,IAAIG,GAAQ,CAACA,EAAMD,EAAM,iBAAiBE,EAAAA,WAAWD,CAAI,CAAC,EAAE,KAAA,GAAUL,CAAQ,CAAC,CAAA,CAEzF,EAEMO,EAAS,CAACC,EAA+BC,IAC7C,OAAO,KAAKD,CAAK,EAAE,SAAaA,EAAME,CAAG,IAAMD,EAAOC,CAAG,CAAC,EAUtDC,EAAwCT,GAAmD,CAE/F,MAAMQ,EAAMR,EAAM,KAAK,GAAG,EAEpB,CAACU,EAAQC,CAAS,EAAIC,EAAAA,SAC1B,IAAM,OAAO,YAAYZ,EAAM,OAAY,CAACG,EAAML,CAAQ,CAAC,CAAC,CAAA,EAG9De,OAAAA,EAAAA,UAAU,IAAM,OACd,GAAI,CAACC,EAAAA,WAAY,OAEjB,MAAMC,EAAOP,EAAI,MAAM,GAAG,EACpBQ,EAAS,IACbL,EAAUM,GAAY,CACpB,MAAMC,EAAOnB,EAAKgB,EAAM,SAAS,eAAe,EAChD,OAAOV,EAAOY,EAAUC,CAAI,GAAK,OAAO,KAAKD,CAAQ,EAAE,SAAWF,EAAK,OACnEE,EACAC,CACN,CAAC,EAEHF,EAAA,EAEA,MAAMG,EAAW,IAAI,iBAAiBH,CAAM,EAC5CG,EAAS,QAAQ,SAAS,gBAAiB,CACzC,WAAY,GACZ,gBAAiB,CAACC,kBAAiB,QAAS,OAAO,CAAA,CACpD,EAEDD,EAAS,QAAQ,SAAS,KAAM,CAAE,UAAW,GAAM,EAEnD,MAAME,GAAQC,EAAA,OAAO,aAAP,YAAAA,EAAA,YAAoB,gCAClC,OAAAD,GAAA,MAAAA,EAAO,iBAAiB,SAAUL,GAE3B,IAAM,CACXG,EAAS,WAAA,EACTE,GAAA,MAAAA,EAAO,oBAAoB,SAAUL,EACvC,CACF,EAAG,CAACR,CAAG,CAAC,EAEDE,CACT"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TokenName } from '@handijit/design';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* ⚠
|
|
8
|
-
* @example const colors = useUiTokens(['
|
|
3
|
+
* The RESOLVED values of design tokens — for drawing libraries that cannot read a CSS variable
|
|
4
|
+
* (a canvas, an SVG attribute that rejects `var(--…)`).
|
|
5
|
+
* Names are the token names of `@handijit/design` without the `--hd-` prefix. The values follow the
|
|
6
|
+
* root theme (`data-theme`, the system setting, an inline override on `<html>`).
|
|
7
|
+
* ⚠ Every value is `currentColor` in the server output and in the first frame before hydration.
|
|
8
|
+
* @example const colors = useUiTokens(['chart-1', 'chart-2', 'border']);
|
|
9
9
|
*/
|
|
10
|
-
declare const useUiTokens: <TName extends
|
|
10
|
+
declare const useUiTokens: <TName extends TokenName>(names: readonly TName[]) => Record<TName, string>;
|
|
11
11
|
export default useUiTokens;
|
|
@@ -1,39 +1,36 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useState as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
const r = getComputedStyle(document.documentElement);
|
|
2
|
+
import { useState as d, useEffect as b } from "react";
|
|
3
|
+
import { THEME_ATTRIBUTE as E, cssVarName as f } from "@handijit/design";
|
|
4
|
+
import { isClient as p } from "@handijit/utils";
|
|
5
|
+
const l = "currentColor", h = (e, t) => {
|
|
6
|
+
const n = getComputedStyle(t);
|
|
8
7
|
return Object.fromEntries(
|
|
9
|
-
e.map((
|
|
8
|
+
e.map((s) => [s, n.getPropertyValue(f(s)).trim() || l])
|
|
10
9
|
);
|
|
11
|
-
},
|
|
12
|
-
const
|
|
13
|
-
() => Object.fromEntries(e.map((o) => [o,
|
|
10
|
+
}, v = (e, t) => Object.keys(e).every((n) => e[n] === t[n]), O = (e) => {
|
|
11
|
+
const t = e.join("|"), [n, s] = d(
|
|
12
|
+
() => Object.fromEntries(e.map((o) => [o, l]))
|
|
14
13
|
);
|
|
15
|
-
return
|
|
14
|
+
return b(() => {
|
|
16
15
|
var m;
|
|
17
|
-
if (!
|
|
18
|
-
const o =
|
|
19
|
-
const
|
|
20
|
-
return
|
|
16
|
+
if (!p()) return;
|
|
17
|
+
const o = t.split("|"), c = () => s((a) => {
|
|
18
|
+
const u = h(o, document.documentElement);
|
|
19
|
+
return v(a, u) && Object.keys(a).length === o.length ? a : u;
|
|
21
20
|
});
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
21
|
+
c();
|
|
22
|
+
const i = new MutationObserver(c);
|
|
23
|
+
i.observe(document.documentElement, {
|
|
25
24
|
attributes: !0,
|
|
26
|
-
attributeFilter: [
|
|
27
|
-
}),
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return n == null || n.addEventListener("change", s), () => {
|
|
32
|
-
c.disconnect(), n == null || n.removeEventListener("change", s);
|
|
25
|
+
attributeFilter: [E, "style", "class"]
|
|
26
|
+
}), i.observe(document.head, { childList: !0 });
|
|
27
|
+
const r = (m = window.matchMedia) == null ? void 0 : m.call(window, "(prefers-color-scheme: dark)");
|
|
28
|
+
return r == null || r.addEventListener("change", c), () => {
|
|
29
|
+
i.disconnect(), r == null || r.removeEventListener("change", c);
|
|
33
30
|
};
|
|
34
|
-
}, [
|
|
31
|
+
}, [t]), n;
|
|
35
32
|
};
|
|
36
33
|
export {
|
|
37
|
-
|
|
34
|
+
O as default
|
|
38
35
|
};
|
|
39
36
|
//# sourceMappingURL=useUiTokens.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUiTokens.js","sources":["../../src/hooks/useUiTokens.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport {
|
|
1
|
+
{"version":3,"file":"useUiTokens.js","sources":["../../src/hooks/useUiTokens.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport { cssVarName, THEME_ATTRIBUTE, type TokenName } from '@handijit/design';\nimport { isClient } from '@handijit/utils';\n\n/** Returned on the server and in the first frame: drawing libraries paint an empty string black. */\nconst FALLBACK = 'currentColor';\n\nconst read = <TName extends TokenName>(\n names: readonly TName[],\n element: Element,\n): Record<TName, string> => {\n const style = getComputedStyle(element);\n\n return Object.fromEntries(\n names.map(name => [name, style.getPropertyValue(cssVarName(name)).trim() || FALLBACK]),\n ) as Record<TName, string>;\n};\n\nconst isSame = (first: Record<string, string>, second: Record<string, string>): boolean =>\n Object.keys(first).every(key => first[key] === second[key]);\n\n/**\n * The RESOLVED values of design tokens — for drawing libraries that cannot read a CSS variable\n * (a canvas, an SVG attribute that rejects `var(--…)`).\n * Names are the token names of `@handijit/design` without the `--hd-` prefix. The values follow the\n * root theme (`data-theme`, the system setting, an inline override on `<html>`).\n * ⚠ Every value is `currentColor` in the server output and in the first frame before hydration.\n * @example const colors = useUiTokens(['chart-1', 'chart-2', 'border']);\n */\nconst useUiTokens = <TName extends TokenName>(names: readonly TName[]): Record<TName, string> => {\n /* The array may be a new object on every render; the subscription follows the NAMES. */\n const key = names.join('|');\n\n const [values, setValues] = useState(\n () => Object.fromEntries(names.map(name => [name, FALLBACK])) as Record<TName, string>,\n );\n\n useEffect(() => {\n if (!isClient()) return;\n\n const list = key.split('|') as TName[];\n const update = () =>\n setValues(previous => {\n const next = read(list, document.documentElement);\n return isSame(previous, next) && Object.keys(previous).length === list.length\n ? previous\n : next;\n });\n\n update();\n\n const observer = new MutationObserver(update);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [THEME_ATTRIBUTE, 'style', 'class'],\n });\n /* A stylesheet added later (the application's brand override) changes the values too. */\n observer.observe(document.head, { childList: true });\n\n const query = window.matchMedia?.('(prefers-color-scheme: dark)');\n query?.addEventListener('change', update);\n\n return () => {\n observer.disconnect();\n query?.removeEventListener('change', update);\n };\n }, [key]);\n\n return values;\n};\n\nexport default useUiTokens;\n"],"names":["FALLBACK","read","names","element","style","name","cssVarName","isSame","first","second","key","useUiTokens","values","setValues","useState","useEffect","isClient","list","update","previous","next","observer","THEME_ATTRIBUTE","query","_a"],"mappings":";;;;AAOA,MAAMA,IAAW,gBAEXC,IAAO,CACXC,GACAC,MAC0B;AAC1B,QAAMC,IAAQ,iBAAiBD,CAAO;AAEtC,SAAO,OAAO;AAAA,IACZD,EAAM,IAAI,CAAAG,MAAQ,CAACA,GAAMD,EAAM,iBAAiBE,EAAWD,CAAI,CAAC,EAAE,KAAA,KAAUL,CAAQ,CAAC;AAAA,EAAA;AAEzF,GAEMO,IAAS,CAACC,GAA+BC,MAC7C,OAAO,KAAKD,CAAK,EAAE,MAAM,OAAOA,EAAME,CAAG,MAAMD,EAAOC,CAAG,CAAC,GAUtDC,IAAc,CAA0BT,MAAmD;AAE/F,QAAMQ,IAAMR,EAAM,KAAK,GAAG,GAEpB,CAACU,GAAQC,CAAS,IAAIC;AAAA,IAC1B,MAAM,OAAO,YAAYZ,EAAM,IAAI,OAAQ,CAACG,GAAML,CAAQ,CAAC,CAAC;AAAA,EAAA;AAG9D,SAAAe,EAAU,MAAM;;AACd,QAAI,CAACC,IAAY;AAEjB,UAAMC,IAAOP,EAAI,MAAM,GAAG,GACpBQ,IAAS,MACbL,EAAU,CAAAM,MAAY;AACpB,YAAMC,IAAOnB,EAAKgB,GAAM,SAAS,eAAe;AAChD,aAAOV,EAAOY,GAAUC,CAAI,KAAK,OAAO,KAAKD,CAAQ,EAAE,WAAWF,EAAK,SACnEE,IACAC;AAAA,IACN,CAAC;AAEH,IAAAF,EAAA;AAEA,UAAMG,IAAW,IAAI,iBAAiBH,CAAM;AAC5C,IAAAG,EAAS,QAAQ,SAAS,iBAAiB;AAAA,MACzC,YAAY;AAAA,MACZ,iBAAiB,CAACC,GAAiB,SAAS,OAAO;AAAA,IAAA,CACpD,GAEDD,EAAS,QAAQ,SAAS,MAAM,EAAE,WAAW,IAAM;AAEnD,UAAME,KAAQC,IAAA,OAAO,eAAP,gBAAAA,EAAA,aAAoB;AAClC,WAAAD,KAAA,QAAAA,EAAO,iBAAiB,UAAUL,IAE3B,MAAM;AACX,MAAAG,EAAS,WAAA,GACTE,KAAA,QAAAA,EAAO,oBAAoB,UAAUL;AAAA,IACvC;AAAA,EACF,GAAG,CAACR,CAAG,CAAC,GAEDE;AACT;"}
|
package/build/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const x=require("./theme/UiProvider.cjs")
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const x=require("./theme/UiProvider.cjs"),T=require("./theme/UiThemeScript.cjs"),$=require("./theme/context.cjs"),t=require("@handijit/design"),E=require("./helpers/focus.helper.cjs"),S=require("./hooks/useAnnounce.cjs"),_=require("./hooks/useUiTheme.cjs"),B=require("./hooks/useUiTokens.cjs"),R=require("./hooks/useStickToBottom.cjs"),P=require("./hooks/useListboxNavigation.cjs"),A=require("./hooks/usePositioning.cjs"),m=require("./hooks/useVirtualList.cjs"),O=require("./enums/ui-variant.enum.cjs"),p=require("./enums/ui-size.enum.cjs"),e=require("./constants/breakpoint.constants.cjs"),o=require("./helpers/text.helper.cjs"),C=require("./components/Button/index.cjs"),I=require("./components/IconButton/index.cjs"),b=require("./components/TextLink/index.cjs"),g=require("./components/Tooltip/index.cjs"),d=require("./components/Menu/index.cjs"),D=require("./components/Popover/index.cjs"),M=require("./components/Chip/index.cjs"),y=require("./components/ChipGroup/index.cjs"),U=require("./components/Combobox/index.cjs"),h=require("./components/SegmentedControl/index.cjs"),H=require("./components/Select/index.cjs"),k=require("./components/Checkbox/index.cjs"),L=require("./components/Switch/index.cjs"),F=require("./components/Radio/index.cjs"),w=require("./components/RadioCard/index.cjs"),v=require("./components/RangeSlider/index.cjs"),K=require("./components/RatingInput/index.cjs"),N=require("./components/QuantityStepper/index.cjs"),V=require("./components/TableCheckbox/index.cjs"),Y=require("./components/Input/index.cjs"),Q=require("./components/PasswordInput/index.cjs"),j=require("./components/TagInput/index.cjs"),G=require("./components/Textarea/index.cjs"),a=require("./components/DateField/index.cjs"),z=require("./components/Field/index.cjs"),J=require("./components/FileUpload/index.cjs"),W=require("./components/Alert/index.cjs"),X=require("./components/Avatar/index.cjs"),Z=require("./components/Badge/index.cjs"),ee=require("./components/Breadcrumb/index.cjs"),r=require("./components/Card/index.cjs"),re=require("./components/Carousel/index.cjs"),te=require("./components/CodeBadge/index.cjs"),ie=require("./components/Kbd/index.cjs"),ne=require("./components/StatusDot/index.cjs"),ue=require("./components/CopyField/index.cjs"),oe=require("./components/Divider/index.cjs"),i=require("./components/Directory/index.cjs"),de=require("./components/EmptyState/index.cjs"),ae=require("./components/PageHeader/index.cjs"),u=require("./components/Panel/index.cjs"),le=require("./components/Price/index.cjs"),se=require("./components/Rating/index.cjs"),ce=require("./components/SectionHeader/index.cjs"),fe=require("./components/ScrollArea/index.cjs"),n=require("./components/Skeleton/index.cjs"),qe=require("./components/Stat/index.cjs"),xe=require("./components/SummaryCard/index.cjs"),l=require("./components/Progress/index.cjs"),Te=require("./components/Spinner/index.cjs"),s=require("./components/Toast/index.cjs"),$e=require("./components/ToastPortal/index.cjs"),Ee=require("./components/Accordion/index.cjs"),Se=require("./components/Disclosure/index.cjs"),_e=require("./components/Steps/index.cjs"),Be=require("./components/Tabs/index.cjs"),Re=require("./components/Tile/index.cjs"),Pe=require("./components/Timeline/index.cjs"),Ae=require("./components/BottomSheet/index.cjs"),me=require("./components/Modal/index.cjs"),Oe=require("./components/CommandPalette/index.cjs"),pe=require("./components/ConfirmDialog/index.cjs"),Ce=require("./components/Drawer/index.cjs"),Ie=require("./components/PromptDialog/index.cjs"),c=require("./components/Table/index.cjs"),f=require("./components/DataTable/index.cjs"),q=require("./components/FilterBar/index.cjs"),be=require("./components/Pagination/index.cjs");exports.UiProvider=x.default;exports.UiThemeScript=T.default;exports.useUi=$.useUi;Object.defineProperty(exports,"THEME_ATTRIBUTE",{enumerable:!0,get:()=>t.THEME_ATTRIBUTE});Object.defineProperty(exports,"THEME_BOOT_SCRIPT",{enumerable:!0,get:()=>t.THEME_BOOT_SCRIPT});Object.defineProperty(exports,"THEME_BOOT_SCRIPT_HASH",{enumerable:!0,get:()=>t.THEME_BOOT_SCRIPT_HASH});Object.defineProperty(exports,"THEME_STORAGE_KEY",{enumerable:!0,get:()=>t.THEME_STORAGE_KEY});exports.hasOpenSurface=E.hasOpenSurface;exports.useAnnounce=S.default;exports.useUiTheme=_.default;exports.useUiTokens=B.default;exports.useStickToBottom=R.default;exports.useListboxNavigation=P.default;exports.usePositioning=A.default;exports.useVirtualList=m.default;exports.UIVariant=O.default;exports.UISize=p.default;exports.ABOVE_MOBILE_MEDIA_QUERY=e.ABOVE_MOBILE_MEDIA_QUERY;exports.ABOVE_TABLET_MEDIA_QUERY=e.ABOVE_TABLET_MEDIA_QUERY;exports.MOBILE_BREAKPOINT=e.MOBILE_BREAKPOINT;exports.SHEET_MEDIA_QUERY=e.SHEET_MEDIA_QUERY;exports.TABLET_BREAKPOINT=e.TABLET_BREAKPOINT;exports.TABLET_PORTRAIT_BREAKPOINT=e.TABLET_PORTRAIT_BREAKPOINT;exports.matchesSearch=o.matchesSearch;exports.normalizeSearchTerm=o.normalizeSearchTerm;exports.Button=C.default;exports.IconButton=I.default;exports.TextLink=b.default;exports.Tooltip=g.default;exports.ContextMenu=d.ContextMenu;exports.Menu=d.default;exports.Popover=D.default;exports.Chip=M.default;exports.ChipGroup=y.default;exports.Combobox=U.default;exports.SegmentedControl=h.default;exports.Select=H.default;exports.Checkbox=k.default;exports.Switch=L.default;exports.Radio=F.default;exports.RadioCard=w.default;exports.RangeSlider=v.default;exports.RatingInput=K.default;exports.QuantityStepper=N.default;exports.TableCheckbox=V.default;exports.Input=Y.default;exports.PasswordInput=Q.default;exports.TagInput=j.default;exports.Textarea=G.default;exports.DateField=a.default;exports.DateRange=a.DateRange;exports.Field=z.default;exports.FileUpload=J.default;exports.Alert=W.default;exports.Avatar=X.default;exports.Badge=Z.default;exports.Breadcrumb=ee.default;exports.Card=r.default;exports.CardBody=r.CardBody;exports.CardFooter=r.CardFooter;exports.CardMedia=r.CardMedia;exports.CardOverlay=r.CardOverlay;exports.Carousel=re.default;exports.CodeBadge=te.default;exports.Kbd=ie.default;exports.StatusDot=ne.default;exports.CopyField=ue.default;exports.Divider=oe.default;exports.Directory=i.default;exports.DirectoryGroup=i.DirectoryGroup;exports.DirectoryJump=i.DirectoryJump;exports.DirectoryRow=i.DirectoryRow;exports.EmptyState=de.default;exports.PageHeader=ae.default;exports.Panel=u.default;exports.PanelForm=u.PanelForm;exports.PanelRow=u.PanelRow;exports.Price=le.default;exports.Rating=se.default;exports.SectionHeader=ce.default;exports.ScrollArea=fe.default;exports.Skeleton=n.default;exports.SkeletonCard=n.SkeletonCard;exports.SkeletonRows=n.SkeletonRows;exports.SkeletonTable=n.SkeletonTable;exports.Stat=qe.default;exports.SummaryCard=xe.default;exports.Progress=l.default;exports.ProgressCircle=l.ProgressCircle;exports.Spinner=Te.default;exports.ToastHub=s.default;exports.toast=s.toast;exports.ToastPortal=$e.default;exports.Accordion=Ee.default;exports.Disclosure=Se.default;exports.Steps=_e.default;exports.Tabs=Be.default;exports.Tile=Re.default;exports.Timeline=Pe.default;exports.BottomSheet=Ae.default;exports.Modal=me.default;exports.CommandPalette=Oe.default;exports.ConfirmDialog=pe.default;exports.Drawer=Ce.default;exports.PromptDialog=Ie.default;exports.Table=c.default;exports.TableScroller=c.TableScroller;exports.DataTable=f.default;exports.DataTableRow=f.DataTableRow;exports.FilterBar=q.default;exports.FilterBarField=q.FilterBarField;exports.Pagination=be.default;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/build/index.d.ts
CHANGED
|
@@ -3,11 +3,9 @@
|
|
|
3
3
|
* kadar kaldırılmaz ve davranışı sessizce değişmez.
|
|
4
4
|
*/
|
|
5
5
|
export { default as UiProvider } from './theme/UiProvider';
|
|
6
|
-
export { default as initUi } from './theme/initUi';
|
|
7
6
|
export { default as UiThemeScript } from './theme/UiThemeScript';
|
|
8
7
|
export { useUi } from './theme/context';
|
|
9
|
-
export {
|
|
10
|
-
export { applyThemeConfig, buildThemeCss, DENSITY_ATTRIBUTE, resolveTokens, THEME_ATTRIBUTE, } from './helpers/theme.helper';
|
|
8
|
+
export { THEME_ATTRIBUTE, THEME_BOOT_SCRIPT, THEME_BOOT_SCRIPT_HASH, THEME_STORAGE_KEY, } from '@handijit/design';
|
|
11
9
|
export { hasOpenSurface } from './helpers/focus.helper';
|
|
12
10
|
export { default as useAnnounce } from './hooks/useAnnounce';
|
|
13
11
|
export { default as useUiTheme } from './hooks/useUiTheme';
|
|
@@ -20,7 +18,7 @@ export { default as UIVariant } from './enums/ui-variant.enum';
|
|
|
20
18
|
export { default as UISize } from './enums/ui-size.enum';
|
|
21
19
|
export type { CommonElementProps } from './types/common-element-props.type';
|
|
22
20
|
export type { UiLinkComponent, UiLinkExtraProps, UiLinkProps } from './types/link.type';
|
|
23
|
-
export { ABOVE_MOBILE_MEDIA_QUERY, ABOVE_TABLET_MEDIA_QUERY, MOBILE_BREAKPOINT, TABLET_BREAKPOINT, TABLET_PORTRAIT_BREAKPOINT, } from './constants/breakpoint.constants';
|
|
21
|
+
export { ABOVE_MOBILE_MEDIA_QUERY, ABOVE_TABLET_MEDIA_QUERY, MOBILE_BREAKPOINT, SHEET_MEDIA_QUERY, TABLET_BREAKPOINT, TABLET_PORTRAIT_BREAKPOINT, } from './constants/breakpoint.constants';
|
|
24
22
|
export { matchesSearch, normalizeSearchTerm } from './helpers/text.helper';
|
|
25
23
|
export { default as Button } from './components/Button';
|
|
26
24
|
export { default as IconButton, type IconButtonVariant } from './components/IconButton';
|
|
@@ -92,4 +90,4 @@ export { default as FilterBar, FilterBarField } from './components/FilterBar';
|
|
|
92
90
|
export { default as Pagination } from './components/Pagination';
|
|
93
91
|
export type { AnnouncePoliteness, ListboxNavigationOptions, VirtualRange } from './types/hook.type';
|
|
94
92
|
export type { PositionAlign, PositionSide, PositioningOptions, PositioningState, } from './types/positioning.type';
|
|
95
|
-
export type { UiColorPreference, UiColorScheme, UiContextValue,
|
|
93
|
+
export type { UiColorPreference, UiColorScheme, UiContextValue, UiLabels, UiThemeState, } from './types/theme.type';
|