@nous-research/ui 0.7.0 → 0.9.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/dist/index.d.ts CHANGED
@@ -17,7 +17,11 @@ export * as Icons from './ui/components/icons';
17
17
  export { ImageDistortion } from './ui/components/image-distortion';
18
18
  export type { AutoPlayPattern } from './ui/components/image-distortion';
19
19
  export { LevaClient } from './ui/components/leva-client';
20
+ export { ListItem } from './ui/components/list-item';
20
21
  export { Modal } from './ui/components/modal';
22
+ export { FilterGroup, Segmented } from './ui/components/segmented';
23
+ export { Switch } from './ui/components/switch';
24
+ export { Tabs, TabsList, TabsTrigger } from './ui/components/tabs';
21
25
  export { Poster } from './ui/components/poster';
22
26
  export type { PosterAspect, PosterProps, PosterVariant } from './ui/components/poster';
23
27
  export { applyLens, LENSES, LENS_0, LENS_5I, toggleLens, $lightMode } from './ui/components/overlays';
@@ -26,6 +30,7 @@ export type { LensPreset } from './ui/components/overlays';
26
30
  export { Progress } from './ui/components/progress';
27
31
  export { SceneCanvas } from './ui/components/scene-canvas';
28
32
  export { Scramble } from './ui/components/scramble';
33
+ export { Select, SelectOption } from './ui/components/select';
29
34
  export { SelectionSwitcher } from './ui/components/selection-switcher';
30
35
  export { Stats } from './ui/components/stats';
31
36
  export { TerminalDemo } from './ui/components/terminal-demo';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACnF,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,YAAY,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACd,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,SAAS,EACT,MAAM,EACN,MAAM,EACN,OAAO,EACP,UAAU,EACV,UAAU,EACX,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC7E,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,EAAE,EAAE,EAAE,MAAM,+BAA+B,CAAA;AAClD,OAAO,EAAE,EAAE,EAAE,MAAM,+BAA+B,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAA;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,OAAO,EACL,SAAS,EACT,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACd,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACnF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,EAChB,MAAM,6BAA6B,CAAA"}
package/dist/index.js CHANGED
@@ -15,13 +15,18 @@ export { HoverBg } from './ui/components/hover-bg';
15
15
  export * as Icons from './ui/components/icons';
16
16
  export { ImageDistortion } from './ui/components/image-distortion';
17
17
  export { LevaClient } from './ui/components/leva-client';
18
+ export { ListItem } from './ui/components/list-item';
18
19
  export { Modal } from './ui/components/modal';
20
+ export { FilterGroup, Segmented } from './ui/components/segmented';
21
+ export { Switch } from './ui/components/switch';
22
+ export { Tabs, TabsList, TabsTrigger } from './ui/components/tabs';
19
23
  export { Poster } from './ui/components/poster';
20
24
  export { applyLens, LENSES, LENS_0, LENS_5I, toggleLens, $lightMode } from './ui/components/overlays';
21
25
  export { Overlays } from './ui/components/overlays';
22
26
  export { Progress } from './ui/components/progress';
23
27
  export { SceneCanvas } from './ui/components/scene-canvas';
24
28
  export { Scramble } from './ui/components/scramble';
29
+ export { Select, SelectOption } from './ui/components/select';
25
30
  export { SelectionSwitcher } from './ui/components/selection-switcher';
26
31
  export { Stats } from './ui/components/stats';
