jaci-ui 0.2.0 → 0.3.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.
Files changed (68) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +47 -0
  3. package/dist/components/button-group/button-group.cjs +22 -0
  4. package/dist/components/button-group/button-group.cjs.map +1 -0
  5. package/dist/components/button-group/button-group.d.cts +12 -0
  6. package/dist/components/button-group/button-group.d.ts +12 -0
  7. package/dist/components/button-group/button-group.js +21 -0
  8. package/dist/components/button-group/button-group.js.map +1 -0
  9. package/dist/components/button-group/index.d.cts +2 -0
  10. package/dist/components/button-group/index.d.ts +2 -0
  11. package/dist/components/empty-state/empty-state.cjs +62 -0
  12. package/dist/components/empty-state/empty-state.cjs.map +1 -0
  13. package/dist/components/empty-state/empty-state.d.cts +18 -0
  14. package/dist/components/empty-state/empty-state.d.ts +18 -0
  15. package/dist/components/empty-state/empty-state.js +57 -0
  16. package/dist/components/empty-state/empty-state.js.map +1 -0
  17. package/dist/components/empty-state/index.d.cts +2 -0
  18. package/dist/components/empty-state/index.d.ts +2 -0
  19. package/dist/components/icon-button/icon-button.cjs +40 -0
  20. package/dist/components/icon-button/icon-button.cjs.map +1 -0
  21. package/dist/components/icon-button/icon-button.d.cts +12 -0
  22. package/dist/components/icon-button/icon-button.d.ts +12 -0
  23. package/dist/components/icon-button/icon-button.js +40 -0
  24. package/dist/components/icon-button/icon-button.js.map +1 -0
  25. package/dist/components/icon-button/index.d.cts +2 -0
  26. package/dist/components/icon-button/index.d.ts +2 -0
  27. package/dist/components/input-group/index.d.cts +2 -0
  28. package/dist/components/input-group/index.d.ts +2 -0
  29. package/dist/components/input-group/input-group.cjs +32 -0
  30. package/dist/components/input-group/input-group.cjs.map +1 -0
  31. package/dist/components/input-group/input-group.d.cts +15 -0
  32. package/dist/components/input-group/input-group.d.ts +15 -0
  33. package/dist/components/input-group/input-group.js +30 -0
  34. package/dist/components/input-group/input-group.js.map +1 -0
  35. package/dist/index.cjs +19 -0
  36. package/dist/index.d.cts +11 -1
  37. package/dist/index.d.ts +11 -1
  38. package/dist/index.js +6 -1
  39. package/dist/styled-system/recipes/button-group.cjs +30 -0
  40. package/dist/styled-system/recipes/button-group.cjs.map +1 -0
  41. package/dist/styled-system/recipes/button-group.js +30 -0
  42. package/dist/styled-system/recipes/button-group.js.map +1 -0
  43. package/dist/styled-system/recipes/empty-state.cjs +36 -0
  44. package/dist/styled-system/recipes/empty-state.cjs.map +1 -0
  45. package/dist/styled-system/recipes/empty-state.js +36 -0
  46. package/dist/styled-system/recipes/empty-state.js.map +1 -0
  47. package/dist/styled-system/recipes/icon-button.cjs +40 -0
  48. package/dist/styled-system/recipes/icon-button.cjs.map +1 -0
  49. package/dist/styled-system/recipes/icon-button.js +40 -0
  50. package/dist/styled-system/recipes/icon-button.js.map +1 -0
  51. package/dist/styled-system/recipes/input-group.cjs +30 -0
  52. package/dist/styled-system/recipes/input-group.cjs.map +1 -0
  53. package/dist/styled-system/recipes/input-group.js +30 -0
  54. package/dist/styled-system/recipes/input-group.js.map +1 -0
  55. package/dist/styles/theme.cjs +15 -0
  56. package/dist/styles/theme.cjs.map +1 -1
  57. package/dist/styles/theme.js +15 -0
  58. package/dist/styles/theme.js.map +1 -1
  59. package/dist/styles.css +192 -1
  60. package/dist/theme/index.d.cts +2 -0
  61. package/dist/theme/index.d.ts +2 -0
  62. package/dist/theme/theme-provider.cjs +86 -0
  63. package/dist/theme/theme-provider.cjs.map +1 -0
  64. package/dist/theme/theme-provider.d.cts +66 -0
  65. package/dist/theme/theme-provider.d.ts +66 -0
  66. package/dist/theme/theme-provider.js +85 -0
  67. package/dist/theme/theme-provider.js.map +1 -0
  68. package/package.json +1 -1
