@tomny-dev/uzi 0.1.12 → 0.2.0-pr.19.65.1.6d1e717

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 CHANGED
@@ -125,6 +125,27 @@ In practice, `uzi` should spend its complexity budget on reusable app scaffoldin
125
125
  - `showThemeToggle`
126
126
  - `themeToggleProps`
127
127
 
128
+ ## Documentation
129
+
130
+ - [Getting Started](docs/getting-started.md) — Installation, setup, and first component
131
+ - [Theming](docs/theming.md) — ThemeProvider, useTheme, accent palettes, CSS overrides
132
+ - [Layout Patterns](docs/guides/layout-patterns.md) — Dashboard, full-width header, center-branded
133
+ - [Form Patterns](docs/guides/form-patterns.md) — Input, Select, MultiSelect, SegmentedToggle patterns
134
+
135
+ ## SSR Notes
136
+
137
+ This package bundles CSS inline into the JavaScript output via `vite-plugin-css-injected-by-js`.
138
+ At runtime, a `<style>` tag is injected into the document head so consumers do **not** need
139
+ to import `./styles.css` for client-side rendering.
140
+
141
+ If your app uses SSR (Next.js, Remix, etc.), the injected `<style>` tag won't run on the
142
+ server, so there may be a brief flash of unstyled content on the first client render.
143
+ Consumers who need SSR-safe styles should continue importing the separate stylesheet:
144
+
145
+ ```css
146
+ @import "@tomny-dev/uzi/styles.css";
147
+ ```
148
+
128
149
  ## Notes
129
150
 
130
151
  - No Tailwind — components use CSS modules internally
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  import * as AvatarPrimitive from "@radix-ui/react-avatar";
3
- export type AvatarSize = "sm" | "md" | "lg";
3
+ export type AvatarSize = "sm" | "md" | "lg" | "xl";
4
4
  export type AvatarProps = React.ComponentProps<typeof AvatarPrimitive.Root> & {
5
5
  size?: AvatarSize;
6
6
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/Avatar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAI1D,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG;IAC5E,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,IAAW,EACX,GAAG,KAAK,EACT,EAAE,WAAW,2CAUb;AAED,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAOpD;AAED,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,QAAQ,CAAC,2CAOvD"}
1
+ {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/Avatar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAI1D,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG;IAC5E,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,IAAW,EACX,GAAG,KAAK,EACT,EAAE,WAAW,2CAUb;AAED,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAOpD;AAED,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,QAAQ,CAAC,2CAOvD"}
@@ -0,0 +1,16 @@
1
+ import type { ReactNode } from "react";
2
+ export type SegmentedToggleOption<T extends string = string> = {
3
+ label: ReactNode;
4
+ value: T;
5
+ disabled?: boolean;
6
+ };
7
+ export type SegmentedToggleProps<T extends string = string> = {
8
+ options: SegmentedToggleOption<T>[];
9
+ value: T;
10
+ onChange: (value: T) => void;
11
+ "aria-label"?: string;
12
+ "aria-labelledby"?: string;
13
+ className?: string;
14
+ };
15
+ export declare function SegmentedToggle<T extends string = string>({ options, value, onChange, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, className, }: SegmentedToggleProps<T>): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=SegmentedToggle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedToggle.d.ts","sourceRoot":"","sources":["../../../src/components/segmented-toggle/SegmentedToggle.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IAC7D,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IAC5D,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EACzD,OAAO,EACP,KAAK,EACL,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,SAAS,GACV,EAAE,oBAAoB,CAAC,CAAC,CAAC,2CA4HzB"}
@@ -7,6 +7,14 @@ export type SidebarNavItem = {
7
7
  badge?: ReactNode;
8
8
  active?: boolean;
9
9
  disabled?: boolean;
10
+ /**
11
+ * When `true`, this item uses exact matching (matches its own path and paths starting with `{href}/`)
12
+ * instead of prefix matching. This flag takes precedence over the global `matchStrategy` prop on a
13
+ * per-item basis — even when `matchStrategy="prefix"`, an item with `exact: true` will use exact matching.
14
+ * When `matchStrategy="most-specific"`, exact-flagged items participate in the length-based tiebreaker
15
+ * like all other candidates, provided they pass their own match check first.
16
+ */
17
+ exact?: boolean;
10
18
  title?: string;
11
19
  target?: AnchorHTMLAttributes<HTMLAnchorElement>["target"];
12
20
  rel?: AnchorHTMLAttributes<HTMLAnchorElement>["rel"];
@@ -22,6 +30,7 @@ export type SidebarNavProps = {
22
30
  sections?: SidebarNavSection[];
23
31
  currentPath?: string;
24
32
  getIsActive?: (item: SidebarNavItem, currentPath?: string) => boolean;
33
+ matchStrategy?: "prefix" | "most-specific";
25
34
  onItemClick?: (item: SidebarNavItem) => void;
26
35
  header?: ReactNode;
27
36
  footer?: ReactNode;
@@ -32,5 +41,5 @@ export type SidebarNavProps = {
32
41
  itemClassName?: string;
33
42
  sectionClassName?: string;
34
43
  };
35
- export declare function SidebarNav({ items, sections, currentPath, getIsActive, onItemClick, header, footer, ariaLabel, collapsed, iconSize, className, itemClassName, sectionClassName, }: SidebarNavProps): import("react/jsx-runtime").JSX.Element;
44
+ export declare function SidebarNav({ items, sections, currentPath, getIsActive, matchStrategy, onItemClick, header, footer, ariaLabel, collapsed, iconSize, className, itemClassName, sectionClassName, }: SidebarNavProps): import("react/jsx-runtime").JSX.Element;
36
45
  //# sourceMappingURL=SidebarNav.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SidebarNav.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar-nav/SidebarNav.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,oBAAoB,EAAsB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAItF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3D,GAAG,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC;IACrD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACtE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAUF,wBAAgB,UAAU,CAAC,EACzB,KAAU,EACV,QAAQ,EACR,WAAW,EACX,WAA6B,EAC7B,WAAW,EACX,MAAM,EACN,MAAM,EACN,SAAgC,EAChC,SAAiB,EACjB,QAAQ,EACR,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,EAAE,eAAe,2CAkDjB"}
1
+ {"version":3,"file":"SidebarNav.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar-nav/SidebarNav.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,oBAAoB,EAAsB,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AAI/F,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3D,GAAG,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC;IACrD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACtE,aAAa,CAAC,EAAE,QAAQ,GAAG,eAAe,CAAC;IAC3C,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAqEF,wBAAgB,UAAU,CAAC,EACzB,KAAU,EACV,QAAQ,EACR,WAAW,EACX,WAAW,EACX,aAAwB,EACxB,WAAW,EACX,MAAM,EACN,MAAM,EACN,SAAgC,EAChC,SAAiB,EACjB,QAAQ,EACR,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,EAAE,eAAe,2CA2EjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SidebarNav.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarNav.test.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar-nav/SidebarNav.test.tsx"],"names":[],"mappings":""}