27
32
  export { TerminalDemo } from './ui/components/terminal-demo';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAEnF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAM/C,OAAO,EACL,SAAS,EACT,MAAM,EACN,MAAM,EACN,OAAO,EACP,UAAU,EACV,UAAU,EACX,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAEpD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAEvD,OAAO,EAAE,EAAE,EAAE,MAAM,+BAA+B,CAAA;AAClD,OAAO,EAAE,EAAE,EAAE,MAAM,+BAA+B,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAA;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,OAAO,EACL,SAAS,EACT,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACd,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACnF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEjC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,EAChB,MAAM,6BAA6B,CAAA","sourcesContent":["export { AnimatedCount, useAnimatedCount } from './ui/components/animated-count'\nexport { AsciiSkeleton, Scramble as AsciiScramble } from './ui/components/ascii'\nexport { Badge } from './ui/components/badge'\nexport { NousGirlBadge } from './ui/components/badges/nous-girl'\nexport { BlendMode, useBlendMode, withBlendMode } from './ui/components/blend-mode'\nexport type { BlendModeProps } from './ui/components/blend-mode'\nexport { Blink } from './ui/components/blink'\nexport { Button } from './ui/components/button'\nexport { CommandBlock, CopyButton } from './ui/components/command-block'\nexport { Cursor } from './ui/components/cursor'\nexport { DropdownMenu } from './ui/components/dropdown-menu'\nexport { FitText } from './ui/components/fit-text'\nexport { BarChart, LineChart } from './ui/components/graphs'\nexport { Cell, Grid } from './ui/components/grid'\nexport { HoverBg } from './ui/components/hover-bg'\nexport * as Icons from './ui/components/icons'\nexport { ImageDistortion } from './ui/components/image-distortion'\nexport type { AutoPlayPattern } from './ui/components/image-distortion'\nexport { LevaClient } from './ui/components/leva-client'\nexport { Modal } from './ui/components/modal'\nexport { Poster } from './ui/components/poster'\nexport type {\n PosterAspect,\n PosterProps,\n PosterVariant\n} from './ui/components/poster'\nexport {\n applyLens,\n LENSES,\n LENS_0,\n LENS_5I,\n toggleLens,\n $lightMode\n} from './ui/components/overlays'\nexport { Overlays } from './ui/components/overlays'\nexport type { LensPreset } from './ui/components/overlays'\nexport { Progress } from './ui/components/progress'\nexport { SceneCanvas } from './ui/components/scene-canvas'\nexport { Scramble } from './ui/components/scramble'\nexport { SelectionSwitcher } from './ui/components/selection-switcher'\nexport { Stats } from './ui/components/stats'\nexport { TerminalDemo } from './ui/components/terminal-demo'\nexport type { TerminalDemoStep } from './ui/components/terminal-demo'\nexport { ThemeToggle } from './ui/components/theme-toggle'\nexport { TierCard } from './ui/components/tier-card'\nexport type { TierCardPrice, TierCardProps } from './ui/components/tier-card'\nexport { TV } from './ui/components/tv'\nexport { Watchlist } from './ui/components/watchlist'\n\nexport { Typography } from './ui/components/typography'\nexport type { TypographyProps } from './ui/components/typography'\nexport { H1 } from './ui/components/typography/h1'\nexport { H2 } from './ui/components/typography/h2'\nexport { Legend } from './ui/components/typography/legend'\nexport { Small } from './ui/components/typography/small'\n\nexport { BasicPage } from './ui/basic-page'\nexport { Header } from './ui/header'\nexport { Footer } from './ui/footer'\nexport { LayoutWrapper } from './ui/layout-wrapper'\n\nexport {\n FONT_SANS,\n FONT_MONO,\n FONT_RULES_COMPRESSED,\n FONT_RULES_EXPANDED,\n FONT_MONDWEST\n} from './fonts'\n\nexport { cn, clamp, smoothstep, hexToVec3, truncate, stripWpStyles } from './utils'\nexport { polyRef } from './utils'\nexport type { PolyComponent, PolyProps, PolyRef } from './utils'\nexport { hexToRgb, rgbToHex, colorDodge, colorMix } from './utils/color'\n\nexport { useCappedFrame } from './hooks/use-capped-frame'\nexport { useCssVarDims } from './hooks/use-css-var-dims'\nexport { $gpuTier, useGpuTier } from './hooks/use-gpu-tier'\nexport {\n useSmoothControls,\n getControlAtom,\n setControlValue\n} from './hooks/use-smooth-controls'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAEnF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAM/C,OAAO,EACL,SAAS,EACT,MAAM,EACN,MAAM,EACN,OAAO,EACP,UAAU,EACV,UAAU,EACX,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAEpD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAEvD,OAAO,EAAE,EAAE,EAAE,MAAM,+BAA+B,CAAA;AAClD,OAAO,EAAE,EAAE,EAAE,MAAM,+BAA+B,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAA;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,OAAO,EACL,SAAS,EACT,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACd,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACnF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEjC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,EAChB,MAAM,6BAA6B,CAAA","sourcesContent":["export { AnimatedCount, useAnimatedCount } from './ui/components/animated-count'\nexport { AsciiSkeleton, Scramble as AsciiScramble } from './ui/components/ascii'\nexport { Badge } from './ui/components/badge'\nexport { NousGirlBadge } from './ui/components/badges/nous-girl'\nexport { BlendMode, useBlendMode, withBlendMode } from './ui/components/blend-mode'\nexport type { BlendModeProps } from './ui/components/blend-mode'\nexport { Blink } from './ui/components/blink'\nexport { Button } from './ui/components/button'\nexport { CommandBlock, CopyButton } from './ui/components/command-block'\nexport { Cursor } from './ui/components/cursor'\nexport { DropdownMenu } from './ui/components/dropdown-menu'\nexport { FitText } from './ui/components/fit-text'\nexport { BarChart, LineChart } from './ui/components/graphs'\nexport { Cell, Grid } from './ui/components/grid'\nexport { HoverBg } from './ui/components/hover-bg'\nexport * as Icons from './ui/components/icons'\nexport { ImageDistortion } from './ui/components/image-distortion'\nexport type { AutoPlayPattern } from './ui/components/image-distortion'\nexport { LevaClient } from './ui/components/leva-client'\nexport { ListItem } from './ui/components/list-item'\nexport { Modal } from './ui/components/modal'\nexport { FilterGroup, Segmented } from './ui/components/segmented'\nexport { Switch } from './ui/components/switch'\nexport { Tabs, TabsList, TabsTrigger } from './ui/components/tabs'\nexport { Poster } from './ui/components/poster'\nexport type {\n PosterAspect,\n PosterProps,\n PosterVariant\n} from './ui/components/poster'\nexport {\n applyLens,\n LENSES,\n LENS_0,\n LENS_5I,\n toggleLens,\n $lightMode\n} from './ui/components/overlays'\nexport { Overlays } from './ui/components/overlays'\nexport type { LensPreset } from './ui/components/overlays'\nexport { Progress } from './ui/components/progress'\nexport { SceneCanvas } from './ui/components/scene-canvas'\nexport { Scramble } from './ui/components/scramble'\nexport { Select, SelectOption } from './ui/components/select'\nexport { SelectionSwitcher } from './ui/components/selection-switcher'\nexport { Stats } from './ui/components/stats'\nexport { TerminalDemo } from './ui/components/terminal-demo'\nexport type { TerminalDemoStep } from './ui/components/terminal-demo'\nexport { ThemeToggle } from './ui/components/theme-toggle'\nexport { TierCard } from './ui/components/tier-card'\nexport type { TierCardPrice, TierCardProps } from './ui/components/tier-card'\nexport { TV } from './ui/components/tv'\nexport { Watchlist } from './ui/components/watchlist'\n\nexport { Typography } from './ui/components/typography'\nexport type { TypographyProps } from './ui/components/typography'\nexport { H1 } from './ui/components/typography/h1'\nexport { H2 } from './ui/components/typography/h2'\nexport { Legend } from './ui/components/typography/legend'\nexport { Small } from './ui/components/typography/small'\n\nexport { BasicPage } from './ui/basic-page'\nexport { Header } from './ui/header'\nexport { Footer } from './ui/footer'\nexport { LayoutWrapper } from './ui/layout-wrapper'\n\nexport {\n FONT_SANS,\n FONT_MONO,\n FONT_RULES_COMPRESSED,\n FONT_RULES_EXPANDED,\n FONT_MONDWEST\n} from './fonts'\n\nexport { cn, clamp, smoothstep, hexToVec3, truncate, stripWpStyles } from './utils'\nexport { polyRef } from './utils'\nexport type { PolyComponent, PolyProps, PolyRef } from './utils'\nexport { hexToRgb, rgbToHex, colorDodge, colorMix } from './utils/color'\n\nexport { useCappedFrame } from './hooks/use-capped-frame'\nexport { useCssVarDims } from './hooks/use-css-var-dims'\nexport { $gpuTier, useGpuTier } from './hooks/use-gpu-tier'\nexport {\n useSmoothControls,\n getControlAtom,\n setControlValue\n} from './hooks/use-smooth-controls'\n"]}
