@snowztech/ui 0.3.0 → 0.3.1

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/dist/client.cjs CHANGED
@@ -36,7 +36,9 @@ function ThemeToggle({
36
36
  const [theme, setTheme] = React__namespace.useState(defaultTheme);
37
37
  const [mounted, setMounted] = React__namespace.useState(false);
38
38
  React__namespace.useEffect(() => {
39
- const stored = localStorage.getItem(storageKey) ?? defaultTheme;
39
+ const followsSystem = document.documentElement.getAttribute("data-theme") === "system";
40
+ const system = matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";
41
+ const stored = localStorage.getItem(storageKey) ?? (followsSystem ? system : defaultTheme);
40
42
  setTheme(stored);
41
43
  setMounted(true);
42
44
  }, [storageKey, defaultTheme]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme-toggle.tsx","../src/copy-button.tsx"],"names":["React","jsx","cx","React2","jsxs"],"mappings":"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","file":"client.cjs","sourcesContent":["import * as React from \"react\";\n\nconst cx = (...parts: Array<string | undefined | false>) => parts.filter(Boolean).join(\" \");\n\nexport type Theme = \"light\" | \"dark\";\n\nexport interface ThemeToggleProps {\n size?: number;\n storageKey?: string;\n defaultTheme?: Theme;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function ThemeToggle({\n size = 12,\n storageKey = \"theme\",\n defaultTheme = \"dark\",\n className,\n style,\n}: ThemeToggleProps) {\n const [theme, setTheme] = React.useState<Theme>(defaultTheme);\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n const stored = (localStorage.getItem(storageKey) as Theme | null) ?? defaultTheme;\n setTheme(stored);\n setMounted(true);\n }, [storageKey, defaultTheme]);\n\n const toggle = () => {\n const next: Theme = theme === \"dark\" ? \"light\" : \"dark\";\n setTheme(next);\n localStorage.setItem(storageKey, next);\n if (next === \"light\") document.documentElement.setAttribute(\"data-theme\", \"light\");\n else document.documentElement.removeAttribute(\"data-theme\");\n };\n\n return (\n <button\n type=\"button\"\n onClick={toggle}\n aria-label={`switch to ${theme === \"dark\" ? \"light\" : \"dark\"} mode`}\n className={cx(\"sn-theme-toggle\", className)}\n style={{\n [\"--sn-theme-toggle-size\" as string]: `${size}px`,\n opacity: mounted ? 1 : 0,\n ...style,\n }}\n >\n <span className=\"sn-theme-toggle__indicator\" />\n </button>\n );\n}\n","import * as React from \"react\";\n\nconst cx = (...parts: Array<string | undefined | false>) => parts.filter(Boolean).join(\" \");\n\nexport interface CopyButtonProps {\n value: string;\n size?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function CopyButton({ value, size = 14, className, style }: CopyButtonProps) {\n const [copied, setCopied] = React.useState(false);\n\n const onCopy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1200);\n } catch {\n // ignored\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? \"copied\" : \"copy\"}\n data-copied={copied || undefined}\n className={cx(\"sn-copy-btn\", className)}\n style={style}\n >\n <svg className=\"sn-copy-btn__idle\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"1.5\" />\n <path d=\"M5 15V5a1 1 0 0 1 1-1h10\" />\n </svg>\n <svg className=\"sn-copy-btn__copied\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m4 12 5 5L20 6\" />\n </svg>\n </button>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/theme-toggle.tsx","../src/copy-button.tsx"],"names":["React","jsx","cx","React2","jsxs"],"mappings":"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","file":"client.cjs","sourcesContent":["import * as React from \"react\";\n\nconst cx = (...parts: Array<string | undefined | false>) => parts.filter(Boolean).join(\" \");\n\nexport type Theme = \"light\" | \"dark\";\n\nexport interface ThemeToggleProps {\n size?: number;\n storageKey?: string;\n defaultTheme?: Theme;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function ThemeToggle({\n size = 12,\n storageKey = \"theme\",\n defaultTheme = \"dark\",\n className,\n style,\n}: ThemeToggleProps) {\n const [theme, setTheme] = React.useState<Theme>(defaultTheme);\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n const followsSystem = document.documentElement.getAttribute(\"data-theme\") === \"system\";\n const system: Theme = matchMedia(\"(prefers-color-scheme: light)\").matches ? \"light\" : \"dark\";\n const stored = (localStorage.getItem(storageKey) as Theme | null) ?? (followsSystem ? system : defaultTheme);\n setTheme(stored);\n setMounted(true);\n }, [storageKey, defaultTheme]);\n\n const toggle = () => {\n const next: Theme = theme === \"dark\" ? \"light\" : \"dark\";\n setTheme(next);\n localStorage.setItem(storageKey, next);\n if (next === \"light\") document.documentElement.setAttribute(\"data-theme\", \"light\");\n else document.documentElement.removeAttribute(\"data-theme\");\n };\n\n return (\n <button\n type=\"button\"\n onClick={toggle}\n aria-label={`switch to ${theme === \"dark\" ? \"light\" : \"dark\"} mode`}\n className={cx(\"sn-theme-toggle\", className)}\n style={{\n [\"--sn-theme-toggle-size\" as string]: `${size}px`,\n opacity: mounted ? 1 : 0,\n ...style,\n }}\n >\n <span className=\"sn-theme-toggle__indicator\" />\n </button>\n );\n}\n","import * as React from \"react\";\n\nconst cx = (...parts: Array<string | undefined | false>) => parts.filter(Boolean).join(\" \");\n\nexport interface CopyButtonProps {\n value: string;\n size?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function CopyButton({ value, size = 14, className, style }: CopyButtonProps) {\n const [copied, setCopied] = React.useState(false);\n\n const onCopy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1200);\n } catch {\n // ignored\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? \"copied\" : \"copy\"}\n data-copied={copied || undefined}\n className={cx(\"sn-copy-btn\", className)}\n style={style}\n >\n <svg className=\"sn-copy-btn__idle\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"1.5\" />\n <path d=\"M5 15V5a1 1 0 0 1 1-1h10\" />\n </svg>\n <svg className=\"sn-copy-btn__copied\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m4 12 5 5L20 6\" />\n </svg>\n </button>\n );\n}\n"]}
package/dist/client.js CHANGED
@@ -14,7 +14,9 @@ function ThemeToggle({
14
14
  const [theme, setTheme] = React.useState(defaultTheme);
15
15
  const [mounted, setMounted] = React.useState(false);
16
16
  React.useEffect(() => {
17
- const stored = localStorage.getItem(storageKey) ?? defaultTheme;
17
+ const followsSystem = document.documentElement.getAttribute("data-theme") === "system";
18
+ const system = matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";
19
+ const stored = localStorage.getItem(storageKey) ?? (followsSystem ? system : defaultTheme);
18
20
  setTheme(stored);
19
21
  setMounted(true);
20
22
  }, [storageKey, defaultTheme]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme-toggle.tsx","../src/copy-button.tsx"],"names":["cx","React2","jsx"],"mappings":"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","file":"client.js","sourcesContent":["import * as React from \"react\";\n\nconst cx = (...parts: Array<string | undefined | false>) => parts.filter(Boolean).join(\" \");\n\nexport type Theme = \"light\" | \"dark\";\n\nexport interface ThemeToggleProps {\n size?: number;\n storageKey?: string;\n defaultTheme?: Theme;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function ThemeToggle({\n size = 12,\n storageKey = \"theme\",\n defaultTheme = \"dark\",\n className,\n style,\n}: ThemeToggleProps) {\n const [theme, setTheme] = React.useState<Theme>(defaultTheme);\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n const stored = (localStorage.getItem(storageKey) as Theme | null) ?? defaultTheme;\n setTheme(stored);\n setMounted(true);\n }, [storageKey, defaultTheme]);\n\n const toggle = () => {\n const next: Theme = theme === \"dark\" ? \"light\" : \"dark\";\n setTheme(next);\n localStorage.setItem(storageKey, next);\n if (next === \"light\") document.documentElement.setAttribute(\"data-theme\", \"light\");\n else document.documentElement.removeAttribute(\"data-theme\");\n };\n\n return (\n <button\n type=\"button\"\n onClick={toggle}\n aria-label={`switch to ${theme === \"dark\" ? \"light\" : \"dark\"} mode`}\n className={cx(\"sn-theme-toggle\", className)}\n style={{\n [\"--sn-theme-toggle-size\" as string]: `${size}px`,\n opacity: mounted ? 1 : 0,\n ...style,\n }}\n >\n <span className=\"sn-theme-toggle__indicator\" />\n </button>\n );\n}\n","import * as React from \"react\";\n\nconst cx = (...parts: Array<string | undefined | false>) => parts.filter(Boolean).join(\" \");\n\nexport interface CopyButtonProps {\n value: string;\n size?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function CopyButton({ value, size = 14, className, style }: CopyButtonProps) {\n const [copied, setCopied] = React.useState(false);\n\n const onCopy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1200);\n } catch {\n // ignored\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? \"copied\" : \"copy\"}\n data-copied={copied || undefined}\n className={cx(\"sn-copy-btn\", className)}\n style={style}\n >\n <svg className=\"sn-copy-btn__idle\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"1.5\" />\n <path d=\"M5 15V5a1 1 0 0 1 1-1h10\" />\n </svg>\n <svg className=\"sn-copy-btn__copied\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m4 12 5 5L20 6\" />\n </svg>\n </button>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/theme-toggle.tsx","../src/copy-button.tsx"],"names":["cx","React2","jsx"],"mappings":"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","file":"client.js","sourcesContent":["import * as React from \"react\";\n\nconst cx = (...parts: Array<string | undefined | false>) => parts.filter(Boolean).join(\" \");\n\nexport type Theme = \"light\" | \"dark\";\n\nexport interface ThemeToggleProps {\n size?: number;\n storageKey?: string;\n defaultTheme?: Theme;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function ThemeToggle({\n size = 12,\n storageKey = \"theme\",\n defaultTheme = \"dark\",\n className,\n style,\n}: ThemeToggleProps) {\n const [theme, setTheme] = React.useState<Theme>(defaultTheme);\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n const followsSystem = document.documentElement.getAttribute(\"data-theme\") === \"system\";\n const system: Theme = matchMedia(\"(prefers-color-scheme: light)\").matches ? \"light\" : \"dark\";\n const stored = (localStorage.getItem(storageKey) as Theme | null) ?? (followsSystem ? system : defaultTheme);\n setTheme(stored);\n setMounted(true);\n }, [storageKey, defaultTheme]);\n\n const toggle = () => {\n const next: Theme = theme === \"dark\" ? \"light\" : \"dark\";\n setTheme(next);\n localStorage.setItem(storageKey, next);\n if (next === \"light\") document.documentElement.setAttribute(\"data-theme\", \"light\");\n else document.documentElement.removeAttribute(\"data-theme\");\n };\n\n return (\n <button\n type=\"button\"\n onClick={toggle}\n aria-label={`switch to ${theme === \"dark\" ? \"light\" : \"dark\"} mode`}\n className={cx(\"sn-theme-toggle\", className)}\n style={{\n [\"--sn-theme-toggle-size\" as string]: `${size}px`,\n opacity: mounted ? 1 : 0,\n ...style,\n }}\n >\n <span className=\"sn-theme-toggle__indicator\" />\n </button>\n );\n}\n","import * as React from \"react\";\n\nconst cx = (...parts: Array<string | undefined | false>) => parts.filter(Boolean).join(\" \");\n\nexport interface CopyButtonProps {\n value: string;\n size?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function CopyButton({ value, size = 14, className, style }: CopyButtonProps) {\n const [copied, setCopied] = React.useState(false);\n\n const onCopy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1200);\n } catch {\n // ignored\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? \"copied\" : \"copy\"}\n data-copied={copied || undefined}\n className={cx(\"sn-copy-btn\", className)}\n style={style}\n >\n <svg className=\"sn-copy-btn__idle\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"1.5\" />\n <path d=\"M5 15V5a1 1 0 0 1 1-1h10\" />\n </svg>\n <svg className=\"sn-copy-btn__copied\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m4 12 5 5L20 6\" />\n </svg>\n </button>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snowztech/ui",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Terminal-minimal React design system. Mark, icons, tokens, and primitives.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -62,7 +62,7 @@
62
62
  "react": ">=18"
63
63
  },
64
64
  "dependencies": {
65
- "@snowztech/ui-css": "0.3.0"
65
+ "@snowztech/ui-css": "0.4.0"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@types/react": "^18.3.12",