@uselets/ui 1.14.1 → 1.15.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 +15 -0
- package/dist/components/theme.d.ts +2 -1
- package/dist/components/theme.js +1 -1
- package/dist/components/theme.js.map +1 -1
- package/dist/components/toggle-group.js +1 -1
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle.d.ts +1 -1
- package/dist/components/toggle.js +1 -1
- package/dist/components/toggle.js.map +1 -1
- package/dist/skills/uselets-ui/references/component-catalog.md +2 -1
- package/dist/skills/uselets-ui/references/package-guide.md +3 -2
- package/package.json +3 -3
- package/skills/uselets-ui/references/component-catalog.md +2 -1
- package/skills/uselets-ui/references/package-guide.md +3 -2
package/README.md
CHANGED
|
@@ -456,6 +456,21 @@ useHotkeys([
|
|
|
456
456
|
|
|
457
457
|
Utilities are exported from the package root and `@uselets/ui/utils`, including `cn` and `randomId`. The package also exports `composeRefs` (and `setRef`) from `@uselets/ui/lib/compose-refs` for composing multiple refs into a single callback ref — handy when a component needs to merge a forwarded `ref` with an internal one (for example `MaskInput`).
|
|
458
458
|
|
|
459
|
+
`ThemeProvider` stores the active `Theme` (`'dark' | 'light' | 'system'`) in `localStorage` under `storageKey` (default `'vite-ui-theme'`) and toggles the `dark`/`light` class on `document.documentElement`. Pass `defaultTheme` to set the initial theme when none is stored yet, and `disableTransitionOnChange` to suppress CSS transitions for the moment the class swaps, matching `next-themes`'s prop of the same name:
|
|
460
|
+
|
|
461
|
+
```tsx
|
|
462
|
+
import { ModeToggle, ThemeProvider } from '@uselets/ui/theme'
|
|
463
|
+
|
|
464
|
+
export function AppRoot({ children }: { children: React.ReactNode }) {
|
|
465
|
+
return (
|
|
466
|
+
<ThemeProvider defaultTheme="system" disableTransitionOnChange>
|
|
467
|
+
<ModeToggle />
|
|
468
|
+
{children}
|
|
469
|
+
</ThemeProvider>
|
|
470
|
+
)
|
|
471
|
+
}
|
|
472
|
+
```
|
|
473
|
+
|
|
459
474
|
### Sonner example
|
|
460
475
|
|
|
461
476
|
```tsx
|
|
@@ -7,13 +7,14 @@ type ThemeProviderProps = {
|
|
|
7
7
|
children: React.ReactNode;
|
|
8
8
|
defaultTheme?: Theme;
|
|
9
9
|
storageKey?: string;
|
|
10
|
+
disableTransitionOnChange?: boolean;
|
|
10
11
|
};
|
|
11
12
|
type ThemeProviderState = {
|
|
12
13
|
theme: Theme;
|
|
13
14
|
setTheme: (theme: Theme) => void;
|
|
14
15
|
};
|
|
15
16
|
type ModeToggleProps = React.ComponentProps<typeof Button>;
|
|
16
|
-
declare function ThemeProvider({ children, defaultTheme, storageKey, ...props }: ThemeProviderProps): React.JSX.Element;
|
|
17
|
+
declare function ThemeProvider({ children, defaultTheme, storageKey, disableTransitionOnChange, ...props }: ThemeProviderProps): React.JSX.Element;
|
|
17
18
|
declare const useTheme: () => ThemeProviderState;
|
|
18
19
|
declare function ModeToggle(props: ModeToggleProps): React.JSX.Element;
|
|
19
20
|
//#endregion
|
package/dist/components/theme.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../rolldown-runtime-Bdj-bS2b.js";import{Button as e}from"./button.js";import{DropdownMenu as t,DropdownMenuContent as n,DropdownMenuItem as r,DropdownMenuTrigger as i}from"./dropdown-menu.js";import{IconMoon as a,IconSun as o}from"@tabler/icons-react";import{jsx as s,jsxs as c}from"react/jsx-runtime";import{createContext as l,use as u,useEffect as d,useState as f}from"react";const p=l({});function ThemeProvider({children:e,defaultTheme:t=`system`,storageKey:n=`vite-ui-theme
|
|
1
|
+
import"../rolldown-runtime-Bdj-bS2b.js";import{Button as e}from"./button.js";import{DropdownMenu as t,DropdownMenuContent as n,DropdownMenuItem as r,DropdownMenuTrigger as i}from"./dropdown-menu.js";import{IconMoon as a,IconSun as o}from"@tabler/icons-react";import{jsx as s,jsxs as c}from"react/jsx-runtime";import{createContext as l,use as u,useEffect as d,useState as f}from"react";const p=l({});function disableAnimation(){let e=document.createElement(`style`);return e.appendChild(document.createTextNode(`*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}`)),document.head.appendChild(e),()=>{window.getComputedStyle(document.body),setTimeout(()=>{document.head.removeChild(e)},1)}}function ThemeProvider({children:e,defaultTheme:t=`system`,storageKey:n=`vite-ui-theme`,disableTransitionOnChange:r=!1,...i}){let[a,o]=f(()=>localStorage.getItem(n)||t);d(()=>{let e=window.document.documentElement,t=r?disableAnimation():null;e.classList.remove(`light`,`dark`);let n=a===`system`?window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:a;e.classList.add(n),t?.()},[a,r]);let c={theme:a,setTheme:e=>{localStorage.setItem(n,e),o(e)}};return s(p.Provider,{...i,value:c,children:e})}const useTheme=()=>{let e=u(p);if(e===void 0||Object.keys(e).length===0)throw Error(`useTheme must be used within a ThemeProvider`);return e};function ModeToggle(l){let{setTheme:u}=useTheme();return c(t,{children:[s(i,{asChild:!0,children:c(e,{variant:`outline`,size:`icon`,...l,children:[s(o,{className:`h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90`}),s(a,{className:`absolute h-[1.2rem] w-[1.2rem] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0`}),s(`span`,{className:`sr-only`,children:`Toggle theme`})]})}),c(n,{align:`end`,children:[s(r,{onClick:()=>u(`light`),children:`Light`}),s(r,{onClick:()=>u(`dark`),children:`Dark`}),s(r,{onClick:()=>u(`system`),children:`System`})]})]})}export{ModeToggle,ThemeProvider,useTheme};
|
|
2
2
|
//# sourceMappingURL=theme.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","names":[],"sources":["../../src/components/theme.tsx"],"sourcesContent":["import type * as React from 'react'\nimport { createContext, use, useEffect, useState } from 'react'\n\nimport { IconMoon, IconSun } from '@tabler/icons-react'\n\nimport { Button } from './button'\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from './dropdown-menu'\n\nexport type Theme = 'dark' | 'light' | 'system'\n\nexport type ThemeProviderProps = {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n}\n\nexport type ThemeProviderState = {\n theme: Theme\n setTheme: (theme: Theme) => void\n}\n\nexport type ModeToggleProps = React.ComponentProps<typeof Button>\n\nconst ThemeProviderContext = createContext({} as ThemeProviderState)\n\nexport function ThemeProvider({\n children,\n defaultTheme = 'system',\n storageKey = 'vite-ui-theme',\n ...props\n}: ThemeProviderProps) {\n const [theme, setTheme] = useState<Theme>(() => (localStorage.getItem(storageKey) as Theme) || defaultTheme)\n\n useEffect(() => {\n const root = window.document.documentElement\n\n root.classList.remove('light', 'dark')\n\n
|
|
1
|
+
{"version":3,"file":"theme.js","names":[],"sources":["../../src/components/theme.tsx"],"sourcesContent":["import type * as React from 'react'\nimport { createContext, use, useEffect, useState } from 'react'\n\nimport { IconMoon, IconSun } from '@tabler/icons-react'\n\nimport { Button } from './button'\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from './dropdown-menu'\n\nexport type Theme = 'dark' | 'light' | 'system'\n\nexport type ThemeProviderProps = {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n disableTransitionOnChange?: boolean\n}\n\nexport type ThemeProviderState = {\n theme: Theme\n setTheme: (theme: Theme) => void\n}\n\nexport type ModeToggleProps = React.ComponentProps<typeof Button>\n\nconst ThemeProviderContext = createContext({} as ThemeProviderState)\n\nfunction disableAnimation() {\n const css = document.createElement('style')\n\n css.appendChild(\n document.createTextNode(\n '*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}'\n )\n )\n document.head.appendChild(css)\n\n return () => {\n window.getComputedStyle(document.body)\n\n setTimeout(() => {\n document.head.removeChild(css)\n }, 1)\n }\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = 'system',\n storageKey = 'vite-ui-theme',\n disableTransitionOnChange = false,\n ...props\n}: ThemeProviderProps) {\n const [theme, setTheme] = useState<Theme>(() => (localStorage.getItem(storageKey) as Theme) || defaultTheme)\n\n useEffect(() => {\n const root = window.document.documentElement\n const enableTransitions = disableTransitionOnChange ? disableAnimation() : null\n\n root.classList.remove('light', 'dark')\n\n const resolvedTheme =\n theme === 'system' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme\n\n root.classList.add(resolvedTheme)\n\n enableTransitions?.()\n }, [theme, disableTransitionOnChange])\n\n const value = {\n theme,\n setTheme: (theme: Theme) => {\n localStorage.setItem(storageKey, theme)\n setTheme(theme)\n }\n }\n\n return (\n <ThemeProviderContext.Provider {...props} value={value}>\n {children}\n </ThemeProviderContext.Provider>\n )\n}\n\nexport const useTheme = () => {\n const context = use(ThemeProviderContext)\n\n if (context === undefined || Object.keys(context).length === 0) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n\n return context\n}\n\nexport function ModeToggle(props: ModeToggleProps) {\n const { setTheme } = useTheme()\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"icon\" {...props}>\n <IconSun className=\"h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <IconMoon className=\"absolute h-[1.2rem] w-[1.2rem] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n <span className=\"sr-only\">Toggle theme</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setTheme('light')}>Light</DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme('dark')}>Dark</DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme('system')}>System</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n"],"mappings":"iYAwBA,MAAM,EAAuB,EAAc,CAAC,CAAuB,EAEnE,SAAS,kBAAmB,CAC1B,IAAM,EAAM,SAAS,cAAc,OAAO,EAS1C,OAPA,EAAI,YACF,SAAS,eACP,6KACF,CACF,EACA,SAAS,KAAK,YAAY,CAAG,MAEhB,CACX,OAAO,iBAAiB,SAAS,IAAI,EAErC,eAAiB,CACf,SAAS,KAAK,YAAY,CAAG,CAC/B,EAAG,CAAC,CACN,CACF,CAEA,SAAgB,cAAc,CAC5B,WACA,eAAe,SACf,aAAa,gBACb,4BAA4B,GAC5B,GAAG,GACkB,CACrB,GAAM,CAAC,EAAO,GAAY,MAAuB,aAAa,QAAQ,CAAU,GAAe,CAAY,EAE3G,MAAgB,CACd,IAAM,EAAO,OAAO,SAAS,gBACvB,EAAoB,EAA4B,iBAAiB,EAAI,KAE3E,EAAK,UAAU,OAAO,QAAS,MAAM,EAErC,IAAM,EACJ,IAAU,SAAY,OAAO,WAAW,8BAA8B,CAAC,CAAC,QAAU,OAAS,QAAW,EAExG,EAAK,UAAU,IAAI,CAAa,EAEhC,IAAoB,CACtB,EAAG,CAAC,EAAO,CAAyB,CAAC,EAErC,IAAM,EAAQ,CACZ,QACA,SAAW,GAAiB,CAC1B,aAAa,QAAQ,EAAY,CAAK,EACtC,EAAS,CAAK,CAChB,CACF,EAEA,OACE,EAAC,EAAqB,SAAtB,CAA+B,GAAI,EAAc,QAC9C,UAC4B,CAAA,CAEnC,CAEA,MAAa,aAAiB,CAC5B,IAAM,EAAU,EAAI,CAAoB,EAExC,GAAI,IAAY,IAAA,IAAa,OAAO,KAAK,CAAO,CAAC,CAAC,SAAW,EAC3D,MAAU,MAAM,8CAA8C,EAGhE,OAAO,CACT,EAEA,SAAgB,WAAW,EAAwB,CACjD,GAAM,CAAE,YAAa,SAAS,EAE9B,OACE,EAAC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CAAqB,QAAA,GACnB,SAAA,EAAC,EAAD,CAAQ,QAAQ,UAAU,KAAK,OAAO,GAAI,EAA1C,SAAA,CACE,EAAC,EAAD,CAAS,UAAU,sFAAwF,CAAA,EAC3G,EAAC,EAAD,CAAU,UAAU,8FAAgG,CAAA,EACpH,EAAC,OAAD,CAAM,UAAU,UAAU,SAAA,cAAkB,CAAA,CACtC,GACW,CAAA,EACrB,EAAC,EAAD,CAAqB,MAAM,MAA3B,SAAA,CACE,EAAC,EAAD,CAAkB,YAAe,EAAS,OAAO,EAAG,SAAA,OAAuB,CAAA,EAC3E,EAAC,EAAD,CAAkB,YAAe,EAAS,MAAM,EAAG,SAAA,MAAsB,CAAA,EACzE,EAAC,EAAD,CAAkB,YAAe,EAAS,QAAQ,EAAG,SAAA,QAAwB,CAAA,CAC1D,CACT,CAAA,CAAA,CAAA,CAAA,CAElB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../rolldown-runtime-Bdj-bS2b.js";import{cn as e}from"../lib/utils.js";import{toggleVariants as t}from"./toggle.js";import{ToggleGroup as n}from"radix-ui";import{jsx as r}from"react/jsx-runtime";import*as i from"react";const a=i.createContext({size:`md`,variant:`ghost`,color:`primary`,spacing:0,orientation:`horizontal`});function ToggleGroup({className:t,variant:i,color:o,size:s,spacing:c=0,orientation:l=`horizontal`,children:u,...d}){return r(n.Root,{"data-slot":`toggle-group`,"data-variant":i??`ghost`,"data-color":o??`primary`,"data-size":s??`md`,"data-spacing":c,"data-orientation":l,style:{"--gap":c},className:e(`group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-vertical:flex-col data-vertical:items-stretch`,t),...d,children:r(a.Provider,{value:{variant:i,color:o,size:s,spacing:c,orientation:l},children:u})})}function ToggleGroupItem({className:o,children:s,variant:c=`ghost`,color:l=`primary`,size:u=`md`,...d}){let f=i.useContext(a);return r(n.Item,{"data-slot":`toggle-group-item`,"data-variant":f.variant||c,"data-color":f.color||l,"data-size":f.size||u,"data-spacing":f.spacing,className:e(`shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 focus:z-10 focus-visible:z-10 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg
|
|
1
|
+
import"../rolldown-runtime-Bdj-bS2b.js";import{cn as e}from"../lib/utils.js";import{toggleVariants as t}from"./toggle.js";import{ToggleGroup as n}from"radix-ui";import{jsx as r}from"react/jsx-runtime";import*as i from"react";const a=i.createContext({size:`md`,variant:`ghost`,color:`primary`,spacing:0,orientation:`horizontal`});function ToggleGroup({className:t,variant:i,color:o,size:s,spacing:c=0,orientation:l=`horizontal`,children:u,...d}){return r(n.Root,{"data-slot":`toggle-group`,"data-variant":i??`ghost`,"data-color":o??`primary`,"data-size":s??`md`,"data-spacing":c,"data-orientation":l,style:{"--gap":c},className:e(`group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-vertical:flex-col data-vertical:items-stretch`,t),...d,children:r(a.Provider,{value:{variant:i,color:o,size:s,spacing:c,orientation:l},children:u})})}function ToggleGroupItem({className:o,children:s,variant:c=`ghost`,color:l=`primary`,size:u=`md`,...d}){let f=i.useContext(a);return r(n.Item,{"data-slot":`toggle-group-item`,"data-variant":f.variant||c,"data-color":f.color||l,"data-size":f.size||u,"data-spacing":f.spacing,className:e(`shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 focus:z-10 focus-visible:z-10 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg`,`group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t`,`group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=secondary]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=secondary]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=secondary]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=secondary]:first:border-t`,t({variant:f.variant||c,color:f.color||l,size:f.size||u}),o),...d,children:s})}export{ToggleGroup,ToggleGroupItem};
|
|
2
2
|
//# sourceMappingURL=toggle-group.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toggle-group.js","names":["ToggleGroupPrimitive"],"sources":["../../src/components/toggle-group.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport type { VariantProps } from 'class-variance-authority'\nimport { ToggleGroup as ToggleGroupPrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\nimport { toggleVariants } from './toggle'\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: 'horizontal' | 'vertical'\n }\n>({\n size: 'md',\n variant: 'ghost',\n color: 'primary',\n spacing: 0,\n orientation: 'horizontal'\n})\n\nexport type ToggleGroupProps = React.ComponentProps<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: 'horizontal' | 'vertical'\n }\n\nexport type ToggleGroupItemProps = React.ComponentProps<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>\n\nfunction ToggleGroup({\n className,\n variant,\n color,\n size,\n spacing = 0,\n orientation = 'horizontal',\n children,\n ...props\n}: ToggleGroupProps) {\n return (\n <ToggleGroupPrimitive.Root\n data-slot=\"toggle-group\"\n data-variant={variant ?? 'ghost'}\n data-color={color ?? 'primary'}\n data-size={size ?? 'md'}\n data-spacing={spacing}\n data-orientation={orientation}\n style={{ '--gap': spacing } as React.CSSProperties}\n className={cn(\n 'group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-vertical:flex-col data-vertical:items-stretch',\n className\n )}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, color, size, spacing, orientation }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n )\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant = 'ghost',\n color = 'primary',\n size = 'md',\n ...props\n}: ToggleGroupItemProps) {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <ToggleGroupPrimitive.Item\n data-slot=\"toggle-group-item\"\n data-variant={context.variant || variant}\n data-color={context.color || color}\n data-size={context.size || size}\n data-spacing={context.spacing}\n className={cn(\n 'shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 focus:z-10 focus-visible:z-10 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg
|
|
1
|
+
{"version":3,"file":"toggle-group.js","names":["ToggleGroupPrimitive"],"sources":["../../src/components/toggle-group.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport type { VariantProps } from 'class-variance-authority'\nimport { ToggleGroup as ToggleGroupPrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\nimport { toggleVariants } from './toggle'\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: 'horizontal' | 'vertical'\n }\n>({\n size: 'md',\n variant: 'ghost',\n color: 'primary',\n spacing: 0,\n orientation: 'horizontal'\n})\n\nexport type ToggleGroupProps = React.ComponentProps<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: 'horizontal' | 'vertical'\n }\n\nexport type ToggleGroupItemProps = React.ComponentProps<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>\n\nfunction ToggleGroup({\n className,\n variant,\n color,\n size,\n spacing = 0,\n orientation = 'horizontal',\n children,\n ...props\n}: ToggleGroupProps) {\n return (\n <ToggleGroupPrimitive.Root\n data-slot=\"toggle-group\"\n data-variant={variant ?? 'ghost'}\n data-color={color ?? 'primary'}\n data-size={size ?? 'md'}\n data-spacing={spacing}\n data-orientation={orientation}\n style={{ '--gap': spacing } as React.CSSProperties}\n className={cn(\n 'group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-vertical:flex-col data-vertical:items-stretch',\n className\n )}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, color, size, spacing, orientation }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n )\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant = 'ghost',\n color = 'primary',\n size = 'md',\n ...props\n}: ToggleGroupItemProps) {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <ToggleGroupPrimitive.Item\n data-slot=\"toggle-group-item\"\n data-variant={context.variant || variant}\n data-color={context.color || color}\n data-size={context.size || size}\n data-spacing={context.spacing}\n className={cn(\n 'shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 focus:z-10 focus-visible:z-10 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg',\n 'group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t',\n 'group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=secondary]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=secondary]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=secondary]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=secondary]:first:border-t',\n toggleVariants({\n variant: context.variant || variant,\n color: context.color || color,\n size: context.size || size\n }),\n className\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n )\n}\n\nexport { ToggleGroup, ToggleGroupItem }\n"],"mappings":"iOAQA,MAAM,EAAqB,EAAM,cAK/B,CACA,KAAM,KACN,QAAS,QACT,MAAO,UACP,QAAS,EACT,YAAa,YACf,CAAC,EAWD,SAAS,YAAY,CACnB,YACA,UACA,QACA,OACA,UAAU,EACV,cAAc,aACd,WACA,GAAG,GACgB,CACnB,OACE,EAACA,EAAqB,KAAtB,CACE,YAAU,eACV,eAAc,GAAW,QACzB,aAAY,GAAS,UACrB,YAAW,GAAQ,KACnB,eAAc,EACd,mBAAkB,EAClB,MAAO,CAAE,QAAS,CAAQ,EAC1B,UAAW,EACT,oMACA,CACF,EACA,GAAI,EAEJ,SAAA,EAAC,EAAmB,SAApB,CAA6B,MAAO,CAAE,UAAS,QAAO,OAAM,UAAS,aAAY,EAC9E,UAC0B,CAAA,CACJ,CAAA,CAE/B,CAEA,SAAS,gBAAgB,CACvB,YACA,WACA,UAAU,QACV,QAAQ,UACR,OAAO,KACP,GAAG,GACoB,CACvB,IAAM,EAAU,EAAM,WAAW,CAAkB,EAEnD,OACE,EAACA,EAAqB,KAAtB,CACE,YAAU,oBACV,eAAc,EAAQ,SAAW,EACjC,aAAY,EAAQ,OAAS,EAC7B,YAAW,EAAQ,MAAQ,EAC3B,eAAc,EAAQ,QACtB,UAAW,EACT,yZACA,8VACA,sWACA,EAAe,CACb,QAAS,EAAQ,SAAW,EAC5B,MAAO,EAAQ,OAAS,EACxB,KAAM,EAAQ,MAAQ,CACxB,CAAC,EACD,CACF,EACA,GAAI,EAEH,UACwB,CAAA,CAE/B"}
|
|
@@ -4,7 +4,7 @@ import { VariantProps } from "class-variance-authority";
|
|
|
4
4
|
import * as React from "react";
|
|
5
5
|
//#region src/components/toggle.d.ts
|
|
6
6
|
declare const toggleVariants: (props?: ({
|
|
7
|
-
variant?: "ghost" | "outline" | null | undefined;
|
|
7
|
+
variant?: "ghost" | "outline" | "secondary" | null | undefined;
|
|
8
8
|
color?: "blue" | "brand" | "gray" | "green" | "indigo" | "pink" | "primary" | "red" | "yellow" | "zinc" | null | undefined;
|
|
9
9
|
size?: "lg" | "md" | "sm" | null | undefined;
|
|
10
10
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../rolldown-runtime-Bdj-bS2b.js";import{cn as e}from"../lib/utils.js";import{buttonColorVariants as t}from"../lib/button.js";import{Toggle as n}from"radix-ui";import{jsx as r}from"react/jsx-runtime";import{cva as i}from"class-variance-authority";const a=i(`group/toggle inline-flex items-center justify-center gap-1 rounded-full border border-transparent text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,{variants:{variant:{outline:`border-(--button-outline-border) bg-background text-(--button-outline-foreground) hover:bg-(--button-solid) hover:text-(--button-solid-foreground) data-[state=on]:bg-(--button-solid) data-[state=on]:text-(--button-solid-foreground)`,ghost:`text-(--button-ghost-foreground) hover:bg-(--button-ghost-hover) hover:text-(--button-ghost-foreground) data-[state=on]:bg-(--button-ghost-hover) data-[state=on]:text-(--button-ghost-foreground)`},color:t,size:{sm:`h-8 min-w-8 px-1.5 text-[0.8rem]`,md:`h-9 min-w-9 px-2`,lg:`h-10 min-w-10 px-2.5`}},defaultVariants:{variant:`ghost`,color:`primary`,size:`md`}});function Toggle({className:t,variant:i=`ghost`,color:o=`primary`,size:s=`md`,...c}){return r(n.Root,{"data-slot":`toggle`,"data-variant":i,"data-color":o,"data-size":s,className:e(a({variant:i,color:o,size:s,className:t})),...c})}export{Toggle,a as toggleVariants};
|
|
1
|
+
import"../rolldown-runtime-Bdj-bS2b.js";import{cn as e}from"../lib/utils.js";import{buttonColorVariants as t}from"../lib/button.js";import{Toggle as n}from"radix-ui";import{jsx as r}from"react/jsx-runtime";import{cva as i}from"class-variance-authority";const a=i(`group/toggle inline-flex items-center justify-center gap-1 rounded-full border border-transparent text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,{variants:{variant:{secondary:`border-border bg-background hover:bg-muted hover:text-foreground data-[state=on]:bg-muted data-[state=on]:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50 dark:data-[state=on]:bg-input/50`,outline:`border-(--button-outline-border) bg-background text-(--button-outline-foreground) hover:bg-(--button-solid) hover:text-(--button-solid-foreground) data-[state=on]:bg-(--button-solid) data-[state=on]:text-(--button-solid-foreground)`,ghost:`text-(--button-ghost-foreground) hover:bg-(--button-ghost-hover) hover:text-(--button-ghost-foreground) data-[state=on]:bg-(--button-ghost-hover) data-[state=on]:text-(--button-ghost-foreground)`},color:t,size:{sm:`h-8 min-w-8 px-1.5 text-[0.8rem]`,md:`h-9 min-w-9 px-2`,lg:`h-10 min-w-10 px-2.5`}},defaultVariants:{variant:`ghost`,color:`primary`,size:`md`}});function Toggle({className:t,variant:i=`ghost`,color:o=`primary`,size:s=`md`,...c}){return r(n.Root,{"data-slot":`toggle`,"data-variant":i,"data-color":o,"data-size":s,className:e(a({variant:i,color:o,size:s,className:t})),...c})}export{Toggle,a as toggleVariants};
|
|
2
2
|
//# sourceMappingURL=toggle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toggle.js","names":["TogglePrimitive"],"sources":["../../src/components/toggle.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Toggle as TogglePrimitive } from 'radix-ui'\n\nimport { buttonColorVariants } from '../lib/button'\nimport { cn } from '../lib/utils'\n\nconst toggleVariants = cva(\n \"group/toggle inline-flex items-center justify-center gap-1 rounded-full border border-transparent text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n outline:\n 'border-(--button-outline-border) bg-background text-(--button-outline-foreground) hover:bg-(--button-solid) hover:text-(--button-solid-foreground) data-[state=on]:bg-(--button-solid) data-[state=on]:text-(--button-solid-foreground)',\n ghost:\n 'text-(--button-ghost-foreground) hover:bg-(--button-ghost-hover) hover:text-(--button-ghost-foreground) data-[state=on]:bg-(--button-ghost-hover) data-[state=on]:text-(--button-ghost-foreground)'\n },\n color: buttonColorVariants,\n size: {\n sm: 'h-8 min-w-8 px-1.5 text-[0.8rem]',\n md: 'h-9 min-w-9 px-2',\n lg: 'h-10 min-w-10 px-2.5'\n }\n },\n defaultVariants: {\n variant: 'ghost',\n color: 'primary',\n size: 'md'\n }\n }\n)\n\nexport type ToggleProps = React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>\n\nfunction Toggle({ className, variant = 'ghost', color = 'primary', size = 'md', ...props }: ToggleProps) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n data-variant={variant}\n data-color={color}\n data-size={size}\n className={cn(toggleVariants({ variant, color, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n"],"mappings":"6PAQA,MAAM,EAAiB,EACrB,shBACA,CACE,SAAU,CACR,QAAS,CACP,QACE,0OACF,MACE,oMACJ,EACA,MAAO,EACP,KAAM,CACJ,GAAI,mCACJ,GAAI,mBACJ,GAAI,sBACN,CACF,EACA,gBAAiB,CACf,QAAS,QACT,MAAO,UACP,KAAM,IACR,CACF,CACF,EAIA,SAAS,OAAO,CAAE,YAAW,UAAU,QAAS,QAAQ,UAAW,OAAO,KAAM,GAAG,GAAsB,CACvG,OACE,EAACA,EAAgB,KAAjB,CACE,YAAU,SACV,eAAc,EACd,aAAY,EACZ,YAAW,EACX,UAAW,EAAG,EAAe,CAAE,UAAS,QAAO,OAAM,WAAU,CAAC,CAAC,EACjE,GAAI,CACL,CAAA,CAEL"}
|
|
1
|
+
{"version":3,"file":"toggle.js","names":["TogglePrimitive"],"sources":["../../src/components/toggle.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Toggle as TogglePrimitive } from 'radix-ui'\n\nimport { buttonColorVariants } from '../lib/button'\nimport { cn } from '../lib/utils'\n\nconst toggleVariants = cva(\n \"group/toggle inline-flex items-center justify-center gap-1 rounded-full border border-transparent text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n secondary:\n 'border-border bg-background hover:bg-muted hover:text-foreground data-[state=on]:bg-muted data-[state=on]:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50 dark:data-[state=on]:bg-input/50',\n outline:\n 'border-(--button-outline-border) bg-background text-(--button-outline-foreground) hover:bg-(--button-solid) hover:text-(--button-solid-foreground) data-[state=on]:bg-(--button-solid) data-[state=on]:text-(--button-solid-foreground)',\n ghost:\n 'text-(--button-ghost-foreground) hover:bg-(--button-ghost-hover) hover:text-(--button-ghost-foreground) data-[state=on]:bg-(--button-ghost-hover) data-[state=on]:text-(--button-ghost-foreground)'\n },\n color: buttonColorVariants,\n size: {\n sm: 'h-8 min-w-8 px-1.5 text-[0.8rem]',\n md: 'h-9 min-w-9 px-2',\n lg: 'h-10 min-w-10 px-2.5'\n }\n },\n defaultVariants: {\n variant: 'ghost',\n color: 'primary',\n size: 'md'\n }\n }\n)\n\nexport type ToggleProps = React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>\n\nfunction Toggle({ className, variant = 'ghost', color = 'primary', size = 'md', ...props }: ToggleProps) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n data-variant={variant}\n data-color={color}\n data-size={size}\n className={cn(toggleVariants({ variant, color, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n"],"mappings":"6PAQA,MAAM,EAAiB,EACrB,shBACA,CACE,SAAU,CACR,QAAS,CACP,UACE,uNACF,QACE,0OACF,MACE,oMACJ,EACA,MAAO,EACP,KAAM,CACJ,GAAI,mCACJ,GAAI,mBACJ,GAAI,sBACN,CACF,EACA,gBAAiB,CACf,QAAS,QACT,MAAO,UACP,KAAM,IACR,CACF,CACF,EAIA,SAAS,OAAO,CAAE,YAAW,UAAU,QAAS,QAAQ,UAAW,OAAO,KAAM,GAAG,GAAsB,CACvG,OACE,EAACA,EAAgB,KAAjB,CACE,YAAU,SACV,eAAc,EACd,aAAY,EACZ,YAAW,EACX,UAAW,EAAG,EAAe,CAAE,UAAS,QAAO,OAAM,WAAU,CAAC,CAAC,EACjE,GAAI,CACL,CAAA,CAEL"}
|
|
@@ -192,9 +192,10 @@ Unless noted otherwise, each module also exports its public `*Props` types from
|
|
|
192
192
|
- Exports: `Label`
|
|
193
193
|
- `toggle`
|
|
194
194
|
- Exports: `Toggle`, `toggleVariants`
|
|
195
|
-
- Notes: supports `color: UIColor` using the same color variants as `Button`
|
|
195
|
+
- Notes: `secondary`, `outline`, and `ghost` variants; supports `color: UIColor` using the same color variants as `Button`
|
|
196
196
|
- `toggle-group`
|
|
197
197
|
- Exports: `ToggleGroup`, `ToggleGroupItem`
|
|
198
|
+
- Notes: shares `toggleVariants` with `Toggle` (`secondary`, `outline`, `ghost`)
|
|
198
199
|
|
|
199
200
|
## Overlays and floating UI
|
|
200
201
|
|
|
@@ -204,7 +204,8 @@ Use these package-level helpers when relevant:
|
|
|
204
204
|
- `Toaster`
|
|
205
205
|
- Mount near the app root before calling `toast(...)`.
|
|
206
206
|
- `ThemeProvider`
|
|
207
|
-
- Provide package theme state for `useTheme` and `ModeToggle`.
|
|
207
|
+
- Provide package theme state for `useTheme` and `ModeToggle`. Accepts `defaultTheme`, `storageKey`, and
|
|
208
|
+
`disableTransitionOnChange` (suppresses CSS transitions during a theme switch, matching `next-themes`).
|
|
208
209
|
|
|
209
210
|
`Field` automatically shares one generated control id with `FieldLabel` and labelable descendants such as
|
|
210
211
|
`Input`, `Textarea`, `SelectTrigger`, `NativeSelect`, `Checkbox`, `Switch`, `RadioGroupItem`, and related input
|
|
@@ -247,7 +248,7 @@ import { ModeToggle, ThemeProvider } from '@uselets/ui/theme'
|
|
|
247
248
|
|
|
248
249
|
export function AppRoot({ children }: { children: React.ReactNode }) {
|
|
249
250
|
return (
|
|
250
|
-
<ThemeProvider defaultTheme="system">
|
|
251
|
+
<ThemeProvider defaultTheme="system" disableTransitionOnChange>
|
|
251
252
|
<ModeToggle />
|
|
252
253
|
{children}
|
|
253
254
|
</ThemeProvider>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uselets/ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.15.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"private": false,
|
|
6
6
|
"description": "React component library for the LET'S design system.",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"@base-ui/react": "1.6.0",
|
|
62
62
|
"@fontsource-variable/inter": "5.3.0",
|
|
63
63
|
"@react-input/mask": "2.0.4",
|
|
64
|
-
"@tabler/icons-react": "3.
|
|
64
|
+
"@tabler/icons-react": "3.46.0",
|
|
65
65
|
"@tanstack/react-table": "8.21.3",
|
|
66
66
|
"class-variance-authority": "0.7.1",
|
|
67
67
|
"clsx": "2.1.1",
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
"@types/node": "26.1.2",
|
|
97
97
|
"@types/react": "19.2.17",
|
|
98
98
|
"@types/react-dom": "19.2.3",
|
|
99
|
-
"jsdom": "
|
|
99
|
+
"jsdom": "30.0.0",
|
|
100
100
|
"tailwindcss": "4.3.3",
|
|
101
101
|
"tsdown": "0.22.14",
|
|
102
102
|
"typescript": "7.0.2",
|
|
@@ -192,9 +192,10 @@ Unless noted otherwise, each module also exports its public `*Props` types from
|
|
|
192
192
|
- Exports: `Label`
|
|
193
193
|
- `toggle`
|
|
194
194
|
- Exports: `Toggle`, `toggleVariants`
|
|
195
|
-
- Notes: supports `color: UIColor` using the same color variants as `Button`
|
|
195
|
+
- Notes: `secondary`, `outline`, and `ghost` variants; supports `color: UIColor` using the same color variants as `Button`
|
|
196
196
|
- `toggle-group`
|
|
197
197
|
- Exports: `ToggleGroup`, `ToggleGroupItem`
|
|
198
|
+
- Notes: shares `toggleVariants` with `Toggle` (`secondary`, `outline`, `ghost`)
|
|
198
199
|
|
|
199
200
|
## Overlays and floating UI
|
|
200
201
|
|
|
@@ -204,7 +204,8 @@ Use these package-level helpers when relevant:
|
|
|
204
204
|
- `Toaster`
|
|
205
205
|
- Mount near the app root before calling `toast(...)`.
|
|
206
206
|
- `ThemeProvider`
|
|
207
|
-
- Provide package theme state for `useTheme` and `ModeToggle`.
|
|
207
|
+
- Provide package theme state for `useTheme` and `ModeToggle`. Accepts `defaultTheme`, `storageKey`, and
|
|
208
|
+
`disableTransitionOnChange` (suppresses CSS transitions during a theme switch, matching `next-themes`).
|
|
208
209
|
|
|
209
210
|
`Field` automatically shares one generated control id with `FieldLabel` and labelable descendants such as
|
|
210
211
|
`Input`, `Textarea`, `SelectTrigger`, `NativeSelect`, `Checkbox`, `Switch`, `RadioGroupItem`, and related input
|
|
@@ -247,7 +248,7 @@ import { ModeToggle, ThemeProvider } from '@uselets/ui/theme'
|
|
|
247
248
|
|
|
248
249
|
export function AppRoot({ children }: { children: React.ReactNode }) {
|
|
249
250
|
return (
|
|
250
|
-
<ThemeProvider defaultTheme="system">
|
|
251
|
+
<ThemeProvider defaultTheme="system" disableTransitionOnChange>
|
|
251
252
|
<ModeToggle />
|
|
252
253
|
{children}
|
|
253
254
|
</ThemeProvider>
|