@@ -4,7 +4,7 @@ declare const buttonVariants: (props?: ({
4
4
  ghost?: boolean | null | undefined;
5
5
  invert?: boolean | null | undefined;
6
6
  outlined?: boolean | null | undefined;
7
- size?: "default" | "icon" | "sm" | null | undefined;
7
+ size?: "default" | "icon" | "sm" | "xs" | null | undefined;
8
8
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
9
9
  export declare const Button: ({ children, className, destructive, ghost, invert, outlined, prefix, size, suffix, ...props }: ButtonProps) => import("react/jsx-runtime").JSX.Element;
10
10
  interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'prefix' | 'suffix'>, VariantProps<typeof buttonVariants> {
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/ui/components/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAgBjE,QAAA,MAAM,cAAc;;;;;;8EAoFnB,CAAA;AA2BD,eAAO,MAAM,MAAM,GAAI,+FAWpB,WAAW,4CAoBb,CAAA;AAED,UAAU,WACR,SAAQ,IAAI,CACR,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAC7C,QAAQ,GAAG,QAAQ,CACpB,EACD,YAAY,CAAC,OAAO,cAAc,CAAC;IACrC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACzB"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/ui/components/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAgBjE,QAAA,MAAM,cAAc;;;;;;8EAqFnB,CAAA;AA2BD,eAAO,MAAM,MAAM,GAAI,+FAWpB,WAAW,4CAoBb,CAAA;AAED,UAAU,WACR,SAAQ,IAAI,CACR,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAC7C,QAAQ,GAAG,QAAQ,CACpB,EACD,YAAY,CAAC,OAAO,cAAc,CAAC;IACrC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACzB"}
@@ -83,7 +83,8 @@ const buttonVariants = cva([
83
83
  size: {
84
84
  default: 'px-[.9em_.75em] py-[1.25em]',
85
85
  icon: 'p-2 aspect-square grid-cols-1 place-items-center [&>svg]:size-3.5',
86
- sm: 'px-3 py-1.5 text-[0.7rem] tracking-[0.15em] [&>svg]:size-3'
86
+ sm: 'px-3 py-1.5 text-[0.7rem] tracking-[0.15em] [&>svg]:size-3',
87
+ xs: 'p-1 aspect-square grid-cols-1 place-items-center [&>svg]:size-3'
87
88
  }
88
89
  }
89
90
  });
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","sourceRoot":"","sources":["../../../src/ui/components/button.tsx"],"names":[],"mappings":"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","sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority'\nimport { cloneElement } from 'react'\n\nimport { cn } from '../../utils'\n\nimport { Typography } from './typography'\n\nconst SHADOW_DEFAULT =\n 'shadow-[inset_-1px_-1px_0_0_#00000080,inset_1px_1px_0_0_#ffffff80]'\nconst SHADOW_INVERT =\n 'shadow-[inset_-1px_-1px_0_0_#00000080,inset_1px_1px_0_0_#ffffff29]'\nconst SHADOW_INVERT_OUTLINED =\n 'shadow-[inset_-1px_-1px_0_0_#ffffff12,inset_1px_1px_0_0_#ffffff29]'\nconst ACTIVE_FILTER =\n 'active:[filter:invert(1)_brightness(calc(100-99*var(--foreground-alpha,0)))]'\n\nconst buttonVariants = cva(\n [\n 'group relative grid cursor-pointer grid-cols-[auto_1fr_auto] items-center',\n 'leading-0 font-bold tracking-[0.2em] uppercase',\n 'disabled:pointer-events-none disabled:bg-midground/15 disabled:text-midground disabled:shadow-none'\n ],\n {\n compoundVariants: [\n // ── invert × outlined matrix (default surface, no ghost/destructive) ──\n {\n class: `bg-midground text-background-base active:invert ${SHADOW_DEFAULT}`,\n destructive: false,\n ghost: false,\n invert: false,\n outlined: false\n },\n {\n class: `bg-midground/15 text-midground ${SHADOW_INVERT} ${ACTIVE_FILTER}`,\n destructive: false,\n ghost: false,\n invert: true,\n outlined: false\n },\n {\n class: `shadow-midground ${SHADOW_DEFAULT} ${ACTIVE_FILTER}`,\n destructive: false,\n ghost: false,\n invert: false,\n outlined: true\n },\n {\n class: `${SHADOW_INVERT_OUTLINED} ${ACTIVE_FILTER}`,\n destructive: false,\n ghost: false,\n invert: true,\n outlined: true\n },\n // ── ghost: no chrome, hover bg only ──\n {\n class: 'bg-transparent text-current hover:bg-midground/10 shadow-none',\n destructive: false,\n ghost: true\n },\n {\n class:\n 'bg-transparent text-destructive hover:bg-destructive/10 shadow-none',\n destructive: true,\n ghost: true\n },\n // ── solid destructive ──\n {\n class: `bg-destructive text-destructive-foreground hover:bg-destructive/90 ${SHADOW_INVERT}`,\n destructive: true,\n ghost: false,\n outlined: false\n },\n // ── outlined destructive ──\n {\n class:\n 'border border-destructive/40 bg-transparent text-destructive hover:bg-destructive/10 shadow-none',\n destructive: true,\n ghost: false,\n outlined: true\n }\n ],\n defaultVariants: {\n destructive: false,\n ghost: false,\n invert: false,\n outlined: false,\n size: 'default'\n },\n variants: {\n destructive: { true: '' },\n ghost: { true: '' },\n invert: { true: '' },\n outlined: { true: 'text-midground bg-transparent' },\n size: {\n default: 'px-[.9em_.75em] py-[1.25em]',\n icon: 'p-2 aspect-square grid-cols-1 place-items-center [&>svg]:size-3.5',\n sm: 'px-3 py-1.5 text-[0.7rem] tracking-[0.15em] [&>svg]:size-3'\n }\n }\n }\n)\n\nconst IconSlot = ({\n icon,\n side\n}: {\n icon: React.ReactNode\n side: 'left' | 'right'\n}) => (\n <>\n <span className=\"w-5\" />\n\n <span\n className={cn(\n 'absolute top-1/2 -translate-y-1/2',\n side === 'left' ? 'left-3' : 'right-3'\n )}\n >\n {typeof icon === 'object'\n ? cloneElement(icon as React.ReactElement<any>, {\n className: 'size-3.5'\n })\n : icon}\n </span>\n </>\n)\n\nexport const Button = ({\n children,\n className,\n destructive,\n ghost,\n invert,\n outlined,\n prefix,\n size,\n suffix,\n ...props\n}: ButtonProps) => (\n <Typography\n as=\"button\"\n className={cn(\n buttonVariants({ destructive, ghost, invert, outlined, size }),\n className\n )}\n mono\n {...props}\n >\n {!ghost && (\n <span\n aria-hidden\n className=\"arc-border opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 group-active:opacity-100\"\n />\n )}\n {prefix && <IconSlot icon={prefix} side=\"left\" />}\n {children}\n {suffix && <IconSlot icon={suffix} side=\"right\" />}\n </Typography>\n)\n\ninterface ButtonProps\n extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'prefix' | 'suffix'\n >,\n VariantProps<typeof buttonVariants> {\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n}\n"]}
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../../../src/ui/components/button.tsx"],"names":[],"mappings":"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","sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority'\nimport { cloneElement } from 'react'\n\nimport { cn } from '../../utils'\n\nimport { Typography } from './typography'\n\nconst SHADOW_DEFAULT =\n 'shadow-[inset_-1px_-1px_0_0_#00000080,inset_1px_1px_0_0_#ffffff80]'\nconst SHADOW_INVERT =\n 'shadow-[inset_-1px_-1px_0_0_#00000080,inset_1px_1px_0_0_#ffffff29]'\nconst SHADOW_INVERT_OUTLINED =\n 'shadow-[inset_-1px_-1px_0_0_#ffffff12,inset_1px_1px_0_0_#ffffff29]'\nconst ACTIVE_FILTER =\n 'active:[filter:invert(1)_brightness(calc(100-99*var(--foreground-alpha,0)))]'\n\nconst buttonVariants = cva(\n [\n 'group relative grid cursor-pointer grid-cols-[auto_1fr_auto] items-center',\n 'leading-0 font-bold tracking-[0.2em] uppercase',\n 'disabled:pointer-events-none disabled:bg-midground/15 disabled:text-midground disabled:shadow-none'\n ],\n {\n compoundVariants: [\n // ── invert × outlined matrix (default surface, no ghost/destructive) ──\n {\n class: `bg-midground text-background-base active:invert ${SHADOW_DEFAULT}`,\n destructive: false,\n ghost: false,\n invert: false,\n outlined: false\n },\n {\n class: `bg-midground/15 text-midground ${SHADOW_INVERT} ${ACTIVE_FILTER}`,\n destructive: false,\n ghost: false,\n invert: true,\n outlined: false\n },\n {\n class: `shadow-midground ${SHADOW_DEFAULT} ${ACTIVE_FILTER}`,\n destructive: false,\n ghost: false,\n invert: false,\n outlined: true\n },\n {\n class: `${SHADOW_INVERT_OUTLINED} ${ACTIVE_FILTER}`,\n destructive: false,\n ghost: false,\n invert: true,\n outlined: true\n },\n // ── ghost: no chrome, hover bg only ──\n {\n class: 'bg-transparent text-current hover:bg-midground/10 shadow-none',\n destructive: false,\n ghost: true\n },\n {\n class:\n 'bg-transparent text-destructive hover:bg-destructive/10 shadow-none',\n destructive: true,\n ghost: true\n },\n // ── solid destructive ──\n {\n class: `bg-destructive text-destructive-foreground hover:bg-destructive/90 ${SHADOW_INVERT}`,\n destructive: true,\n ghost: false,\n outlined: false\n },\n // ── outlined destructive ──\n {\n class:\n 'border border-destructive/40 bg-transparent text-destructive hover:bg-destructive/10 shadow-none',\n destructive: true,\n ghost: false,\n outlined: true\n }\n ],\n defaultVariants: {\n destructive: false,\n ghost: false,\n invert: false,\n outlined: false,\n size: 'default'\n },\n variants: {\n destructive: { true: '' },\n ghost: { true: '' },\n invert: { true: '' },\n outlined: { true: 'text-midground bg-transparent' },\n size: {\n default: 'px-[.9em_.75em] py-[1.25em]',\n icon: 'p-2 aspect-square grid-cols-1 place-items-center [&>svg]:size-3.5',\n sm: 'px-3 py-1.5 text-[0.7rem] tracking-[0.15em] [&>svg]:size-3',\n xs: 'p-1 aspect-square grid-cols-1 place-items-center [&>svg]:size-3'\n }\n }\n }\n)\n\nconst IconSlot = ({\n icon,\n side\n}: {\n icon: React.ReactNode\n side: 'left' | 'right'\n}) => (\n <>\n <span className=\"w-5\" />\n\n <span\n className={cn(\n 'absolute top-1/2 -translate-y-1/2',\n side === 'left' ? 'left-3' : 'right-3'\n )}\n >\n {typeof icon === 'object'\n ? cloneElement(icon as React.ReactElement<any>, {\n className: 'size-3.5'\n })\n : icon}\n </span>\n </>\n)\n\nexport const Button = ({\n children,\n className,\n destructive,\n ghost,\n invert,\n outlined,\n prefix,\n size,\n suffix,\n ...props\n}: ButtonProps) => (\n <Typography\n as=\"button\"\n className={cn(\n buttonVariants({ destructive, ghost, invert, outlined, size }),\n className\n )}\n mono\n {...props}\n >\n {!ghost && (\n <span\n aria-hidden\n className=\"arc-border opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 group-active:opacity-100\"\n />\n )}\n {prefix && <IconSlot icon={prefix} side=\"left\" />}\n {children}\n {suffix && <IconSlot icon={suffix} side=\"right\" />}\n </Typography>\n)\n\ninterface ButtonProps\n extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'prefix' | 'suffix'\n >,\n VariantProps<typeof buttonVariants> {\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import { type ButtonHTMLAttributes } from 'react';
2
+ export declare const ListItem: import("react").ForwardRefExoticComponent<ListItemProps & import("react").RefAttributes<HTMLButtonElement>>;
3
+ interface ListItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {
4
+ active?: boolean;
5
+ }
6
+ export {};
7
+ //# sourceMappingURL=list-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-item.d.ts","sourceRoot":"","sources":["../../../src/ui/components/list-item.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAI7D,eAAO,MAAM,QAAQ,6GA0BpB,CAAA;AAED,UAAU,aAAc,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IACrE,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB"}
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from 'react';
4
+ import { cn } from '../../utils';
5
+ export const ListItem = forwardRef(function ListItem({ active = false, children, className, type = 'button', ...props }, ref) {
6
+ return (_jsx("button", { className: cn('group relative flex w-full items-center gap-2 px-3 py-2 text-left', 'font-courier text-sm transition-colors cursor-pointer', 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30', 'disabled:cursor-not-allowed disabled:opacity-50', active
7
+ ? 'bg-midground/10 text-midground'
8
+ : 'text-midground/70 hover:text-midground hover:bg-midground/5', className), "data-active": active || undefined, ref: ref, type: type, ...props, children: children }));
9
+ });
10
+ //# sourceMappingURL=list-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-item.js","sourceRoot":"","sources":["../../../src/ui/components/list-item.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,UAAU,EAA6B,MAAM,OAAO,CAAA;AAE7D,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAChC,SAAS,QAAQ,CACf,EAAE,MAAM,GAAG,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,EAClE,GAAG;IAEH,OAAO,CACL,iBACE,SAAS,EAAE,EAAE,CACX,mEAAmE,EACnE,uDAAuD,EACvD,iFAAiF,EACjF,iDAAiD,EACjD,MAAM;YACJ,CAAC,CAAC,gCAAgC;YAClC,CAAC,CAAC,6DAA6D,EACjE,SAAS,CACV,iBACY,MAAM,IAAI,SAAS,EAChC,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,KACN,KAAK,YAER,QAAQ,GACF,CACV,CAAA;AACH,CAAC,CACF,CAAA","sourcesContent":["'use client'\n\nimport { forwardRef, type ButtonHTMLAttributes } from 'react'\n\nimport { cn } from '../../utils'\n\nexport const ListItem = forwardRef<HTMLButtonElement, ListItemProps>(\n function ListItem(\n { active = false, children, className, type = 'button', ...props },\n ref\n ) {\n return (\n <button\n className={cn(\n 'group relative flex w-full items-center gap-2 px-3 py-2 text-left',\n 'font-courier text-sm transition-colors cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n active\n ? 'bg-midground/10 text-midground'\n : 'text-midground/70 hover:text-midground hover:bg-midground/5',\n className\n )}\n data-active={active || undefined}\n ref={ref}\n type={type}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\n\ninterface ListItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n active?: boolean\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function Segmented<T extends string>({ className, onChange, options, size, value }: SegmentedProps<T>): import("react/jsx-runtime").JSX.Element;
3
+ export declare function FilterGroup({ children, className, label }: FilterGroupProps): import("react/jsx-runtime").JSX.Element;
4
+ interface FilterGroupProps {
5
+ children: ReactNode;
6
+ className?: string;
7
+ label: string;
8
+ }
9
+ interface SegmentedOption<T extends string> {
10
+ label: string;
11
+ value: T;
12
+ }
13
+ interface SegmentedProps<T extends string> {
14
+ className?: string;
15
+ onChange: (value: T) => void;
16
+ options: SegmentedOption<T>[];
17
+ size?: 'md' | 'sm';
18
+ value: T;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=segmented.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmented.d.ts","sourceRoot":"","sources":["../../../src/ui/components/segmented.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,EAC1C,SAAS,EACT,QAAQ,EACR,OAAO,EACP,IAAW,EACX,KAAK,EACN,EAAE,cAAc,CAAC,CAAC,CAAC,2CAqCnB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,gBAAgB,2CAU3E;AAED,UAAU,gBAAgB;IACxB,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,UAAU,eAAe,CAAC,CAAC,SAAS,MAAM;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,CAAC,CAAA;CACT;AAED,UAAU,cAAc,CAAC,CAAC,SAAS,MAAM;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;IAC5B,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAClB,KAAK,EAAE,CAAC,CAAA;CACT"}
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cn } from '../../utils';
4
+ export function Segmented({ className, onChange, options, size = 'sm', value }) {
5
+ return (_jsx("div", { className: cn('inline-flex border border-midground/15 bg-background/30', className), role: "radiogroup", children: options.map(opt => {
6
+ const active = opt.value === value;
7
+ return (_jsx("button", { "aria-checked": active, className: cn('font-mondwest tracking-[0.1em] uppercase', 'transition-colors cursor-pointer whitespace-nowrap', 'border-r border-midground/15 last:border-r-0', 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30', size === 'sm' && 'h-7 px-2.5 text-[0.65rem]', size === 'md' && 'h-8 px-3 text-xs', active
8
+ ? 'bg-midground text-background'
9
+ : 'text-midground/60 hover:bg-midground/10 hover:text-midground'), onClick: () => onChange(opt.value), role: "radio", type: "button", children: opt.label }, opt.value));
10
+ }) }));
11
+ }
12
+ export function FilterGroup({ children, className, label }) {
13
+ return (_jsxs("div", { className: cn('flex items-center gap-2', className), children: [_jsx("span", { className: "font-mondwest text-[0.65rem] tracking-[0.12em] uppercase text-midground/50", children: label }), children] }));
14
+ }
15
+ //# sourceMappingURL=segmented.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmented.js","sourceRoot":"","sources":["../../../src/ui/components/segmented.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAIZ,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,MAAM,UAAU,SAAS,CAAmB,EAC1C,SAAS,EACT,QAAQ,EACR,OAAO,EACP,IAAI,GAAG,IAAI,EACX,KAAK,EACa;IAClB,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,yDAAyD,EACzD,SAAS,CACV,EACD,IAAI,EAAC,YAAY,YAEhB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACjB,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,KAAK,KAAK,CAAA;YAElC,OAAO,CACL,iCACgB,MAAM,EACpB,SAAS,EAAE,EAAE,CACX,0CAA0C,EAC1C,oDAAoD,EACpD,8CAA8C,EAC9C,iFAAiF,EACjF,IAAI,KAAK,IAAI,IAAI,2BAA2B,EAC5C,IAAI,KAAK,IAAI,IAAI,kBAAkB,EACnC,MAAM;oBACJ,CAAC,CAAC,8BAA8B;oBAChC,CAAC,CAAC,8DAA8D,CACnE,EAED,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAClC,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,QAAQ,YAEZ,GAAG,CAAC,KAAK,IALL,GAAG,CAAC,KAAK,CAMP,CACV,CAAA;QACH,CAAC,CAAC,GACE,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAoB;IAC1E,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,aACtD,eAAM,SAAS,EAAC,4EAA4E,YACzF,KAAK,GACD,EAEN,QAAQ,IACL,CACP,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport { type ReactNode } from 'react'\n\nimport { cn } from '../../utils'\n\nexport function Segmented<T extends string>({\n className,\n onChange,\n options,\n size = 'sm',\n value\n}: SegmentedProps<T>) {\n return (\n <div\n className={cn(\n 'inline-flex border border-midground/15 bg-background/30',\n className\n )}\n role=\"radiogroup\"\n >\n {options.map(opt => {\n const active = opt.value === value\n\n return (\n <button\n aria-checked={active}\n className={cn(\n 'font-mondwest tracking-[0.1em] uppercase',\n 'transition-colors cursor-pointer whitespace-nowrap',\n 'border-r border-midground/15 last:border-r-0',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30',\n size === 'sm' && 'h-7 px-2.5 text-[0.65rem]',\n size === 'md' && 'h-8 px-3 text-xs',\n active\n ? 'bg-midground text-background'\n : 'text-midground/60 hover:bg-midground/10 hover:text-midground'\n )}\n key={opt.value}\n onClick={() => onChange(opt.value)}\n role=\"radio\"\n type=\"button\"\n >\n {opt.label}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport function FilterGroup({ children, className, label }: FilterGroupProps) {\n return (\n <div className={cn('flex items-center gap-2', className)}>\n <span className=\"font-mondwest text-[0.65rem] tracking-[0.12em] uppercase text-midground/50\">\n {label}\n </span>\n\n {children}\n </div>\n )\n}\n\ninterface FilterGroupProps {\n children: ReactNode\n className?: string\n label: string\n}\n\ninterface SegmentedOption<T extends string> {\n label: string\n value: T\n}\n\ninterface SegmentedProps<T extends string> {\n className?: string\n onChange: (value: T) => void\n options: SegmentedOption<T>[]\n size?: 'md' | 'sm'\n value: T\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import { type CSSProperties, type ReactNode } from 'react';
2
+ export declare function Select({ children, className, disabled, id, onValueChange, placeholder, style, value }: SelectProps): import("react/jsx-runtime").JSX.Element;
3
+ export declare function SelectOption(_props: SelectOptionProps): null;
4
+ interface SelectOptionProps {
5
+ children: ReactNode;
6
+ value: string;
7
+ }
8
+ interface SelectProps {
9
+ children?: ReactNode;
10
+ className?: string;
11
+ disabled?: boolean;
12
+ id?: string;
13
+ onValueChange?: (value: string) => void;
14
+ placeholder?: string;
15
+ style?: CSSProperties;
16
+ value?: string;
17
+ }
18
+ export {};
19
+ //# sourceMappingURL=select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/ui/components/select.tsx"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,aAAa,EAGlB,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAiBd,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,EAAE,EACF,aAAa,EACb,WAAW,EACX,KAAK,EACL,KAAK,EACN,EAAE,WAAW,2CAoJb;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,QAErD;AA0DD,UAAU,iBAAiB;IACzB,QAAQ,EAAE,SAAS,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
@@ -0,0 +1,127 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Children, isValidElement, useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
+ import { cn } from '../../utils';
5
+ const TRIGGER_CN = 'flex h-9 w-full items-center justify-between gap-2 ' +
6
+ 'border border-midground/15 bg-background/40 px-3 py-1 ' +
7
+ 'font-courier text-sm text-left text-midground transition-colors ' +
8
+ 'hover:border-midground/25 ' +
9
+ 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30 focus-visible:border-midground/30 ' +
10
+ 'disabled:cursor-not-allowed disabled:opacity-50 ' +
11
+ 'cursor-pointer';
12
+ const LISTBOX_CN = 'absolute z-50 mt-1 w-full max-h-60 overflow-auto ' +
13
+ 'border border-midground/15 bg-background-base text-midground shadow-lg';
14
+ export function Select({ children, className, disabled, id, onValueChange, placeholder, style, value }) {
15
+ const [open, setOpen] = useState(false);
16
+ const [highlightedIndex, setHighlightedIndex] = useState(-1);
17
+ const containerRef = useRef(null);
18
+ const listRef = useRef(null);
19
+ const options = useMemo(() => collectOptions(children), [children]);
20
+ const selected = options.find(o => o.value === value);
21
+ const displayLabel = selected?.label ?? placeholder ?? value ?? '';
22
+ const close = useCallback(() => {
23
+ setOpen(false);
24
+ setHighlightedIndex(-1);
25
+ }, []);
26
+ useEffect(() => {
27
+ if (!open)
28
+ return;
29
+ const ac = new AbortController();
30
+ document.addEventListener('mousedown', e => {
31
+ if (!containerRef.current?.contains(e.target))
32
+ close();
33
+ }, { signal: ac.signal });
34
+ return () => ac.abort();
35
+ }, [open, close]);
36
+ useEffect(() => {
37
+ if (!open || highlightedIndex < 0)
38
+ return;
39
+ const el = listRef.current?.children[highlightedIndex];
40
+ el?.scrollIntoView({ block: 'nearest' });
41
+ }, [open, highlightedIndex]);
42
+ const handleKeyDown = (e) => {
43
+ if (disabled)
44
+ return;
45
+ switch (e.key) {
46
+ case 'Enter':
47
+ case ' ':
48
+ e.preventDefault();
49
+ if (!open) {
50
+ setOpen(true);
51
+ setHighlightedIndex(options.findIndex(o => o.value === value));
52
+ }
53
+ else if (highlightedIndex >= 0 && options[highlightedIndex]) {
54
+ onValueChange?.(options[highlightedIndex].value);
55
+ close();
56
+ }
57
+ break;
58
+ case 'ArrowDown':
59
+ e.preventDefault();
60
+ if (!open) {
61
+ setOpen(true);
62
+ setHighlightedIndex(options.findIndex(o => o.value === value));
63
+ }
64
+ else {
65
+ setHighlightedIndex(i => Math.min(i + 1, options.length - 1));
66
+ }
67
+ break;
68
+ case 'ArrowUp':
69
+ e.preventDefault();
70
+ if (open)
71
+ setHighlightedIndex(i => Math.max(i - 1, 0));
72
+ break;
73
+ case 'Home':
74
+ if (open) {
75
+ e.preventDefault();
76
+ setHighlightedIndex(0);
77
+ }
78
+ break;
79
+ case 'End':
80
+ if (open) {
81
+ e.preventDefault();
82
+ setHighlightedIndex(options.length - 1);
83
+ }
84
+ break;
85
+ case 'Escape':
86
+ e.preventDefault();
87
+ close();
88
+ break;
89
+ }
90
+ };
91
+ return (_jsxs("div", { className: cn('relative', className), id: id, ref: containerRef, style: style, children: [_jsxs("button", { "aria-expanded": open, "aria-haspopup": "listbox", className: TRIGGER_CN, disabled: disabled, onClick: () => !disabled && setOpen(o => !o), onKeyDown: handleKeyDown, role: "combobox", type: "button", children: [_jsx("span", { className: cn('truncate', !selected && 'text-midground/50'), children: displayLabel }), _jsx(ChevronDownGlyph, { className: cn('size-3 shrink-0 text-midground/60 transition-transform', open && 'rotate-180') })] }), open && (_jsx("div", { className: LISTBOX_CN, ref: listRef, role: "listbox", children: options.map((opt, i) => {
92
+ const isSelected = opt.value === value;
93
+ const isHighlighted = i === highlightedIndex;
94
+ return (_jsxs("div", { "aria-selected": isSelected, className: cn('flex cursor-pointer items-center gap-2 px-3 py-2', 'font-courier text-sm transition-colors', isHighlighted && 'bg-midground/10', isSelected ? 'text-midground' : 'text-midground/70'), onClick: () => {
95
+ onValueChange?.(opt.value);
96
+ close();
97
+ }, onMouseEnter: () => setHighlightedIndex(i), role: "option", children: [_jsx(CheckGlyph, { className: cn('size-3 shrink-0', isSelected ? 'opacity-100' : 'opacity-0') }), _jsx("span", { className: "truncate", children: opt.label })] }, opt.value));
98
+ }) }))] }));
99
+ }
100
+ // Marker component — `Select` reads `value`/`children` from its tree.
101
+ // Renders nothing on its own.
102
+ export function SelectOption(_props) {
103
+ return null;
104
+ }
105
+ const ChevronDownGlyph = ({ className }) => (_jsx("svg", { "aria-hidden": true, className: className, fill: "none", stroke: "currentColor", strokeLinecap: "square", strokeWidth: 1.5, viewBox: "0 0 12 12", children: _jsx("path", { d: "M2.5 4.5 6 8l3.5-3.5" }) }));
106
+ const CheckGlyph = ({ className }) => (_jsx("svg", { "aria-hidden": true, className: className, fill: "none", stroke: "currentColor", strokeLinecap: "square", strokeWidth: 1.5, viewBox: "0 0 12 12", children: _jsx("path", { d: "m2.5 6.5 2.5 2.5L9.5 3.5" }) }));
107
+ function collectOptions(children) {
108
+ const out = [];
109
+ Children.forEach(children, child => {
110
+ if (!isValidElement(child))
111
+ return;
112
+ const el = child;
113
+ if (el.props.value !== undefined) {
114
+ out.push({
115
+ label: typeof el.props.children === 'string'
116
+ ? el.props.children
117
+ : String(el.props.value),
118
+ value: String(el.props.value)
119
+ });
120
+ }
121
+ else if (el.props.children) {
122
+ out.push(...collectOptions(el.props.children));
123
+ }
124
+ });
125
+ return out;
126
+ }
127
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/ui/components/select.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport {\n Children,\n isValidElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode\n} from 'react'\n\nimport { cn } from '../../utils'\n\nconst TRIGGER_CN =\n 'flex h-9 w-full items-center justify-between gap-2 ' +\n 'border border-midground/15 bg-background/40 px-3 py-1 ' +\n 'font-courier text-sm text-left text-midground transition-colors ' +\n 'hover:border-midground/25 ' +\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30 focus-visible:border-midground/30 ' +\n 'disabled:cursor-not-allowed disabled:opacity-50 ' +\n 'cursor-pointer'\n\nconst LISTBOX_CN =\n 'absolute z-50 mt-1 w-full max-h-60 overflow-auto ' +\n 'border border-midground/15 bg-background-base text-midground shadow-lg'\n\nexport function Select({\n children,\n className,\n disabled,\n id,\n onValueChange,\n placeholder,\n style,\n value\n}: SelectProps) {\n const [open, setOpen] = useState(false)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const containerRef = useRef<HTMLDivElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n\n const options = useMemo(() => collectOptions(children), [children])\n const selected = options.find(o => o.value === value)\n const displayLabel = selected?.label ?? placeholder ?? value ?? ''\n\n const close = useCallback(() => {\n setOpen(false)\n setHighlightedIndex(-1)\n }, [])\n\n useEffect(() => {\n if (!open) return\n const ac = new AbortController()\n document.addEventListener(\n 'mousedown',\n e => {\n if (!containerRef.current?.contains(e.target as Node)) close()\n },\n { signal: ac.signal }\n )\n return () => ac.abort()\n }, [open, close])\n\n useEffect(() => {\n if (!open || highlightedIndex < 0) return\n const el = listRef.current?.children[highlightedIndex] as\n | HTMLElement\n | undefined\n el?.scrollIntoView({ block: 'nearest' })\n }, [open, highlightedIndex])\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (disabled) return\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault()\n if (!open) {\n setOpen(true)\n setHighlightedIndex(options.findIndex(o => o.value === value))\n } else if (highlightedIndex >= 0 && options[highlightedIndex]) {\n onValueChange?.(options[highlightedIndex].value)\n close()\n }\n break\n case 'ArrowDown':\n e.preventDefault()\n if (!open) {\n setOpen(true)\n setHighlightedIndex(options.findIndex(o => o.value === value))\n } else {\n setHighlightedIndex(i => Math.min(i + 1, options.length - 1))\n }\n break\n case 'ArrowUp':\n e.preventDefault()\n if (open) setHighlightedIndex(i => Math.max(i - 1, 0))\n break\n case 'Home':\n if (open) {\n e.preventDefault()\n setHighlightedIndex(0)\n }\n break\n case 'End':\n if (open) {\n e.preventDefault()\n setHighlightedIndex(options.length - 1)\n }\n break\n case 'Escape':\n e.preventDefault()\n close()\n break\n }\n }\n\n return (\n <div\n className={cn('relative', className)}\n id={id}\n ref={containerRef}\n style={style}\n >\n <button\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n className={TRIGGER_CN}\n disabled={disabled}\n onClick={() => !disabled && setOpen(o => !o)}\n onKeyDown={handleKeyDown}\n role=\"combobox\"\n type=\"button\"\n >\n <span className={cn('truncate', !selected && 'text-midground/50')}>\n {displayLabel}\n </span>\n\n <ChevronDownGlyph\n className={cn(\n 'size-3 shrink-0 text-midground/60 transition-transform',\n open && 'rotate-180'\n )}\n />\n </button>\n\n {open && (\n <div className={LISTBOX_CN} ref={listRef} role=\"listbox\">\n {options.map((opt, i) => {\n const isSelected = opt.value === value\n const isHighlighted = i === highlightedIndex\n\n return (\n <div\n aria-selected={isSelected}\n className={cn(\n 'flex cursor-pointer items-center gap-2 px-3 py-2',\n 'font-courier text-sm transition-colors',\n isHighlighted && 'bg-midground/10',\n isSelected ? 'text-midground' : 'text-midground/70'\n )}\n key={opt.value}\n onClick={() => {\n onValueChange?.(opt.value)\n close()\n }}\n onMouseEnter={() => setHighlightedIndex(i)}\n role=\"option\"\n >\n <CheckGlyph\n className={cn(\n 'size-3 shrink-0',\n isSelected ? 'opacity-100' : 'opacity-0'\n )}\n />\n <span className=\"truncate\">{opt.label}</span>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n// Marker component — `Select` reads `value`/`children` from its tree.\n// Renders nothing on its own.\nexport function SelectOption(_props: SelectOptionProps) {\n return null\n}\n\nconst ChevronDownGlyph = ({ className }: { className?: string }) => (\n <svg\n aria-hidden\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"square\"\n strokeWidth={1.5}\n viewBox=\"0 0 12 12\"\n >\n <path d=\"M2.5 4.5 6 8l3.5-3.5\" />\n </svg>\n)\n\nconst CheckGlyph = ({ className }: { className?: string }) => (\n <svg\n aria-hidden\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"square\"\n strokeWidth={1.5}\n viewBox=\"0 0 12 12\"\n >\n <path d=\"m2.5 6.5 2.5 2.5L9.5 3.5\" />\n </svg>\n)\n\nfunction collectOptions(children: ReactNode): SelectOptionData[] {\n const out: SelectOptionData[] = []\n Children.forEach(children, child => {\n if (!isValidElement(child)) return\n const el = child as ReactElement<{\n children?: ReactNode\n value?: unknown\n }>\n if (el.props.value !== undefined) {\n out.push({\n label:\n typeof el.props.children === 'string'\n ? el.props.children\n : String(el.props.value),\n value: String(el.props.value)\n })\n } else if (el.props.children) {\n out.push(...collectOptions(el.props.children))\n }\n })\n return out\n}\n\ninterface SelectOptionData {\n label: string\n value: string\n}\n\ninterface SelectOptionProps {\n children: ReactNode\n value: string\n}\n\ninterface SelectProps {\n children?: ReactNode\n className?: string\n disabled?: boolean\n id?: string\n onValueChange?: (value: string) => void\n placeholder?: string\n style?: CSSProperties\n value?: string\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { type ButtonHTMLAttributes } from 'react';
2
+ export declare const Switch: import("react").ForwardRefExoticComponent<SwitchProps & import("react").RefAttributes<HTMLButtonElement>>;
3
+ interface SwitchProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {
4
+ checked: boolean;
5
+ onCheckedChange: (checked: boolean) => void;
6
+ }
7
+ export {};
8
+ //# sourceMappingURL=switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../src/ui/components/switch.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,oBAAoB,EAAc,MAAM,OAAO,CAAA;AAI7D,eAAO,MAAM,MAAM,2GAmCjB,CAAA;AAEF,UAAU,WACR,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IACjE,OAAO,EAAE,OAAO,CAAA;IAChB,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC5C"}
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from 'react';
4
+ import { cn } from '../../utils';
5
+ export const Switch = forwardRef(function Switch({ checked, className, disabled, id, onCheckedChange, ...props }, ref) {
6
+ return (_jsx("button", { "aria-checked": checked, className: cn('peer inline-flex h-5 w-9 shrink-0 items-center border transition-colors cursor-pointer', 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30', 'disabled:cursor-not-allowed disabled:opacity-50', checked
7
+ ? 'bg-midground/15 border-midground/30'
8
+ : 'bg-background border-midground/20', className), disabled: disabled, id: id, onClick: () => onCheckedChange(!checked), ref: ref, role: "switch", type: "button", ...props, children: _jsx("span", { "aria-hidden": true, className: cn('pointer-events-none block h-3.5 w-3.5 transition-transform', checked
9
+ ? 'translate-x-4 bg-midground'
10
+ : 'translate-x-0.5 bg-midground/40') }) }));
11
+ });
12
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../src/ui/components/switch.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAA6B,UAAU,EAAE,MAAM,OAAO,CAAA;AAE7D,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAiC,SAAS,MAAM,CAC9E,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,KAAK,EAAE,EAC/D,GAAG;IAEH,OAAO,CACL,iCACgB,OAAO,EACrB,SAAS,EAAE,EAAE,CACX,wFAAwF,EACxF,iFAAiF,EACjF,iDAAiD,EACjD,OAAO;YACL,CAAC,CAAC,qCAAqC;YACvC,CAAC,CAAC,mCAAmC,EACvC,SAAS,CACV,EACD,QAAQ,EAAE,QAAQ,EAClB,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACxC,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,QAAQ,KACT,KAAK,YAET,oCAEE,SAAS,EAAE,EAAE,CACX,4DAA4D,EAC5D,OAAO;gBACL,CAAC,CAAC,4BAA4B;gBAC9B,CAAC,CAAC,iCAAiC,CACtC,GACD,GACK,CACV,CAAA;AACH,CAAC,CAAC,CAAA","sourcesContent":["'use client'\n\nimport { type ButtonHTMLAttributes, forwardRef } from 'react'\n\nimport { cn } from '../../utils'\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n { checked, className, disabled, id, onCheckedChange, ...props },\n ref\n) {\n return (\n <button\n aria-checked={checked}\n className={cn(\n 'peer inline-flex h-5 w-9 shrink-0 items-center border transition-colors cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n checked\n ? 'bg-midground/15 border-midground/30'\n : 'bg-background border-midground/20',\n className\n )}\n disabled={disabled}\n id={id}\n onClick={() => onCheckedChange(!checked)}\n ref={ref}\n role=\"switch\"\n type=\"button\"\n {...props}\n >\n <span\n aria-hidden\n className={cn(\n 'pointer-events-none block h-3.5 w-3.5 transition-transform',\n checked\n ? 'translate-x-4 bg-midground'\n : 'translate-x-0.5 bg-midground/40'\n )}\n />\n </button>\n )\n})\n\ninterface SwitchProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { type ButtonHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react';
2
+ export declare function Tabs({ children, className, defaultValue }: TabsProps): import("react/jsx-runtime").JSX.Element;
3
+ export declare function TabsList({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
4
+ export declare function TabsTrigger({ active, className, value: _value, ...props }: TabsTriggerProps): import("react/jsx-runtime").JSX.Element;
5
+ interface TabsProps {
6
+ children: (active: string, setActive: (value: string) => void) => ReactNode;
7
+ className?: string;
8
+ defaultValue: string;
9
+ }
10
+ interface TabsTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {
11
+ active: boolean;
12
+ value: string;
13
+ }
14
+ export {};
15
+ //# sourceMappingURL=tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../src/ui/components/tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,OAAO,CAAA;AAId,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,SAAS,2CAQpE;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,2CAU/E;AAED,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,SAAS,EACT,KAAK,EAAE,MAAM,EACb,GAAG,KAAK,EACT,EAAE,gBAAgB,2CAgBlB;AAED,UAAU,SAAS;IACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,SAAS,CAAA;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,UAAU,gBAAiB,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IACxE,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd"}
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { cn } from '../../utils';
5
+ export function Tabs({ children, className, defaultValue }) {
6
+ const [active, setActive] = useState(defaultValue);
7
+ return (_jsx("div", { className: cn('flex flex-col gap-4', className), children: children(active, setActive) }));
8
+ }
9
+ export function TabsList({ className, ...props }) {
10
+ return (_jsx("div", { className: cn('inline-flex h-9 items-center justify-start border-b border-midground/15 text-midground/60', className), ...props }));
11
+ }
12
+ export function TabsTrigger({ active, className, value: _value, ...props }) {
13
+ return (_jsx("button", { className: cn('relative inline-flex items-center justify-center whitespace-nowrap px-3 py-1.5', 'font-mondwest text-xs tracking-[0.1em] uppercase transition-all cursor-pointer', 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30', active
14
+ ? 'text-midground after:absolute after:bottom-0 after:left-0 after:right-0 after:h-px after:bg-midground'
15
+ : 'hover:text-midground', className), type: "button", ...props }));
16
+ }
17
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../src/ui/components/tabs.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAIL,QAAQ,EACT,MAAM,OAAO,CAAA;AAEd,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAa;IACnE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;IAElD,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,YACjD,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,GACxB,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAkC;IAC9E,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,2FAA2F,EAC3F,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,MAAM,EACN,SAAS,EACT,KAAK,EAAE,MAAM,EACb,GAAG,KAAK,EACS;IACjB,OAAO,CACL,iBACE,SAAS,EAAE,EAAE,CACX,gFAAgF,EAChF,gFAAgF,EAChF,iFAAiF,EACjF,MAAM;YACJ,CAAC,CAAC,uGAAuG;YACzG,CAAC,CAAC,sBAAsB,EAC1B,SAAS,CACV,EACD,IAAI,EAAC,QAAQ,KACT,KAAK,GACT,CACH,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport {\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n useState\n} from 'react'\n\nimport { cn } from '../../utils'\n\nexport function Tabs({ children, className, defaultValue }: TabsProps) {\n const [active, setActive] = useState(defaultValue)\n\n return (\n <div className={cn('flex flex-col gap-4', className)}>\n {children(active, setActive)}\n </div>\n )\n}\n\nexport function TabsList({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n 'inline-flex h-9 items-center justify-start border-b border-midground/15 text-midground/60',\n className\n )}\n {...props}\n />\n )\n}\n\nexport function TabsTrigger({\n active,\n className,\n value: _value,\n ...props\n}: TabsTriggerProps) {\n return (\n <button\n className={cn(\n 'relative inline-flex items-center justify-center whitespace-nowrap px-3 py-1.5',\n 'font-mondwest text-xs tracking-[0.1em] uppercase transition-all cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30',\n active\n ? 'text-midground after:absolute after:bottom-0 after:left-0 after:right-0 after:h-px after:bg-midground'\n : 'hover:text-midground',\n className\n )}\n type=\"button\"\n {...props}\n />\n )\n}\n\ninterface TabsProps {\n children: (active: string, setActive: (value: string) => void) => ReactNode\n className?: string\n defaultValue: string\n}\n\ninterface TabsTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n active: boolean\n value: string\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nous-research/ui",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "sideEffects": [