@krizaka/ui 2.0.0-beta.2 → 2.0.0-beta.4
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 +98 -6
- package/dist/alert.d.ts +2 -0
- package/dist/alert.js.map +1 -1
- package/dist/avatar.d.ts +5 -0
- package/dist/avatar.js.map +1 -1
- package/dist/badge.d.ts +12 -0
- package/dist/badge.js.map +1 -1
- package/dist/{button-G5qY4qSY.d.ts → button-8La7l0V4.d.ts} +15 -0
- package/dist/button.d.ts +19 -0
- package/dist/button.js.map +1 -1
- package/dist/card.d.ts +24 -1
- package/dist/card.js.map +1 -1
- package/dist/chip.d.ts +23 -0
- package/dist/chip.js.map +1 -1
- package/dist/{chunk-5FRYKFTO.js → chunk-3X5MVH54.js} +2 -2
- package/dist/chunk-3X5MVH54.js.map +1 -0
- package/dist/{chunk-QRG5RYEI.js → chunk-ZUD4U22H.js} +1 -1
- package/dist/chunk-ZUD4U22H.js.map +1 -0
- package/dist/command.d.ts +4 -1
- package/dist/command.js +2 -2
- package/dist/command.js.map +1 -1
- package/dist/confirm-button.d.ts +1 -1
- package/dist/confirm-button.js +1 -1
- package/dist/countdown.d.ts +3 -0
- package/dist/countdown.js.map +1 -1
- package/dist/{dialog-DGBY2grk.d.ts → dialog-GQ4Nvuyf.d.ts} +10 -0
- package/dist/dialog.d.ts +9 -1
- package/dist/dialog.js +2 -2
- package/dist/dialog.js.map +1 -1
- package/dist/dropdown-menu.d.ts +1 -0
- package/dist/dropdown-menu.js.map +1 -1
- package/dist/empty-state.d.ts +2 -0
- package/dist/empty-state.js.map +1 -1
- package/dist/kbd.d.ts +7 -1
- package/dist/kbd.js.map +1 -1
- package/dist/native.d.ts +471 -3
- package/dist/native.js +1005 -36
- package/dist/native.js.map +1 -1
- package/dist/page-header.d.ts +2 -0
- package/dist/page-header.js.map +1 -1
- package/dist/progress.d.ts +5 -0
- package/dist/progress.js.map +1 -1
- package/dist/skeleton.d.ts +7 -1
- package/dist/skeleton.js.map +1 -1
- package/dist/slider.d.ts +2 -0
- package/dist/slider.js.map +1 -1
- package/dist/spinner.d.ts +5 -0
- package/dist/spinner.js.map +1 -1
- package/dist/stat.d.ts +2 -0
- package/dist/stat.js.map +1 -1
- package/dist/switch.d.ts +7 -3
- package/dist/switch.js.map +1 -1
- package/dist/tabs.d.ts +4 -1
- package/dist/tabs.js.map +1 -1
- package/dist/theme.d.ts +10 -2
- package/dist/theme.js +4 -2
- package/dist/theme.js.map +1 -1
- package/dist/tooltip.d.ts +3 -0
- package/dist/tooltip.js.map +1 -1
- package/package.json +31 -8
- package/registry/alert.json +59 -0
- package/registry/avatar.json +114 -0
- package/registry/badge.json +59 -0
- package/registry/button.json +115 -0
- package/registry/card.json +154 -0
- package/registry/checkbox.json +46 -0
- package/registry/chip.json +164 -0
- package/registry/cn.json +21 -0
- package/registry/command.json +162 -0
- package/registry/confirm-button.json +104 -0
- package/registry/countdown.json +84 -0
- package/registry/demos/alert.d.ts +5 -0
- package/registry/demos/alert.js +12 -0
- package/registry/demos/alert.tsx +15 -0
- package/registry/demos/avatar.d.ts +5 -0
- package/registry/demos/avatar.js +14 -0
- package/registry/demos/avatar.tsx +13 -0
- package/registry/demos/badge.d.ts +5 -0
- package/registry/demos/badge.js +11 -0
- package/registry/demos/badge.tsx +5 -0
- package/registry/demos/button.d.ts +5 -0
- package/registry/demos/button.js +11 -0
- package/registry/demos/button.tsx +5 -0
- package/registry/demos/card.d.ts +5 -0
- package/registry/demos/card.js +30 -0
- package/registry/demos/card.tsx +37 -0
- package/registry/demos/checkbox.d.ts +5 -0
- package/registry/demos/checkbox.js +11 -0
- package/registry/demos/checkbox.tsx +5 -0
- package/registry/demos/chip.d.ts +5 -0
- package/registry/demos/chip.js +15 -0
- package/registry/demos/chip.tsx +11 -0
- package/registry/demos/cn.d.ts +7 -0
- package/registry/demos/cn.js +17 -0
- package/registry/demos/cn.tsx +9 -0
- package/registry/demos/command.d.ts +5 -0
- package/registry/demos/command.js +32 -0
- package/registry/demos/command.tsx +28 -0
- package/registry/demos/confirm-button.d.ts +5 -0
- package/registry/demos/confirm-button.js +12 -0
- package/registry/demos/confirm-button.tsx +13 -0
- package/registry/demos/countdown.d.ts +5 -0
- package/registry/demos/countdown.js +13 -0
- package/registry/demos/countdown.tsx +10 -0
- package/registry/demos/dialog.d.ts +7 -0
- package/registry/demos/dialog.js +29 -0
- package/registry/demos/dialog.tsx +31 -0
- package/registry/demos/dropdown-menu.d.ts +7 -0
- package/registry/demos/dropdown-menu.js +36 -0
- package/registry/demos/dropdown-menu.tsx +27 -0
- package/registry/demos/empty-state.d.ts +5 -0
- package/registry/demos/empty-state.js +15 -0
- package/registry/demos/empty-state.tsx +12 -0
- package/registry/demos/field.d.ts +5 -0
- package/registry/demos/field.js +15 -0
- package/registry/demos/field.tsx +11 -0
- package/registry/demos/kbd.d.ts +5 -0
- package/registry/demos/kbd.js +11 -0
- package/registry/demos/kbd.tsx +5 -0
- package/registry/demos/page-header.d.ts +5 -0
- package/registry/demos/page-header.js +11 -0
- package/registry/demos/page-header.tsx +5 -0
- package/registry/demos/popover.d.ts +7 -0
- package/registry/demos/popover.js +25 -0
- package/registry/demos/popover.tsx +31 -0
- package/registry/demos/progress.d.ts +5 -0
- package/registry/demos/progress.js +11 -0
- package/registry/demos/progress.tsx +5 -0
- package/registry/demos/radio-group.d.ts +5 -0
- package/registry/demos/radio-group.js +16 -0
- package/registry/demos/radio-group.tsx +14 -0
- package/registry/demos/separator.d.ts +5 -0
- package/registry/demos/separator.js +15 -0
- package/registry/demos/separator.tsx +11 -0
- package/registry/demos/skeleton.d.ts +5 -0
- package/registry/demos/skeleton.js +20 -0
- package/registry/demos/skeleton.tsx +16 -0
- package/registry/demos/slider.d.ts +5 -0
- package/registry/demos/slider.js +11 -0
- package/registry/demos/slider.tsx +5 -0
- package/registry/demos/slot.d.ts +5 -0
- package/registry/demos/slot.js +14 -0
- package/registry/demos/slot.tsx +13 -0
- package/registry/demos/spinner.d.ts +5 -0
- package/registry/demos/spinner.js +11 -0
- package/registry/demos/spinner.tsx +5 -0
- package/registry/demos/stat.d.ts +5 -0
- package/registry/demos/stat.js +11 -0
- package/registry/demos/stat.tsx +5 -0
- package/registry/demos/switch.d.ts +5 -0
- package/registry/demos/switch.js +11 -0
- package/registry/demos/switch.tsx +5 -0
- package/registry/demos/tabs.d.ts +5 -0
- package/registry/demos/tabs.js +22 -0
- package/registry/demos/tabs.tsx +28 -0
- package/registry/demos/theme.d.ts +5 -0
- package/registry/demos/theme.js +11 -0
- package/registry/demos/theme.tsx +9 -0
- package/registry/demos/toast.d.ts +8 -0
- package/registry/demos/toast.js +29 -0
- package/registry/demos/toast.tsx +31 -0
- package/registry/demos/tooltip.d.ts +7 -0
- package/registry/demos/tooltip.js +15 -0
- package/registry/demos/tooltip.tsx +15 -0
- package/registry/dialog.json +218 -0
- package/registry/dropdown-menu.json +63 -0
- package/registry/empty-state.json +59 -0
- package/registry/field.json +66 -0
- package/registry/index.json +320 -0
- package/registry/kbd.json +38 -0
- package/registry/page-header.json +66 -0
- package/registry/popover.json +44 -0
- package/registry/progress.json +80 -0
- package/registry/radio-group.json +64 -0
- package/registry/separator.json +25 -0
- package/registry/skeleton.json +38 -0
- package/registry/slider.json +95 -0
- package/registry/slot.json +31 -0
- package/registry/spinner.json +45 -0
- package/registry/stat.json +66 -0
- package/registry/switch.json +53 -0
- package/registry/tabs.json +44 -0
- package/registry/theme.json +78 -0
- package/registry/toast.json +54 -0
- package/registry/tooltip.json +91 -0
- package/dist/chunk-5FRYKFTO.js.map +0 -1
- package/dist/chunk-QRG5RYEI.js.map +0 -1
package/dist/native.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/native/OrochiaMark.tsx","../src/marks/orochia-geometry.ts"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { AccessibilityInfo, Animated, Easing, View } from \"react-native\";\nimport Svg, { Circle, Defs, Ellipse, G as Group, LinearGradient, Path, RadialGradient, Stop } from \"react-native-svg\";\n\nimport { OROCHIA as G } from \"../marks/orochia-geometry\";\n\nexport interface NativeMarkProps {\n /** Width and height in points. */\n size?: number;\n /** The orbit turns and the flame breathes; always still when the system asks to reduce motion. */\n animated?: boolean;\n /** An accessible name (the mark becomes an image); without it the mark is decorative. */\n title?: string;\n /** The neutral strokes (orbit, ring): the host's border colour. */\n neutral?: string;\n}\n\nconst CENTER = G.offset + 180;\n\n/**\n * The Orochia mark for React Native — the same geometry as the web mark (marks/orochia-geometry.ts), drawn with\n * react-native-svg. Three layers so that the motion runs on the native driver: the orbit turns, the eye and the flame\n * breathe, the serpent stays still.\n */\nexport function OrochiaMark({ size = 48, animated = true, title, neutral = \"rgba(255,255,255,0.35)\" }: NativeMarkProps) {\n const [spin] = useState(() => new Animated.Value(0));\n const [pulse] = useState(() => new Animated.Value(0));\n useEffect(() => {\n if (!animated) return;\n let loops: Animated.CompositeAnimation[] = [];\n let cancelled = false;\n void AccessibilityInfo.isReduceMotionEnabled().then((reduce) => {\n if (reduce || cancelled) return;\n loops = [\n Animated.loop(Animated.timing(spin, { toValue: 1, duration: 30_000, easing: Easing.linear, useNativeDriver: true })),\n Animated.loop(\n Animated.sequence([\n Animated.timing(pulse, { toValue: 1, duration: 1600, easing: Easing.inOut(Easing.ease), useNativeDriver: true }),\n Animated.timing(pulse, { toValue: 0, duration: 1600, easing: Easing.inOut(Easing.ease), useNativeDriver: true }),\n ]),\n ),\n ];\n loops.forEach((l) => l.start());\n });\n return () => {\n cancelled = true;\n loops.forEach((l) => l.stop());\n };\n }, [animated, spin, pulse]);\n\n const viewBox = size < 48 ? G.croppedViewBox : G.viewBox;\n const layer = { position: \"absolute\" as const, width: size, height: size };\n const a11y = title ? { accessible: true, accessibilityRole: \"image\" as const, accessibilityLabel: title } : { accessibilityElementsHidden: true, importantForAccessibility: \"no-hide-descendants\" as const };\n const bodyGradient = (\n <LinearGradient id=\"body\" gradientUnits=\"userSpaceOnUse\" x1={G.body.x1 + G.offset} y1={G.body.y1 + G.offset} x2={G.body.x2 + G.offset} y2={G.body.y2 + G.offset}>\n {G.body.stops.map(([offset, color]) => (\n <Stop key={offset} offset={offset} stopColor={color} />\n ))}\n </LinearGradient>\n );\n\n return (\n <View style={{ width: size, height: size }} {...a11y}>\n <Svg viewBox={viewBox} style={layer}>\n <Defs>\n <RadialGradient id=\"glow\" cx=\"50%\" cy=\"50%\" r=\"50%\">\n <Stop offset=\"0%\" stopColor={G.glow.color} stopOpacity={G.glow.opacity} />\n <Stop offset=\"100%\" stopColor={G.glow.color} stopOpacity={0} />\n </RadialGradient>\n </Defs>\n <Circle cx={CENTER} cy={CENTER} r={170} fill=\"url(#glow)\" />\n <Circle cx={CENTER} cy={CENTER} r={G.ring.r} stroke={neutral} strokeWidth={G.ring.width} opacity={0.35} fill=\"none\" />\n </Svg>\n <Animated.View style={[layer, { transform: [{ rotate: spin.interpolate({ inputRange: [0, 1], outputRange: [\"0deg\", \"360deg\"] }) }] }]}>\n <Svg viewBox={viewBox} style={layer}>\n <Circle cx={CENTER} cy={CENTER} r={G.orbit.r} stroke={neutral} strokeWidth={G.orbit.width} strokeDasharray={G.orbit.dash} opacity={0.6} fill=\"none\" />\n </Svg>\n </Animated.View>\n <Svg viewBox={viewBox} style={layer}>\n <Defs>{bodyGradient}</Defs>\n <Group transform={`translate(${G.offset} ${G.offset})`}>\n <Path d={G.arc} stroke=\"url(#body)\" strokeWidth={22} strokeLinecap=\"round\" fill=\"none\" />\n <Path d={G.arc} stroke={G.scales.color} strokeOpacity={G.scales.opacity} strokeWidth={G.scales.width} strokeLinecap=\"round\" strokeDasharray={G.scales.dash} fill=\"none\" />\n <Path d={G.neck} stroke=\"url(#body)\" strokeWidth={14} strokeLinecap=\"round\" fill=\"none\" />\n <Path d={G.tail} stroke=\"url(#body)\" strokeWidth={6} strokeLinecap=\"round\" fill=\"none\" />\n <Ellipse cx={G.head.cx} cy={G.head.cy} rx={G.head.rx} ry={G.head.ry} rotation={G.head.rotate} origin={`${G.head.cx}, ${G.head.cy}`} fill=\"url(#body)\" />\n <Path d={G.tongue.d} stroke={G.tongue.color} strokeWidth={3} strokeLinecap=\"round\" fill=\"none\" />\n </Group>\n </Svg>\n <Animated.View style={[layer, { opacity: pulse.interpolate({ inputRange: [0, 1], outputRange: [0.85, 1] }) }]}>\n <Svg viewBox={viewBox} style={layer}>\n <Defs>\n <LinearGradient id=\"flame\" x1=\"50%\" y1=\"100%\" x2=\"50%\" y2=\"0%\">\n {G.flameGradient.stops.map(([offset, color]) => (\n <Stop key={offset} offset={offset} stopColor={color} />\n ))}\n </LinearGradient>\n </Defs>\n <Group transform={`translate(${G.offset} ${G.offset})`}>\n <Circle cx={G.eye.cx} cy={G.eye.cy} r={G.eye.r} fill={G.eye.color} />\n <Path d={G.flame.d} transform={`translate(${G.flame.translate[0]} ${G.flame.translate[1]}) scale(${G.flame.scale})`} fill=\"url(#flame)\" />\n </Group>\n </Svg>\n </Animated.View>\n </View>\n );\n}\n","/**\n * The Orochia mark's geometry — the one description of the serpent and its flame, drawn by the web mark (SVG in the\n * DOM, OrochiaLogo) and the native one (react-native-svg, @krizaka/ui/native). Coordinates are in the 360×360 artwork,\n * placed at (20, 20) in a 400×400 view box; below 48 px the view box crops to the serpent.\n */\nexport const OROCHIA = {\n viewBox: \"0 0 400 400\",\n croppedViewBox: \"86 82 228 228\",\n offset: 20,\n body: { x1: 70, y1: 290, x2: 290, y2: 70, stops: [[\"0%\", \"#7c3aed\"], [\"55%\", \"#d946ef\"], [\"100%\", \"#f472b6\"]] },\n flameGradient: { stops: [[\"0%\", \"#a855f7\"], [\"100%\", \"#f9a8d4\"]] },\n glow: { color: \"#d946ef\", opacity: 0.18 },\n orbit: { r: 160, dash: \"8 8\", width: 1.5 },\n ring: { r: 134, width: 1 },\n arc: \"M259.8,142.8 A88,88 0 1 1 142.8,100.2\",\n neck: \"M142.8,100.2 A88,88 0 0 1 187.7,92.3\",\n tail: \"M187.7,92.3 A88,88 0 0 1 221.3,102.3\",\n scales: { color: \"#fdf4ff\", opacity: 0.45, width: 3, dash: \"2 14\" },\n head: { cx: 253.9, cy: 130.1, rx: 13, ry: 20, rotate: -25 },\n tongue: { d: \"M245.4,112.0 L242.0,104.8 L235.0,101.5 M242.0,104.8 L244.0,97.3\", color: \"#f472b6\" },\n eye: { cx: 256.3, cy: 123.5, r: 4.5, color: \"#fdf4ff\" },\n flame: {\n translate: [127, 120] as const,\n scale: 4.4,\n d: \"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\",\n },\n} as const;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/countdown/core.ts","../src/native/avatar.tsx","../../tokens/dist/native.js","../src/native/theme.tsx","../src/native/badge.tsx","../src/native/button.tsx","../src/native/txt.tsx","../src/native/card.tsx","../src/native/chip.tsx","../src/native/countdown.tsx","../src/native/empty-state.tsx","../src/native/OrochiaMark.tsx","../src/marks/orochia-geometry.ts","../src/native/progress.tsx","../src/native/segmented.tsx","../src/native/skeleton.tsx","../src/native/spinner.tsx","../src/native/toast.tsx"],"sourcesContent":["// The countdown's clock, shared by the web (`@krizaka/ui/countdown`) and native renders: no DOM import.\nimport { useSyncExternalStore } from \"react\";\n\n// One clock for every countdown on the page: it ticks each second while someone listens.\nconst listeners = new Set<() => void>();\nlet timer: ReturnType<typeof setInterval> | null = null;\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n timer ??= setInterval(() => listeners.forEach((l) => l()), 1000);\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0 && timer) {\n clearInterval(timer);\n timer = null;\n }\n };\n}\n\nconst nowSecond = () => Math.floor(Date.now() / 1000) * 1000;\n\n/** Milliseconds left until `target` (never negative), ticking every second. `skewMs` = server clock − this clock. */\nexport function useCountdown(target: Date | string | number, skewMs = 0): number {\n const now = useSyncExternalStore(subscribe, nowSecond, nowSecond);\n return Math.max(0, new Date(target).getTime() - (now + skewMs));\n}\n\n/** Splits a duration into days, hours, minutes and seconds. */\nexport function splitDuration(ms: number): { d: number; h: number; m: number; s: number } {\n const total = Math.max(0, Math.floor(ms / 1000));\n return { d: Math.floor(total / 86400), h: Math.floor((total % 86400) / 3600), m: Math.floor((total % 3600) / 60), s: total % 60 };\n}\n\n/** The short unit labels, passed translated (e.g. `{ d: \"d\", h: \"h\", m: \"m\", s: \"s\" }`). */\nexport type CountdownUnits = { d: string; h: string; m: string; s: string };\n\n/** The three segments shown: days, hours, minutes when there are days; else hours, minutes, seconds. */\nexport function countdownParts(ms: number, units: CountdownUnits): [number, string][] {\n const { d, h, m, s } = splitDuration(ms);\n return d > 0 ? [[d, units.d], [h, units.h], [m, units.m]] : [[h, units.h], [m, units.m], [s, units.s]];\n}\n","import * as React from \"react\";\nimport { Image, StyleSheet, Text, View, type ViewProps } from \"react-native\";\n\nimport { useTheme } from \"./theme\";\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nconst SIDE: Record<AvatarSize, number> = { xs: 20, sm: 32, md: 40, lg: 56, xl: 80 };\n\nexport type AvatarProps = Omit<ViewProps, \"children\"> & {\n src?: string | null;\n /** The person's name: the image's accessible name and the source of the default initial. */\n alt?: string;\n /** Shown while there is no image or when it fails: default, the first letter of `alt`. */\n fallback?: React.ReactNode;\n /** A size of the scale, or points. */\n size?: AvatarSize | number;\n};\n\n/** A round picture; the initial (or `fallback`) when there is none or it fails to load. */\nexport function AvatarRoot({ src, alt = \"\", fallback, size = \"md\", style, ...props }: AvatarProps) {\n const { theme } = useTheme();\n // The source that failed to load: a new `src` gets its chance.\n const [failedSrc, setFailedSrc] = React.useState<string | null>(null);\n const failed = Boolean(src) && failedSrc === src;\n const side = typeof size === \"number\" ? size : SIDE[size];\n const initial = alt.trim().charAt(0).toUpperCase();\n const content = fallback ?? initial;\n return (\n <View\n accessible={Boolean(alt)}\n role={alt ? \"img\" : undefined}\n aria-label={alt || undefined}\n {...props}\n style={[styles.root, { width: side, height: side, borderRadius: side / 2, backgroundColor: theme.surface3 }, style]}\n >\n {src && !failed ? (\n <Image testID={props.testID ? `${props.testID}.image` : undefined} source={{ uri: src }} onError={() => setFailedSrc(src)} resizeMode=\"cover\" style={StyleSheet.absoluteFill} />\n ) : typeof content === \"string\" ? (\n <Text style={[styles.initial, { color: theme.textSecondary, fontSize: Math.max(9, Math.round(side * 0.4)) }]}>{content}</Text>\n ) : (\n content\n )}\n </View>\n );\n}\n\nexport type AvatarGroupProps = ViewProps & {\n /** How many avatars are shown; the rest becomes a `+n` avatar. */\n max?: number;\n /** The size of the avatars (and of the `+n` one). */\n size?: AvatarSize | number;\n};\n\n/** Overlapping avatars; past `max`, a `+n` avatar counts the rest. */\nexport function AvatarGroup({ max, size = \"md\", style, children, ...props }: AvatarGroupProps) {\n const { theme } = useTheme();\n const items = React.Children.toArray(children);\n const shown = max === undefined ? items : items.slice(0, max);\n const rest = items.length - shown.length;\n const side = typeof size === \"number\" ? size : SIDE[size];\n const ring = { borderWidth: 2, borderColor: theme.surface0, marginLeft: -side / 5 };\n return (\n <View {...props} style={[styles.group, { paddingLeft: side / 5 }, style]}>\n {shown.map((child, i) => (\n <View key={i} style={[ring, { borderRadius: side }]}>\n {React.isValidElement<AvatarProps>(child) ? React.cloneElement(child, { size }) : child}\n </View>\n ))}\n {rest > 0 ? (\n <View style={[ring, { borderRadius: side }]}>\n <AvatarRoot size={size} fallback={`+${rest}`} />\n </View>\n ) : null}\n </View>\n );\n}\n\n/** `Avatar` (an image with a fallback) and `Avatar.Group`. */\nexport const Avatar = Object.assign(AvatarRoot, { Group: AvatarGroup });\n\nconst styles = StyleSheet.create({\n root: { overflow: \"hidden\", alignItems: \"center\", justifyContent: \"center\" },\n initial: { fontWeight: \"700\" },\n group: { flexDirection: \"row\", alignItems: \"center\" },\n});\n","// @krizaka/tokens — GÉNÉRÉ depuis src/tokens/*.tokens.json par scripts/build.mjs : ne pas éditer.\n\n/** Colour roles per theme, resolved for React Native (`#rrggbb`, `rgba()` when translucent). */\nexport const themes = Object.freeze({ dark: Object.freeze({\n \"surface0\": \"#0c0c0e\",\n \"surface1\": \"#161618\",\n \"surface2\": \"#1f1f23\",\n \"surface3\": \"#2a2a2d\",\n \"media\": \"#1b1b1d\",\n \"borderSubtle\": \"rgba(255,255,255,0.06)\",\n \"borderDefault\": \"rgba(255,255,255,0.1)\",\n \"borderStrong\": \"rgba(255,255,255,0.16)\",\n \"textPrimary\": \"#f5f5f5\",\n \"textSecondary\": \"#a0a0a7\",\n \"textMuted\": \"#73737d\",\n \"textOnMedia\": \"#ffffff\",\n \"accent\": \"#196df5\",\n \"accentHover\": \"#0e5bd8\",\n \"accentSoft\": \"rgba(25,109,245,0.1)\",\n \"accent2\": \"#196df5\",\n \"onAccent\": \"#ffffff\",\n \"ring\": \"#196df5\",\n \"success\": \"#10b77f\",\n \"warning\": \"#f59f0a\",\n \"danger\": \"#ef4343\",\n \"info\": \"#196df5\",\n \"scrim\": \"rgba(0,0,0,0.6)\",\n \"scrimStrong\": \"rgba(0,0,0,0.8)\",\n \"overlay\": \"rgba(0,0,0,0.7)\"\n}), light: Object.freeze({\n \"surface0\": \"#fafafa\",\n \"surface1\": \"#ffffff\",\n \"surface2\": \"#f1f1f3\",\n \"surface3\": \"#e4e4e7\",\n \"media\": \"#e9e9ec\",\n \"borderSubtle\": \"rgba(0,0,0,0.06)\",\n \"borderDefault\": \"rgba(0,0,0,0.1)\",\n \"borderStrong\": \"rgba(0,0,0,0.16)\",\n \"textPrimary\": \"#18181b\",\n \"textSecondary\": \"#64646d\",\n \"textMuted\": \"#808089\",\n \"textOnMedia\": \"#ffffff\",\n \"accent\": \"#0a64f5\",\n \"accentHover\": \"#0d55c9\",\n \"accentSoft\": \"rgba(10,100,245,0.08)\",\n \"accent2\": \"#0a64f5\",\n \"onAccent\": \"#ffffff\",\n \"ring\": \"#0a64f5\",\n \"success\": \"#10b77f\",\n \"warning\": \"#f59f0a\",\n \"danger\": \"#ef4343\",\n \"info\": \"#0a64f5\",\n \"scrim\": \"rgba(0,0,0,0.6)\",\n \"scrimStrong\": \"rgba(0,0,0,0.8)\",\n \"overlay\": \"rgba(0,0,0,0.7)\"\n}) });\n\n/** Corner radii, in dp. */\nexport const radius = Object.freeze({\n \"sm\": 8,\n \"md\": 12,\n \"lg\": 16,\n \"xl\": 20,\n \"full\": 9999\n});\n\n/** Font families: the first family of each web stack (React Native takes a single name). */\nexport const typography = Object.freeze({\n \"sans\": \"Inter\",\n \"display\": \"Inter\",\n \"mono\": \"JetBrains Mono\"\n});\n\n/** Motion: the cubic-bezier control points (`Easing.bezier(...motion.ease)`). */\nexport const motion = Object.freeze({ ease: Object.freeze([0.16,1,0.3,1]) });\n","// The native theme: the @krizaka/tokens roles (dark, light), a product's overrides on top, the mode chosen by the app\n// or followed from the system. Same names as the web `./theme` (`mode`, `setMode`, `ThemeProvider`, `useTheme`).\nimport { motion as tokenMotion, radius as tokenRadius, themes as tokenThemes } from \"@krizaka/tokens/native\";\nimport * as React from \"react\";\nimport { AccessibilityInfo, useColorScheme } from \"react-native\";\n\n// The token values are inlined in dist/native.js (no dependency for the app); their types are spelled out here so the\n// declarations stand alone. theme.test.tsx checks that they match @krizaka/tokens/native both ways.\nexport type ThemeName = \"dark\" | \"light\";\n\n/** The colour roles of one theme (the @krizaka/tokens roles). */\nexport type Theme = {\n readonly surface0: string;\n readonly surface1: string;\n readonly surface2: string;\n readonly surface3: string;\n readonly media: string;\n readonly borderSubtle: string;\n readonly borderDefault: string;\n readonly borderStrong: string;\n readonly textPrimary: string;\n readonly textSecondary: string;\n readonly textMuted: string;\n readonly textOnMedia: string;\n readonly accent: string;\n readonly accentHover: string;\n readonly accentSoft: string;\n readonly accent2: string;\n readonly onAccent: string;\n readonly ring: string;\n readonly success: string;\n readonly warning: string;\n readonly danger: string;\n readonly info: string;\n readonly scrim: string;\n readonly scrimStrong: string;\n readonly overlay: string;\n};\n\n/** Corner radii, in points. */\nexport type Radius = { readonly sm: number; readonly md: number; readonly lg: number; readonly xl: number; readonly full: number };\n/** Motion: the cubic-bezier control points of the platform's ease (`Easing.bezier(...motion.ease)`). */\nexport type Motion = { readonly ease: readonly [number, number, number, number] };\n\nconst themes: Readonly<Record<ThemeName, Theme>> = tokenThemes;\nconst radius: Radius = tokenRadius;\nconst motion: Motion = tokenMotion;\n\nexport type Mode = \"dark\" | \"light\" | \"system\";\n\n/** A product's colour roles per theme (e.g. `nativeTheme` of a product design system): only the roles it changes. */\nexport type ThemeOverrides = { readonly dark?: Partial<Theme>; readonly light?: Partial<Theme> };\n\n/** Font families, when the app has loaded them (`expo-font`…). Absent: the system font. */\nexport type ThemeFonts = { readonly sans?: string; readonly display?: string; readonly mono?: string };\n\nexport type ThemeContextValue = {\n /** The chosen mode: dark, light or follow the system. */\n mode: Mode;\n setMode: (mode: Mode) => void;\n /** The resolved scheme: what `mode` gives on this device right now. */\n scheme: ThemeName;\n /** The colour roles of the resolved scheme, overrides applied. */\n theme: Theme;\n radius: Radius;\n motion: Motion;\n fonts: ThemeFonts;\n};\n\nconst ThemeContext = React.createContext<ThemeContextValue | null>(null);\n\nfunction resolve(mode: Mode, system: string | null | undefined): ThemeName {\n if (mode === \"system\") return system === \"light\" ? \"light\" : \"dark\";\n return mode;\n}\n\nexport type ThemeProviderProps = {\n children: React.ReactNode;\n /** Controlled mode (with `onModeChange`). */\n mode?: Mode;\n /** Uncontrolled: the mode before the user picks one. Default: follow the system. */\n defaultMode?: Mode;\n /** Every change of mode — the app persists it (no storage dependency here). */\n onModeChange?: (mode: Mode) => void;\n /** The product's roles over the platform's, per theme. */\n overrides?: ThemeOverrides;\n fonts?: ThemeFonts;\n};\n\n/** Once, at the root of the app. Without it, `useTheme()` follows the system with the platform's roles. */\nexport function ThemeProvider({ children, mode: controlled, defaultMode = \"system\", onModeChange, overrides, fonts }: ThemeProviderProps) {\n const system = useColorScheme();\n const [own, setOwn] = React.useState<Mode>(defaultMode);\n const mode = controlled ?? own;\n const setMode = React.useCallback(\n (next: Mode) => {\n if (controlled === undefined) setOwn(next);\n onModeChange?.(next);\n },\n [controlled, onModeChange],\n );\n const scheme = resolve(mode, system);\n const override = overrides?.[scheme];\n const theme = React.useMemo(() => (override ? { ...themes[scheme], ...override } : themes[scheme]), [scheme, override]);\n const value = React.useMemo<ThemeContextValue>(\n () => ({ mode, setMode, scheme, theme, radius, motion, fonts: fonts ?? {} }),\n [mode, setMode, scheme, theme, fonts],\n );\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nconst noop = () => undefined;\n\n/** The current theme: `{ mode, setMode, scheme, theme, radius, motion, fonts }`. */\nexport function useTheme(): ThemeContextValue {\n const context = React.useContext(ThemeContext);\n const system = useColorScheme();\n if (context) return context;\n const scheme = resolve(\"system\", system);\n return { mode: \"system\", setMode: noop, scheme, theme: themes[scheme], radius, motion, fonts: {} };\n}\n\n/** True while the system asks to reduce motion: every loop and transition of /native stops. */\nexport function useReducedMotion(): boolean {\n const [reduce, setReduce] = React.useState(false);\n React.useEffect(() => {\n let alive = true;\n void AccessibilityInfo.isReduceMotionEnabled().then((value) => {\n if (alive) setReduce(value);\n });\n const subscription = AccessibilityInfo.addEventListener(\"reduceMotionChanged\", setReduce);\n return () => {\n alive = false;\n subscription.remove();\n };\n }, []);\n return reduce;\n}\n\n/** A role at a lower opacity (`#rrggbb` → `rgba()`): the soft tints of the status tones. Other forms pass through. */\nexport function alpha(color: string, opacity: number): string {\n const hex = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(color);\n if (!hex) return color;\n const [r, g, b] = hex.slice(1).map((part) => parseInt(part, 16));\n return `rgba(${r},${g},${b},${opacity})`;\n}\n\n/** An id usable in an SVG `url(#…)` reference, unique per instance. */\nexport function useSvgId(prefix: string): string {\n return `${prefix}${React.useId().replace(/[^a-zA-Z0-9_-]/g, \"\")}`;\n}\n","import * as React from \"react\";\nimport { Animated, StyleSheet, Text, type ViewProps } from \"react-native\";\n\nimport { alpha, type Theme, useReducedMotion, useTheme } from \"./theme\";\n\nexport type BadgeTone = \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\" | \"scrim\";\n\ntype Look = { bg: string; fg: string; border: string; dot: string };\n\n// As on the web: the status tones are soft (a tint, a coloured dot); the text stays a text role.\nfunction look(tone: BadgeTone, t: Theme): Look {\n switch (tone) {\n case \"accent\":\n return { bg: t.accentSoft, fg: t.textPrimary, border: alpha(t.accent, 0.4), dot: t.accent };\n case \"success\":\n case \"warning\":\n case \"danger\":\n return { bg: alpha(t[tone], 0.15), fg: t.textPrimary, border: alpha(t[tone], 0.4), dot: t[tone] };\n case \"scrim\":\n return { bg: t.scrim, fg: t.textOnMedia, border: \"transparent\", dot: t.textOnMedia };\n default:\n return { bg: t.surface3, fg: t.textSecondary, border: \"transparent\", dot: t.textSecondary };\n }\n}\n\nexport type BadgeProps = ViewProps & {\n tone?: BadgeTone;\n size?: \"sm\" | \"md\";\n /** A small dot before the text, in the tone's colour. */\n dot?: boolean;\n /** The dot breathes (still when the system reduces motion). */\n pulse?: boolean;\n children?: React.ReactNode;\n};\n\n/** A short status in capitals: a tone, a size, an optional (pulsing) dot. */\nexport function Badge({ tone = \"neutral\", size = \"sm\", dot, pulse, style, children, ...props }: BadgeProps) {\n const { theme } = useTheme();\n const colors = look(tone, theme);\n const reduce = useReducedMotion();\n const [opacity] = React.useState(() => new Animated.Value(1));\n React.useEffect(() => {\n if (!dot || !pulse || reduce) return;\n const loop = Animated.loop(\n Animated.sequence([\n Animated.timing(opacity, { toValue: 0.35, duration: 800, useNativeDriver: true }),\n Animated.timing(opacity, { toValue: 1, duration: 800, useNativeDriver: true }),\n ]),\n );\n loop.start();\n return () => {\n loop.stop();\n opacity.setValue(1);\n };\n }, [dot, pulse, reduce, opacity]);\n return (\n <Animated.View\n {...props}\n style={[styles.root, size === \"md\" ? styles.md : styles.sm, { backgroundColor: colors.bg, borderColor: colors.border }, style]}\n >\n {dot ? <Animated.View aria-hidden style={[styles.dot, { backgroundColor: colors.dot, opacity }]} /> : null}\n {typeof children === \"string\" || typeof children === \"number\" ? (\n <Text style={[styles.text, { color: colors.fg, fontSize: size === \"md\" ? 11 : 10 }]}>{children}</Text>\n ) : (\n children\n )}\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flexDirection: \"row\", alignItems: \"center\", alignSelf: \"flex-start\", gap: 4, borderRadius: 9999, borderWidth: 1 },\n sm: { paddingHorizontal: 8, paddingVertical: 2 },\n md: { paddingHorizontal: 10, paddingVertical: 4 },\n dot: { width: 6, height: 6, borderRadius: 3 },\n text: { fontWeight: \"700\", textTransform: \"uppercase\", letterSpacing: 0.8 },\n});\n","import * as React from \"react\";\nimport { ActivityIndicator, Pressable, type PressableProps, type StyleProp, StyleSheet, View, type ViewStyle } from \"react-native\";\n\nimport { alpha, type Theme, useTheme } from \"./theme\";\nimport { Txt } from \"./txt\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"danger\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\ntype Look = { bg: string; fg: string; border: string };\n\n/** The same five looks as the web `buttonVariants`, from the theme's roles. */\nfunction look(variant: ButtonVariant, t: Theme): Look {\n switch (variant) {\n case \"primary\":\n return { bg: t.accent, fg: t.onAccent, border: t.accent };\n case \"outline\":\n return { bg: \"transparent\", fg: t.textPrimary, border: t.borderDefault };\n case \"ghost\":\n return { bg: \"transparent\", fg: t.textSecondary, border: \"transparent\" };\n case \"danger\":\n // As on the web: the border and the tint carry the danger, the label stays a text role (legible in light).\n return { bg: alpha(t.danger, 0.1), fg: t.textPrimary, border: alpha(t.danger, 0.5) };\n default:\n return { bg: t.surface2, fg: t.textPrimary, border: t.borderDefault };\n }\n}\n\nconst HEIGHT: Record<ButtonSize, number> = { sm: 32, md: 40, lg: 48 };\nconst PADDING: Record<ButtonSize, number> = { sm: 12, md: 16, lg: 24 };\n\ntype BaseProps = Omit<PressableProps, \"children\" | \"style\"> & {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** `rounded` (default) or `pill`. */\n shape?: \"rounded\" | \"pill\";\n /** Disables, shows a spinner in place of the icon and says busy. */\n loading?: boolean;\n style?: StyleProp<ViewStyle>;\n};\n\nexport type ButtonProps = BaseProps & {\n /** The visible text — passed translated. It is also the accessible name. */\n label: string;\n /** Before the label (an icon component from the app's icon set). */\n icon?: React.ReactNode;\n};\n\nfunction useButton({ variant = \"secondary\", size = \"md\", shape = \"rounded\", loading, disabled }: BaseProps) {\n const { theme, radius } = useTheme();\n const colors = look(variant, theme);\n const inactive = Boolean(disabled || loading);\n const frame = (pressed: boolean): ViewStyle => ({\n height: HEIGHT[size],\n borderRadius: shape === \"pill\" ? radius.full : radius.sm,\n backgroundColor: colors.bg,\n borderColor: colors.border,\n opacity: inactive ? 0.4 : pressed ? 0.85 : 1,\n transform: [{ scale: pressed ? 0.98 : 1 }],\n });\n return { colors, inactive, frame };\n}\n\n/** The action. `variant` × `size` × `shape`, `loading`, `icon`; the haptics, if any, belong to the app's `onPress`. */\nexport function Button({ label, icon, variant, size = \"md\", shape, loading = false, disabled, style, ...props }: ButtonProps) {\n const { colors, inactive, frame } = useButton({ variant, size, shape, loading, disabled });\n return (\n <Pressable\n role=\"button\"\n aria-label={label}\n aria-disabled={inactive}\n aria-busy={loading}\n {...props}\n disabled={inactive}\n style={({ pressed }) => [styles.base, { paddingHorizontal: PADDING[size] }, frame(pressed), style]}\n >\n <View style={styles.row}>\n {loading ? <ActivityIndicator aria-hidden size=\"small\" color={colors.fg} /> : icon}\n <Txt variant=\"label\" numberOfLines={1} style={{ color: colors.fg, fontSize: size === \"sm\" ? 12 : 14 }}>\n {label}\n </Txt>\n </View>\n </Pressable>\n );\n}\n\nexport type IconButtonProps = BaseProps & {\n /** The accessible name — required, passed translated. */\n label: string;\n icon: React.ReactNode;\n};\n\n/** A square button holding only an icon: `label` is required, it is its accessible name. */\nexport function IconButton({ label, icon, variant, size = \"md\", shape, loading = false, disabled, style, ...props }: IconButtonProps) {\n const { colors, inactive, frame } = useButton({ variant, size, shape, loading, disabled });\n const side = HEIGHT[size];\n return (\n <Pressable\n role=\"button\"\n aria-label={label}\n aria-disabled={inactive}\n aria-busy={loading}\n hitSlop={side < 44 ? (44 - side) / 2 : undefined}\n {...props}\n disabled={inactive}\n style={({ pressed }) => [styles.base, frame(pressed), { width: side }, style]}\n >\n {loading ? <ActivityIndicator aria-hidden size=\"small\" color={colors.fg} /> : icon}\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n base: { alignItems: \"center\", justifyContent: \"center\", borderWidth: 1 },\n row: { flexDirection: \"row\", alignItems: \"center\", gap: 8 },\n});\n","import * as React from \"react\";\nimport { StyleSheet, Text, type TextProps } from \"react-native\";\n\nimport { type Theme, useTheme } from \"./theme\";\n\nexport type TxtVariant = \"display\" | \"title\" | \"body\" | \"caption\" | \"label\" | \"mono\";\nexport type TxtTone = \"text\" | \"secondary\" | \"muted\" | \"accent\" | \"success\" | \"warning\" | \"danger\" | \"onAccent\" | \"onMedia\";\n\nconst TONE: Record<TxtTone, keyof Theme> = {\n text: \"textPrimary\",\n secondary: \"textSecondary\",\n muted: \"textMuted\",\n accent: \"accent\",\n success: \"success\",\n warning: \"warning\",\n danger: \"danger\",\n onAccent: \"onAccent\",\n onMedia: \"textOnMedia\",\n};\n\nexport type TxtProps = TextProps & {\n /** The type scale: display · title · body (default) · caption · label · mono (tabular figures). */\n variant?: TxtVariant;\n /** A text role of the theme (default `text`). */\n tone?: TxtTone;\n};\n\n/** Text in the platform's scale, coloured by a role of the current theme. `title` and `display` are headers for screen readers. */\nexport function Txt({ variant = \"body\", tone = \"text\", style, ...props }: TxtProps) {\n const { theme, fonts } = useTheme();\n const family = variant === \"display\" || variant === \"title\" ? fonts.display : variant === \"mono\" ? fonts.mono : fonts.sans;\n return (\n <Text\n role={variant === \"display\" || variant === \"title\" ? \"heading\" : undefined}\n {...props}\n style={[styles[variant], { color: theme[TONE[tone]] }, family ? { fontFamily: family } : null, style]}\n />\n );\n}\n\nexport const textStyles = StyleSheet.create({\n display: { fontSize: 30, lineHeight: 36, fontWeight: \"900\", letterSpacing: -0.5 },\n title: { fontSize: 18, lineHeight: 24, fontWeight: \"800\" },\n body: { fontSize: 15, lineHeight: 21 },\n caption: { fontSize: 12, lineHeight: 16 },\n label: { fontSize: 14, lineHeight: 18, fontWeight: \"700\" },\n mono: { fontSize: 14, lineHeight: 18, fontWeight: \"700\", fontVariant: [\"tabular-nums\"] },\n});\nconst styles = textStyles;\n","import * as React from \"react\";\nimport { Image, type ImageProps, Pressable, type PressableProps, type StyleProp, StyleSheet, View, type ViewProps, type ViewStyle } from \"react-native\";\n\nimport { useTheme } from \"./theme\";\nimport { Txt, type TxtProps } from \"./txt\";\n\nexport type CardRootProps = ViewProps & {\n /** `default` (the raised surface) or `elevated` (one step higher, with a shadow). */\n tone?: \"default\" | \"elevated\";\n radius?: \"md\" | \"lg\" | \"xl\";\n /**\n * Makes the whole card pressable: a button for screen readers, named by its content (an `aria-label`, if any, must\n * contain the visible title).\n */\n onPress?: PressableProps[\"onPress\"];\n};\n\n/** The frame: the theme's surface, a hairline border, rounded corners; `onPress` makes it a pressable card. */\nexport function CardRoot({ tone = \"default\", radius = \"xl\", onPress, style, ...props }: CardRootProps) {\n const { theme, radius: r } = useTheme();\n const frame: StyleProp<ViewStyle> = [\n styles.root,\n {\n backgroundColor: tone === \"elevated\" ? theme.surface2 : theme.surface1,\n borderColor: theme.borderDefault,\n borderRadius: r[radius],\n },\n tone === \"elevated\" ? [styles.shadow, { shadowColor: theme.scrimStrong }] : null,\n ];\n if (!onPress) return <View {...props} style={[frame, style]} />;\n return (\n <Pressable\n role=\"button\"\n onPress={onPress}\n {...props}\n style={({ pressed }) => [frame, { opacity: pressed ? 0.92 : 1, transform: [{ scale: pressed ? 0.99 : 1 }] }, style]}\n />\n );\n}\n\nconst ASPECT = { video: 16 / 9, square: 1, portrait: 3 / 4 } as const;\n\nexport type CardMediaProps = ViewProps & { aspect?: keyof typeof ASPECT | \"auto\" };\n\n/** The media area at the top of a card: a fixed ratio, the `media` role behind (what shows while an image loads). */\nexport function CardMedia({ aspect = \"video\", style, ...props }: CardMediaProps) {\n const { theme } = useTheme();\n return <View {...props} style={[styles.media, { backgroundColor: theme.media }, aspect === \"auto\" ? null : { aspectRatio: ASPECT[aspect] }, style]} />;\n}\n\nexport type CardImageProps = Omit<ImageProps, \"source\" | \"src\"> & {\n src?: string | null;\n /** Shown when there is no image: an icon, an illustration (decorative). */\n fallback?: React.ReactNode;\n};\n\n/** The image of a media (it fills it), or its `fallback` when there is none. Decorative unless `alt` is given. */\nexport function CardImage({ src, fallback, alt, style, ...props }: CardImageProps) {\n const { theme } = useTheme();\n if (!src) {\n return (\n <View aria-hidden style={[StyleSheet.absoluteFill, styles.center, { backgroundColor: theme.accentSoft }]}>\n {fallback}\n </View>\n );\n }\n return <Image accessible={Boolean(alt)} alt={alt} aria-label={alt} resizeMode=\"cover\" {...props} source={{ uri: src }} style={[StyleSheet.absoluteFill, style]} />;\n}\n\nconst CORNER: Record<\"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\", ViewStyle> = {\n \"top-left\": { top: 10, left: 10 },\n \"top-right\": { top: 10, right: 10 },\n \"bottom-left\": { bottom: 10, left: 10 },\n \"bottom-right\": { bottom: 10, right: 10 },\n};\n\nexport type CardOverlayProps = ViewProps & { corner?: keyof typeof CORNER };\n\n/** What sits on the media (badges, a caption), in a corner. */\nexport function CardOverlay({ corner = \"top-left\", style, ...props }: CardOverlayProps) {\n return <View {...props} style={[styles.overlay, CORNER[corner], style]} />;\n}\n\nconst PADDING = { none: 0, sm: 12, md: 16, lg: 24 } as const;\n\nexport type CardBodyProps = ViewProps & { padding?: keyof typeof PADDING };\n\nexport function CardBody({ padding = \"md\", style, ...props }: CardBodyProps) {\n return <View {...props} style={[styles.body, { padding: PADDING[padding] }, style]} />;\n}\n\n/** The card's name: one line, a header for screen readers. */\nexport function CardTitle({ numberOfLines = 1, ...props }: Omit<TxtProps, \"variant\">) {\n return <Txt variant=\"label\" role=\"heading\" numberOfLines={numberOfLines} {...props} />;\n}\n\nexport function CardDescription({ numberOfLines = 2, ...props }: Omit<TxtProps, \"variant\">) {\n return <Txt variant=\"caption\" tone=\"secondary\" numberOfLines={numberOfLines} {...props} />;\n}\n\nexport function CardFooter({ style, ...props }: ViewProps) {\n const { theme } = useTheme();\n return <View {...props} style={[styles.footer, { borderTopColor: theme.borderSubtle }, style]} />;\n}\n\n/** `Card.Root/Media/Image/Overlay/Body/Title/Description/Footer` — the web parts, on View, Image and Text. */\nexport const Card = {\n Root: CardRoot,\n Media: CardMedia,\n Image: CardImage,\n Overlay: CardOverlay,\n Body: CardBody,\n Title: CardTitle,\n Description: CardDescription,\n Footer: CardFooter,\n};\n\nconst styles = StyleSheet.create({\n root: { overflow: \"hidden\", borderWidth: StyleSheet.hairlineWidth },\n shadow: { shadowOpacity: 0.25, shadowRadius: 12, shadowOffset: { width: 0, height: 6 }, elevation: 4 },\n media: { position: \"relative\", overflow: \"hidden\", width: \"100%\" },\n center: { alignItems: \"center\", justifyContent: \"center\" },\n overlay: { position: \"absolute\", zIndex: 1, flexDirection: \"row\", alignItems: \"center\", gap: 6 },\n body: { gap: 12 },\n footer: { flexDirection: \"row\", alignItems: \"center\", gap: 8, borderTopWidth: StyleSheet.hairlineWidth, paddingTop: 12, marginTop: \"auto\" },\n});\n","import * as React from \"react\";\nimport { Pressable, type PressableProps, ScrollView, type StyleProp, StyleSheet, Text, View, type ViewStyle } from \"react-native\";\n\nimport { useTheme } from \"./theme\";\n\nexport type ChipSize = \"sm\" | \"md\";\n\ntype GroupContext = {\n type: \"single\" | \"multiple\";\n isSelected: (value: string) => boolean;\n toggle: (value: string) => void;\n size?: ChipSize;\n disabled?: boolean;\n};\nconst ChipGroupContext = React.createContext<GroupContext | null>(null);\n\ntype CommonProps = Omit<PressableProps, \"children\" | \"style\" | \"onPress\"> & {\n size?: ChipSize;\n style?: StyleProp<ViewStyle>;\n /** The text (passed translated) or a node (an icon and a text). */\n children: React.ReactNode;\n};\n\ntype ToggleChipProps = CommonProps & {\n /** Inside `Chip.Group`: the value this chip stands for (required there, ignored alone). */\n value?: string;\n /** Alone: pressed or not (`defaultSelected` uncontrolled), `onSelectedChange` on every press. */\n selected?: boolean;\n defaultSelected?: boolean;\n onSelectedChange?: (selected: boolean) => void;\n removable?: false;\n};\n\ntype RemovableChipProps = CommonProps & {\n /** A static chip (a chosen tag, an applied filter) with a remove button. */\n removable: true;\n /** The accessible name of the remove button — passed translated, e.g. \"Remove #night\". */\n removeLabel: string;\n onRemove: () => void;\n};\n\nexport type ChipProps = ToggleChipProps | RemovableChipProps;\n\nfunction Label({ children, color, size }: { children: React.ReactNode; color: string; size: ChipSize }) {\n if (typeof children !== \"string\" && typeof children !== \"number\") return <>{children}</>;\n return <Text style={[styles.label, { color, fontSize: size === \"sm\" ? 12 : 13 }]}>{children}</Text>;\n}\n\n/** A selectable pill (`selected` / `onSelectedChange`), an item of `Chip.Group` (`value`), or `removable`. */\nfunction ChipBase(props: ChipProps) {\n const group = React.useContext(ChipGroupContext);\n const { theme, radius } = useTheme();\n const [own, setOwn] = React.useState(props.removable ? false : (props.defaultSelected ?? false));\n const size = props.size ?? group?.size ?? \"md\";\n const frame = (on: boolean, pressed: boolean): ViewStyle => ({\n height: size === \"sm\" ? 28 : 36,\n borderRadius: radius.full,\n borderColor: on ? theme.accent : theme.borderDefault,\n backgroundColor: on ? theme.accentSoft : theme.surface1,\n opacity: pressed ? 0.85 : 1,\n });\n\n if (props.removable) {\n const { removable: _r, removeLabel, onRemove, disabled, size: _s, style, children, ...rest } = props;\n return (\n <View {...rest} style={[styles.base, frame(false, false), disabled ? styles.disabled : null, style]}>\n <Label color={theme.textSecondary} size={size}>\n {children}\n </Label>\n <Pressable role=\"button\" aria-label={removeLabel} disabled={disabled ?? undefined} hitSlop={10} onPress={onRemove} style={styles.remove}>\n <Text style={[styles.cross, { color: theme.textSecondary }]}>×</Text>\n </Pressable>\n </View>\n );\n }\n\n const { removable: _r, value, selected, defaultSelected: _d, onSelectedChange, disabled: ownDisabled, size: _s, style, children, ...rest } = props;\n if (group && value === undefined) throw new Error(\"Chip: a chip inside Chip.Group needs a `value`.\");\n const on = group ? group.isSelected(value as string) : (selected ?? own);\n const disabled = Boolean(ownDisabled || group?.disabled);\n const press = () => {\n if (group) return group.toggle(value as string);\n if (selected === undefined) setOwn(!on);\n onSelectedChange?.(!on);\n };\n const single = group?.type === \"single\";\n return (\n <Pressable\n role={single ? \"radio\" : \"checkbox\"}\n aria-checked={on}\n aria-disabled={disabled}\n {...rest}\n disabled={disabled}\n onPress={press}\n style={({ pressed }) => [styles.base, frame(on, pressed), disabled ? styles.disabled : null, style]}\n >\n <Label color={on ? theme.textPrimary : theme.textSecondary} size={size}>\n {children}\n </Label>\n </Pressable>\n );\n}\n\ntype GroupBase = {\n size?: ChipSize;\n disabled?: boolean;\n /** One horizontal scrolling row (a filter bar) instead of wrapping lines. */\n scrollable?: boolean;\n /** The accessible name of the group — passed translated. */\n \"aria-label\"?: string;\n style?: StyleProp<ViewStyle>;\n children: React.ReactNode;\n};\n\nexport type ChipGroupProps =\n | (GroupBase & { type: \"single\"; value?: string; defaultValue?: string; onValueChange?: (value: string) => void })\n | (GroupBase & { type: \"multiple\"; value?: string[]; defaultValue?: string[]; onValueChange?: (value: string[]) => void });\n\n/** A set of chips: `single` (one value, a radio group; pressing the chosen chip keeps it) or `multiple` (toggles). */\nfunction ChipGroup(props: ChipGroupProps) {\n const { size, disabled, scrollable, \"aria-label\": label, style, children } = props;\n const initial = props.type === \"single\" ? (props.defaultValue ?? \"\") : (props.defaultValue ?? []);\n const [own, setOwn] = React.useState<string | string[]>(initial);\n const current = props.value ?? own;\n const context = React.useMemo<GroupContext>(() => {\n const list = Array.isArray(current) ? current : [current];\n return {\n type: props.type,\n size,\n disabled,\n isSelected: (v) => list.includes(v),\n toggle: (v) => {\n const next = props.type === \"single\" ? v : list.includes(v) ? list.filter((x) => x !== v) : [...list, v];\n if (props.value === undefined) setOwn(next);\n (props.onValueChange as ((value: string | string[]) => void) | undefined)?.(next);\n },\n };\n }, [current, props.type, props.value, props.onValueChange, size, disabled]);\n const a11y = { role: props.type === \"single\" ? (\"radiogroup\" as const) : (\"group\" as const), \"aria-label\": label };\n return (\n <ChipGroupContext.Provider value={context}>\n {scrollable ? (\n <ScrollView horizontal showsHorizontalScrollIndicator={false} {...a11y} style={style} contentContainerStyle={styles.row}>\n {children}\n </ScrollView>\n ) : (\n <View {...a11y} style={[styles.row, styles.wrap, style]}>\n {children}\n </View>\n )}\n </ChipGroupContext.Provider>\n );\n}\n\n/** `Chip` and `Chip.Group`. */\nexport const Chip = Object.assign(ChipBase, { Group: ChipGroup });\n\nconst styles = StyleSheet.create({\n base: { flexDirection: \"row\", alignItems: \"center\", justifyContent: \"center\", gap: 6, paddingHorizontal: 14, borderWidth: 1, alignSelf: \"flex-start\" },\n label: { fontWeight: \"600\" },\n remove: { marginRight: -6, width: 24, height: 24, alignItems: \"center\", justifyContent: \"center\" },\n cross: { fontSize: 16, lineHeight: 18, fontWeight: \"700\" },\n disabled: { opacity: 0.4 },\n row: { flexDirection: \"row\", alignItems: \"center\", gap: 8 },\n wrap: { flexWrap: \"wrap\" },\n});\n","import * as React from \"react\";\nimport { Animated, type StyleProp, StyleSheet, Text, type ViewStyle } from \"react-native\";\n\nimport { countdownParts, type CountdownUnits, useCountdown } from \"../countdown/core\";\nimport { useReducedMotion, useTheme } from \"./theme\";\n\nexport type { CountdownUnits };\n\nexport type CountdownProps = {\n target: Date | string | number;\n /** Server clock − this clock, in milliseconds. */\n skewMs?: number;\n /** The short unit labels, passed translated. */\n units: CountdownUnits;\n /** Below this many milliseconds it turns urgent (the danger role, the last segment breathes). Default 60 s. */\n urgentBelowMs?: number;\n size?: \"sm\" | \"md\" | \"lg\";\n /** Accessible name, e.g. \"Ends in\". */\n label: string;\n style?: StyleProp<ViewStyle>;\n};\n\nconst FONT = { sm: 14, md: 20, lg: 32 } as const;\n\n/**\n * Time left until a moment, as segments (2d 04h 13m — days only when there are some) in tabular figures, on the same\n * clock as the web `Countdown` (one interval for every countdown on screen). Under `urgentBelowMs` it turns to the\n * danger role and its last segment breathes (still when the system reduces motion).\n */\nexport function Countdown({ target, skewMs = 0, units, urgentBelowMs = 60_000, size = \"md\", label, style }: CountdownProps) {\n const { theme, fonts } = useTheme();\n const reduce = useReducedMotion();\n const ms = useCountdown(target, skewMs);\n const urgent = ms > 0 && ms < urgentBelowMs;\n const parts = countdownParts(ms, units);\n const [opacity] = React.useState(() => new Animated.Value(1));\n React.useEffect(() => {\n if (!urgent || reduce) return;\n const loop = Animated.loop(\n Animated.sequence([\n Animated.timing(opacity, { toValue: 0.4, duration: 500, useNativeDriver: true }),\n Animated.timing(opacity, { toValue: 1, duration: 500, useNativeDriver: true }),\n ]),\n );\n loop.start();\n return () => {\n loop.stop();\n opacity.setValue(1);\n };\n }, [urgent, reduce, opacity]);\n const color = urgent ? theme.danger : theme.textPrimary;\n const text = parts.map(([value, unit]) => `${String(value).padStart(2, \"0\")}${unit}`).join(\" \");\n return (\n <Animated.View\n accessible\n role=\"timer\"\n aria-label={`${label} ${text}`}\n style={[styles.root, style]}\n >\n {parts.map(([value, unit], i) => (\n <Animated.View key={unit} style={[styles.segment, urgent && i === parts.length - 1 ? { opacity } : null]}>\n <Text style={[styles.value, { color, fontSize: FONT[size] }, fonts.display ? { fontFamily: fonts.display } : null]}>\n {String(value).padStart(2, \"0\")}\n </Text>\n <Text style={[styles.unit, { color: theme.textSecondary, fontSize: Math.round(FONT[size] / 2) }]}>{unit}</Text>\n </Animated.View>\n ))}\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flexDirection: \"row\", alignItems: \"baseline\", gap: 6 },\n segment: { flexDirection: \"row\", alignItems: \"baseline\" },\n value: { fontWeight: \"900\", fontVariant: [\"tabular-nums\"], letterSpacing: -0.3 },\n unit: { marginLeft: 2, fontWeight: \"700\", textTransform: \"uppercase\" },\n});\n","import * as React from \"react\";\nimport { StyleSheet, View, type ViewProps } from \"react-native\";\n\nimport { useTheme } from \"./theme\";\nimport { Txt } from \"./txt\";\n\nexport type EmptyStateProps = Omit<ViewProps, \"children\"> & {\n /** A decorative icon (hidden from screen readers). */\n icon?: React.ReactNode;\n title: string;\n description?: string;\n /** What to do next: a Button. */\n action?: React.ReactNode;\n};\n\n/** What a list, a search or a screen says when it has nothing to show — every word is a prop. */\nexport function EmptyState({ icon, title, description, action, style, ...props }: EmptyStateProps) {\n const { theme } = useTheme();\n return (\n <View {...props} style={[styles.root, style]}>\n {icon ? (\n <View aria-hidden style={[styles.icon, { backgroundColor: theme.surface2 }]}>\n {icon}\n </View>\n ) : null}\n <Txt variant=\"label\" role=\"heading\" style={styles.center}>\n {title}\n </Txt>\n {description ? (\n <Txt tone=\"secondary\" style={styles.center}>\n {description}\n </Txt>\n ) : null}\n {action ? <View style={styles.action}>{action}</View> : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { alignItems: \"center\", justifyContent: \"center\", gap: 8, paddingVertical: 40, paddingHorizontal: 24 },\n icon: { width: 48, height: 48, borderRadius: 24, alignItems: \"center\", justifyContent: \"center\", marginBottom: 4 },\n center: { textAlign: \"center\", maxWidth: 360 },\n action: { marginTop: 8, flexDirection: \"row\", flexWrap: \"wrap\", justifyContent: \"center\", gap: 8 },\n});\n","import React, { useEffect, useState } from \"react\";\nimport { AccessibilityInfo, Animated, Easing, View } from \"react-native\";\nimport Svg, { Circle, Defs, Ellipse, G as Group, LinearGradient, Path, RadialGradient, Stop } from \"react-native-svg\";\n\nimport { OROCHIA as G } from \"../marks/orochia-geometry\";\n\nexport interface NativeMarkProps {\n /** Width and height in points. */\n size?: number;\n /** The orbit turns and the flame breathes; always still when the system asks to reduce motion. */\n animated?: boolean;\n /** An accessible name (the mark becomes an image); without it the mark is decorative. */\n title?: string;\n /** The neutral strokes (orbit, ring): the host's border colour. */\n neutral?: string;\n}\n\nconst CENTER = G.offset + 180;\n\n/**\n * The Orochia mark for React Native — the same geometry as the web mark (marks/orochia-geometry.ts), drawn with\n * react-native-svg. Three layers so that the motion runs on the native driver: the orbit turns, the eye and the flame\n * breathe, the serpent stays still.\n */\nexport function OrochiaMark({ size = 48, animated = true, title, neutral = \"rgba(255,255,255,0.35)\" }: NativeMarkProps) {\n const [spin] = useState(() => new Animated.Value(0));\n const [pulse] = useState(() => new Animated.Value(0));\n useEffect(() => {\n if (!animated) return;\n let loops: Animated.CompositeAnimation[] = [];\n let cancelled = false;\n void AccessibilityInfo.isReduceMotionEnabled().then((reduce) => {\n if (reduce || cancelled) return;\n loops = [\n Animated.loop(Animated.timing(spin, { toValue: 1, duration: 30_000, easing: Easing.linear, useNativeDriver: true })),\n Animated.loop(\n Animated.sequence([\n Animated.timing(pulse, { toValue: 1, duration: 1600, easing: Easing.inOut(Easing.ease), useNativeDriver: true }),\n Animated.timing(pulse, { toValue: 0, duration: 1600, easing: Easing.inOut(Easing.ease), useNativeDriver: true }),\n ]),\n ),\n ];\n loops.forEach((l) => l.start());\n });\n return () => {\n cancelled = true;\n loops.forEach((l) => l.stop());\n };\n }, [animated, spin, pulse]);\n\n const viewBox = size < 48 ? G.croppedViewBox : G.viewBox;\n const layer = { position: \"absolute\" as const, width: size, height: size };\n const a11y = title ? { accessible: true, accessibilityRole: \"image\" as const, accessibilityLabel: title } : { accessibilityElementsHidden: true, importantForAccessibility: \"no-hide-descendants\" as const };\n const bodyGradient = (\n <LinearGradient id=\"body\" gradientUnits=\"userSpaceOnUse\" x1={G.body.x1 + G.offset} y1={G.body.y1 + G.offset} x2={G.body.x2 + G.offset} y2={G.body.y2 + G.offset}>\n {G.body.stops.map(([offset, color]) => (\n <Stop key={offset} offset={offset} stopColor={color} />\n ))}\n </LinearGradient>\n );\n\n return (\n <View style={{ width: size, height: size }} {...a11y}>\n <Svg viewBox={viewBox} style={layer}>\n <Defs>\n <RadialGradient id=\"glow\" cx=\"50%\" cy=\"50%\" r=\"50%\">\n <Stop offset=\"0%\" stopColor={G.glow.color} stopOpacity={G.glow.opacity} />\n <Stop offset=\"100%\" stopColor={G.glow.color} stopOpacity={0} />\n </RadialGradient>\n </Defs>\n <Circle cx={CENTER} cy={CENTER} r={170} fill=\"url(#glow)\" />\n <Circle cx={CENTER} cy={CENTER} r={G.ring.r} stroke={neutral} strokeWidth={G.ring.width} opacity={0.35} fill=\"none\" />\n </Svg>\n <Animated.View style={[layer, { transform: [{ rotate: spin.interpolate({ inputRange: [0, 1], outputRange: [\"0deg\", \"360deg\"] }) }] }]}>\n <Svg viewBox={viewBox} style={layer}>\n <Circle cx={CENTER} cy={CENTER} r={G.orbit.r} stroke={neutral} strokeWidth={G.orbit.width} strokeDasharray={G.orbit.dash} opacity={0.6} fill=\"none\" />\n </Svg>\n </Animated.View>\n <Svg viewBox={viewBox} style={layer}>\n <Defs>{bodyGradient}</Defs>\n <Group transform={`translate(${G.offset} ${G.offset})`}>\n <Path d={G.arc} stroke=\"url(#body)\" strokeWidth={22} strokeLinecap=\"round\" fill=\"none\" />\n <Path d={G.arc} stroke={G.scales.color} strokeOpacity={G.scales.opacity} strokeWidth={G.scales.width} strokeLinecap=\"round\" strokeDasharray={G.scales.dash} fill=\"none\" />\n <Path d={G.neck} stroke=\"url(#body)\" strokeWidth={14} strokeLinecap=\"round\" fill=\"none\" />\n <Path d={G.tail} stroke=\"url(#body)\" strokeWidth={6} strokeLinecap=\"round\" fill=\"none\" />\n <Ellipse cx={G.head.cx} cy={G.head.cy} rx={G.head.rx} ry={G.head.ry} rotation={G.head.rotate} origin={`${G.head.cx}, ${G.head.cy}`} fill=\"url(#body)\" />\n <Path d={G.tongue.d} stroke={G.tongue.color} strokeWidth={3} strokeLinecap=\"round\" fill=\"none\" />\n </Group>\n </Svg>\n <Animated.View style={[layer, { opacity: pulse.interpolate({ inputRange: [0, 1], outputRange: [0.85, 1] }) }]}>\n <Svg viewBox={viewBox} style={layer}>\n <Defs>\n <LinearGradient id=\"flame\" x1=\"50%\" y1=\"100%\" x2=\"50%\" y2=\"0%\">\n {G.flameGradient.stops.map(([offset, color]) => (\n <Stop key={offset} offset={offset} stopColor={color} />\n ))}\n </LinearGradient>\n </Defs>\n <Group transform={`translate(${G.offset} ${G.offset})`}>\n <Circle cx={G.eye.cx} cy={G.eye.cy} r={G.eye.r} fill={G.eye.color} />\n <Path d={G.flame.d} transform={`translate(${G.flame.translate[0]} ${G.flame.translate[1]}) scale(${G.flame.scale})`} fill=\"url(#flame)\" />\n </Group>\n </Svg>\n </Animated.View>\n </View>\n );\n}\n","/**\n * The Orochia mark's geometry — the one description of the serpent and its flame, drawn by the web mark (SVG in the\n * DOM, OrochiaLogo) and the native one (react-native-svg, @krizaka/ui/native). Coordinates are in the 360×360 artwork,\n * placed at (20, 20) in a 400×400 view box; below 48 px the view box crops to the serpent.\n */\nexport const OROCHIA = {\n viewBox: \"0 0 400 400\",\n croppedViewBox: \"86 82 228 228\",\n offset: 20,\n body: { x1: 70, y1: 290, x2: 290, y2: 70, stops: [[\"0%\", \"#7c3aed\"], [\"55%\", \"#d946ef\"], [\"100%\", \"#f472b6\"]] },\n flameGradient: { stops: [[\"0%\", \"#a855f7\"], [\"100%\", \"#f9a8d4\"]] },\n glow: { color: \"#d946ef\", opacity: 0.18 },\n orbit: { r: 160, dash: \"8 8\", width: 1.5 },\n ring: { r: 134, width: 1 },\n arc: \"M259.8,142.8 A88,88 0 1 1 142.8,100.2\",\n neck: \"M142.8,100.2 A88,88 0 0 1 187.7,92.3\",\n tail: \"M187.7,92.3 A88,88 0 0 1 221.3,102.3\",\n scales: { color: \"#fdf4ff\", opacity: 0.45, width: 3, dash: \"2 14\" },\n head: { cx: 253.9, cy: 130.1, rx: 13, ry: 20, rotate: -25 },\n tongue: { d: \"M245.4,112.0 L242.0,104.8 L235.0,101.5 M242.0,104.8 L244.0,97.3\", color: \"#f472b6\" },\n eye: { cx: 256.3, cy: 123.5, r: 4.5, color: \"#fdf4ff\" },\n flame: {\n translate: [127, 120] as const,\n scale: 4.4,\n d: \"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\",\n },\n} as const;\n","import * as React from \"react\";\nimport { Animated, Easing, type StyleProp, StyleSheet, View, type ViewStyle } from \"react-native\";\nimport Svg, { Circle, Defs, LinearGradient, Rect, Stop } from \"react-native-svg\";\n\nimport { useReducedMotion, useSvgId, useTheme } from \"./theme\";\n\nconst AnimatedCircle = Animated.createAnimatedComponent(Circle);\n\nexport type ProgressProps = {\n /** `bar` (default) or `ring`. */\n variant?: \"bar\" | \"ring\";\n size?: \"sm\" | \"md\" | \"lg\";\n /** How far, between 0 and `max`. `null` or absent: indeterminate (a wait of unknown length). */\n value?: number | null;\n max?: number;\n /** The accessible name — passed translated (\"Upload\", \"Raised towards the goal\"). */\n label: string;\n /** The value in words for screen readers (\"$420 of $1,000\") — default: the percentage. */\n valueText?: string;\n /** A ring's centre: an amount, a percentage, an icon. */\n children?: React.ReactNode;\n style?: StyleProp<ViewStyle>;\n};\n\nconst BAR = { sm: 4, md: 8, lg: 12 } as const;\nconst RING = { sm: 40, md: 80, lg: 144 } as const;\nconst STROKE = { sm: 12, md: 9, lg: 7 } as const; // in a 100-unit box, as on the web\n\n/**\n * A progress bar or ring in the accent gradient (`accent` → `accent2`): it moves to `value` / `max` when it changes,\n * indeterminate without a value. Still under reduced motion. A `progressbar` with its value for screen readers.\n */\nexport function Progress({ variant = \"bar\", size = \"md\", value, max = 100, label, valueText, children, style }: ProgressProps) {\n const { theme } = useTheme();\n const reduce = useReducedMotion();\n const id = useSvgId(\"kz-progress-\");\n const known = typeof value === \"number\" && Number.isFinite(value);\n const ratio = known ? Math.min(1, Math.max(0, value / (max || 1))) : 0;\n const percent = Math.round(ratio * 100);\n\n const [progress] = React.useState(() => new Animated.Value(ratio));\n const [spin] = React.useState(() => new Animated.Value(0));\n const [track, setTrack] = React.useState(0);\n React.useEffect(() => {\n if (reduce) {\n progress.setValue(ratio);\n return;\n }\n const animation = Animated.timing(progress, { toValue: ratio, duration: 700, easing: Easing.out(Easing.cubic), useNativeDriver: false });\n animation.start();\n return () => animation.stop();\n }, [ratio, reduce, progress]);\n React.useEffect(() => {\n if (known || reduce) return;\n const loop = Animated.loop(Animated.timing(spin, { toValue: 1, duration: 1200, easing: Easing.linear, useNativeDriver: true }));\n loop.start();\n return () => {\n loop.stop();\n spin.setValue(0);\n };\n }, [known, reduce, spin]);\n\n const a11y = {\n accessible: true,\n role: \"progressbar\" as const,\n \"aria-label\": label,\n \"aria-valuemin\": known ? 0 : undefined,\n \"aria-valuemax\": known ? max : undefined,\n \"aria-valuenow\": known ? Math.min(max, Math.max(0, value)) : undefined,\n \"aria-valuetext\": known ? (valueText ?? `${percent}%`) : valueText,\n };\n const gradient = (\n <Defs>\n <LinearGradient id={id} x1=\"0\" y1=\"0\" x2=\"1\" y2={variant === \"ring\" ? \"1\" : \"0\"}>\n <Stop offset=\"0\" stopColor={theme.accent} />\n <Stop offset=\"1\" stopColor={theme.accent2} />\n </LinearGradient>\n </Defs>\n );\n\n if (variant === \"ring\") {\n const side = RING[size];\n const stroke = STROKE[size];\n const r = 50 - stroke / 2;\n const circumference = 2 * Math.PI * r;\n const offset = known ? progress.interpolate({ inputRange: [0, 1], outputRange: [circumference, 0] }) : circumference * 0.75;\n const rotate = spin.interpolate({ inputRange: [0, 1], outputRange: [\"0deg\", \"360deg\"] });\n return (\n <View {...a11y} style={[styles.ring, { width: side, height: side }, style]}>\n <Animated.View style={[StyleSheet.absoluteFill, { transform: [{ rotate: known ? \"-90deg\" : rotate }] }]}>\n <Svg width={side} height={side} viewBox=\"0 0 100 100\">\n {gradient}\n <Circle cx={50} cy={50} r={r} fill=\"none\" stroke={theme.borderDefault} strokeWidth={stroke} />\n <AnimatedCircle\n cx={50}\n cy={50}\n r={r}\n fill=\"none\"\n stroke={`url(#${id})`}\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={`${circumference} ${circumference}`}\n strokeDashoffset={offset}\n />\n </Svg>\n </Animated.View>\n {children}\n </View>\n );\n }\n\n const width = known ? progress.interpolate({ inputRange: [0, 1], outputRange: [\"0%\", \"100%\"] }) : \"40%\";\n // Indeterminate: a 40 % segment crosses the track (measured, so the motion runs on the native driver in points).\n const translate = spin.interpolate({ inputRange: [0, 1], outputRange: [-0.4 * track, track] });\n return (\n <View\n {...a11y}\n onLayout={known ? undefined : (event) => setTrack(event.nativeEvent.layout.width)}\n style={[styles.bar, { height: BAR[size], backgroundColor: theme.surface3 }, style]}\n >\n <Animated.View style={[styles.fill, { width }, known || reduce ? null : { transform: [{ translateX: translate }] }]}>\n <Svg width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\">\n {gradient}\n <Rect x={0} y={0} width=\"100%\" height=\"100%\" fill={`url(#${id})`} />\n </Svg>\n </Animated.View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n ring: { alignItems: \"center\", justifyContent: \"center\" },\n bar: { width: \"100%\", overflow: \"hidden\", borderRadius: 9999 },\n fill: { height: \"100%\", overflow: \"hidden\", borderRadius: 9999 },\n});\n","import * as React from \"react\";\nimport { Pressable, type StyleProp, StyleSheet, Text, View, type ViewStyle } from \"react-native\";\n\nimport { useTheme } from \"./theme\";\n\nexport type SegmentedOption<T extends string> = { value: T; label: string; disabled?: boolean };\n\nexport type SegmentedProps<T extends string> = {\n /** The views, in order; `label` passed translated. */\n options: readonly SegmentedOption<T>[];\n value: T;\n onValueChange: (value: T) => void;\n size?: \"sm\" | \"md\";\n /** The accessible name of the tab list — passed translated. */\n \"aria-label\"?: string;\n style?: StyleProp<ViewStyle>;\n};\n\n/**\n * Switches between views of one screen: equal segments on a track, the chosen one raised — the web\n * `Tabs variant=\"segmented\"`. A tab list for screen readers. To filter a list, use `Chip.Group`.\n */\nexport function Segmented<T extends string>({ options, value, onValueChange, size = \"md\", \"aria-label\": label, style }: SegmentedProps<T>) {\n const { theme, radius } = useTheme();\n return (\n <View\n role=\"tablist\"\n aria-label={label}\n style={[styles.track, { backgroundColor: theme.surface2, borderColor: theme.borderSubtle, borderRadius: radius.md, height: size === \"sm\" ? 32 : 40 }, style]}\n >\n {options.map((option) => {\n const selected = option.value === value;\n return (\n <Pressable\n key={option.value}\n role=\"tab\"\n aria-selected={selected}\n aria-disabled={option.disabled}\n disabled={option.disabled}\n onPress={() => {\n if (!selected) onValueChange(option.value);\n }}\n style={[\n styles.segment,\n { borderRadius: radius.sm },\n selected ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault } : null,\n option.disabled ? styles.disabled : null,\n ]}\n >\n <Text numberOfLines={1} style={[styles.label, { color: selected ? theme.textPrimary : theme.textSecondary, fontSize: size === \"sm\" ? 12 : 13 }]}>\n {option.label}\n </Text>\n </Pressable>\n );\n })}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n track: { flexDirection: \"row\", padding: 3, gap: 3, borderWidth: StyleSheet.hairlineWidth },\n segment: { flex: 1, alignItems: \"center\", justifyContent: \"center\", paddingHorizontal: 8, borderWidth: StyleSheet.hairlineWidth, borderColor: \"transparent\" },\n label: { fontWeight: \"600\" },\n disabled: { opacity: 0.4 },\n});\n","import * as React from \"react\";\nimport { Animated, type DimensionValue, type StyleProp, type ViewStyle } from \"react-native\";\n\nimport { useReducedMotion, useTheme } from \"./theme\";\n\nexport type SkeletonProps = {\n /** `text` (a line), `circle` (an avatar), `rect` (a media, a card). */\n shape?: \"text\" | \"circle\" | \"rect\";\n width?: DimensionValue;\n height?: DimensionValue;\n style?: StyleProp<ViewStyle>;\n testID?: string;\n};\n\nconst SHAPE = {\n text: { width: \"100%\", height: 12, radius: 4 },\n circle: { width: 40, height: 40, radius: 9999 },\n rect: { width: \"100%\", height: 96, radius: 12 },\n} as const;\n\n/** A pulsing placeholder the size of what is loading — hidden from screen readers; still when the system reduces motion. */\nexport function Skeleton({ shape = \"text\", width, height, style, testID }: SkeletonProps) {\n const { theme } = useTheme();\n const reduce = useReducedMotion();\n const [opacity] = React.useState(() => new Animated.Value(1));\n React.useEffect(() => {\n if (reduce) return;\n const loop = Animated.loop(\n Animated.sequence([\n Animated.timing(opacity, { toValue: 0.5, duration: 900, useNativeDriver: true }),\n Animated.timing(opacity, { toValue: 1, duration: 900, useNativeDriver: true }),\n ]),\n );\n loop.start();\n return () => {\n loop.stop();\n opacity.setValue(1);\n };\n }, [reduce, opacity]);\n const s = SHAPE[shape];\n const side = shape === \"circle\" ? (width ?? height ?? s.width) : undefined;\n return (\n <Animated.View\n testID={testID}\n aria-hidden\n style={[\n { width: side ?? width ?? s.width, height: side ?? height ?? s.height, borderRadius: s.radius, backgroundColor: theme.surface3, opacity },\n style,\n ]}\n />\n );\n}\n","import * as React from \"react\";\nimport { ActivityIndicator, type ActivityIndicatorProps } from \"react-native\";\n\nimport { useTheme } from \"./theme\";\n\nexport type SpinnerProps = Omit<ActivityIndicatorProps, \"size\" | \"color\"> & {\n /** The accessible name of the wait, e.g. \"Loading\" — passed translated. */\n label: string;\n size?: \"sm\" | \"md\" | \"lg\";\n};\n\n/** An indeterminate wait: the platform's activity indicator in the accent, named by `label`. */\nexport function Spinner({ label, size = \"md\", ...props }: SpinnerProps) {\n const { theme } = useTheme();\n return (\n <ActivityIndicator\n accessible\n role=\"progressbar\"\n aria-label={label}\n {...props}\n size={size === \"lg\" ? \"large\" : \"small\"}\n color={theme.accent}\n style={[size === \"sm\" ? { transform: [{ scale: 0.75 }] } : null, props.style]}\n />\n );\n}\n","import * as React from \"react\";\nimport { AccessibilityInfo, Animated, Pressable, StyleSheet, Text, View } from \"react-native\";\n\nimport { useReducedMotion, useTheme } from \"./theme\";\nimport { Txt } from \"./txt\";\n\nexport type ToastTone = \"default\" | \"success\" | \"warning\" | \"error\" | \"info\";\n\nexport type ToastOptions = {\n /** Replaces a toast with the same id (a notification shown once). */\n id?: string;\n description?: string;\n tone?: ToastTone;\n /** A decorative icon before the text. */\n icon?: React.ReactNode;\n /** Milliseconds on screen; `Infinity` keeps it until dismissed. Default: the Toaster's `duration`. */\n duration?: number;\n /** Pressing the toast (opening what it is about); it is then dismissed. */\n onPress?: () => void;\n /** A button inside the toast; it is then dismissed. */\n action?: { label: string; onPress: () => void };\n /** Called once the toast leaves, whatever the reason. */\n onDismiss?: () => void;\n};\n\nexport type ToastItem = ToastOptions & { id: string; title: string };\n\n// One queue for the app, outside React: `toast()` can be called from anywhere (a stream handler, a mutation).\nlet items: readonly ToastItem[] = [];\nconst listeners = new Set<() => void>();\nlet counter = 0;\nconst emit = () => listeners.forEach((listener) => listener());\nconst subscribe = (listener: () => void) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n};\nconst snapshot = () => items;\n\nfunction show(title: string, options: ToastOptions = {}): string {\n const id = options.id ?? `kz-toast-${++counter}`;\n const item: ToastItem = { ...options, id, title };\n items = items.some((t) => t.id === id) ? items.map((t) => (t.id === id ? item : t)) : [...items, item];\n emit();\n return id;\n}\n\nfunction dismiss(id?: string) {\n const gone = items.filter((t) => id === undefined || t.id === id);\n if (gone.length === 0) return;\n items = id === undefined ? [] : items.filter((t) => t.id !== id);\n emit();\n gone.forEach((t) => t.onDismiss?.());\n}\n\nconst tone = (name: ToastTone) => (title: string, options?: Omit<ToastOptions, \"tone\">) => show(title, { ...options, tone: name });\n\n/** `toast(title, options)`, `toast.success/warning/error/info(…)`, `toast.dismiss(id?)` — the web `toast`'s names. */\nexport const toast = Object.assign(show, {\n success: tone(\"success\"),\n warning: tone(\"warning\"),\n error: tone(\"error\"),\n info: tone(\"info\"),\n dismiss,\n});\n\nexport type ToasterProps = {\n /** The accessible name of each toast's close button — passed translated. */\n closeLabel: string;\n position?: \"top\" | \"bottom\";\n /** Distance from the edge, e.g. the safe-area inset + a margin (no safe-area dependency here). */\n offset?: number;\n /** Default milliseconds on screen. */\n duration?: number;\n /** At most this many on screen; the oldest leave first. */\n max?: number;\n};\n\nfunction ToastView({ item, closeLabel, duration }: { item: ToastItem; closeLabel: string; duration: number }) {\n const { theme, radius } = useTheme();\n const reduce = useReducedMotion();\n const [enter] = React.useState(() => new Animated.Value(reduce ? 1 : 0));\n React.useEffect(() => {\n if (reduce) enter.setValue(1);\n else Animated.timing(enter, { toValue: 1, duration: 220, useNativeDriver: true }).start();\n }, [enter, reduce]);\n React.useEffect(() => {\n AccessibilityInfo.announceForAccessibility(item.description ? `${item.title}. ${item.description}` : item.title);\n }, [item.title, item.description]);\n const ms = item.duration ?? duration;\n React.useEffect(() => {\n if (!Number.isFinite(ms)) return;\n const timer = setTimeout(() => dismiss(item.id), ms);\n return () => clearTimeout(timer);\n }, [item.id, ms]);\n const edge = { success: theme.success, warning: theme.warning, error: theme.danger, info: theme.info, default: theme.borderDefault }[item.tone ?? \"default\"];\n // The text (with its icon) is the pressable part; the action and the close button sit beside it, never inside.\n const text = (\n <>\n {item.icon ? <View aria-hidden>{item.icon}</View> : null}\n <View style={styles.content}>\n <Txt variant=\"label\" numberOfLines={2}>\n {item.title}\n </Txt>\n {item.description ? (\n <Txt variant=\"caption\" tone=\"secondary\" numberOfLines={3}>\n {item.description}\n </Txt>\n ) : null}\n </View>\n </>\n );\n const body = (\n <>\n {item.onPress ? (\n <Pressable\n role=\"button\"\n onPress={() => {\n item.onPress?.();\n dismiss(item.id);\n }}\n style={({ pressed }) => [styles.main, { opacity: pressed ? 0.8 : 1 }]}\n >\n {text}\n </Pressable>\n ) : (\n <View style={styles.main}>{text}</View>\n )}\n {item.action ? (\n <Pressable\n role=\"button\"\n onPress={() => {\n item.action?.onPress();\n dismiss(item.id);\n }}\n style={[styles.action, { backgroundColor: theme.accent, borderRadius: radius.sm }]}\n >\n <Text style={[styles.actionLabel, { color: theme.onAccent }]}>{item.action.label}</Text>\n </Pressable>\n ) : null}\n <Pressable role=\"button\" aria-label={closeLabel} hitSlop={10} onPress={() => dismiss(item.id)} style={styles.close}>\n <Text style={[styles.cross, { color: theme.textSecondary }]}>×</Text>\n </Pressable>\n </>\n );\n const frame = [\n styles.toast,\n { backgroundColor: theme.surface2, borderColor: theme.borderDefault, borderLeftColor: edge, borderRadius: radius.lg, shadowColor: theme.scrimStrong },\n ];\n // A slide only, never a fade: the text is legible (and its contrast measurable) from the first frame.\n const motion = { transform: [{ translateY: enter.interpolate({ inputRange: [0, 1], outputRange: [-8, 0] }) }] };\n return (\n <Animated.View aria-live=\"polite\" style={motion}>\n <View style={frame}>{body}</View>\n </Animated.View>\n );\n}\n\n/** Mount once, at the root (inside `ThemeProvider`). Then call `toast()` from anywhere. */\nexport function Toaster({ closeLabel, position = \"top\", offset = 12, duration = 6000, max = 3 }: ToasterProps) {\n const all = React.useSyncExternalStore(subscribe, snapshot, snapshot);\n const shown = all.slice(-max);\n if (shown.length === 0) return null;\n return (\n <View pointerEvents=\"box-none\" style={[styles.stack, position === \"top\" ? { top: offset } : { bottom: offset }]}>\n {(position === \"top\" ? shown : [...shown].reverse()).map((item) => (\n <ToastView key={item.id} item={item} closeLabel={closeLabel} duration={duration} />\n ))}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n stack: { position: \"absolute\", left: 12, right: 12, gap: 8, zIndex: 100 },\n toast: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n padding: 12,\n borderWidth: StyleSheet.hairlineWidth,\n borderLeftWidth: 4,\n shadowOpacity: 0.3,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: 8 },\n elevation: 8,\n },\n main: { flex: 1, flexDirection: \"row\", alignItems: \"center\", gap: 10 },\n content: { flex: 1, gap: 2 },\n action: { paddingHorizontal: 12, paddingVertical: 6 },\n actionLabel: { fontSize: 12, fontWeight: \"700\" },\n close: { width: 28, height: 28, alignItems: \"center\", justifyContent: \"center\" },\n cross: { fontSize: 18, lineHeight: 20, fontWeight: \"700\" },\n});\n"],"mappings":"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","names":["React","themes","radius","motion","jsx","items","React","StyleSheet","Text","jsx","jsxs","tone","styles","Text","StyleSheet","StyleSheet","View","StyleSheet","Text","jsx","tone","Text","styles","StyleSheet","jsx","jsxs","look","radius","styles","View","StyleSheet","Image","Pressable","StyleSheet","View","jsx","tone","radius","styles","View","Pressable","StyleSheet","Image","PADDING","React","Pressable","StyleSheet","Text","View","jsx","jsxs","Text","styles","radius","on","_r","disabled","_s","style","children","rest","View","Pressable","StyleSheet","React","Animated","StyleSheet","Text","jsx","jsxs","Animated","styles","Text","StyleSheet","StyleSheet","View","jsx","jsxs","View","styles","StyleSheet","useEffect","useState","AccessibilityInfo","Animated","View","jsx","jsxs","useState","Animated","useEffect","AccessibilityInfo","View","React","Animated","Easing","StyleSheet","View","Svg","Circle","Defs","LinearGradient","Stop","jsx","jsxs","Animated","Circle","Easing","Defs","LinearGradient","Stop","View","styles","StyleSheet","Svg","Pressable","StyleSheet","Text","View","jsx","radius","View","styles","Pressable","Text","StyleSheet","React","Animated","jsx","Animated","ActivityIndicator","jsx","ActivityIndicator","React","AccessibilityInfo","Animated","Pressable","StyleSheet","Text","View","Fragment","jsx","jsxs","listeners","subscribe","radius","Animated","AccessibilityInfo","timer","View","styles","Pressable","Text","motion","StyleSheet"]}
|
package/dist/page-header.d.ts
CHANGED
|
@@ -63,7 +63,9 @@ declare const pageHeader: tailwind_variants.TVReturnType<{
|
|
|
63
63
|
actions: string;
|
|
64
64
|
}>>;
|
|
65
65
|
type PageHeaderProps = Omit<React.ComponentProps<"div">, "title"> & {
|
|
66
|
+
/** The title of the page (an `h1`, or `as="h2"`). */
|
|
66
67
|
title: React.ReactNode;
|
|
68
|
+
/** A sentence under the title. */
|
|
67
69
|
description?: React.ReactNode;
|
|
68
70
|
/** The page's actions: Buttons, a DropdownMenu. */
|
|
69
71
|
actions?: React.ReactNode;
|
package/dist/page-header.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/page-header/page-header.tsx"],"sourcesContent":["// Server-safe. The top of a page: an optional breadcrumb, the title (h1), a description and the page's actions.\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const pageHeader = tv({\n slots: {\n root: \"flex flex-col gap-3 border-b border-border-subtle pb-6\",\n breadcrumb: \"text-xs text-fg-secondary\",\n row: \"flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between\",\n text: \"flex min-w-0 flex-col gap-1.5\",\n title: \"font-display text-2xl font-black tracking-tight text-fg sm:text-3xl\",\n description: \"max-w-2xl text-sm text-fg-secondary\",\n actions: \"flex shrink-0 flex-wrap items-center gap-2\",\n },\n});\nconst s = pageHeader();\n\nexport type PageHeaderProps = Omit<React.ComponentProps<\"div\">, \"title\"> & {\n title: React.ReactNode;\n description?: React.ReactNode;\n /** The page's actions: Buttons, a DropdownMenu. */\n actions?: React.ReactNode;\n /** A breadcrumb (the product's own <nav aria-label>), shown above the title. */\n breadcrumb?: React.ReactNode;\n /** The heading level of the title: `h1` for a page, `h2` for a section that looks like one. */\n as?: \"h1\" | \"h2\";\n};\n\nexport function PageHeader({ title, description, actions, breadcrumb, as: Heading = \"h1\", className, ...props }: PageHeaderProps) {\n return (\n <div className={s.root({ className })} {...props}>\n {breadcrumb && <div className={s.breadcrumb()}>{breadcrumb}</div>}\n <div className={s.row()}>\n <div className={s.text()}>\n <Heading className={s.title()}>{title}</Heading>\n {description && <p className={s.description()}>{description}</p>}\n </div>\n {actions && <div className={s.actions()}>{actions}</div>}\n </div>\n </div>\n );\n}\n"],"mappings":";AAEA,SAAS,UAAU;
|
|
1
|
+
{"version":3,"sources":["../src/page-header/page-header.tsx"],"sourcesContent":["// Server-safe. The top of a page: an optional breadcrumb, the title (h1), a description and the page's actions.\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const pageHeader = tv({\n slots: {\n root: \"flex flex-col gap-3 border-b border-border-subtle pb-6\",\n breadcrumb: \"text-xs text-fg-secondary\",\n row: \"flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between\",\n text: \"flex min-w-0 flex-col gap-1.5\",\n title: \"font-display text-2xl font-black tracking-tight text-fg sm:text-3xl\",\n description: \"max-w-2xl text-sm text-fg-secondary\",\n actions: \"flex shrink-0 flex-wrap items-center gap-2\",\n },\n});\nconst s = pageHeader();\n\nexport type PageHeaderProps = Omit<React.ComponentProps<\"div\">, \"title\"> & {\n /** The title of the page (an `h1`, or `as=\"h2\"`). */\n title: React.ReactNode;\n /** A sentence under the title. */\n description?: React.ReactNode;\n /** The page's actions: Buttons, a DropdownMenu. */\n actions?: React.ReactNode;\n /** A breadcrumb (the product's own <nav aria-label>), shown above the title. */\n breadcrumb?: React.ReactNode;\n /** The heading level of the title: `h1` for a page, `h2` for a section that looks like one. */\n as?: \"h1\" | \"h2\";\n};\n\nexport function PageHeader({ title, description, actions, breadcrumb, as: Heading = \"h1\", className, ...props }: PageHeaderProps) {\n return (\n <div className={s.root({ className })} {...props}>\n {breadcrumb && <div className={s.breadcrumb()}>{breadcrumb}</div>}\n <div className={s.row()}>\n <div className={s.text()}>\n <Heading className={s.title()}>{title}</Heading>\n {description && <p className={s.description()}>{description}</p>}\n </div>\n {actions && <div className={s.actions()}>{actions}</div>}\n </div>\n </div>\n );\n}\n"],"mappings":";AAEA,SAAS,UAAU;AA+BE,cAEb,YAFa;AA7Bd,IAAM,aAAa,GAAG;AAAA,EAC3B,OAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AACF,CAAC;AACD,IAAM,IAAI,WAAW;AAed,SAAS,WAAW,EAAE,OAAO,aAAa,SAAS,YAAY,IAAI,UAAU,MAAM,WAAW,GAAG,MAAM,GAAoB;AAChI,SACE,qBAAC,SAAI,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OACxC;AAAA,kBAAc,oBAAC,SAAI,WAAW,EAAE,WAAW,GAAI,sBAAW;AAAA,IAC3D,qBAAC,SAAI,WAAW,EAAE,IAAI,GACpB;AAAA,2BAAC,SAAI,WAAW,EAAE,KAAK,GACrB;AAAA,4BAAC,WAAQ,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,QACrC,eAAe,oBAAC,OAAE,WAAW,EAAE,YAAY,GAAI,uBAAY;AAAA,SAC9D;AAAA,MACC,WAAW,oBAAC,SAAI,WAAW,EAAE,QAAQ,GAAI,mBAAQ;AAAA,OACpD;AAAA,KACF;AAEJ;","names":[]}
|
package/dist/progress.d.ts
CHANGED
|
@@ -71,8 +71,13 @@ declare const progress: tailwind_variants.TVReturnType<{
|
|
|
71
71
|
}>>;
|
|
72
72
|
type ProgressVariants = VariantProps<typeof progress>;
|
|
73
73
|
type ProgressProps = Omit<React.ComponentProps<"div">, "children"> & ProgressVariants & {
|
|
74
|
+
/** bar · ring (a ring holds its `children` in the centre). */
|
|
75
|
+
variant?: ProgressVariants["variant"];
|
|
76
|
+
/** sm · md · lg: the bar's thickness, the ring's diameter. */
|
|
77
|
+
size?: ProgressVariants["size"];
|
|
74
78
|
/** How far, between 0 and `max`. `null` or absent: indeterminate (a wait of unknown length). */
|
|
75
79
|
value?: number | null;
|
|
80
|
+
/** The value that means complete. */
|
|
76
81
|
max?: number;
|
|
77
82
|
/** The accessible name — passed translated ("Upload", "Raised towards the goal"). */
|
|
78
83
|
label: string;
|
package/dist/progress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/progress/progress.tsx"],"sourcesContent":["// Server-safe: no hook, no context. role=\"progressbar\" with aria-valuenow / aria-valuemax (none when indeterminate),\n// named by `label`. A bar or a ring; the ring can hold content in its centre (an amount, a percentage).\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const progress = tv({\n slots: {\n root: \"relative\",\n track: \"\",\n indicator: \"\",\n center: \"absolute inset-0 flex flex-col items-center justify-center text-center\",\n },\n variants: {\n variant: {\n bar: {\n root: \"w-full overflow-hidden rounded-full bg-surface-3\",\n indicator:\n \"kz-progress h-full rounded-full bg-linear-to-r from-accent to-accent-2 transition-[width] duration-500 motion-reduce:transition-none \" +\n \"data-[state=indeterminate]:w-2/5\",\n },\n ring: {\n root: \"inline-flex shrink-0 items-center justify-center\",\n track: \"stroke-border-default\",\n indicator:\n \"stroke-accent transition-[stroke-dashoffset] duration-1000 motion-reduce:transition-none \" +\n \"data-[state=indeterminate]:origin-center data-[state=indeterminate]:animate-spin motion-reduce:data-[state=indeterminate]:animate-none\",\n },\n },\n size: { sm: {}, md: {}, lg: {} },\n },\n compoundVariants: [\n { variant: \"bar\", size: \"sm\", class: { root: \"h-1\" } },\n { variant: \"bar\", size: \"md\", class: { root: \"h-2\" } },\n { variant: \"bar\", size: \"lg\", class: { root: \"h-3\" } },\n { variant: \"ring\", size: \"sm\", class: { root: \"h-10 w-10\" } },\n { variant: \"ring\", size: \"md\", class: { root: \"h-20 w-20\" } },\n { variant: \"ring\", size: \"lg\", class: { root: \"h-36 w-36\" } },\n ],\n defaultVariants: { variant: \"bar\", size: \"md\" },\n});\n\nexport type ProgressVariants = VariantProps<typeof progress>;\n\nexport type ProgressProps = Omit<React.ComponentProps<\"div\">, \"children\"> &\n ProgressVariants & {\n /** How far, between 0 and `max`. `null` or absent: indeterminate (a wait of unknown length). */\n value?: number | null;\n max?: number;\n /** The accessible name — passed translated (\"Upload\", \"Raised towards the goal\"). */\n label: string;\n /** The value in words for assistive technology (\"$420 of $1,000\") — default: the percentage. */\n valueText?: string;\n /** A ring's centre: an amount, a percentage, an icon. */\n children?: React.ReactNode;\n };\n\nconst STROKE = { sm: 12, md: 9, lg: 7 } as const;\n\n/** A progress bar or ring: `value` / `max`, indeterminate without a value. State: `data-state` (loading · complete · indeterminate). */\nexport function Progress({ variant = \"bar\", size = \"md\", value, max = 100, label, valueText, className, children, ...props }: ProgressProps) {\n const s = progress({ variant, size });\n const known = typeof value === \"number\" && Number.isFinite(value);\n const ratio = known ? Math.min(1, Math.max(0, value / (max || 1))) : 0;\n const percent = Math.round(ratio * 100);\n const state = !known ? \"indeterminate\" : ratio >= 1 ? \"complete\" : \"loading\";\n const aria = {\n role: \"progressbar\" as const,\n \"aria-label\": label,\n \"aria-valuemin\": known ? 0 : undefined,\n \"aria-valuemax\": known ? max : undefined,\n \"aria-valuenow\": known ? Math.min(max, Math.max(0, value)) : undefined,\n \"aria-valuetext\": known ? (valueText ?? `${percent}%`) : valueText,\n \"data-state\": state,\n \"data-value\": known ? value : undefined,\n \"data-variant\": variant,\n };\n if (variant === \"ring\") {\n const stroke = STROKE[size];\n const r = 50 - stroke / 2;\n return (\n <div {...aria} className={s.root({ className })} {...props}>\n <svg viewBox=\"0 0 100 100\" className=\"h-full w-full -rotate-90\" aria-hidden>\n <circle cx=\"50\" cy=\"50\" r={r} fill=\"none\" strokeWidth={stroke} className={s.track()} />\n <circle\n cx=\"50\"\n cy=\"50\"\n r={r}\n fill=\"none\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n pathLength={100}\n strokeDasharray={100}\n strokeDashoffset={known ? 100 - percent : 75}\n data-state={state}\n className={s.indicator()}\n />\n </svg>\n {children !== undefined && <div className={s.center()}>{children}</div>}\n </div>\n );\n }\n return (\n <div {...aria} className={s.root({ className })} {...props}>\n <div data-state={state} className={s.indicator()} style={known ? { width: `${ratio * 100}%` } : undefined} />\n </div>\n );\n}\n"],"mappings":";AAGA,SAAS,UAA6B;
|
|
1
|
+
{"version":3,"sources":["../src/progress/progress.tsx"],"sourcesContent":["// Server-safe: no hook, no context. role=\"progressbar\" with aria-valuenow / aria-valuemax (none when indeterminate),\n// named by `label`. A bar or a ring; the ring can hold content in its centre (an amount, a percentage).\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const progress = tv({\n slots: {\n root: \"relative\",\n track: \"\",\n indicator: \"\",\n center: \"absolute inset-0 flex flex-col items-center justify-center text-center\",\n },\n variants: {\n variant: {\n bar: {\n root: \"w-full overflow-hidden rounded-full bg-surface-3\",\n indicator:\n \"kz-progress h-full rounded-full bg-linear-to-r from-accent to-accent-2 transition-[width] duration-500 motion-reduce:transition-none \" +\n \"data-[state=indeterminate]:w-2/5\",\n },\n ring: {\n root: \"inline-flex shrink-0 items-center justify-center\",\n track: \"stroke-border-default\",\n indicator:\n \"stroke-accent transition-[stroke-dashoffset] duration-1000 motion-reduce:transition-none \" +\n \"data-[state=indeterminate]:origin-center data-[state=indeterminate]:animate-spin motion-reduce:data-[state=indeterminate]:animate-none\",\n },\n },\n size: { sm: {}, md: {}, lg: {} },\n },\n compoundVariants: [\n { variant: \"bar\", size: \"sm\", class: { root: \"h-1\" } },\n { variant: \"bar\", size: \"md\", class: { root: \"h-2\" } },\n { variant: \"bar\", size: \"lg\", class: { root: \"h-3\" } },\n { variant: \"ring\", size: \"sm\", class: { root: \"h-10 w-10\" } },\n { variant: \"ring\", size: \"md\", class: { root: \"h-20 w-20\" } },\n { variant: \"ring\", size: \"lg\", class: { root: \"h-36 w-36\" } },\n ],\n defaultVariants: { variant: \"bar\", size: \"md\" },\n});\n\nexport type ProgressVariants = VariantProps<typeof progress>;\n\nexport type ProgressProps = Omit<React.ComponentProps<\"div\">, \"children\"> &\n ProgressVariants & {\n /** bar · ring (a ring holds its `children` in the centre). */\n variant?: ProgressVariants[\"variant\"];\n /** sm · md · lg: the bar's thickness, the ring's diameter. */\n size?: ProgressVariants[\"size\"];\n /** How far, between 0 and `max`. `null` or absent: indeterminate (a wait of unknown length). */\n value?: number | null;\n /** The value that means complete. */\n max?: number;\n /** The accessible name — passed translated (\"Upload\", \"Raised towards the goal\"). */\n label: string;\n /** The value in words for assistive technology (\"$420 of $1,000\") — default: the percentage. */\n valueText?: string;\n /** A ring's centre: an amount, a percentage, an icon. */\n children?: React.ReactNode;\n };\n\nconst STROKE = { sm: 12, md: 9, lg: 7 } as const;\n\n/** A progress bar or ring: `value` / `max`, indeterminate without a value. State: `data-state` (loading · complete · indeterminate). */\nexport function Progress({ variant = \"bar\", size = \"md\", value, max = 100, label, valueText, className, children, ...props }: ProgressProps) {\n const s = progress({ variant, size });\n const known = typeof value === \"number\" && Number.isFinite(value);\n const ratio = known ? Math.min(1, Math.max(0, value / (max || 1))) : 0;\n const percent = Math.round(ratio * 100);\n const state = !known ? \"indeterminate\" : ratio >= 1 ? \"complete\" : \"loading\";\n const aria = {\n role: \"progressbar\" as const,\n \"aria-label\": label,\n \"aria-valuemin\": known ? 0 : undefined,\n \"aria-valuemax\": known ? max : undefined,\n \"aria-valuenow\": known ? Math.min(max, Math.max(0, value)) : undefined,\n \"aria-valuetext\": known ? (valueText ?? `${percent}%`) : valueText,\n \"data-state\": state,\n \"data-value\": known ? value : undefined,\n \"data-variant\": variant,\n };\n if (variant === \"ring\") {\n const stroke = STROKE[size];\n const r = 50 - stroke / 2;\n return (\n <div {...aria} className={s.root({ className })} {...props}>\n <svg viewBox=\"0 0 100 100\" className=\"h-full w-full -rotate-90\" aria-hidden>\n <circle cx=\"50\" cy=\"50\" r={r} fill=\"none\" strokeWidth={stroke} className={s.track()} />\n <circle\n cx=\"50\"\n cy=\"50\"\n r={r}\n fill=\"none\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n pathLength={100}\n strokeDasharray={100}\n strokeDashoffset={known ? 100 - percent : 75}\n data-state={state}\n className={s.indicator()}\n />\n </svg>\n {children !== undefined && <div className={s.center()}>{children}</div>}\n </div>\n );\n }\n return (\n <div {...aria} className={s.root({ className })} {...props}>\n <div data-state={state} className={s.indicator()} style={known ? { width: `${ratio * 100}%` } : undefined} />\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
package/dist/skeleton.d.ts
CHANGED
|
@@ -21,7 +21,13 @@ declare const skeletonVariants: tailwind_variants.TVReturnType<{
|
|
|
21
21
|
rect: "h-24 w-full rounded-lg";
|
|
22
22
|
};
|
|
23
23
|
}, undefined>>;
|
|
24
|
-
type SkeletonProps = React.ComponentProps<"span"> &
|
|
24
|
+
type SkeletonProps = React.ComponentProps<"span"> & {
|
|
25
|
+
/**
|
|
26
|
+
* text (a line) · circle (an avatar; give it a height) · rect (a media; give it a height).
|
|
27
|
+
* @default "text"
|
|
28
|
+
*/
|
|
29
|
+
shape?: VariantProps<typeof skeletonVariants>["shape"];
|
|
30
|
+
};
|
|
25
31
|
/** A pulsing shape the size of what is loading. Announce the wait elsewhere (aria-busy on the region, a Spinner). */
|
|
26
32
|
declare function Skeleton({ shape, className, ...props }: SkeletonProps): React.JSX.Element;
|
|
27
33
|
|
package/dist/skeleton.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/skeleton/skeleton.tsx"],"sourcesContent":["// Server-safe. A placeholder for content on its way: decorative, so hidden from assistive technology.\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const skeletonVariants = tv({\n base: \"block bg-surface-3 motion-safe:animate-pulse\",\n variants: {\n shape: { text: \"h-3 w-full rounded-sm\", circle: \"aspect-square h-10 rounded-full\", rect: \"h-24 w-full rounded-lg\" },\n },\n defaultVariants: { shape: \"text\" },\n});\n\nexport type SkeletonProps = React.ComponentProps<\"span\"> & VariantProps<typeof skeletonVariants
|
|
1
|
+
{"version":3,"sources":["../src/skeleton/skeleton.tsx"],"sourcesContent":["// Server-safe. A placeholder for content on its way: decorative, so hidden from assistive technology.\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const skeletonVariants = tv({\n base: \"block bg-surface-3 motion-safe:animate-pulse\",\n variants: {\n shape: { text: \"h-3 w-full rounded-sm\", circle: \"aspect-square h-10 rounded-full\", rect: \"h-24 w-full rounded-lg\" },\n },\n defaultVariants: { shape: \"text\" },\n});\n\nexport type SkeletonProps = React.ComponentProps<\"span\"> & {\n /**\n * text (a line) · circle (an avatar; give it a height) · rect (a media; give it a height).\n * @default \"text\"\n */\n shape?: VariantProps<typeof skeletonVariants>[\"shape\"];\n};\n\n/** A pulsing shape the size of what is loading. Announce the wait elsewhere (aria-busy on the region, a Spinner). */\nexport function Skeleton({ shape, className, ...props }: SkeletonProps) {\n return <span aria-hidden data-shape={shape ?? \"text\"} className={skeletonVariants({ shape, className })} {...props} />;\n}\n"],"mappings":";AAEA,SAAS,UAA6B;AAoB7B;AAlBF,IAAM,mBAAmB,GAAG;AAAA,EACjC,MAAM;AAAA,EACN,UAAU;AAAA,IACR,OAAO,EAAE,MAAM,yBAAyB,QAAQ,mCAAmC,MAAM,yBAAyB;AAAA,EACpH;AAAA,EACA,iBAAiB,EAAE,OAAO,OAAO;AACnC,CAAC;AAWM,SAAS,SAAS,EAAE,OAAO,WAAW,GAAG,MAAM,GAAkB;AACtE,SAAO,oBAAC,UAAK,eAAW,MAAC,cAAY,SAAS,QAAQ,WAAW,iBAAiB,EAAE,OAAO,UAAU,CAAC,GAAI,GAAG,OAAO;AACtH;","names":[]}
|
package/dist/slider.d.ts
CHANGED
|
@@ -67,7 +67,9 @@ type SliderValue = number | [number, number];
|
|
|
67
67
|
type SliderProps<V extends SliderValue = number> = Omit<React.ComponentProps<typeof Slider$1.Root>, "value" | "defaultValue" | "onValueChange" | "onValueCommit" | "children"> & {
|
|
68
68
|
/** One number (a thumb) or two (a range). Controlled with `onValueChange`. */
|
|
69
69
|
value?: V;
|
|
70
|
+
/** The value at first, uncontrolled: one number, or two for a range. */
|
|
70
71
|
defaultValue?: V;
|
|
72
|
+
/** Called on every move, with one number or two. */
|
|
71
73
|
onValueChange?: (value: V) => void;
|
|
72
74
|
/** Called once the drag or the key press ends. */
|
|
73
75
|
onValueCommit?: (value: V) => void;
|
package/dist/slider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/slider/slider.tsx"],"sourcesContent":["// Client. Radix Slider: role=\"slider\" on each thumb, arrows / Page Up / Page Down / Home / End, a range with two\n// thumbs. The words arrive as props: `label` names the thumb(s), `formatValue` gives the aria-valuetext and the value\n// shown next to a visible label.\nimport { Slider as SliderPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const slider = tv({\n slots: {\n root: \"flex flex-col gap-2\",\n header: \"flex items-baseline justify-between gap-3 text-xs font-semibold text-fg-secondary\",\n value: \"font-mono text-[11px] tabular-nums text-fg-secondary\",\n control:\n \"relative flex h-6 w-full touch-none select-none items-center data-disabled:cursor-not-allowed data-disabled:opacity-40\",\n track: \"relative h-1.5 w-full grow overflow-hidden rounded-full bg-surface-3\",\n range: \"absolute h-full rounded-full bg-linear-to-r from-accent to-accent-2\",\n thumb:\n \"block h-5 w-5 cursor-grab rounded-full border border-border-strong bg-fg-on-media shadow-md transition-[box-shadow] \" +\n \"focus-visible:outline-hidden focus-visible:ring-4 focus-visible:ring-ring/50 active:cursor-grabbing\",\n },\n});\n\nexport type SliderValue = number | [number, number];\n\nexport type SliderProps<V extends SliderValue = number> = Omit<\n React.ComponentProps<typeof SliderPrimitive.Root>,\n \"value\" | \"defaultValue\" | \"onValueChange\" | \"onValueCommit\" | \"children\"\n> & {\n /** One number (a thumb) or two (a range). Controlled with `onValueChange`. */\n value?: V;\n defaultValue?: V;\n onValueChange?: (value: V) => void;\n /** Called once the drag or the key press ends. */\n onValueCommit?: (value: V) => void;\n /** The accessible name — of the thumb, or of both thumbs of a range — passed translated. */\n label: string;\n /** For a range: each thumb's own name ([\"Minimum\", \"Maximum\"]), passed translated. */\n thumbLabels?: [string, string];\n /** The value as words (aria-valuetext) and as shown: \"1.5×\", \"−12 %\", \"3 min\". */\n formatValue?: (value: number) => string;\n /** Shows the label and the value above the track. Without it, `label` only names the thumb. */\n showLabel?: boolean;\n /** Fills from this value instead of the minimum (a ±range from 0: brightness, balance). One thumb only. */\n origin?: number;\n};\n\nconst toArray = (v: SliderValue | undefined) => (v === undefined ? undefined : typeof v === \"number\" ? [v] : v);\n\n/** A slider on one value or a range: `value`/`defaultValue` + `onValueChange`, `min`, `max`, `step`. */\nexport function Slider<V extends SliderValue = number>({\n value,\n defaultValue,\n onValueChange,\n onValueCommit,\n label,\n thumbLabels,\n formatValue = String,\n showLabel,\n origin,\n min = 0,\n max = 100,\n className,\n ...props\n}: SliderProps<V>) {\n const s = slider();\n const range = Array.isArray(value ?? defaultValue);\n const [inner, setInner] = React.useState(() => toArray(defaultValue) ?? [min]);\n const current = toArray(value) ?? inner;\n const out = (next: number[]) => (range ? next : next[0]) as V;\n const pct = (v: number) => ((v - min) / (max - min || 1)) * 100;\n const fill =\n origin !== undefined && !range\n ? { left: `${Math.min(pct(origin), pct(current[0]))}%`, right: `${100 - Math.max(pct(origin), pct(current[0]))}%` }\n : undefined;\n const id = React.useId();\n return (\n <div className={s.root({ className })} data-range={range ? \"\" : undefined}>\n {showLabel && (\n <div className={s.header()}>\n <span id={`${id}-label`}>{label}</span>\n <span className={s.value()} aria-hidden>\n {current.map(formatValue).join(\" – \")}\n </span>\n </div>\n )}\n <SliderPrimitive.Root\n min={min}\n max={max}\n value={current}\n onValueChange={(next) => {\n if (value === undefined) setInner(next);\n onValueChange?.(out(next));\n }}\n onValueCommit={onValueCommit && ((next) => onValueCommit(out(next)))}\n className={s.control()}\n {...props}\n >\n <SliderPrimitive.Track className={s.track()}>\n {fill ? <span data-origin=\"\" className={s.range()} style={fill} /> : <SliderPrimitive.Range className={s.range()} />}\n </SliderPrimitive.Track>\n {current.map((v, i) => (\n <SliderPrimitive.Thumb\n key={i}\n aria-label={range ? (thumbLabels?.[i] ?? label) : showLabel ? undefined : label}\n aria-labelledby={!range && showLabel ? `${id}-label` : undefined}\n aria-valuetext={formatValue(v)}\n className={s.thumb()}\n />\n ))}\n </SliderPrimitive.Root>\n </div>\n );\n}\n"],"mappings":";;;AAGA,SAAS,UAAU,uBAAuB;AAC1C,YAAY,WAAW;AACvB,SAAS,UAAU;
|
|
1
|
+
{"version":3,"sources":["../src/slider/slider.tsx"],"sourcesContent":["// Client. Radix Slider: role=\"slider\" on each thumb, arrows / Page Up / Page Down / Home / End, a range with two\n// thumbs. The words arrive as props: `label` names the thumb(s), `formatValue` gives the aria-valuetext and the value\n// shown next to a visible label.\nimport { Slider as SliderPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const slider = tv({\n slots: {\n root: \"flex flex-col gap-2\",\n header: \"flex items-baseline justify-between gap-3 text-xs font-semibold text-fg-secondary\",\n value: \"font-mono text-[11px] tabular-nums text-fg-secondary\",\n control:\n \"relative flex h-6 w-full touch-none select-none items-center data-disabled:cursor-not-allowed data-disabled:opacity-40\",\n track: \"relative h-1.5 w-full grow overflow-hidden rounded-full bg-surface-3\",\n range: \"absolute h-full rounded-full bg-linear-to-r from-accent to-accent-2\",\n thumb:\n \"block h-5 w-5 cursor-grab rounded-full border border-border-strong bg-fg-on-media shadow-md transition-[box-shadow] \" +\n \"focus-visible:outline-hidden focus-visible:ring-4 focus-visible:ring-ring/50 active:cursor-grabbing\",\n },\n});\n\nexport type SliderValue = number | [number, number];\n\nexport type SliderProps<V extends SliderValue = number> = Omit<\n React.ComponentProps<typeof SliderPrimitive.Root>,\n \"value\" | \"defaultValue\" | \"onValueChange\" | \"onValueCommit\" | \"children\"\n> & {\n /** One number (a thumb) or two (a range). Controlled with `onValueChange`. */\n value?: V;\n /** The value at first, uncontrolled: one number, or two for a range. */\n defaultValue?: V;\n /** Called on every move, with one number or two. */\n onValueChange?: (value: V) => void;\n /** Called once the drag or the key press ends. */\n onValueCommit?: (value: V) => void;\n /** The accessible name — of the thumb, or of both thumbs of a range — passed translated. */\n label: string;\n /** For a range: each thumb's own name ([\"Minimum\", \"Maximum\"]), passed translated. */\n thumbLabels?: [string, string];\n /** The value as words (aria-valuetext) and as shown: \"1.5×\", \"−12 %\", \"3 min\". */\n formatValue?: (value: number) => string;\n /** Shows the label and the value above the track. Without it, `label` only names the thumb. */\n showLabel?: boolean;\n /** Fills from this value instead of the minimum (a ±range from 0: brightness, balance). One thumb only. */\n origin?: number;\n};\n\nconst toArray = (v: SliderValue | undefined) => (v === undefined ? undefined : typeof v === \"number\" ? [v] : v);\n\n/** A slider on one value or a range: `value`/`defaultValue` + `onValueChange`, `min`, `max`, `step`. */\nexport function Slider<V extends SliderValue = number>({\n value,\n defaultValue,\n onValueChange,\n onValueCommit,\n label,\n thumbLabels,\n formatValue = String,\n showLabel,\n origin,\n min = 0,\n max = 100,\n className,\n ...props\n}: SliderProps<V>) {\n const s = slider();\n const range = Array.isArray(value ?? defaultValue);\n const [inner, setInner] = React.useState(() => toArray(defaultValue) ?? [min]);\n const current = toArray(value) ?? inner;\n const out = (next: number[]) => (range ? next : next[0]) as V;\n const pct = (v: number) => ((v - min) / (max - min || 1)) * 100;\n const fill =\n origin !== undefined && !range\n ? { left: `${Math.min(pct(origin), pct(current[0]))}%`, right: `${100 - Math.max(pct(origin), pct(current[0]))}%` }\n : undefined;\n const id = React.useId();\n return (\n <div className={s.root({ className })} data-range={range ? \"\" : undefined}>\n {showLabel && (\n <div className={s.header()}>\n <span id={`${id}-label`}>{label}</span>\n <span className={s.value()} aria-hidden>\n {current.map(formatValue).join(\" – \")}\n </span>\n </div>\n )}\n <SliderPrimitive.Root\n min={min}\n max={max}\n value={current}\n onValueChange={(next) => {\n if (value === undefined) setInner(next);\n onValueChange?.(out(next));\n }}\n onValueCommit={onValueCommit && ((next) => onValueCommit(out(next)))}\n className={s.control()}\n {...props}\n >\n <SliderPrimitive.Track className={s.track()}>\n {fill ? <span data-origin=\"\" className={s.range()} style={fill} /> : <SliderPrimitive.Range className={s.range()} />}\n </SliderPrimitive.Track>\n {current.map((v, i) => (\n <SliderPrimitive.Thumb\n key={i}\n aria-label={range ? (thumbLabels?.[i] ?? label) : showLabel ? undefined : label}\n aria-labelledby={!range && showLabel ? `${id}-label` : undefined}\n aria-valuetext={formatValue(v)}\n className={s.thumb()}\n />\n ))}\n </SliderPrimitive.Root>\n </div>\n );\n}\n"],"mappings":";;;AAGA,SAAS,UAAU,uBAAuB;AAC1C,YAAY,WAAW;AACvB,SAAS,UAAU;AA2EX,SACE,KADF;AAzED,IAAM,SAAS,GAAG;AAAA,EACvB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SACE;AAAA,IACF,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OACE;AAAA,EAEJ;AACF,CAAC;AA4BD,IAAM,UAAU,CAAC,MAAgC,MAAM,SAAY,SAAY,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI;AAGtG,SAAS,OAAuC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,MAAM;AAAA,EACN;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,QAAM,IAAI,OAAO;AACjB,QAAM,QAAQ,MAAM,QAAQ,SAAS,YAAY;AACjD,QAAM,CAAC,OAAO,QAAQ,IAAU,eAAS,MAAM,QAAQ,YAAY,KAAK,CAAC,GAAG,CAAC;AAC7E,QAAM,UAAU,QAAQ,KAAK,KAAK;AAClC,QAAM,MAAM,CAAC,SAAoB,QAAQ,OAAO,KAAK,CAAC;AACtD,QAAM,MAAM,CAAC,OAAgB,IAAI,QAAQ,MAAM,OAAO,KAAM;AAC5D,QAAM,OACJ,WAAW,UAAa,CAAC,QACrB,EAAE,MAAM,GAAG,KAAK,IAAI,IAAI,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,IAChH;AACN,QAAM,KAAW,YAAM;AACvB,SACE,qBAAC,SAAI,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,cAAY,QAAQ,KAAK,QAC7D;AAAA,iBACC,qBAAC,SAAI,WAAW,EAAE,OAAO,GACvB;AAAA,0BAAC,UAAK,IAAI,GAAG,EAAE,UAAW,iBAAM;AAAA,MAChC,oBAAC,UAAK,WAAW,EAAE,MAAM,GAAG,eAAW,MACpC,kBAAQ,IAAI,WAAW,EAAE,KAAK,UAAK,GACtC;AAAA,OACF;AAAA,IAEF;AAAA,MAAC,gBAAgB;AAAA,MAAhB;AAAA,QACC;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,eAAe,CAAC,SAAS;AACvB,cAAI,UAAU,OAAW,UAAS,IAAI;AACtC,0BAAgB,IAAI,IAAI,CAAC;AAAA,QAC3B;AAAA,QACA,eAAe,kBAAkB,CAAC,SAAS,cAAc,IAAI,IAAI,CAAC;AAAA,QAClE,WAAW,EAAE,QAAQ;AAAA,QACpB,GAAG;AAAA,QAEJ;AAAA,8BAAC,gBAAgB,OAAhB,EAAsB,WAAW,EAAE,MAAM,GACvC,iBAAO,oBAAC,UAAK,eAAY,IAAG,WAAW,EAAE,MAAM,GAAG,OAAO,MAAM,IAAK,oBAAC,gBAAgB,OAAhB,EAAsB,WAAW,EAAE,MAAM,GAAG,GACpH;AAAA,UACC,QAAQ,IAAI,CAAC,GAAG,MACf;AAAA,YAAC,gBAAgB;AAAA,YAAhB;AAAA,cAEC,cAAY,QAAS,cAAc,CAAC,KAAK,QAAS,YAAY,SAAY;AAAA,cAC1E,mBAAiB,CAAC,SAAS,YAAY,GAAG,EAAE,WAAW;AAAA,cACvD,kBAAgB,YAAY,CAAC;AAAA,cAC7B,WAAW,EAAE,MAAM;AAAA;AAAA,YAJd;AAAA,UAKP,CACD;AAAA;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;","names":[]}
|
package/dist/spinner.d.ts
CHANGED
|
@@ -22,6 +22,11 @@ declare const spinnerVariants: tailwind_variants.TVReturnType<{
|
|
|
22
22
|
};
|
|
23
23
|
}, undefined>>;
|
|
24
24
|
type SpinnerProps = Omit<React.ComponentProps<"svg">, "children"> & VariantProps<typeof spinnerVariants> & {
|
|
25
|
+
/**
|
|
26
|
+
* sm · md · lg.
|
|
27
|
+
* @default "md"
|
|
28
|
+
*/
|
|
29
|
+
size?: VariantProps<typeof spinnerVariants>["size"];
|
|
25
30
|
/** The accessible name of the wait, e.g. "Loading" — passed translated. */
|
|
26
31
|
label: string;
|
|
27
32
|
};
|
package/dist/spinner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/spinner/spinner.tsx"],"sourcesContent":["// Server-safe. An indeterminate wait: an SVG ring, announced as a status with its `label`.\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const spinnerVariants = tv({\n base: \"shrink-0 text-accent motion-safe:animate-spin\",\n variants: { size: { sm: \"h-4 w-4\", md: \"h-6 w-6\", lg: \"h-10 w-10\" } },\n defaultVariants: { size: \"md\" },\n});\n\nexport type SpinnerProps = Omit<React.ComponentProps<\"svg\">, \"children\"> &\n VariantProps<typeof spinnerVariants> & {\n /** The accessible name of the wait, e.g. \"Loading\" — passed translated. */\n label: string;\n };\n\n/** A turning ring with `role=\"status\"` (it stops turning under prefers-reduced-motion). */\nexport function Spinner({ label, size, className, ...props }: SpinnerProps) {\n return (\n <svg\n role=\"status\"\n aria-label={label}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n data-size={size ?? \"md\"}\n className={spinnerVariants({ size, className })}\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeOpacity=\"0.2\" strokeWidth=\"3\" />\n <path d=\"M21 12a9 9 0 0 0-9-9\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n"],"mappings":";AAEA,SAAS,UAA6B;
|
|
1
|
+
{"version":3,"sources":["../src/spinner/spinner.tsx"],"sourcesContent":["// Server-safe. An indeterminate wait: an SVG ring, announced as a status with its `label`.\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const spinnerVariants = tv({\n base: \"shrink-0 text-accent motion-safe:animate-spin\",\n variants: { size: { sm: \"h-4 w-4\", md: \"h-6 w-6\", lg: \"h-10 w-10\" } },\n defaultVariants: { size: \"md\" },\n});\n\nexport type SpinnerProps = Omit<React.ComponentProps<\"svg\">, \"children\"> &\n VariantProps<typeof spinnerVariants> & {\n /**\n * sm · md · lg.\n * @default \"md\"\n */\n size?: VariantProps<typeof spinnerVariants>[\"size\"];\n /** The accessible name of the wait, e.g. \"Loading\" — passed translated. */\n label: string;\n };\n\n/** A turning ring with `role=\"status\"` (it stops turning under prefers-reduced-motion). */\nexport function Spinner({ label, size, className, ...props }: SpinnerProps) {\n return (\n <svg\n role=\"status\"\n aria-label={label}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n data-size={size ?? \"md\"}\n className={spinnerVariants({ size, className })}\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeOpacity=\"0.2\" strokeWidth=\"3\" />\n <path d=\"M21 12a9 9 0 0 0-9-9\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n"],"mappings":";AAEA,SAAS,UAA6B;AAsBlC,SASE,KATF;AApBG,IAAM,kBAAkB,GAAG;AAAA,EAChC,MAAM;AAAA,EACN,UAAU,EAAE,MAAM,EAAE,IAAI,WAAW,IAAI,WAAW,IAAI,YAAY,EAAE;AAAA,EACpE,iBAAiB,EAAE,MAAM,KAAK;AAChC,CAAC;AAcM,SAAS,QAAQ,EAAE,OAAO,MAAM,WAAW,GAAG,MAAM,GAAiB;AAC1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,aAAW,QAAQ;AAAA,MACnB,WAAW,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAAA,MAC7C,GAAG;AAAA,MAEJ;AAAA,4BAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,QAAO,gBAAe,eAAc,OAAM,aAAY,KAAI;AAAA,QACxF,oBAAC,UAAK,GAAE,wBAAuB,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ;AAAA;AAAA;AAAA,EAC7F;AAEJ;","names":[]}
|
package/dist/stat.d.ts
CHANGED
|
@@ -61,7 +61,9 @@ declare const stat: tailwind_variants.TVReturnType<{
|
|
|
61
61
|
}>>;
|
|
62
62
|
type StatTrend = "up" | "down" | "flat";
|
|
63
63
|
type StatProps = Omit<React.ComponentProps<"div">, "children"> & {
|
|
64
|
+
/** What the figure is ("Revenue"), above it. */
|
|
64
65
|
label: React.ReactNode;
|
|
66
|
+
/** The figure, formatted by the app, in tabular digits. */
|
|
65
67
|
value: React.ReactNode;
|
|
66
68
|
/** A line under the value: the period, the comparison. */
|
|
67
69
|
hint?: React.ReactNode;
|
package/dist/stat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stat/stat.tsx"],"sourcesContent":["// Server-safe. A key figure: a label, the value in tabular digits, a hint, a trend. Every word is a prop.\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const stat = tv({\n slots: {\n root: \"flex min-w-0 flex-col gap-1\",\n label: \"text-xs font-semibold uppercase tracking-wider text-fg-secondary\",\n value: \"font-display text-2xl font-black tabular-nums text-fg\",\n meta: \"flex flex-wrap items-center gap-x-2 gap-y-1 text-xs\",\n // The status tokens are too light for small text on a light surface: the words stay a text role, the arrow carries\n // the direction's colour.\n trend: \"inline-flex items-center gap-1 font-semibold text-fg [&>svg]:h-3.5 [&>svg]:w-3.5 [&>svg]:shrink-0\",\n hint: \"text-fg-secondary\",\n },\n variants: {\n trend: {\n up: { trend: \"[&>svg]:text-success\" },\n down: { trend: \"[&>svg]:text-danger\" },\n flat: { trend: \"[&>svg]:text-fg-secondary\" },\n },\n },\n});\n\nexport type StatTrend = \"up\" | \"down\" | \"flat\";\n\nconst ARROW: Record<StatTrend, string> = { up: \"M7 17 17 7M8 7h9v9\", down: \"M7 7l10 10M17 8v9H8\", flat: \"M5 12h14M13 6l6 6-6 6\" };\n\nexport type StatProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n label: React.ReactNode;\n value: React.ReactNode;\n /** A line under the value: the period, the comparison. */\n hint?: React.ReactNode;\n /** The direction of the change; its arrow is decorative. */\n trend?: StatTrend;\n /** The change, in words, as read and shown (e.g. \"+12 % vs last week\") — the arrow alone says nothing. */\n trendLabel?: React.ReactNode;\n};\n\nexport function Stat({ label, value, hint, trend, trendLabel, className, ...props }: StatProps) {\n const s = stat({ trend });\n return (\n <div data-trend={trend} className={s.root({ className })} {...props}>\n <p className={s.label()}>{label}</p>\n <p className={s.value()}>{value}</p>\n {(trendLabel || hint) && (\n <p className={s.meta()}>\n {trend && trendLabel && (\n <span className={s.trend()}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d={ARROW[trend]} />\n </svg>\n {trendLabel}\n </span>\n )}\n {hint && <span className={s.hint()}>{hint}</span>}\n </p>\n )}\n </div>\n );\n}\n"],"mappings":";AAEA,SAAS,UAAU;
|
|
1
|
+
{"version":3,"sources":["../src/stat/stat.tsx"],"sourcesContent":["// Server-safe. A key figure: a label, the value in tabular digits, a hint, a trend. Every word is a prop.\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const stat = tv({\n slots: {\n root: \"flex min-w-0 flex-col gap-1\",\n label: \"text-xs font-semibold uppercase tracking-wider text-fg-secondary\",\n value: \"font-display text-2xl font-black tabular-nums text-fg\",\n meta: \"flex flex-wrap items-center gap-x-2 gap-y-1 text-xs\",\n // The status tokens are too light for small text on a light surface: the words stay a text role, the arrow carries\n // the direction's colour.\n trend: \"inline-flex items-center gap-1 font-semibold text-fg [&>svg]:h-3.5 [&>svg]:w-3.5 [&>svg]:shrink-0\",\n hint: \"text-fg-secondary\",\n },\n variants: {\n trend: {\n up: { trend: \"[&>svg]:text-success\" },\n down: { trend: \"[&>svg]:text-danger\" },\n flat: { trend: \"[&>svg]:text-fg-secondary\" },\n },\n },\n});\n\nexport type StatTrend = \"up\" | \"down\" | \"flat\";\n\nconst ARROW: Record<StatTrend, string> = { up: \"M7 17 17 7M8 7h9v9\", down: \"M7 7l10 10M17 8v9H8\", flat: \"M5 12h14M13 6l6 6-6 6\" };\n\nexport type StatProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n /** What the figure is (\"Revenue\"), above it. */\n label: React.ReactNode;\n /** The figure, formatted by the app, in tabular digits. */\n value: React.ReactNode;\n /** A line under the value: the period, the comparison. */\n hint?: React.ReactNode;\n /** The direction of the change; its arrow is decorative. */\n trend?: StatTrend;\n /** The change, in words, as read and shown (e.g. \"+12 % vs last week\") — the arrow alone says nothing. */\n trendLabel?: React.ReactNode;\n};\n\nexport function Stat({ label, value, hint, trend, trendLabel, className, ...props }: StatProps) {\n const s = stat({ trend });\n return (\n <div data-trend={trend} className={s.root({ className })} {...props}>\n <p className={s.label()}>{label}</p>\n <p className={s.value()}>{value}</p>\n {(trendLabel || hint) && (\n <p className={s.meta()}>\n {trend && trendLabel && (\n <span className={s.trend()}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d={ARROW[trend]} />\n </svg>\n {trendLabel}\n </span>\n )}\n {hint && <span className={s.hint()}>{hint}</span>}\n </p>\n )}\n </div>\n );\n}\n"],"mappings":";AAEA,SAAS,UAAU;AA2Cb,cAKM,YALN;AAzCC,IAAM,OAAO,GAAG;AAAA,EACrB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA;AAAA;AAAA,IAGN,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,MACL,IAAI,EAAE,OAAO,uBAAuB;AAAA,MACpC,MAAM,EAAE,OAAO,sBAAsB;AAAA,MACrC,MAAM,EAAE,OAAO,4BAA4B;AAAA,IAC7C;AAAA,EACF;AACF,CAAC;AAID,IAAM,QAAmC,EAAE,IAAI,sBAAsB,MAAM,uBAAuB,MAAM,wBAAwB;AAezH,SAAS,KAAK,EAAE,OAAO,OAAO,MAAM,OAAO,YAAY,WAAW,GAAG,MAAM,GAAc;AAC9F,QAAM,IAAI,KAAK,EAAE,MAAM,CAAC;AACxB,SACE,qBAAC,SAAI,cAAY,OAAO,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OAC5D;AAAA,wBAAC,OAAE,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,IAChC,oBAAC,OAAE,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,KAC9B,cAAc,SACd,qBAAC,OAAE,WAAW,EAAE,KAAK,GAClB;AAAA,eAAS,cACR,qBAAC,UAAK,WAAW,EAAE,MAAM,GACvB;AAAA,4BAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,eAAW,MACnI,8BAAC,UAAK,GAAG,MAAM,KAAK,GAAG,GACzB;AAAA,QACC;AAAA,SACH;AAAA,MAED,QAAQ,oBAAC,UAAK,WAAW,EAAE,KAAK,GAAI,gBAAK;AAAA,OAC5C;AAAA,KAEJ;AAEJ;","names":[]}
|
package/dist/switch.d.ts
CHANGED
|
@@ -47,9 +47,8 @@ declare const switchVariants: tailwind_variants.TVReturnType<{
|
|
|
47
47
|
thumb: string;
|
|
48
48
|
}>>;
|
|
49
49
|
type SwitchVariants = VariantProps<typeof switchVariants>;
|
|
50
|
-
type Named =
|
|
51
|
-
/** The accessible name — required when no visible label names it, passed translated. */
|
|
52
|
-
{
|
|
50
|
+
type Named = {
|
|
51
|
+
/** The accessible name — required when no visible label names it, passed translated. */
|
|
53
52
|
label: string;
|
|
54
53
|
}
|
|
55
54
|
/** Named by a visible `<label htmlFor={id}>` (e.g. `Field.Label`). */
|
|
@@ -63,6 +62,11 @@ type Named =
|
|
|
63
62
|
"aria-labelledby": string;
|
|
64
63
|
};
|
|
65
64
|
type SwitchProps = Omit<React.ComponentProps<typeof Switch$1.Root>, "children"> & SwitchVariants & Named & {
|
|
65
|
+
/**
|
|
66
|
+
* sm · md.
|
|
67
|
+
* @default "md"
|
|
68
|
+
*/
|
|
69
|
+
size?: SwitchVariants["size"];
|
|
66
70
|
/** Marks it invalid: aria-invalid and data-invalid. */
|
|
67
71
|
invalid?: boolean;
|
|
68
72
|
};
|
package/dist/switch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/switch/switch.tsx"],"sourcesContent":["// Client. Radix Switch: role=\"switch\", aria-checked, Space and Enter toggle, a hidden input inside a form.\nimport { Switch as SwitchPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const switchVariants = tv({\n slots: {\n root:\n \"peer relative inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent bg-fg-muted transition-colors \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-surface-0 \" +\n \"disabled:cursor-not-allowed disabled:opacity-40 data-[state=checked]:bg-accent aria-invalid:border-danger\",\n thumb:\n \"pointer-events-none block rounded-full bg-fg-on-media shadow-sm transition-transform data-[state=unchecked]:translate-x-0.5 motion-reduce:transition-none\",\n },\n variants: {\n size: {\n sm: { root: \"h-5 w-9\", thumb: \"h-4 w-4 data-[state=checked]:translate-x-[1.125rem]\" },\n md: { root: \"h-6 w-11\", thumb: \"h-5 w-5 data-[state=checked]:translate-x-[1.375rem]\" },\n },\n },\n defaultVariants: { size: \"md\" },\n});\n\nexport type SwitchVariants = VariantProps<typeof switchVariants>;\n\ntype Named =\n /** The accessible name — required when no visible label names it, passed translated. */\n
|
|
1
|
+
{"version":3,"sources":["../src/switch/switch.tsx"],"sourcesContent":["// Client. Radix Switch: role=\"switch\", aria-checked, Space and Enter toggle, a hidden input inside a form.\nimport { Switch as SwitchPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const switchVariants = tv({\n slots: {\n root:\n \"peer relative inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent bg-fg-muted transition-colors \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-surface-0 \" +\n \"disabled:cursor-not-allowed disabled:opacity-40 data-[state=checked]:bg-accent aria-invalid:border-danger\",\n thumb:\n \"pointer-events-none block rounded-full bg-fg-on-media shadow-sm transition-transform data-[state=unchecked]:translate-x-0.5 motion-reduce:transition-none\",\n },\n variants: {\n size: {\n sm: { root: \"h-5 w-9\", thumb: \"h-4 w-4 data-[state=checked]:translate-x-[1.125rem]\" },\n md: { root: \"h-6 w-11\", thumb: \"h-5 w-5 data-[state=checked]:translate-x-[1.375rem]\" },\n },\n },\n defaultVariants: { size: \"md\" },\n});\n\nexport type SwitchVariants = VariantProps<typeof switchVariants>;\n\ntype Named =\n | {\n /** The accessible name — required when no visible label names it, passed translated. */\n label: string;\n }\n /** Named by a visible `<label htmlFor={id}>` (e.g. `Field.Label`). */\n | { label?: undefined; id: string }\n /** Named by another element. */\n | { label?: undefined; \"aria-labelledby\": string };\n\nexport type SwitchProps = Omit<React.ComponentProps<typeof SwitchPrimitive.Root>, \"children\"> &\n SwitchVariants &\n Named & {\n /**\n * sm · md.\n * @default \"md\"\n */\n size?: SwitchVariants[\"size\"];\n /** Marks it invalid: aria-invalid and data-invalid. */\n invalid?: boolean;\n };\n\n/** An on/off switch: `checked`/`defaultChecked` + `onCheckedChange`. */\nexport function Switch({ label, size, invalid, className, ...props }: SwitchProps) {\n const s = switchVariants({ size });\n return (\n <SwitchPrimitive.Root\n aria-label={label}\n aria-invalid={invalid || undefined}\n data-invalid={invalid ? \"\" : undefined}\n className={s.root({ className })}\n {...props}\n >\n <SwitchPrimitive.Thumb className={s.thumb()} />\n </SwitchPrimitive.Root>\n );\n}\n"],"mappings":";;;AACA,SAAS,UAAU,uBAAuB;AAE1C,SAAS,UAA6B;AAuDhC;AArDC,IAAM,iBAAiB,GAAG;AAAA,EAC/B,OAAO;AAAA,IACL,MACE;AAAA,IAGF,OACE;AAAA,EACJ;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,IAAI,EAAE,MAAM,WAAW,OAAO,sDAAsD;AAAA,MACpF,IAAI,EAAE,MAAM,YAAY,OAAO,sDAAsD;AAAA,IACvF;AAAA,EACF;AAAA,EACA,iBAAiB,EAAE,MAAM,KAAK;AAChC,CAAC;AA2BM,SAAS,OAAO,EAAE,OAAO,MAAM,SAAS,WAAW,GAAG,MAAM,GAAgB;AACjF,QAAM,IAAI,eAAe,EAAE,KAAK,CAAC;AACjC,SACE;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,cAAY;AAAA,MACZ,gBAAc,WAAW;AAAA,MACzB,gBAAc,UAAU,KAAK;AAAA,MAC7B,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC;AAAA,MAC9B,GAAG;AAAA,MAEJ,8BAAC,gBAAgB,OAAhB,EAAsB,WAAW,EAAE,MAAM,GAAG;AAAA;AAAA,EAC/C;AAEJ;","names":[]}
|
package/dist/tabs.d.ts
CHANGED
|
@@ -65,7 +65,10 @@ declare const tabs: tailwind_variants.TVReturnType<{
|
|
|
65
65
|
content: string;
|
|
66
66
|
}>>;
|
|
67
67
|
type TabsVariants = VariantProps<typeof tabs>;
|
|
68
|
-
type TabsRootProps = React.ComponentProps<typeof Tabs$1.Root> &
|
|
68
|
+
type TabsRootProps = React.ComponentProps<typeof Tabs$1.Root> & {
|
|
69
|
+
/** underline (the sections of a page) · segmented (a view switch) · pills (a feed's sections). */
|
|
70
|
+
variant?: TabsVariants["variant"];
|
|
71
|
+
};
|
|
69
72
|
/** `value`/`defaultValue` + `onValueChange`, `orientation` (horizontal by default), `variant` for the list. */
|
|
70
73
|
declare function TabsRoot({ variant, className, ...props }: TabsRootProps): React.JSX.Element;
|
|
71
74
|
/** The tabs. Name it (`aria-label`) when no heading says what it switches. */
|