@orangecheck/app-design 0.0.0-stage → 0.1.1
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/LICENSE +21 -0
- package/README.md +39 -2
- package/dist/brand.d.mts +46 -0
- package/dist/brand.d.ts +46 -0
- package/dist/brand.js +144 -0
- package/dist/brand.js.map +1 -0
- package/dist/brand.mjs +136 -0
- package/dist/brand.mjs.map +1 -0
- package/dist/chrome.d.mts +64 -0
- package/dist/chrome.d.ts +64 -0
- package/dist/chrome.js +479 -0
- package/dist/chrome.js.map +1 -0
- package/dist/chrome.mjs +447 -0
- package/dist/chrome.mjs.map +1 -0
- package/dist/components.d.mts +474 -0
- package/dist/components.d.ts +474 -0
- package/dist/components.js +619 -0
- package/dist/components.js.map +1 -0
- package/dist/components.mjs +588 -0
- package/dist/components.mjs.map +1 -0
- package/dist/index.d.mts +21 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +1597 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1448 -0
- package/dist/index.mjs.map +1 -0
- package/dist/primitives.d.mts +140 -0
- package/dist/primitives.d.ts +140 -0
- package/dist/primitives.js +706 -0
- package/dist/primitives.js.map +1 -0
- package/dist/primitives.mjs +606 -0
- package/dist/primitives.mjs.map +1 -0
- package/dist/styles/fonts/inter-latin-ext.woff2 +0 -0
- package/dist/styles/fonts/inter-latin.woff2 +0 -0
- package/dist/styles/fonts/jetbrains-mono-latin-ext.woff2 +0 -0
- package/dist/styles/fonts/jetbrains-mono-latin.woff2 +0 -0
- package/dist/styles/fonts.css +74 -0
- package/dist/styles/motion.css +80 -0
- package/dist/styles/theme.css +227 -0
- package/dist/styles/tokens.css +152 -0
- package/dist/styles.css +14 -0
- package/dist/tokens.d.mts +42 -0
- package/dist/tokens.d.ts +42 -0
- package/dist/tokens.js +50 -0
- package/dist/tokens.js.map +1 -0
- package/dist/tokens.mjs +45 -0
- package/dist/tokens.mjs.map +1 -0
- package/package.json +114 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/cn.ts","../src/primitives/feedback.tsx","../src/primitives/button.tsx","../src/primitives/badge.tsx","../src/primitives/card.tsx","../src/primitives/form.tsx","../src/primitives/overlay.tsx","../src/primitives/tabs.tsx"],"names":["Separator","SonnerToaster","forwardRef","Button","jsx","jsxs","cva","Card","Input","Textarea","Label","SelectTrigger","SelectContent","SelectItem","Checkbox","Switch","RadioGroup","RadioGroupItem","DialogContent","DialogTitle","DialogDescription","SheetContent","PopoverContent","TooltipContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuLabel","DropdownMenuSeparator","Tabs","TabsList","TabsTrigger","TabsContent"],"mappings":"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","file":"primitives.mjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n// tailwind-merge would treat `oca-display-1` and `text-foreground` as the same\n// group and drop one; teach it the package's own type utilities.\nconst merge = extendTailwindMerge<'oca-type'>({\n extend: {\n classGroups: {\n 'oca-type': [\n 'oca-display-1',\n 'oca-display-2',\n 'oca-display-3',\n 'oca-title',\n 'oca-title-sm',\n 'oca-eyebrow',\n 'oca-lead',\n 'oca-body',\n 'oca-numeral',\n ],\n },\n },\n});\n\nexport function cn(...inputs: ClassValue[]): string {\n return merge(clsx(inputs));\n}\n","import * as SeparatorPrimitive from '@radix-ui/react-separator';\nimport { forwardRef, type ComponentPropsWithoutRef, type ElementRef, type HTMLAttributes } from 'react';\nimport { Toaster as SonnerToaster, type ToasterProps } from 'sonner';\n\nimport { cn } from '../lib/cn';\n\nexport function Spinner({ className, label }: { className?: string; label?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n role={label ? 'status' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={cn('size-4 animate-spin', className)}\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeOpacity=\"0.2\" strokeWidth=\"2.5\" />\n <path d=\"M21 12a9 9 0 0 0-9-9\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function Skeleton({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div data-ui=\"skeleton\" className={cn('animate-pulse rounded-lg bg-muted', className)} {...props} />;\n}\n\nexport const Separator = forwardRef<\n ElementRef<typeof SeparatorPrimitive.Root>,\n ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(function Separator({ className, orientation = 'horizontal', decorative = true, ...props }, ref) {\n return (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-px w-full' : 'h-full w-px',\n className\n )}\n {...props}\n />\n );\n});\n\nexport function Kbd({ className, ...props }: HTMLAttributes<HTMLElement>) {\n return (\n <kbd\n className={cn(\n 'inline-flex h-5 min-w-5 items-center justify-center rounded-md border border-border bg-card px-1.5 font-mono text-[11px] text-muted-foreground',\n className\n )}\n {...props}\n />\n );\n}\n\n/** Live-region status dot: a calm pulse for \"running\", solid otherwise. */\nexport function StatusDot({\n tone = 'neutral',\n pulse = false,\n className,\n}: {\n tone?: 'neutral' | 'success' | 'warning' | 'danger' | 'brand';\n pulse?: boolean;\n className?: string;\n}) {\n const color = {\n neutral: 'bg-oca-subtle',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-destructive',\n brand: 'bg-brand',\n }[tone];\n return (\n <span\n aria-hidden\n className={cn('inline-block size-2 shrink-0 rounded-full', color, pulse && 'oca-animate-pulse-dot', className)}\n />\n );\n}\n\n/** Toasts in the system's type and surfaces. Mount once. */\nexport function Toaster(props: ToasterProps) {\n return (\n <SonnerToaster\n position=\"bottom-right\"\n toastOptions={{\n classNames: {\n toast: 'oca-toast rounded-2xl border border-border bg-popover text-popover-foreground shadow-lg font-sans',\n title: 'text-[0.9375rem] font-medium',\n description: 'text-sm text-muted-foreground',\n actionButton: 'rounded-full bg-primary text-primary-foreground',\n cancelButton: 'rounded-full bg-muted text-foreground',\n },\n }}\n {...props}\n />\n );\n}\n\nexport { toast } from 'sonner';\n","import { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type ButtonHTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { Spinner } from './feedback';\n\n/*\n * Pills, as the deck draws them: the black filled pill leads, the white\n * outlined pill follows. `brand` is for the orange band only; `onInk` and\n * `onInkOutline` are the same pair inverted for dark bands.\n */\nexport const buttonVariants = cva(\n [\n 'inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-full font-medium',\n 'transition-[background-color,border-color,color,box-shadow,transform] duration-150',\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'active:translate-y-px disabled:pointer-events-none disabled:opacity-45',\n '[&_svg]:pointer-events-none [&_svg]:size-[1.1em] [&_svg]:shrink-0',\n ],\n {\n variants: {\n variant: {\n primary: 'bg-primary text-primary-foreground hover:bg-primary/85',\n secondary:\n 'border border-border bg-secondary text-secondary-foreground hover:border-oca-hairline-strong hover:bg-accent',\n brand: 'bg-brand text-brand-foreground hover:bg-oca-orange-deep',\n ghost: 'text-foreground hover:bg-accent',\n danger: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n link: 'h-auto rounded-none px-0 text-foreground underline decoration-border underline-offset-4 hover:decoration-foreground',\n onInk: 'bg-white text-oca-ink hover:bg-white/90',\n onInkOutline: 'border border-white/20 text-white hover:bg-white/10',\n },\n size: {\n sm: 'h-9 px-4 text-sm',\n md: 'h-11 px-5 text-[0.9375rem]',\n lg: 'h-14 px-7 text-[1.0625rem]',\n icon: 'size-10',\n 'icon-sm': 'size-8',\n },\n },\n compoundVariants: [{ variant: 'link', className: 'h-auto px-0' }],\n defaultVariants: { variant: 'primary', size: 'md' },\n }\n);\n\nexport interface ButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n /** Render the child element (a Link, an <a>) with the button's styles. */\n asChild?: boolean;\n /** Shows a spinner and disables the button. */\n loading?: boolean;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { className, variant, size, asChild = false, loading = false, disabled, children, type, ...props },\n ref\n) {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp\n ref={ref}\n data-ui=\"button\"\n className={cn(buttonVariants({ variant, size }), className)}\n disabled={asChild ? undefined : disabled || loading}\n aria-busy={loading || undefined}\n type={asChild ? undefined : (type ?? 'button')}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {loading ? <Spinner className=\"size-[1.1em]\" /> : null}\n {children}\n </>\n )}\n </Comp>\n );\n});\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport type { HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/*\n * The small white pill from the deck (\"in testing\", \"on the path\"), plus soft\n * status tints. Text stays on the token that clears 4.5:1 against its tint.\n */\nexport const badgeVariants = cva(\n 'inline-flex h-6 shrink-0 items-center gap-1.5 whitespace-nowrap rounded-full border px-2.5 text-[0.8125rem] font-medium leading-none',\n {\n variants: {\n tone: {\n neutral: 'border-border bg-card text-foreground',\n muted: 'border-transparent bg-muted text-muted-foreground',\n brand: 'border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_12%,var(--card))] text-oca-accent-ink',\n success: 'border-transparent bg-[color-mix(in_oklab,var(--success)_12%,var(--card))] text-success',\n warning: 'border-transparent bg-[color-mix(in_oklab,var(--warning)_14%,var(--card))] text-warning',\n danger: 'border-transparent bg-[color-mix(in_oklab,var(--destructive)_12%,var(--card))] text-destructive',\n info: 'border-transparent bg-[color-mix(in_oklab,var(--info)_12%,var(--card))] text-info',\n ink: 'border-transparent bg-oca-ink text-oca-ink-foreground',\n onInk: 'border-white/15 bg-white/5 text-white/90',\n },\n },\n defaultVariants: { tone: 'neutral' },\n }\n);\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {}\n\nexport function Badge({ className, tone, ...props }: BadgeProps) {\n return <span data-ui=\"badge\" className={cn(badgeVariants({ tone }), className)} {...props} />;\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/*\n * White on the canvas with one hairline and a generous radius; no shadow. The\n * `ink` card is the deck's #1E1E1E panel, dark in both modes.\n */\nexport const cardVariants = cva('relative rounded-[1.25rem] border', {\n variants: {\n tone: {\n default: 'border-border bg-card text-card-foreground',\n sunken: 'border-transparent bg-muted text-foreground',\n ink: 'border-oca-ink-line bg-oca-ink-card text-oca-ink-foreground',\n outline: 'border-border bg-transparent text-foreground',\n },\n padding: {\n none: '',\n sm: 'p-5',\n md: 'p-6 md:p-8',\n lg: 'p-8 md:p-10',\n },\n interactive: {\n true: 'transition-colors hover:border-oca-hairline-strong focus-within:border-oca-hairline-strong',\n false: '',\n },\n },\n defaultVariants: { tone: 'default', padding: 'md', interactive: false },\n});\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof cardVariants> {}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n { className, tone, padding, interactive, ...props },\n ref\n) {\n return (\n <div ref={ref} data-ui=\"card\" className={cn(cardVariants({ tone, padding, interactive }), className)} {...props} />\n );\n});\n\nexport function CardHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex flex-col gap-2', className)} {...props} />;\n}\n\n/** The small \"01\" above a card title. */\nexport function CardNumeral({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {\n return <span className={cn('oca-numeral block', className)} {...props} />;\n}\n\nexport function CardTitle({ className, ...props }: HTMLAttributes<HTMLHeadingElement>) {\n return <h3 className={cn('oca-title flex flex-wrap items-center gap-2.5', className)} {...props} />;\n}\n\nexport function CardDescription({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) {\n return <p className={cn('oca-body', className)} {...props} />;\n}\n\nexport function CardContent({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('mt-5', className)} {...props} />;\n}\n\nexport function CardFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('mt-6 flex flex-wrap items-center gap-3', className)} {...props} />;\n}\n","import * as CheckboxPrimitive from '@radix-ui/react-checkbox';\nimport * as LabelPrimitive from '@radix-ui/react-label';\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport * as SwitchPrimitive from '@radix-ui/react-switch';\nimport { Check, ChevronDown } from 'lucide-react';\nimport {\n cloneElement,\n forwardRef,\n isValidElement,\n useId,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type InputHTMLAttributes,\n type ReactElement,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from 'react';\n\nimport { cn } from '../lib/cn';\n\n/* Fields: 44px tall, a hairline that darkens on focus with a soft orange halo,\n 16px text on phones so iOS never zooms. */\nconst fieldBase = [\n 'w-full rounded-xl border border-input bg-card text-foreground placeholder:text-oca-subtle',\n 'text-base md:text-[0.9375rem] outline-none transition-[border-color,box-shadow]',\n 'focus:border-foreground/35 focus:ring-4 focus:ring-[color-mix(in_oklab,var(--oca-orange)_16%,transparent)]',\n 'disabled:cursor-not-allowed disabled:opacity-55',\n 'aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:ring-[color-mix(in_oklab,var(--destructive)_14%,transparent)]',\n];\n\nexport const Input = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(function Input(\n { className, type = 'text', ...props },\n ref\n) {\n return <input ref={ref} type={type} data-ui=\"input\" className={cn(fieldBase, 'h-11 px-3.5', className)} {...props} />;\n});\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaHTMLAttributes<HTMLTextAreaElement>>(\n function Textarea({ className, ...props }, ref) {\n return (\n <textarea\n ref={ref}\n data-ui=\"textarea\"\n className={cn(fieldBase, 'min-h-28 px-3.5 py-3 leading-relaxed', className)}\n {...props}\n />\n );\n }\n);\n\nexport const Label = forwardRef<\n ElementRef<typeof LabelPrimitive.Root>,\n ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(function Label({ className, ...props }, ref) {\n return (\n <LabelPrimitive.Root\n ref={ref}\n className={cn('text-sm font-medium leading-none text-foreground', className)}\n {...props}\n />\n );\n});\n\nexport interface FieldProps {\n label: ReactNode;\n /** One line under the label, before the control. */\n hint?: ReactNode;\n /** Shown in place of nothing; marks the control invalid. */\n error?: ReactNode;\n /** The control. Receives id, aria-describedby and aria-invalid. */\n children: ReactElement;\n className?: string;\n /** Render the label visually hidden (it is still the accessible name). */\n hideLabel?: boolean;\n}\n\n/** Label, hint, control and error, wired together by id. */\nexport function Field({ label, hint, error, children, className, hideLabel }: FieldProps) {\n const id = useId();\n const hintId = hint ? `${id}-hint` : undefined;\n const errorId = error ? `${id}-error` : undefined;\n const describedBy = [hintId, errorId].filter(Boolean).join(' ') || undefined;\n const control = isValidElement(children)\n ? cloneElement(children as ReactElement<Record<string, unknown>>, {\n id,\n 'aria-describedby': describedBy,\n 'aria-invalid': error ? true : undefined,\n })\n : children;\n return (\n <div className={cn('flex flex-col gap-2', className)}>\n <Label htmlFor={id} className={hideLabel ? 'sr-only' : undefined}>\n {label}\n </Label>\n {hint ? (\n <p id={hintId} className=\"text-[0.8125rem] leading-snug text-muted-foreground\">\n {hint}\n </p>\n ) : null}\n {control}\n {error ? (\n <p id={errorId} role=\"alert\" className=\"text-[0.8125rem] leading-snug text-destructive\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\n/* ── Select ───────────────────────────────────────────────────────────── */\n\nexport const Select = SelectPrimitive.Root;\nexport const SelectGroup = SelectPrimitive.Group;\nexport const SelectValue = SelectPrimitive.Value;\n\nexport const SelectTrigger = forwardRef<\n ElementRef<typeof SelectPrimitive.Trigger>,\n ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(function SelectTrigger({ className, children, ...props }, ref) {\n return (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(fieldBase, 'flex h-11 items-center justify-between gap-2 px-3.5 text-left', className)}\n {...props}\n >\n <span className=\"truncate\">{children}</span>\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"size-4 shrink-0 text-muted-foreground\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n});\n\nexport const SelectContent = forwardRef<\n ElementRef<typeof SelectPrimitive.Content>,\n ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(function SelectContent({ className, children, position = 'popper', ...props }, ref) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n position={position}\n sideOffset={6}\n className={cn(\n 'oca-animate-fade z-50 max-h-[min(24rem,var(--radix-select-content-available-height))] min-w-[var(--radix-select-trigger-width)] overflow-hidden rounded-xl border border-border bg-popover p-1 text-popover-foreground shadow-lg',\n className\n )}\n {...props}\n >\n <SelectPrimitive.Viewport>{children}</SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n});\n\nexport const SelectItem = forwardRef<\n ElementRef<typeof SelectPrimitive.Item>,\n ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(function SelectItem({ className, children, ...props }, ref) {\n return (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex h-10 cursor-default select-none items-center rounded-lg pl-3 pr-9 text-[0.9375rem] outline-none',\n 'data-[highlighted]:bg-accent data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator className=\"absolute right-3\">\n <Check className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n );\n});\n\n/* ── Checkbox, Switch, Radio ──────────────────────────────────────────── */\n\nexport const Checkbox = forwardRef<\n ElementRef<typeof CheckboxPrimitive.Root>,\n ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(function Checkbox({ className, ...props }, ref) {\n return (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n 'peer inline-flex size-5 shrink-0 items-center justify-center rounded-[6px] border border-input bg-card',\n 'outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator>\n <Check className=\"size-3.5\" strokeWidth={3} />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n});\n\nexport const Switch = forwardRef<\n ElementRef<typeof SwitchPrimitive.Root>,\n ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>\n>(function Switch({ className, ...props }, ref) {\n return (\n <SwitchPrimitive.Root\n ref={ref}\n className={cn(\n 'peer inline-flex h-6 w-11 shrink-0 items-center rounded-full border border-transparent bg-input p-0.5',\n 'outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'data-[state=checked]:bg-brand disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb className=\"pointer-events-none block size-5 rounded-full bg-white shadow-sm transition-transform data-[state=checked]:translate-x-5\" />\n </SwitchPrimitive.Root>\n );\n});\n\nexport const RadioGroup = forwardRef<\n ElementRef<typeof RadioGroupPrimitive.Root>,\n ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(function RadioGroup({ className, ...props }, ref) {\n return <RadioGroupPrimitive.Root ref={ref} className={cn('grid gap-3', className)} {...props} />;\n});\n\nexport const RadioGroupItem = forwardRef<\n ElementRef<typeof RadioGroupPrimitive.Item>,\n ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(function RadioGroupItem({ className, ...props }, ref) {\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n 'inline-flex size-5 shrink-0 items-center justify-center rounded-full border border-input bg-card',\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'data-[state=checked]:border-primary disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"block size-2.5 rounded-full bg-primary\" />\n </RadioGroupPrimitive.Item>\n );\n});\n","import * as DialogPrimitive from '@radix-ui/react-dialog';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport { X } from 'lucide-react';\nimport { forwardRef, type ComponentPropsWithoutRef, type ElementRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/* ── Dialog ───────────────────────────────────────────────────────────── */\n\nexport const Dialog = DialogPrimitive.Root;\nexport const DialogTrigger = DialogPrimitive.Trigger;\nexport const DialogClose = DialogPrimitive.Close;\n\nconst overlayClass =\n 'oca-animate-fade fixed inset-0 z-50 bg-[rgb(10_10_10/0.38)] backdrop-blur-[2px] data-[state=closed]:opacity-0';\n\nexport const DialogContent = forwardRef<\n ElementRef<typeof DialogPrimitive.Content>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & { hideClose?: boolean }\n>(function DialogContent({ className, children, hideClose, ...props }, ref) {\n return (\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay className={overlayClass} />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'oca-animate-rise fixed left-1/2 top-1/2 z-50 w-[min(92vw,34rem)] -translate-x-1/2 -translate-y-1/2',\n 'max-h-[88vh] overflow-y-auto rounded-[1.5rem] border border-border bg-popover p-6 text-popover-foreground shadow-xl md:p-8',\n 'outline-none',\n className\n )}\n {...props}\n >\n {children}\n {hideClose ? null : (\n <DialogPrimitive.Close\n className=\"absolute right-4 top-4 inline-flex size-9 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n aria-label=\"Close\"\n >\n <X className=\"size-4\" />\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n );\n});\n\nexport function DialogHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('mb-5 flex flex-col gap-2 pr-8', className)} {...props} />;\n}\n\nexport function DialogFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('mt-7 flex flex-col-reverse gap-3 sm:flex-row sm:justify-end', className)} {...props} />;\n}\n\nexport const DialogTitle = forwardRef<\n ElementRef<typeof DialogPrimitive.Title>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(function DialogTitle({ className, ...props }, ref) {\n return (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-[1.5rem] font-normal leading-tight tracking-[-0.02em]', className)}\n {...props}\n />\n );\n});\n\nexport const DialogDescription = forwardRef<\n ElementRef<typeof DialogPrimitive.Description>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(function DialogDescription({ className, ...props }, ref) {\n return <DialogPrimitive.Description ref={ref} className={cn('oca-body', className)} {...props} />;\n});\n\n/* ── Sheet: a dialog from an edge ────────────────────────────────────── */\n\nexport const Sheet = DialogPrimitive.Root;\nexport const SheetTrigger = DialogPrimitive.Trigger;\nexport const SheetClose = DialogPrimitive.Close;\nexport const SheetTitle = DialogTitle;\nexport const SheetDescription = DialogDescription;\n\nconst sheetSide = {\n right: 'inset-y-0 right-0 h-full w-[min(88vw,24rem)] border-l',\n left: 'inset-y-0 left-0 h-full w-[min(88vw,24rem)] border-r',\n bottom: 'inset-x-0 bottom-0 max-h-[88vh] rounded-t-[1.5rem] border-t',\n} as const;\n\nexport const SheetContent = forwardRef<\n ElementRef<typeof DialogPrimitive.Content>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & { side?: keyof typeof sheetSide }\n>(function SheetContent({ className, children, side = 'right', ...props }, ref) {\n return (\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay className={overlayClass} />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'oca-animate-fade fixed z-50 flex flex-col gap-4 overflow-y-auto border-border bg-popover p-6 text-popover-foreground shadow-xl outline-none',\n sheetSide[side],\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close\n className=\"absolute right-4 top-4 inline-flex size-9 items-center justify-center rounded-full text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Close\"\n >\n <X className=\"size-4\" />\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n );\n});\n\n/* ── Popover ──────────────────────────────────────────────────────────── */\n\nexport const Popover = PopoverPrimitive.Root;\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\nexport const PopoverAnchor = PopoverPrimitive.Anchor;\n\nexport const PopoverContent = forwardRef<\n ElementRef<typeof PopoverPrimitive.Content>,\n ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(function PopoverContent({ className, align = 'center', sideOffset = 8, ...props }, ref) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'oca-animate-fade z-50 w-72 rounded-2xl border border-border bg-popover p-4 text-popover-foreground shadow-lg outline-none',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n});\n\n/* ── Tooltip: ink, small, quick ───────────────────────────────────────── */\n\nexport const TooltipProvider = TooltipPrimitive.Provider;\nexport const Tooltip = TooltipPrimitive.Root;\nexport const TooltipTrigger = TooltipPrimitive.Trigger;\n\nexport const TooltipContent = forwardRef<\n ElementRef<typeof TooltipPrimitive.Content>,\n ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(function TooltipContent({ className, sideOffset = 6, ...props }, ref) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'oca-animate-fade z-50 max-w-xs rounded-lg bg-oca-ink px-2.5 py-1.5 text-[0.8125rem] leading-snug text-oca-ink-foreground',\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n );\n});\n\n/* ── Menu ─────────────────────────────────────────────────────────────── */\n\nexport const DropdownMenu = DropdownMenuPrimitive.Root;\nexport const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\nexport const DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nexport const DropdownMenuContent = forwardRef<\n ElementRef<typeof DropdownMenuPrimitive.Content>,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(function DropdownMenuContent({ className, sideOffset = 8, ...props }, ref) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'oca-animate-fade z-50 min-w-56 overflow-hidden rounded-2xl border border-border bg-popover p-1.5 text-popover-foreground shadow-lg',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n});\n\nexport const DropdownMenuItem = forwardRef<\n ElementRef<typeof DropdownMenuPrimitive.Item>,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & { destructive?: boolean }\n>(function DropdownMenuItem({ className, destructive, ...props }, ref) {\n return (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'flex h-10 cursor-default select-none items-center gap-2.5 rounded-xl px-3 text-[0.9375rem] outline-none',\n 'data-[highlighted]:bg-accent data-[disabled]:opacity-50 [&_svg]:size-4 [&_svg]:text-muted-foreground',\n destructive && 'text-destructive [&_svg]:text-destructive',\n className\n )}\n {...props}\n />\n );\n});\n\nexport const DropdownMenuLabel = forwardRef<\n ElementRef<typeof DropdownMenuPrimitive.Label>,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label>\n>(function DropdownMenuLabel({ className, ...props }, ref) {\n return (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('px-3 pb-1.5 pt-2 text-[0.8125rem] text-muted-foreground', className)}\n {...props}\n />\n );\n});\n\nexport const DropdownMenuSeparator = forwardRef<\n ElementRef<typeof DropdownMenuPrimitive.Separator>,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(function DropdownMenuSeparator({ className, ...props }, ref) {\n return <DropdownMenuPrimitive.Separator ref={ref} className={cn('my-1.5 h-px bg-border', className)} {...props} />;\n});\n","import * as TabsPrimitive from '@radix-ui/react-tabs';\nimport { createContext, forwardRef, useContext, type ComponentPropsWithoutRef, type ElementRef } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/*\n * Two looks for one behaviour: `pill` is a segmented control for switching a\n * view in place; `line` is page-level navigation between sections.\n */\ntype TabsLook = 'pill' | 'line';\nconst LookContext = createContext<TabsLook>('pill');\n\nexport const Tabs = forwardRef<\n ElementRef<typeof TabsPrimitive.Root>,\n ComponentPropsWithoutRef<typeof TabsPrimitive.Root> & { look?: TabsLook }\n>(function Tabs({ look = 'pill', ...props }, ref) {\n return (\n <LookContext.Provider value={look}>\n <TabsPrimitive.Root ref={ref} {...props} />\n </LookContext.Provider>\n );\n});\n\nexport const TabsList = forwardRef<\n ElementRef<typeof TabsPrimitive.List>,\n ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(function TabsList({ className, ...props }, ref) {\n const look = useContext(LookContext);\n return (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n look === 'pill'\n ? 'inline-flex max-w-full items-center gap-1 overflow-x-auto rounded-full bg-muted p-1'\n : 'flex max-w-full items-center gap-6 overflow-x-auto border-b border-border',\n className\n )}\n {...props}\n />\n );\n});\n\nexport const TabsTrigger = forwardRef<\n ElementRef<typeof TabsPrimitive.Trigger>,\n ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(function TabsTrigger({ className, ...props }, ref) {\n const look = useContext(LookContext);\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap text-[0.9375rem] outline-none transition-colors',\n 'focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',\n look === 'pill'\n ? 'h-9 rounded-full px-4 text-muted-foreground hover:text-foreground data-[state=active]:bg-card data-[state=active]:text-foreground data-[state=active]:shadow-sm'\n : '-mb-px h-11 border-b-2 border-transparent text-muted-foreground hover:text-foreground data-[state=active]:border-foreground data-[state=active]:text-foreground',\n className\n )}\n {...props}\n />\n );\n});\n\nexport const TabsContent = forwardRef<\n ElementRef<typeof TabsPrimitive.Content>,\n ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(function TabsContent({ className, ...props }, ref) {\n return <TabsPrimitive.Content ref={ref} className={cn('mt-6 outline-none', className)} {...props} />;\n});\n"]}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @orangecheck/app-design — fonts.css
|
|
3
|
+
*
|
|
4
|
+
* Inter (variable: weight + optical size) and JetBrains Mono, self-hosted from
|
|
5
|
+
* @fontsource-variable 5.3.0, both SIL OFL 1.1. Optical size is what gives large
|
|
6
|
+
* headlines the tight display cut in Sou's deck without a second family. The
|
|
7
|
+
* family names are app-specific so a site's own next/font Inter cannot shadow them.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
@font-face {
|
|
11
|
+
font-family: 'OCA Inter';
|
|
12
|
+
font-style: normal;
|
|
13
|
+
font-display: swap;
|
|
14
|
+
font-weight: 100 900;
|
|
15
|
+
src: url('./fonts/inter-latin.woff2') format('woff2-variations');
|
|
16
|
+
unicode-range:
|
|
17
|
+
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308,
|
|
18
|
+
U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@font-face {
|
|
22
|
+
font-family: 'OCA Inter';
|
|
23
|
+
font-style: normal;
|
|
24
|
+
font-display: swap;
|
|
25
|
+
font-weight: 100 900;
|
|
26
|
+
src: url('./fonts/inter-latin-ext.woff2') format('woff2-variations');
|
|
27
|
+
unicode-range:
|
|
28
|
+
U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
|
|
29
|
+
U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
|
|
30
|
+
U+A720-A7FF;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@font-face {
|
|
34
|
+
font-family: 'OCA JetBrains Mono';
|
|
35
|
+
font-style: normal;
|
|
36
|
+
font-display: swap;
|
|
37
|
+
font-weight: 100 800;
|
|
38
|
+
src: url('./fonts/jetbrains-mono-latin.woff2') format('woff2-variations');
|
|
39
|
+
unicode-range:
|
|
40
|
+
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308,
|
|
41
|
+
U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@font-face {
|
|
45
|
+
font-family: 'OCA JetBrains Mono';
|
|
46
|
+
font-style: normal;
|
|
47
|
+
font-display: swap;
|
|
48
|
+
font-weight: 100 800;
|
|
49
|
+
src: url('./fonts/jetbrains-mono-latin-ext.woff2') format('woff2-variations');
|
|
50
|
+
unicode-range:
|
|
51
|
+
U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
|
|
52
|
+
U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
|
|
53
|
+
U+A720-A7FF;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* Metric-matched fallbacks, so the swap from Arial / Courier to the webfont
|
|
57
|
+
does not move a line. Values are next/font's for Inter and JetBrains Mono. */
|
|
58
|
+
@font-face {
|
|
59
|
+
font-family: 'OCA Inter Fallback';
|
|
60
|
+
src: local('Arial');
|
|
61
|
+
ascent-override: 90.44%;
|
|
62
|
+
descent-override: 22.52%;
|
|
63
|
+
line-gap-override: 0%;
|
|
64
|
+
size-adjust: 107.12%;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@font-face {
|
|
68
|
+
font-family: 'OCA JetBrains Mono Fallback';
|
|
69
|
+
src: local('Courier New');
|
|
70
|
+
ascent-override: 75.79%;
|
|
71
|
+
descent-override: 22.29%;
|
|
72
|
+
line-gap-override: 0%;
|
|
73
|
+
size-adjust: 133.49%;
|
|
74
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @orangecheck/app-design — motion.css
|
|
3
|
+
*
|
|
4
|
+
* Quiet by default. The isometric check settles in, the sphere breathes, overlays
|
|
5
|
+
* fade and lift. Everything stops under prefers-reduced-motion (theme.css).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
@keyframes oca-rise {
|
|
9
|
+
from {
|
|
10
|
+
opacity: 0;
|
|
11
|
+
transform: translateY(6px);
|
|
12
|
+
}
|
|
13
|
+
to {
|
|
14
|
+
opacity: 1;
|
|
15
|
+
transform: none;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@keyframes oca-fade {
|
|
20
|
+
from {
|
|
21
|
+
opacity: 0;
|
|
22
|
+
}
|
|
23
|
+
to {
|
|
24
|
+
opacity: 1;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@keyframes oca-settle {
|
|
29
|
+
0% {
|
|
30
|
+
opacity: 0;
|
|
31
|
+
transform: translateY(-14px);
|
|
32
|
+
}
|
|
33
|
+
70% {
|
|
34
|
+
opacity: 1;
|
|
35
|
+
transform: translateY(2px);
|
|
36
|
+
}
|
|
37
|
+
100% {
|
|
38
|
+
transform: none;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@keyframes oca-float {
|
|
43
|
+
0%,
|
|
44
|
+
100% {
|
|
45
|
+
transform: translateY(0);
|
|
46
|
+
}
|
|
47
|
+
50% {
|
|
48
|
+
transform: translateY(-6px);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@keyframes oca-pulse-dot {
|
|
53
|
+
0%,
|
|
54
|
+
100% {
|
|
55
|
+
opacity: 1;
|
|
56
|
+
}
|
|
57
|
+
50% {
|
|
58
|
+
opacity: 0.35;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@utility oca-animate-rise {
|
|
63
|
+
animation: oca-rise 420ms cubic-bezier(0.2, 0.7, 0.2, 1) both;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@utility oca-animate-fade {
|
|
67
|
+
animation: oca-fade 240ms ease-out both;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@utility oca-animate-settle {
|
|
71
|
+
animation: oca-settle 900ms cubic-bezier(0.2, 0.8, 0.2, 1) both;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@utility oca-animate-float {
|
|
75
|
+
animation: oca-float 6s ease-in-out infinite;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@utility oca-animate-pulse-dot {
|
|
79
|
+
animation: oca-pulse-dot 1.6s ease-in-out infinite;
|
|
80
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @orangecheck/app-design — theme.css
|
|
3
|
+
*
|
|
4
|
+
* The Tailwind 4 bridge, the type scale and the base layer. Expects a pipeline
|
|
5
|
+
* that has already done `@import 'tailwindcss'` and declared `@custom-variant dark`.
|
|
6
|
+
* The semantic names are identical to the family bridge, so the two can sit in
|
|
7
|
+
* one build; the --oca- names are new. Values live in tokens.css.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
@theme inline {
|
|
11
|
+
--color-background: var(--background);
|
|
12
|
+
--color-foreground: var(--foreground);
|
|
13
|
+
--color-card: var(--card);
|
|
14
|
+
--color-card-foreground: var(--card-foreground);
|
|
15
|
+
--color-popover: var(--popover);
|
|
16
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
17
|
+
--color-muted: var(--muted);
|
|
18
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
19
|
+
--color-secondary: var(--secondary);
|
|
20
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
21
|
+
--color-accent: var(--accent);
|
|
22
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
23
|
+
--color-primary: var(--primary);
|
|
24
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
25
|
+
--color-brand: var(--brand);
|
|
26
|
+
--color-brand-foreground: var(--brand-foreground);
|
|
27
|
+
--color-border: var(--border);
|
|
28
|
+
--color-input: var(--input);
|
|
29
|
+
--color-ring: var(--ring);
|
|
30
|
+
--color-destructive: var(--destructive);
|
|
31
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
32
|
+
--color-success: var(--success);
|
|
33
|
+
--color-success-foreground: var(--success-foreground);
|
|
34
|
+
--color-warning: var(--warning);
|
|
35
|
+
--color-warning-foreground: var(--warning-foreground);
|
|
36
|
+
--color-info: var(--info);
|
|
37
|
+
--color-info-foreground: var(--info-foreground);
|
|
38
|
+
|
|
39
|
+
--color-oca-subtle: var(--oca-subtle-foreground);
|
|
40
|
+
--color-oca-hairline-strong: var(--oca-hairline-strong);
|
|
41
|
+
--color-oca-table-head: var(--oca-table-head);
|
|
42
|
+
--color-oca-accent-display: var(--oca-accent-display);
|
|
43
|
+
--color-oca-accent-ink: var(--oca-accent-ink);
|
|
44
|
+
--color-oca-peach: var(--oca-peach);
|
|
45
|
+
--color-oca-orange-light: var(--oca-orange-light);
|
|
46
|
+
--color-oca-orange: var(--oca-orange);
|
|
47
|
+
--color-oca-orange-deep: var(--oca-orange-deep);
|
|
48
|
+
--color-oca-outline: var(--oca-outline);
|
|
49
|
+
--color-oca-ink: var(--oca-ink);
|
|
50
|
+
--color-oca-ink-card: var(--oca-ink-card);
|
|
51
|
+
--color-oca-ink-line: var(--oca-ink-line);
|
|
52
|
+
--color-oca-ink-foreground: var(--oca-ink-foreground);
|
|
53
|
+
--color-oca-ink-muted: var(--oca-ink-muted);
|
|
54
|
+
--color-oca-ink-subtle: var(--oca-ink-subtle);
|
|
55
|
+
--color-oca-ink-title: var(--oca-ink-title);
|
|
56
|
+
--color-oca-ink-eyebrow: var(--oca-ink-eyebrow);
|
|
57
|
+
--color-oca-code-package: var(--oca-code-package);
|
|
58
|
+
--color-oca-code-tag: var(--oca-code-tag);
|
|
59
|
+
--color-oca-code-link: var(--oca-code-link);
|
|
60
|
+
|
|
61
|
+
--font-sans: var(--oc-font-sans);
|
|
62
|
+
--font-mono: var(--oc-font-mono);
|
|
63
|
+
|
|
64
|
+
/* Same formulas as the family bridge: in a shared build the last @theme wins,
|
|
65
|
+
and family components must not change shape. */
|
|
66
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
67
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
68
|
+
--radius-lg: var(--radius);
|
|
69
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
70
|
+
|
|
71
|
+
--shadow-2xs: var(--oc-shadow-2xs);
|
|
72
|
+
--shadow-xs: var(--oc-shadow-xs);
|
|
73
|
+
--shadow-sm: var(--oc-shadow-sm);
|
|
74
|
+
--shadow-md: var(--oc-shadow-md);
|
|
75
|
+
--shadow-lg: var(--oc-shadow-lg);
|
|
76
|
+
--shadow-xl: var(--oc-shadow-xl);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* ── Type scale ──────────────────────────────────────────────────────────
|
|
80
|
+
Inter at regular weight for display, as the deck sets it; optical sizing
|
|
81
|
+
tightens it at large sizes. Fluid between a 390px phone and a 1440px desk. */
|
|
82
|
+
|
|
83
|
+
@utility oca-display-1 {
|
|
84
|
+
font-family: var(--oc-font-display);
|
|
85
|
+
font-weight: 400;
|
|
86
|
+
font-size: clamp(2.625rem, 1.75rem + 3.6vw, 4.75rem);
|
|
87
|
+
line-height: 1.02;
|
|
88
|
+
letter-spacing: -0.035em;
|
|
89
|
+
text-wrap: balance;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@utility oca-display-2 {
|
|
93
|
+
font-family: var(--oc-font-display);
|
|
94
|
+
font-weight: 400;
|
|
95
|
+
font-size: clamp(2rem, 1.45rem + 2.4vw, 3.5rem);
|
|
96
|
+
line-height: 1.06;
|
|
97
|
+
letter-spacing: -0.03em;
|
|
98
|
+
text-wrap: balance;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@utility oca-display-3 {
|
|
102
|
+
font-family: var(--oc-font-display);
|
|
103
|
+
font-weight: 400;
|
|
104
|
+
font-size: clamp(1.5rem, 1.25rem + 1.1vw, 2.25rem);
|
|
105
|
+
line-height: 1.12;
|
|
106
|
+
letter-spacing: -0.022em;
|
|
107
|
+
text-wrap: balance;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@utility oca-title {
|
|
111
|
+
font-weight: 500;
|
|
112
|
+
font-size: 1.3125rem;
|
|
113
|
+
line-height: 1.3;
|
|
114
|
+
letter-spacing: -0.012em;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@utility oca-title-sm {
|
|
118
|
+
font-weight: 500;
|
|
119
|
+
font-size: 1.0625rem;
|
|
120
|
+
line-height: 1.35;
|
|
121
|
+
letter-spacing: -0.008em;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
@utility oca-eyebrow {
|
|
125
|
+
font-weight: 400;
|
|
126
|
+
font-size: 0.9375rem;
|
|
127
|
+
line-height: 1.4;
|
|
128
|
+
letter-spacing: -0.003em;
|
|
129
|
+
color: var(--oca-accent-ink);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
@utility oca-lead {
|
|
133
|
+
font-size: clamp(1.0625rem, 1rem + 0.3vw, 1.25rem);
|
|
134
|
+
line-height: 1.55;
|
|
135
|
+
letter-spacing: -0.006em;
|
|
136
|
+
color: var(--muted-foreground);
|
|
137
|
+
text-wrap: pretty;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
@utility oca-body {
|
|
141
|
+
font-size: 1rem;
|
|
142
|
+
line-height: 1.6;
|
|
143
|
+
color: var(--muted-foreground);
|
|
144
|
+
text-wrap: pretty;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
@utility oca-numeral {
|
|
148
|
+
font-size: 0.8125rem;
|
|
149
|
+
line-height: 1;
|
|
150
|
+
font-variant-numeric: tabular-nums;
|
|
151
|
+
color: var(--muted-foreground);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
@utility oca-tabular {
|
|
155
|
+
font-variant-numeric: tabular-nums;
|
|
156
|
+
font-feature-settings: 'tnum' 1;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
@utility oca-container {
|
|
160
|
+
width: 100%;
|
|
161
|
+
max-width: 75rem;
|
|
162
|
+
margin-inline: auto;
|
|
163
|
+
padding-inline: clamp(1rem, 0.4rem + 2.6vw, 2.5rem);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
@utility oca-section {
|
|
167
|
+
padding-block: clamp(4rem, 2.8rem + 5vw, 8rem);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* The stadium hairline behind a hero sphere. */
|
|
171
|
+
/* The hairline behind the hero sphere. Its shape is set where it is drawn
|
|
172
|
+
(brand/sphere.tsx): a ring on phones, the deck's rounded square beside it. */
|
|
173
|
+
@utility oca-stadium {
|
|
174
|
+
border: 1px solid var(--oca-outline);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
@layer base {
|
|
178
|
+
[data-oc-app='ochk'] {
|
|
179
|
+
font-family: var(--oc-font-sans);
|
|
180
|
+
font-optical-sizing: auto;
|
|
181
|
+
-webkit-font-smoothing: antialiased;
|
|
182
|
+
-moz-osx-font-smoothing: grayscale;
|
|
183
|
+
text-rendering: optimizeLegibility;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
[data-oc-app='ochk'] body,
|
|
187
|
+
body[data-oc-app='ochk'] {
|
|
188
|
+
background-color: var(--background);
|
|
189
|
+
color: var(--foreground);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
[data-oc-app='ochk'] ::selection {
|
|
193
|
+
background-color: color-mix(in oklab, var(--oca-orange) 28%, transparent);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
[data-oc-app='ochk'] :focus-visible {
|
|
197
|
+
outline: 2px solid var(--ring);
|
|
198
|
+
outline-offset: 2px;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
[data-oc-app='ochk'] code,
|
|
202
|
+
[data-oc-app='ochk'] kbd,
|
|
203
|
+
[data-oc-app='ochk'] samp {
|
|
204
|
+
font-family: var(--oc-font-mono);
|
|
205
|
+
font-size: 0.92em;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/* iOS Safari zooms into a focused field under 16px. Unlayered so no utility re-breaks it. */
|
|
210
|
+
@media (width < 48rem) {
|
|
211
|
+
[data-oc-app='ochk']
|
|
212
|
+
input:not([type='checkbox'], [type='radio'], [type='range'], [type='color'], [type='file'], [type='hidden']),
|
|
213
|
+
[data-oc-app='ochk'] textarea,
|
|
214
|
+
[data-oc-app='ochk'] select {
|
|
215
|
+
font-size: 16px;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
@media (prefers-reduced-motion: reduce) {
|
|
220
|
+
[data-oc-app='ochk'] *,
|
|
221
|
+
[data-oc-app='ochk'] *::before,
|
|
222
|
+
[data-oc-app='ochk'] *::after {
|
|
223
|
+
animation-duration: 0.01ms !important;
|
|
224
|
+
animation-iteration-count: 1 !important;
|
|
225
|
+
transition-duration: 0.01ms !important;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @orangecheck/app-design — tokens.css
|
|
3
|
+
*
|
|
4
|
+
* Token values for ochk.app, measured from Sou's partner deck (2026-10-15) and
|
|
5
|
+
* corrected where the deck fails contrast. Everything is scoped to
|
|
6
|
+
* [data-oc-app='ochk'], so a family site that never sets the attribute never
|
|
7
|
+
* sees a value from here. The :root form outranks a family skin's bare :root.
|
|
8
|
+
*
|
|
9
|
+
* The semantic names (--background, --primary, --muted-foreground…) match the
|
|
10
|
+
* family bridge on purpose: bg-background and text-foreground mean the same
|
|
11
|
+
* thing in either system, so a page needs no translation layer. Everything new
|
|
12
|
+
* to ochk.app is prefixed --oca-.
|
|
13
|
+
*
|
|
14
|
+
* Contrast is checked by scripts/check-contrast.mjs: every text pair ≥ 4.5:1,
|
|
15
|
+
* display accent ≥ 3:1 (large text only).
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
:root[data-oc-app='ochk'],
|
|
19
|
+
[data-oc-app='ochk'] {
|
|
20
|
+
color-scheme: light;
|
|
21
|
+
|
|
22
|
+
/* Surfaces */
|
|
23
|
+
--background: #fafafa;
|
|
24
|
+
--foreground: #0a0a0a;
|
|
25
|
+
--card: #ffffff;
|
|
26
|
+
--card-foreground: #0a0a0a;
|
|
27
|
+
--popover: #ffffff;
|
|
28
|
+
--popover-foreground: #0a0a0a;
|
|
29
|
+
--muted: #f2f2f2;
|
|
30
|
+
--muted-foreground: #54585e;
|
|
31
|
+
--secondary: #ffffff;
|
|
32
|
+
--secondary-foreground: #0a0a0a;
|
|
33
|
+
--accent: #f4f4f4;
|
|
34
|
+
--accent-foreground: #0a0a0a;
|
|
35
|
+
|
|
36
|
+
/* Actions: the black pill and the white outlined pill */
|
|
37
|
+
--primary: #0a0a0a;
|
|
38
|
+
--primary-foreground: #ffffff;
|
|
39
|
+
--brand: #f66d36;
|
|
40
|
+
--brand-foreground: #0a0a0a;
|
|
41
|
+
|
|
42
|
+
/* Lines */
|
|
43
|
+
--border: #ececec;
|
|
44
|
+
--input: #e2e2e2;
|
|
45
|
+
--ring: #f66d36;
|
|
46
|
+
|
|
47
|
+
/* Status */
|
|
48
|
+
--destructive: #c2262e;
|
|
49
|
+
--destructive-foreground: #ffffff;
|
|
50
|
+
--success: #15803d;
|
|
51
|
+
--success-foreground: #ffffff;
|
|
52
|
+
--warning: #a15c07;
|
|
53
|
+
--warning-foreground: #ffffff;
|
|
54
|
+
--info: #1d4ed8;
|
|
55
|
+
--info-foreground: #ffffff;
|
|
56
|
+
|
|
57
|
+
/* ochk.app only */
|
|
58
|
+
--oca-subtle-foreground: #686c72;
|
|
59
|
+
--oca-hairline-strong: #dadada;
|
|
60
|
+
--oca-table-head: #ededed;
|
|
61
|
+
/* #F66D36 as text is 2.81:1 on the canvas; these are the same hue, darker. */
|
|
62
|
+
--oca-accent-display: #f55819;
|
|
63
|
+
--oca-accent-ink: #c73f09;
|
|
64
|
+
--oca-peach: #fed8ab;
|
|
65
|
+
--oca-orange-light: #fb933c;
|
|
66
|
+
--oca-orange: #f66d36;
|
|
67
|
+
--oca-orange-deep: #ea580b;
|
|
68
|
+
--oca-sphere-from: #ff6f33;
|
|
69
|
+
--oca-sphere-to: #ffd9c4;
|
|
70
|
+
--oca-outline: #f2cfc3;
|
|
71
|
+
|
|
72
|
+
/* The dark surfaces (code card, dark bands) are dark in both modes. */
|
|
73
|
+
--oca-ink: #0a0a0a;
|
|
74
|
+
--oca-ink-card: #1e1e1e;
|
|
75
|
+
--oca-ink-line: #2a2a2a;
|
|
76
|
+
--oca-ink-foreground: #ffffff;
|
|
77
|
+
--oca-ink-muted: #d5d8dc;
|
|
78
|
+
--oca-ink-subtle: #909397;
|
|
79
|
+
--oca-ink-title: #fcb781;
|
|
80
|
+
--oca-ink-eyebrow: #f0835a;
|
|
81
|
+
--oca-code-package: #e99a8f;
|
|
82
|
+
--oca-code-tag: #e3a8c2;
|
|
83
|
+
--oca-code-link: #9db4ec;
|
|
84
|
+
|
|
85
|
+
--radius: 1rem;
|
|
86
|
+
--oc-font-sans: 'OCA Inter', 'OCA Inter Fallback', ui-sans-serif, system-ui, sans-serif;
|
|
87
|
+
--oc-font-mono:
|
|
88
|
+
'OCA JetBrains Mono', 'OCA JetBrains Mono Fallback', ui-monospace, SFMono-Regular, monospace;
|
|
89
|
+
--oc-font-display: var(--oc-font-sans);
|
|
90
|
+
|
|
91
|
+
/* The deck has no shadows. Overlays get one, so a dialog still separates. */
|
|
92
|
+
--oc-shadow-2xs: none;
|
|
93
|
+
--oc-shadow-xs: none;
|
|
94
|
+
--oc-shadow-sm: 0 1px 2px rgb(10 10 10 / 0.04);
|
|
95
|
+
--oc-shadow-md: 0 4px 16px -4px rgb(10 10 10 / 0.08);
|
|
96
|
+
--oc-shadow-lg: 0 12px 32px -8px rgb(10 10 10 / 0.12);
|
|
97
|
+
--oc-shadow-xl: 0 24px 56px -12px rgb(10 10 10 / 0.18);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
:root.dark[data-oc-app='ochk'],
|
|
101
|
+
.dark[data-oc-app='ochk'],
|
|
102
|
+
.dark [data-oc-app='ochk'] {
|
|
103
|
+
color-scheme: dark;
|
|
104
|
+
|
|
105
|
+
--background: #0a0a0a;
|
|
106
|
+
--foreground: #fafafa;
|
|
107
|
+
--card: #161616;
|
|
108
|
+
--card-foreground: #fafafa;
|
|
109
|
+
--popover: #1a1a1a;
|
|
110
|
+
--popover-foreground: #fafafa;
|
|
111
|
+
--muted: #1e1e1e;
|
|
112
|
+
--muted-foreground: #a3a6aa;
|
|
113
|
+
--secondary: #0a0a0a;
|
|
114
|
+
--secondary-foreground: #fafafa;
|
|
115
|
+
--accent: #1e1e1e;
|
|
116
|
+
--accent-foreground: #fafafa;
|
|
117
|
+
|
|
118
|
+
--primary: #fafafa;
|
|
119
|
+
--primary-foreground: #0a0a0a;
|
|
120
|
+
--brand: #f66d36;
|
|
121
|
+
--brand-foreground: #0a0a0a;
|
|
122
|
+
|
|
123
|
+
--border: #262626;
|
|
124
|
+
--input: #303030;
|
|
125
|
+
--ring: #f66d36;
|
|
126
|
+
|
|
127
|
+
--destructive: #f87171;
|
|
128
|
+
--destructive-foreground: #0a0a0a;
|
|
129
|
+
--success: #4ade80;
|
|
130
|
+
--success-foreground: #0a0a0a;
|
|
131
|
+
--warning: #fbbf24;
|
|
132
|
+
--warning-foreground: #0a0a0a;
|
|
133
|
+
--info: #93c5fd;
|
|
134
|
+
--info-foreground: #0a0a0a;
|
|
135
|
+
|
|
136
|
+
--oca-subtle-foreground: #8b8e93;
|
|
137
|
+
--oca-hairline-strong: #333333;
|
|
138
|
+
--oca-table-head: #1e1e1e;
|
|
139
|
+
--oca-accent-display: #f66d36;
|
|
140
|
+
--oca-accent-ink: #f0835a;
|
|
141
|
+
--oca-outline: #3a2a24;
|
|
142
|
+
/* In dark the ink band lifts off the canvas, so the deck's rhythm survives. */
|
|
143
|
+
--oca-ink: #141414;
|
|
144
|
+
--oca-ink-card: #1e1e1e;
|
|
145
|
+
--oca-icon-tile: #1e1e1e;
|
|
146
|
+
--oca-icon-ring: #333333;
|
|
147
|
+
|
|
148
|
+
--oc-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.4);
|
|
149
|
+
--oc-shadow-md: 0 4px 16px -4px rgb(0 0 0 / 0.5);
|
|
150
|
+
--oc-shadow-lg: 0 12px 32px -8px rgb(0 0 0 / 0.6);
|
|
151
|
+
--oc-shadow-xl: 0 24px 56px -12px rgb(0 0 0 / 0.7);
|
|
152
|
+
}
|