@@ -0,0 +1,66 @@
1
+ import { ComponentPropsWithoutRef, ElementType, ReactNode } from "react";
2
+ //#region src/theme/theme-provider.d.ts
3
+ type ThemeMode = "light" | "dark" | "system";
4
+ /** A leaf value accepted by the theme variable mapper. */
5
+ type JaciThemeTokenValue = string | number;
6
+ /**
7
+ * Semantic theme values. The groups intentionally accept additional keys so
8
+ * applications can extend the token vocabulary without waiting for a package
9
+ * release. Known semantic groups are documented in the public README.
10
+ */
11
+ type JaciThemeTokenGroup = {
12
+ readonly [key: string]: JaciThemeTokenValue | JaciThemeTokenGroup | undefined;
13
+ };
14
+ interface JaciThemeColorTokens extends JaciThemeTokenGroup {
15
+ surface?: JaciThemeTokenGroup;
16
+ fg?: JaciThemeTokenGroup;
17
+ border?: JaciThemeTokenGroup;
18
+ accent?: JaciThemeTokenGroup;
19
+ success?: JaciThemeTokenValue;
20
+ warning?: JaciThemeTokenValue;
21
+ danger?: JaciThemeTokenValue;
22
+ info?: JaciThemeTokenValue;
23
+ link?: JaciThemeTokenGroup;
24
+ focus?: JaciThemeTokenValue;
25
+ disabled?: JaciThemeTokenValue;
26
+ selected?: JaciThemeTokenValue;
27
+ }
28
+ interface JaciThemeTokens {
29
+ colors?: JaciThemeColorTokens;
30
+ radii?: JaciThemeTokenGroup;
31
+ shadows?: JaciThemeTokenGroup;
32
+ durations?: JaciThemeTokenGroup;
33
+ easings?: JaciThemeTokenGroup;
34
+ transitions?: JaciThemeTokenGroup;
35
+ spacing?: JaciThemeTokenGroup;
36
+ fontSizes?: JaciThemeTokenGroup;
37
+ lineHeights?: JaciThemeTokenGroup;
38
+ typography?: JaciThemeTokenGroup;
39
+ textStyles?: JaciThemeTokenGroup;
40
+ fonts?: JaciThemeTokenGroup;
41
+ }
42
+ interface ThemeProviderProps extends Omit<ComponentPropsWithoutRef<"div">, "children"> {
43
+ /** The controlled color mode. */
44
+ theme?: ThemeMode;
45
+ /** The initial color mode for an uncontrolled provider. */
46
+ defaultTheme?: ThemeMode;
47
+ /** The deterministic mode used for `system` while rendering on the server. */
48
+ ssrTheme?: "light" | "dark";
49
+ /** Scoped semantic token overrides. */
50
+ tokens?: JaciThemeTokens;
51
+ /** Called when a controlled provider requests a mode change. */
52
+ onThemeChange?: (theme: ThemeMode) => void;
53
+ /** The element that owns the theme scope. */
54
+ as?: ElementType;
55
+ children?: ReactNode;
56
+ }
57
+ interface ThemeContextValue {
58
+ theme: ThemeMode;
59
+ resolvedTheme: "light" | "dark";
60
+ setTheme: (theme: ThemeMode) => void;
61
+ }
62
+ declare const ThemeProvider: import("react").ForwardRefExoticComponent<ThemeProviderProps & import("react").RefAttributes<HTMLElement>>;
63
+ declare function useTheme(): ThemeContextValue;
64
+ //#endregion
65
+ export { JaciThemeColorTokens, JaciThemeTokenGroup, JaciThemeTokenValue, JaciThemeTokens, ThemeContextValue, ThemeMode, ThemeProvider, ThemeProviderProps, useTheme };
66
+ //# sourceMappingURL=theme-provider.d.ts.map
@@ -0,0 +1,85 @@
1
+ "use client";
2
+ import { createContext, createElement, forwardRef, useCallback, useContext, useEffect, useMemo, useState } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/theme/theme-provider.tsx
5
+ const ThemeContext = createContext({
6
+ theme: "light",
7
+ resolvedTheme: "light",
8
+ setTheme: () => void 0
9
+ });
10
+ function kebabCase(value) {
11
+ return value.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
12
+ }
13
+ function flattenTokens(group, path, output) {
14
+ if (!group) return;
15
+ for (const [key, value] of Object.entries(group)) {
16
+ if (value === void 0) continue;
17
+ const nextPath = [...path, kebabCase(key)];
18
+ if (typeof value === "object") flattenTokens(value, nextPath, output);
19
+ else output[`--jaci-${nextPath.join("-")}`] = String(value);
20
+ }
21
+ }
22
+ function tokenStyles(tokens) {
23
+ if (!tokens) return {};
24
+ const variables = {};
25
+ for (const [group, values] of Object.entries(tokens)) flattenTokens(values, [kebabCase(group)], variables);
26
+ return variables;
27
+ }
28
+ function initialSystemTheme(ssrTheme) {
29
+ return ssrTheme ?? "light";
30
+ }
31
+ const ThemeProvider = forwardRef(function ThemeProvider({ as = "div", children, defaultTheme = "light", onThemeChange, ssrTheme, style, theme, tokens, ...props }, ref) {
32
+ const [uncontrolledTheme, setUncontrolledTheme] = useState(defaultTheme);
33
+ const [systemTheme, setSystemTheme] = useState(() => initialSystemTheme(ssrTheme));
34
+ const currentTheme = theme ?? uncontrolledTheme;
35
+ useEffect(() => {
36
+ if (currentTheme !== "system") return;
37
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
38
+ const media = window.matchMedia("(prefers-color-scheme: dark)");
39
+ const update = () => setSystemTheme(media.matches ? "dark" : "light");
40
+ update();
41
+ if (typeof media.addEventListener === "function") media.addEventListener("change", update);
42
+ else media.addListener?.(update);
43
+ return () => {
44
+ if (typeof media.removeEventListener === "function") media.removeEventListener("change", update);
45
+ else media.removeListener?.(update);
46
+ };
47
+ }, [currentTheme]);
48
+ const resolvedTheme = currentTheme === "system" ? systemTheme : currentTheme;
49
+ const setTheme = useCallback((nextTheme) => {
50
+ if (theme === void 0) setUncontrolledTheme(nextTheme);
51
+ onThemeChange?.(nextTheme);
52
+ }, [onThemeChange, theme]);
53
+ const contextValue = useMemo(() => ({
54
+ theme: currentTheme,
55
+ resolvedTheme,
56
+ setTheme
57
+ }), [
58
+ currentTheme,
59
+ resolvedTheme,
60
+ setTheme
61
+ ]);
62
+ const mergedStyle = useMemo(() => ({
63
+ ...style,
64
+ ...tokenStyles(tokens)
65
+ }), [style, tokens]);
66
+ const Root = as;
67
+ return /* @__PURE__ */ jsx(ThemeContext.Provider, {
68
+ value: contextValue,
69
+ children: createElement(Root, {
70
+ ...props,
71
+ "data-jaci-theme": resolvedTheme,
72
+ "data-jaci-component": "theme-provider",
73
+ "data-slot": "theme-provider",
74
+ ref,
75
+ style: mergedStyle
76
+ }, children)
77
+ });
78
+ });
79
+ function useTheme() {
80
+ return useContext(ThemeContext);
81
+ }
82
+ //#endregion
83
+ export { ThemeProvider, useTheme };
84
+
85
+ //# sourceMappingURL=theme-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-provider.js","names":[],"sources":["../../src/theme/theme-provider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n createElement,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport type { ComponentPropsWithoutRef, CSSProperties, ElementType, ReactNode, Ref } from \"react\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\n/** A leaf value accepted by the theme variable mapper. */\nexport type JaciThemeTokenValue = string | number;\n\n/**\n * Semantic theme values. The groups intentionally accept additional keys so\n * applications can extend the token vocabulary without waiting for a package\n * release. Known semantic groups are documented in the public README.\n */\nexport type JaciThemeTokenGroup = {\n readonly [key: string]: JaciThemeTokenValue | JaciThemeTokenGroup | undefined;\n};\n\nexport interface JaciThemeColorTokens extends JaciThemeTokenGroup {\n surface?: JaciThemeTokenGroup;\n fg?: JaciThemeTokenGroup;\n border?: JaciThemeTokenGroup;\n accent?: JaciThemeTokenGroup;\n success?: JaciThemeTokenValue;\n warning?: JaciThemeTokenValue;\n danger?: JaciThemeTokenValue;\n info?: JaciThemeTokenValue;\n link?: JaciThemeTokenGroup;\n focus?: JaciThemeTokenValue;\n disabled?: JaciThemeTokenValue;\n selected?: JaciThemeTokenValue;\n}\n\nexport interface JaciThemeTokens {\n colors?: JaciThemeColorTokens;\n radii?: JaciThemeTokenGroup;\n shadows?: JaciThemeTokenGroup;\n durations?: JaciThemeTokenGroup;\n easings?: JaciThemeTokenGroup;\n transitions?: JaciThemeTokenGroup;\n spacing?: JaciThemeTokenGroup;\n fontSizes?: JaciThemeTokenGroup;\n lineHeights?: JaciThemeTokenGroup;\n typography?: JaciThemeTokenGroup;\n textStyles?: JaciThemeTokenGroup;\n fonts?: JaciThemeTokenGroup;\n}\n\nexport interface ThemeProviderProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n /** The controlled color mode. */\n theme?: ThemeMode;\n /** The initial color mode for an uncontrolled provider. */\n defaultTheme?: ThemeMode;\n /** The deterministic mode used for `system` while rendering on the server. */\n ssrTheme?: \"light\" | \"dark\";\n /** Scoped semantic token overrides. */\n tokens?: JaciThemeTokens;\n /** Called when a controlled provider requests a mode change. */\n onThemeChange?: (theme: ThemeMode) => void;\n /** The element that owns the theme scope. */\n as?: ElementType;\n children?: ReactNode;\n}\n\nexport interface ThemeContextValue {\n theme: ThemeMode;\n resolvedTheme: \"light\" | \"dark\";\n setTheme: (theme: ThemeMode) => void;\n}\n\nconst defaultThemeContext: ThemeContextValue = {\n theme: \"light\",\n resolvedTheme: \"light\",\n setTheme: () => undefined,\n};\n\nconst ThemeContext = createContext<ThemeContextValue>(defaultThemeContext);\n\nfunction kebabCase(value: string) {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n}\n\nfunction flattenTokens(\n group: JaciThemeTokenGroup | undefined,\n path: string[],\n output: Record<string, string>,\n) {\n if (!group) return;\n\n for (const [key, value] of Object.entries(group)) {\n if (value === undefined) continue;\n const nextPath = [...path, kebabCase(key)];\n\n if (typeof value === \"object\") {\n flattenTokens(value, nextPath, output);\n } else {\n output[`--jaci-${nextPath.join(\"-\")}`] = String(value);\n }\n }\n}\n\nfunction tokenStyles(tokens: JaciThemeTokens | undefined): CSSProperties {\n if (!tokens) return {};\n\n const variables: Record<string, string> = {};\n for (const [group, values] of Object.entries(tokens)) {\n flattenTokens(values, [kebabCase(group)], variables);\n }\n\n return variables as CSSProperties;\n}\n\nfunction initialSystemTheme(ssrTheme: \"light\" | \"dark\" | undefined) {\n return ssrTheme ?? \"light\";\n}\n\nexport const ThemeProvider = forwardRef<HTMLElement, ThemeProviderProps>(function ThemeProvider(\n {\n as = \"div\",\n children,\n defaultTheme = \"light\",\n onThemeChange,\n ssrTheme,\n style,\n theme,\n tokens,\n ...props\n },\n ref,\n) {\n const [uncontrolledTheme, setUncontrolledTheme] = useState<ThemeMode>(defaultTheme);\n const [systemTheme, setSystemTheme] = useState<\"light\" | \"dark\">(() =>\n initialSystemTheme(ssrTheme),\n );\n const currentTheme = theme ?? uncontrolledTheme;\n\n useEffect(() => {\n if (currentTheme !== \"system\") return;\n\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const update = () => setSystemTheme(media.matches ? \"dark\" : \"light\");\n update();\n if (typeof media.addEventListener === \"function\") media.addEventListener(\"change\", update);\n else media.addListener?.(update);\n\n return () => {\n if (typeof media.removeEventListener === \"function\")\n media.removeEventListener(\"change\", update);\n else media.removeListener?.(update);\n };\n }, [currentTheme]);\n\n const resolvedTheme = currentTheme === \"system\" ? systemTheme : currentTheme;\n const setTheme = useCallback(\n (nextTheme: ThemeMode) => {\n if (theme === undefined) setUncontrolledTheme(nextTheme);\n onThemeChange?.(nextTheme);\n },\n [onThemeChange, theme],\n );\n const contextValue = useMemo(\n () => ({ theme: currentTheme, resolvedTheme, setTheme }),\n [currentTheme, resolvedTheme, setTheme],\n );\n const mergedStyle = useMemo(() => ({ ...style, ...tokenStyles(tokens) }), [style, tokens]);\n const Root = as;\n\n return (\n <ThemeContext.Provider value={contextValue}>\n {createElement(\n Root,\n {\n ...props,\n \"data-jaci-theme\": resolvedTheme,\n \"data-jaci-component\": \"theme-provider\",\n \"data-slot\": \"theme-provider\",\n ref: ref as Ref<HTMLElement>,\n style: mergedStyle,\n },\n children,\n )}\n </ThemeContext.Provider>\n );\n});\n\nexport function useTheme() {\n return useContext(ThemeContext);\n}\n"],"mappings":";;;;AAsFA,MAAM,eAAe,cAAiC;CALpD,OAAO;CACP,eAAe;CACf,gBAAgB,KAAA;AAGsD,CAAC;AAEzE,SAAS,UAAU,OAAe;CAChC,OAAO,MACJ,QAAQ,sBAAsB,OAAO,CAAC,CACtC,QAAQ,WAAW,GAAG,CAAC,CACvB,YAAY;AACjB;AAEA,SAAS,cACP,OACA,MACA,QACA;CACA,IAAI,CAAC,OAAO;CAEZ,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;EAChD,IAAI,UAAU,KAAA,GAAW;EACzB,MAAM,WAAW,CAAC,GAAG,MAAM,UAAU,GAAG,CAAC;EAEzC,IAAI,OAAO,UAAU,UACnB,cAAc,OAAO,UAAU,MAAM;OAErC,OAAO,UAAU,SAAS,KAAK,GAAG,OAAO,OAAO,KAAK;CAEzD;AACF;AAEA,SAAS,YAAY,QAAoD;CACvE,IAAI,CAAC,QAAQ,OAAO,CAAC;CAErB,MAAM,YAAoC,CAAC;CAC3C,KAAK,MAAM,CAAC,OAAO,WAAW,OAAO,QAAQ,MAAM,GACjD,cAAc,QAAQ,CAAC,UAAU,KAAK,CAAC,GAAG,SAAS;CAGrD,OAAO;AACT;AAEA,SAAS,mBAAmB,UAAwC;CAClE,OAAO,YAAY;AACrB;AAEA,MAAa,gBAAgB,WAA4C,SAAS,cAChF,EACE,KAAK,OACL,UACA,eAAe,SACf,eACA,UACA,OACA,OACA,QACA,GAAG,SAEL,KACA;CACA,MAAM,CAAC,mBAAmB,wBAAwB,SAAoB,YAAY;CAClF,MAAM,CAAC,aAAa,kBAAkB,eACpC,mBAAmB,QAAQ,CAC7B;CACA,MAAM,eAAe,SAAS;CAE9B,gBAAgB;EACd,IAAI,iBAAiB,UAAU;EAE/B,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;EAE9E,MAAM,QAAQ,OAAO,WAAW,8BAA8B;EAC9D,MAAM,eAAe,eAAe,MAAM,UAAU,SAAS,OAAO;EACpE,OAAO;EACP,IAAI,OAAO,MAAM,qBAAqB,YAAY,MAAM,iBAAiB,UAAU,MAAM;OACpF,MAAM,cAAc,MAAM;EAE/B,aAAa;GACX,IAAI,OAAO,MAAM,wBAAwB,YACvC,MAAM,oBAAoB,UAAU,MAAM;QACvC,MAAM,iBAAiB,MAAM;EACpC;CACF,GAAG,CAAC,YAAY,CAAC;CAEjB,MAAM,gBAAgB,iBAAiB,WAAW,cAAc;CAChE,MAAM,WAAW,aACd,cAAyB;EACxB,IAAI,UAAU,KAAA,GAAW,qBAAqB,SAAS;EACvD,gBAAgB,SAAS;CAC3B,GACA,CAAC,eAAe,KAAK,CACvB;CACA,MAAM,eAAe,eACZ;EAAE,OAAO;EAAc;EAAe;CAAS,IACtD;EAAC;EAAc;EAAe;CAAQ,CACxC;CACA,MAAM,cAAc,eAAe;EAAE,GAAG;EAAO,GAAG,YAAY,MAAM;CAAE,IAAI,CAAC,OAAO,MAAM,CAAC;CACzF,MAAM,OAAO;CAEb,OACE,oBAAC,aAAa,UAAd;EAAuB,OAAO;YAC3B,cACC,MACA;GACE,GAAG;GACH,mBAAmB;GACnB,uBAAuB;GACvB,aAAa;GACR;GACL,OAAO;EACT,GACA,QACF;CACqB,CAAA;AAE3B,CAAC;AAED,SAAgB,WAAW;CACzB,OAAO,WAAW,YAAY;AAChC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "jaci-ui",
3
3
  "description": "Accessible, themeable React components by Jaci UI",
4
- "version": "0.2.0",
4
+ "version": "0.3.0",
5
5
  "license": "MIT",
6
6
  "author": {
7
7
  "name": "Richard Borges",