neba 1.18.0 → 1.18.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/dist/components/checkbox/Checkbox.js +1 -1
- package/dist/components/checkbox-group/CheckboxGroup.d.ts +84 -0
- package/dist/components/checkbox-group/CheckboxGroup.js +1 -0
- package/dist/components/checkbox-group/index.d.ts +2 -0
- package/dist/components/checkbox-group/index.js +1 -0
- package/dist/components/fieldset/Fieldset.d.ts +12 -1
- package/dist/components/fieldset/Fieldset.js +1 -1
- package/dist/components/form/Form.d.ts +8 -2
- package/dist/components/form/Form.js +1 -1
- package/dist/components/list/List.d.ts +9 -0
- package/dist/components/list/List.js +1 -1
- package/dist/components/provider/NebaProvider.d.ts +3 -2
- package/dist/components/provider/NebaProvider.js +1 -1
- package/dist/components/radio-group/RadioGroup.d.ts +13 -0
- package/dist/components/radio-group/RadioGroup.js +1 -1
- package/dist/components/toast/Toast.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/internal/checkbox-group.d.ts +29 -0
- package/dist/internal/checkbox-group.js +1 -0
- package/dist/internal/defaults.d.ts +14 -2
- package/dist/internal/styles.d.ts +13 -1
- package/dist/internal/styles.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind.css +3 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e,jsxs as a}from"react/jsx-runtime";import*as n from"react";import{Checkbox as r}from"@base-ui/react/checkbox";import{Field as t}from"@base-ui/react/field";import{controlTextClasses as i,cx as o,hitAreaClasses as l,metaTextClasses as s,surfaceClasses as d,tickRadiusClasses as c,tickRowLeadingClasses as h,tickSizeClasses as b,transitionClasses as f}from"../../internal/styles.js";import{useStyleDefaults as
|
|
1
|
+
"use client";import{jsx as e,jsxs as a}from"react/jsx-runtime";import*as n from"react";import{Checkbox as r}from"@base-ui/react/checkbox";import{Field as t}from"@base-ui/react/field";import{controlTextClasses as i,cx as o,hitAreaClasses as l,metaTextClasses as s,surfaceClasses as d,tickRadiusClasses as c,tickRowLeadingClasses as h,tickSizeClasses as b,transitionClasses as f}from"../../internal/styles.js";import{useStyleDefaults as m}from"../../internal/defaults.js";import{useFieldsetDisabled as p}from"../../internal/fieldset.js";import{CheckboxGroupContext as u}from"../../internal/checkbox-group.js";const v=["relative inline-flex shrink-0 items-center justify-center border",l,"[-webkit-tap-highlight-color:transparent] [touch-action:manipulation]",f,"active:[transition-duration:0ms]","focus-visible:[outline:2px_solid_var(--n-ring)] focus-visible:outline-offset-2"].join(" "),g=[d,"cursor-pointer bg-(--n-panel) [border-color:var(--n-line)]","hover:bg-(--n-panel-hover) hover:[border-color:var(--n-line-hover)]","data-[checked]:bg-(--n-fill) data-[checked]:text-(--n-on-solid)","data-[checked]:[border-color:transparent]","data-[checked]:hover:bg-(--n-fill-hover)","data-[indeterminate]:bg-(--n-fill) data-[indeterminate]:text-(--n-on-solid)","data-[indeterminate]:[border-color:transparent]"].join(" "),k=[d,"cursor-default bg-(--n-panel) [border-color:var(--n-line)]","[filter:saturate(0.55)]","data-[checked]:bg-(--n-fill) data-[checked]:text-(--n-on-solid)","data-[checked]:[border-color:transparent]","data-[indeterminate]:bg-(--n-fill) data-[indeterminate]:text-(--n-on-solid)","data-[indeterminate]:[border-color:transparent]"].join(" "),x=["cursor-not-allowed bg-transparent [border-color:var(--neba-disabled-border)]","text-(--neba-disabled-fg) shadow-none","data-[checked]:bg-(--neba-disabled-bg)","data-[indeterminate]:bg-(--neba-disabled-bg)"].join(" "),y=["flex size-[70%] items-center justify-center","[transition:opacity_var(--neba-duration)_var(--neba-ease)]","data-[starting-style]:opacity-0 data-[ending-style]:opacity-0","[&_path]:[stroke-dasharray:1]","[&_path]:[transition:stroke-dashoffset_var(--neba-duration)_var(--neba-ease)]","[&[data-starting-style]_path]:[stroke-dashoffset:1]","[&[data-ending-style]_path]:[stroke-dashoffset:1]"].join(" ");function CheckMark(){return e("svg",{viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",className:"size-full",children:e("path",{d:"M2 6.2 4.6 8.8 10 3.4",pathLength:"1",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function DashMark(){return e("svg",{viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",className:"size-full",children:e("path",{d:"M2.5 6h7",pathLength:"1",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})})}export const Checkbox=/*@__PURE__*/n.forwardRef(function Checkbox(l,d){const f=n.useContext(u),{size:j,color:N,label:_,description:$,error:C,invalid:w,disabled:z,readOnly:L,name:M,className:D,classNames:O,style:R,...B}=m(l,["size"],f),W=j??f?.size??"md",E=N??f?.color??"primary",I=L??f?.readOnly??!1,q=M??f?.name,A=p(z)||!0===f?.disabled,F=null!=C&&!1!==C&&""!==C,G=w??F,H=G||!0===f?.invalid?"danger":E,J={"--n-fill":`var(--neba-${H}-fill)`,"--n-fill-hover":`var(--neba-${H}-fill-hover)`,"--n-on-solid":`var(--neba-${H}-on-solid)`,"--n-accent":`var(--neba-${H}-accent)`,"--n-panel":"var(--neba-panel)","--n-panel-hover":"var(--neba-panel-hover)","--n-line":`var(--neba-${H}-line)`,"--n-line-hover":`var(--neba-${H}-line-hover)`,"--n-ring":`var(--neba-${H}-ring)`},K=[v,b[W],c[W],A?x:I?k:g].join(" ");return a(t.Root,{disabled:A,invalid:G,className:o("inline-flex flex-col gap-1 align-top",D??""),style:{...J,...R},children:[a("div",{className:`flex items-start gap-2 ${i[W]} ${h}`,children:[e("span",{className:"flex h-[1lh] shrink-0 items-center",children:e(r.Root,{ref:d,className:o(K,O?.control),disabled:A,readOnly:I,name:q,...B,children:e(r.Indicator,{className:o(y,O?.indicator),render:(a,n)=>e("span",{...a,children:n.indeterminate?e(DashMark,{}):e(CheckMark,{})})})})}),_||$?a("span",{className:"flex min-w-0 flex-col gap-0.5",children:[_?e(t.Label,{className:o("leading-[1.4]",A?"text-(--neba-disabled-fg)":"cursor-pointer text-(--neba-fg)",O?.label),children:_}):null,$?e(t.Description,{className:o(s[W],"text-(--neba-muted-fg)",O?.description),children:$}):null]}):null]}),e(t.Error,F?{match:!0,className:o(s[W],"text-(--n-accent)",O?.error),children:C}:{className:o(s[W],"text-(--n-accent)",O?.error)})]})});
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { CheckboxGroup as BaseUICheckboxGroup } from '@base-ui/react/checkbox-group';
|
|
3
|
+
import type { NebaColor, NebaFieldSlot, NebaOrientation, NebaSize, NebaSlots } from '../../types.js';
|
|
4
|
+
/**
|
|
5
|
+
* The parts a CheckboxGroup draws behind its root. `control` is the element
|
|
6
|
+
* that holds the checkboxes — the one carrying the row or column direction —
|
|
7
|
+
* and not any single Checkbox, which has slots of its own.
|
|
8
|
+
*/
|
|
9
|
+
export type CheckboxGroupSlot = NebaFieldSlot;
|
|
10
|
+
export interface CheckboxGroupProps extends Omit<React.ComponentPropsWithoutRef<typeof BaseUICheckboxGroup>, 'className' | 'style' | 'render'> {
|
|
11
|
+
/**
|
|
12
|
+
* The size of every Checkbox inside, unless one sets its own, and the type
|
|
13
|
+
* scale of the label, the description and the error.
|
|
14
|
+
* @default 'md'
|
|
15
|
+
*/
|
|
16
|
+
size?: NebaSize;
|
|
17
|
+
/** The colour family of every Checkbox inside, unless one sets its own. @default 'primary' */
|
|
18
|
+
color?: NebaColor;
|
|
19
|
+
/**
|
|
20
|
+
* Which way the checkboxes stack. Vertical by default, for RadioGroup's
|
|
21
|
+
* reason: a column is scannable at any length, and a row stops being readable
|
|
22
|
+
* the moment one label runs long.
|
|
23
|
+
* @default 'vertical'
|
|
24
|
+
*/
|
|
25
|
+
orientation?: NebaOrientation;
|
|
26
|
+
/**
|
|
27
|
+
* The gap between the checkboxes, on Tailwind's spacing scale: `3` is
|
|
28
|
+
* `0.75rem`, the same step `gap-3` is. One length on both axes, so a
|
|
29
|
+
* horizontal group that wraps puts its lines as far apart as its options.
|
|
30
|
+
* Left out, a column follows `size` on the ladder a Form stands its fields
|
|
31
|
+
* on, `3` at `md`, and a row keeps `5` along it with the column's step
|
|
32
|
+
* between its lines — RadioGroup's gaps, so the two read as the same kind of
|
|
33
|
+
* question.
|
|
34
|
+
*
|
|
35
|
+
* Not read from a `NebaProvider`: the provider's `spacing` is the gap between
|
|
36
|
+
* fields, and a product that spreads its fields apart should not spread every
|
|
37
|
+
* set of options with them.
|
|
38
|
+
*/
|
|
39
|
+
spacing?: number;
|
|
40
|
+
/** The question the checkboxes answer. It names the group. */
|
|
41
|
+
label?: React.ReactNode;
|
|
42
|
+
/** Helper text under the label. */
|
|
43
|
+
description?: React.ReactNode;
|
|
44
|
+
/** Error message below the checkboxes. Its presence also turns the group invalid. */
|
|
45
|
+
error?: React.ReactNode;
|
|
46
|
+
/** Forces the invalid state without a message. Defaults to `!!error`. */
|
|
47
|
+
invalid?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Shows every checkbox's state without letting it change. Base UI's group
|
|
50
|
+
* has no such state, so this is handed to each Checkbox inside.
|
|
51
|
+
* @default false
|
|
52
|
+
*/
|
|
53
|
+
readOnly?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* The name the ticked values are submitted under. A native submit sends one
|
|
56
|
+
* entry per ticked checkbox, each its `value`, and a Form's `onSubmit` is
|
|
57
|
+
* handed them as an array.
|
|
58
|
+
*/
|
|
59
|
+
name?: string;
|
|
60
|
+
className?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Class names for the parts behind the root. The element holding the
|
|
63
|
+
* checkboxes is `classNames.control`; a single option is styled on the
|
|
64
|
+
* Checkbox itself.
|
|
65
|
+
*/
|
|
66
|
+
classNames?: NebaSlots<CheckboxGroupSlot>;
|
|
67
|
+
style?: React.CSSProperties;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* A set of checkboxes that answer one question, any number of them at once.
|
|
71
|
+
*
|
|
72
|
+
* A column of Checkboxes in a Fieldset already works, and this is what that
|
|
73
|
+
* column was missing: one value for the set — an array of the ticked
|
|
74
|
+
* checkboxes' `value`s, controlled or not — a label and an error that belong to
|
|
75
|
+
* the question rather than to one option, and a parent checkbox that ticks
|
|
76
|
+
* every option at once. `allValues` names every option, and the Checkbox with
|
|
77
|
+
* `parent` is the one that answers for all of them.
|
|
78
|
+
*
|
|
79
|
+
* Base UI's group owns the value and the parent's three states. What it does
|
|
80
|
+
* not carry down is how each option looks, so `size`, `color`, `disabled` and
|
|
81
|
+
* `readOnly` reach every Checkbox through `internal/checkbox-group.ts`, and so
|
|
82
|
+
* does the `name` a native submit needs.
|
|
83
|
+
*/
|
|
84
|
+
export declare const CheckboxGroup: React.ForwardRefExoticComponent<CheckboxGroupProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as e,jsxs as r}from"react/jsx-runtime";import*as a from"react";import{CheckboxGroup as l}from"@base-ui/react/checkbox-group";import{Field as o}from"@base-ui/react/field";import{cx as i,metaTextClasses as t,optionGapClasses as n}from"../../internal/styles.js";import{spacingValue as s}from"../../internal/grid.js";import{useStyleDefaults as c}from"../../internal/defaults.js";import{useFieldsetDisabled as d}from"../../internal/fieldset.js";import{CheckboxGroupContext as m}from"../../internal/checkbox-group.js";export const CheckboxGroup=/*@__PURE__*/a.forwardRef(function CheckboxGroup(f,p){const{size:x="md",color:b="primary",orientation:u="vertical",spacing:h,label:g,description:v,error:j,invalid:N,disabled:y,readOnly:k=!1,name:z,className:w,classNames:C,style:G,children:O,...R}=c(f,["size"]),D=d(y),E=null!=j&&!1!==j&&""!==j,L=N??E,M=L?"danger":b,P=a.useMemo(()=>({size:x,color:b,invalid:L,disabled:D,readOnly:k,name:z}),[x,b,L,D,k,z]);return e(m.Provider,{value:P,children:r(o.Root,{name:z,disabled:D,invalid:L,className:i("flex flex-col gap-1.5",w??""),style:{"--n-accent":`var(--neba-${M}-accent)`,...G},children:[g?e(o.Label,{className:i(t[x],"font-medium",D?"text-(--neba-disabled-fg)":"text-(--neba-fg)",C?.label),children:g}):null,v?e(o.Description,{className:i(t[x],"text-(--neba-muted-fg)",C?.description),children:v}):null,e(l,{ref:p,disabled:D,className:i("flex","horizontal"===u?"flex-row flex-wrap":"flex-col",void 0===h?n[u][x]:"",C?.control),style:void 0===h?void 0:{gap:s(h)},...R,children:O}),e(o.Error,E?{match:!0,className:i(t[x],"text-(--n-accent)",C?.error),children:j}:{className:i(t[x],"text-(--n-accent)",C?.error)})]})})});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{CheckboxGroup}from"./CheckboxGroup.js";
|
|
@@ -11,8 +11,19 @@ export interface FieldsetProps extends Omit<React.ComponentPropsWithoutRef<'fiel
|
|
|
11
11
|
description?: React.ReactNode;
|
|
12
12
|
/** Disables every control inside at once, the way a `<fieldset>` always has. */
|
|
13
13
|
disabled?: boolean;
|
|
14
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* The type scale of the legend, and the gap between the controls when
|
|
16
|
+
* `spacing` is not given.
|
|
17
|
+
* @default 'md'
|
|
18
|
+
*/
|
|
15
19
|
size?: NebaSize;
|
|
20
|
+
/**
|
|
21
|
+
* The gap between the controls as an exact length, on Tailwind's spacing
|
|
22
|
+
* scale: `5` is `1.25rem`, the same step `gap-5` is. Takes over from the gap
|
|
23
|
+
* `size` picks, leaves the legend's type scale alone, and a `NebaProvider` can
|
|
24
|
+
* set it for every Fieldset.
|
|
25
|
+
*/
|
|
26
|
+
spacing?: number;
|
|
16
27
|
children?: React.ReactNode;
|
|
17
28
|
}
|
|
18
29
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e,jsxs as i}from"react/jsx-runtime";import*as s from"react";import{Fieldset as
|
|
1
|
+
"use client";import{jsx as e,jsxs as i}from"react/jsx-runtime";import*as s from"react";import{Fieldset as r}from"@base-ui/react/fieldset";import{cx as l,hasContent as a,metaTextClasses as d,sheetHeaderGapClasses as t,sheetSectionGapClasses as n,sheetTitleClasses as o}from"../../internal/styles.js";import{spacingValue as m}from"../../internal/grid.js";import{useStyleDefaults as c}from"../../internal/defaults.js";import{FieldsetDisabledContext as f,useFieldsetDisabled as p}from"../../internal/fieldset.js";export const Fieldset=/*@__PURE__*/s.forwardRef(function Fieldset(u,b){const{legend:x,description:j,disabled:g,size:v="md",spacing:h,className:y,style:N,children:w,"aria-describedby":F,...$}=c(u,["size","spacing"]),z=p(g),R=s.useId(),B=a(x),I=a(j);return e(f.Provider,{value:z,children:i(r.Root,{ref:b,disabled:z,className:l("m-0 flex min-w-0 flex-col border-0 p-0",void 0===h?n[v]:"",y??""),style:void 0===h?N:{gap:m(h),...N},"aria-describedby":[F,I?R:void 0].filter(Boolean).join(" ")||void 0,...$,children:[B||I?i("div",{className:`flex min-w-0 flex-col ${t[v]}`,children:[B?e(r.Legend,{className:`p-0 font-semibold ${o[v]}`,children:x}):null,I?e("span",{id:R,className:`text-(--neba-muted-fg) ${d[v]}`,children:j}):null]}):null,w]})})});
|
|
@@ -36,11 +36,17 @@ export interface FormProps extends Omit<React.ComponentPropsWithoutRef<'form'>,
|
|
|
36
36
|
*/
|
|
37
37
|
onSubmit?: (values: Record<string, unknown>) => void;
|
|
38
38
|
/**
|
|
39
|
-
* The gap between the form's children
|
|
40
|
-
* rung of the ladder it stacks on.
|
|
39
|
+
* The gap between the form's children, when `spacing` is not given. A form is
|
|
40
|
+
* a stack, and this is which rung of the ladder it stacks on.
|
|
41
41
|
* @default 'md'
|
|
42
42
|
*/
|
|
43
43
|
size?: NebaSize;
|
|
44
|
+
/**
|
|
45
|
+
* The gap between the form's children as an exact length, on Tailwind's
|
|
46
|
+
* spacing scale: `5` is `1.25rem`, the same step `gap-5` is. Takes over from
|
|
47
|
+
* the gap `size` picks, and a `NebaProvider` can set it for every Form.
|
|
48
|
+
*/
|
|
49
|
+
spacing?: number;
|
|
44
50
|
children?: React.ReactNode;
|
|
45
51
|
}
|
|
46
52
|
export declare const Form: React.ForwardRefExoticComponent<FormProps & React.RefAttributes<HTMLFormElement>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e}from"react/jsx-runtime";import*as r from"react";import{Form as t}from"@base-ui/react/form";import{cx as o,sheetSectionGapClasses as n}from"../../internal/styles.js";import{useStyleDefaults as a}from"../../internal/defaults.js";export const Form=/*@__PURE__*/r.forwardRef(function Form(r,
|
|
1
|
+
"use client";import{jsx as e}from"react/jsx-runtime";import*as r from"react";import{Form as t}from"@base-ui/react/form";import{cx as o,sheetSectionGapClasses as n}from"../../internal/styles.js";import{spacingValue as i}from"../../internal/grid.js";import{useStyleDefaults as a}from"../../internal/defaults.js";export const Form=/*@__PURE__*/r.forwardRef(function Form(r,s){const{validationMode:m="onSubmit",errors:l,onSubmit:c,size:f="md",spacing:d,className:u,style:p,children:g,...b}=a(r,["size","spacing"]);return e(t,{ref:s,validationMode:m,errors:l,onFormSubmit:c?(e,r)=>c(function(e,r){if(!(r instanceof HTMLFormElement))return e;const t=r.querySelectorAll("input[data-neba-repeats][name]:not(:disabled)");if(0===t.length)return e;const o=new FormData(r),n={...e};for(const e of t)n[e.name]=o.getAll(e.name);return n}(e,r.event.target)):void 0,className:o("flex flex-col",void 0===d?n[f]:"",u??""),style:void 0===d?p:{gap:i(d),...p},...b,children:g})});
|
|
@@ -17,6 +17,15 @@ export interface ListProps extends NebaStyleProps, Omit<React.ComponentPropsWith
|
|
|
17
17
|
* @default false
|
|
18
18
|
*/
|
|
19
19
|
dividers?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* The gap between the rows, on Tailwind's spacing scale: `1` is `0.25rem`,
|
|
22
|
+
* the same step `gap-1` is. Left out, the rows touch, and the padding inside
|
|
23
|
+
* each one is what keeps their text apart.
|
|
24
|
+
*
|
|
25
|
+
* Ignored with `dividers`, where the rule is what separates the rows: a rule
|
|
26
|
+
* with a gap on either side of it is a line floating between two tiles.
|
|
27
|
+
*/
|
|
28
|
+
spacing?: number;
|
|
20
29
|
/**
|
|
21
30
|
* Renders something other than a `<ul>` — `render={<ol />}` for a list where
|
|
22
31
|
* the order is the point. Base UI's own escape hatch.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e,jsxs as n,Fragment as r}from"react/jsx-runtime";import*as t from"react";import{safeHref as s}from"../../internal/link.js";import{useRender as
|
|
1
|
+
"use client";import{jsx as e,jsxs as n,Fragment as r}from"react/jsx-runtime";import*as t from"react";import{safeHref as s}from"../../internal/link.js";import{useRender as i}from"@base-ui/react/use-render";import{boxPaddingXClasses as l}from"../box/Box.js";import{cx as a,focusRingClasses as o,gapClasses as d,hasContent as c,iconClasses as m,metaTextClasses as f,radiusClasses as p,sheetBodyClasses as x,surfaceClasses as u,surfaceSlots as v,transitionClasses as h}from"../../internal/styles.js";import{spacingValue as b}from"../../internal/grid.js";import{useStyleDefaults as g}from"../../internal/defaults.js";const y=/*@__PURE__*/t.createContext({size:"md",density:"default",dividers:!1}),N={solid:[u,"text-(--neba-fg) bg-(--n-panel-hover)","[box-shadow:var(--n-elev),var(--neba-plate-solid)]"].join(" "),outline:[u,"border text-(--neba-fg) bg-(--n-panel)","[border-color:var(--n-line)]","[box-shadow:var(--n-elev),var(--neba-plate-glass)]"].join(" "),text:"text-(--neba-fg) bg-transparent"},j={default:{xs:"py-1",sm:"py-1.5",md:"py-2",lg:"py-2.5",xl:"py-3"},compact:{xs:"py-0.5",sm:"py-0.5",md:"py-1",lg:"py-1.5",xl:"py-2"}},w={xs:p.xs,sm:p.xs,md:p.sm,lg:p.sm,xl:p.md};export const List=/*@__PURE__*/t.forwardRef(function List(n,r){const{variant:s="outline",size:l="md",color:o="primary",density:d="default",elevation:c=0,dividers:m=!1,spacing:f,render:x,className:u,style:j,children:w,...k}=g(n,["size","density","variant"]),z=t.useMemo(()=>({size:l,density:d,dividers:m}),[l,d,m]),C=a("flex flex-col",p[l],N[s],h,m?"overflow-hidden [&>li+li]:border-t [&>li+li]:[border-color:var(--n-line)]":"p-1",u??""),I=i({render:x,ref:r,props:{role:"list",className:C,style:{...v(o,c),...void 0===f||m?null:{gap:b(f)},...j},children:w,...k}});return e(y.Provider,{value:z,children:I})});export const ListItem=/*@__PURE__*/t.forwardRef(function ListItem({startIcon:i,endIcon:p,description:u,action:v,href:b,selected:g=!1,disabled:N=!1,className:k,children:z,onClick:C,...I},L){const{size:_,density:B,dividers:R}=t.useContext(y),$=s(b),F=Boolean(C||$)&&!N,M=l[B][_],P=j[B][_],q=a("flex min-w-0 flex-1 items-center text-start",M,P,d[_],x[_],h,m,R?"":w[_],N?"cursor-not-allowed text-(--neba-disabled-fg)":g?"bg-(--n-soft-press) font-medium text-(--n-on-tint)":"",F?`cursor-pointer ${R?"[outline:0_solid_var(--n-ring)] outline-offset-[-2px] focus-visible:[outline:2px_solid_var(--n-ring)]":o}`:"",F&&!g?"hover:bg-(--n-soft)":"",F&&g?"hover:bg-(--n-soft-press)":""),A=n(r,{children:[c(i)?e("span",{className:"flex h-[1lh] shrink-0 items-center text-(--neba-muted-fg)",children:i}):null,n("span",{className:"flex min-w-0 flex-1 flex-col",children:[c(z)?e("span",{className:"truncate",children:z}):null,c(u)?e("span",{className:a("truncate",f[_],g?"":"text-(--neba-muted-fg)"),children:u}):null]}),c(p)?e("span",{className:"flex h-[1lh] shrink-0 items-center text-(--neba-muted-fg)",children:p}):null]});return n("li",{ref:L,className:a("flex w-full items-center",k??""),...I,children:[F&&$?e("a",{href:$,className:q,"aria-current":g?"page":void 0,onClick:C,children:A}):F?e("button",{type:"button",className:q,"aria-current":!!g||void 0,onClick:C,children:A}):e("div",{className:q,"aria-disabled":N||void 0,"aria-current":!!g||void 0,children:A}),c(v)?e("div",{className:`flex shrink-0 items-center ${M}`,children:v}):null]})});
|
|
@@ -19,8 +19,9 @@ export interface NebaProviderProps {
|
|
|
19
19
|
/**
|
|
20
20
|
* Prop values every component under it starts from.
|
|
21
21
|
*
|
|
22
|
-
* `size`, `density`, `variant`, `locale` and `
|
|
23
|
-
* right value is a property of the product rather than of the
|
|
22
|
+
* `size`, `density`, `variant`, `locale`, `labelPlacement` and `spacing` — the
|
|
23
|
+
* axes whose right value is a property of the product rather than of the
|
|
24
|
+
* control. A call site still wins:
|
|
24
25
|
* the order is the caller, then this, then the component's own default.
|
|
25
26
|
*/
|
|
26
27
|
defaults?: NebaDefaults;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e}from"react/jsx-runtime";import*as t from"react";import{DirectionProvider as r,useDirection as o}from"@base-ui/react/direction-provider";import{DefaultsContext as n}from"../../internal/defaults.js";import{useHydrated as l,useMediaQuery as c}from"../../internal/media.js";import{DEFAULT_STORAGE_KEY as i}from"./colorSchemeScript.js";const s=/*@__PURE__*/t.createContext(null);export function NebaProvider({children:a,defaults:u,colorScheme:m,defaultColorScheme:d="system",onColorSchemeChange:h,storageKey:f=i,colorSchemeElement:
|
|
1
|
+
"use client";import{jsx as e}from"react/jsx-runtime";import*as t from"react";import{DirectionProvider as r,useDirection as o}from"@base-ui/react/direction-provider";import{DefaultsContext as n}from"../../internal/defaults.js";import{useHydrated as l,useMediaQuery as c}from"../../internal/media.js";import{DEFAULT_STORAGE_KEY as i}from"./colorSchemeScript.js";const s=/*@__PURE__*/t.createContext(null);export function NebaProvider({children:a,defaults:u,colorScheme:m,defaultColorScheme:d="system",onColorSchemeChange:h,storageKey:f=i,colorSchemeElement:p,direction:S}){const v=l(),g=t.useContext(n),b=t.useContext(s),y=o(),[C,E]=t.useState(null),P=t.useMemo(()=>v?function(e){if(!1===e||"undefined"==typeof localStorage)return null;try{const t=localStorage.getItem(e);return"light"===t||"dark"===t||"system"===t?t:null}catch{return null}}(f):null,[v,f]),x=m??C??P??d,k=c("(prefers-color-scheme: dark)"),w="system"===x?k?"dark":"light":x,N=t.useCallback(e=>{if(void 0===m&&E(e),!1!==f)try{localStorage.setItem(f,e)}catch{}h?.(e)},[m,f,h]);t.useEffect(()=>{if(!v)return;const e=p?p():null===b?document.documentElement:null;e&&(e.setAttribute("data-theme",w),e.style.colorScheme=w)},[v,w,p,b]);const j=t.useRef(!1);t.useEffect(()=>{const e=!j.current;if(j.current=!0,!S)return;const t=document.documentElement.dir;"production"!==process.env.NODE_ENV&&e&&(t||"ltr")!==S&&console.warn(`Neba: a NebaProvider has direction="${S}", and <html> ${t?`has dir="${t}"`:"has no dir"}. The provider sets dir only once it has mounted, so the page is drawn the other way round until then and mirrors when it does. Put dir="${S}" on <html> in the HTML itself.`),document.documentElement.setAttribute("dir",S)},[S]);const M=t.useMemo(()=>({colorScheme:x,resolvedColorScheme:w,setColorScheme:N,toggleColorScheme:()=>N("dark"===w?"light":"dark")}),[x,w,N]),$=u?.size??g?.size,z=u?.density??g?.density,A=u?.variant??g?.variant,I=u?.locale??g?.locale,T=u?.labelPlacement??g?.labelPlacement,D=u?.spacing??g?.spacing,H=null!=u||null!==g,K=t.useMemo(()=>H?{size:$,density:z,variant:A,locale:I,labelPlacement:T,spacing:D}:null,[H,$,z,A,I,T,D]);return e(n.Provider,{value:K,children:e(s.Provider,{value:M,children:e(r,{direction:S??y,children:a})})})}export function useColorScheme(){const e=t.useContext(s);if(!e)throw new Error("neba: useColorScheme() needs a <NebaProvider> above it.");return e}
|
|
@@ -25,6 +25,19 @@ export interface RadioGroupProps extends Omit<React.ComponentPropsWithoutRef<typ
|
|
|
25
25
|
* @default 'vertical'
|
|
26
26
|
*/
|
|
27
27
|
orientation?: NebaOrientation;
|
|
28
|
+
/**
|
|
29
|
+
* The gap between the options, on Tailwind's spacing scale: `3` is
|
|
30
|
+
* `0.75rem`, the same step `gap-3` is. One length on both axes, so a
|
|
31
|
+
* horizontal group that wraps puts its lines as far apart as its options.
|
|
32
|
+
* Left out, a column follows `size` on the ladder a Form stands its fields
|
|
33
|
+
* on, `3` at `md`, and a row keeps `5` along it with the column's step
|
|
34
|
+
* between its lines.
|
|
35
|
+
*
|
|
36
|
+
* Not read from a `NebaProvider`: the provider's `spacing` is the gap between
|
|
37
|
+
* fields, and a product that spreads its fields apart should not spread every
|
|
38
|
+
* set of options with them.
|
|
39
|
+
*/
|
|
40
|
+
spacing?: number;
|
|
28
41
|
/** The question the options answer. Rendered as the group's legend. */
|
|
29
42
|
label?: React.ReactNode;
|
|
30
43
|
/** Helper text under the label. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e,jsxs as a}from"react/jsx-runtime";import*as r from"react";import{Radio as n}from"@base-ui/react/radio";import{RadioGroup as l}from"@base-ui/react/radio-group";import{Field as i}from"@base-ui/react/field";import{controlTextClasses as o,cx as t,hitAreaClasses as s,metaTextClasses as d,
|
|
1
|
+
"use client";import{jsx as e,jsxs as a}from"react/jsx-runtime";import*as r from"react";import{Radio as n}from"@base-ui/react/radio";import{RadioGroup as l}from"@base-ui/react/radio-group";import{Field as i}from"@base-ui/react/field";import{controlTextClasses as o,cx as t,hitAreaClasses as s,metaTextClasses as d,optionGapClasses as c,surfaceClasses as b,tickDotClasses as f,tickRowLeadingClasses as m,tickSizeClasses as h,transitionClasses as p}from"../../internal/styles.js";import{spacingValue as u}from"../../internal/grid.js";import{useStyleDefaults as v}from"../../internal/defaults.js";import{useFieldsetDisabled as g}from"../../internal/fieldset.js";const x=/*@__PURE__*/r.createContext({size:"md",color:"primary",readOnly:!1,disabled:!1}),N=["relative inline-flex shrink-0 items-center justify-center rounded-full border",s,"[-webkit-tap-highlight-color:transparent] [touch-action:manipulation]",p,"active:[transition-duration:0ms]","focus-visible:[outline:2px_solid_var(--n-ring)] focus-visible:outline-offset-2"].join(" "),y=[b,"cursor-pointer bg-(--n-panel) [border-color:var(--n-line)]","hover:bg-(--n-panel-hover) hover:[border-color:var(--n-line-hover)]","data-[checked]:bg-(--n-fill) data-[checked]:text-(--n-on-solid)","data-[checked]:[border-color:transparent]","data-[checked]:hover:bg-(--n-fill-hover)"].join(" "),j=[b,"cursor-default bg-(--n-panel) [border-color:var(--n-line)]","[filter:saturate(0.55)]","data-[checked]:bg-(--n-fill) data-[checked]:text-(--n-on-solid)","data-[checked]:[border-color:transparent]"].join(" "),k=["cursor-not-allowed bg-transparent [border-color:var(--neba-disabled-border)] shadow-none","data-[checked]:bg-(--neba-disabled-bg)"].join(" "),z=["neba-radio-dot rounded-full bg-current","[transition:width_var(--neba-duration)_var(--neba-ease),height_var(--neba-duration)_var(--neba-ease)]","data-[starting-style]:size-0 data-[ending-style]:size-0"].join(" ");export const Radio=/*@__PURE__*/r.forwardRef(function Radio({label:l,description:s,disabled:c,className:b,classNames:p,style:u,...v},g){const R=r.useContext(x),w=v.readOnly??R.readOnly,$=c??R.disabled;return e(i.Root,{disabled:$,className:t("flex flex-col",b??""),style:u,children:a("div",{className:`flex items-start gap-2 ${o[R.size]} ${m}`,children:[e("span",{className:"flex h-[1lh] shrink-0 items-center",children:e(n.Root,{ref:g,className:t(N,h[R.size],$?k:w?j:y,p?.control),disabled:$,...v,children:e(n.Indicator,{className:t(z,f[R.size],p?.indicator)})})}),l||s?a("span",{className:"flex min-w-0 flex-col gap-0.5",children:[l?e(i.Label,{className:t("leading-[1.4]",$?"text-(--neba-disabled-fg)":"cursor-pointer text-(--neba-fg)",p?.label),children:l}):null,s?e(i.Description,{className:t(d[R.size],"text-(--neba-muted-fg)",p?.description),children:s}):null]}):null]})})});export const RadioGroup=/*@__PURE__*/r.forwardRef(function RadioGroup(n,o){const{size:s="md",color:b="primary",orientation:f="vertical",spacing:m,label:h,description:p,error:N,invalid:y,disabled:j,readOnly:k=!1,className:z,classNames:R,style:w,children:$,...O}=v(n,["size"]),_=g(j),G=null!=N&&!1!==N&&""!==N,C=y??G,D=C?"danger":b,L={"--n-fill":`var(--neba-${D}-fill)`,"--n-fill-hover":`var(--neba-${D}-fill-hover)`,"--n-on-solid":`var(--neba-${D}-on-solid)`,"--n-accent":`var(--neba-${D}-accent)`,"--n-panel":"var(--neba-panel)","--n-panel-hover":"var(--neba-panel-hover)","--n-line":`var(--neba-${D}-line)`,"--n-line-hover":`var(--neba-${D}-line-hover)`,"--n-ring":`var(--neba-${D}-ring)`},E=r.useMemo(()=>({size:s,color:D,readOnly:k,disabled:_}),[s,D,k,_]);return e(x.Provider,{value:E,children:a(i.Root,{disabled:_,invalid:C,className:t("flex flex-col gap-1.5",z??""),style:{...L,...w},children:[h?e(i.Label,{className:t(d[s],"font-medium",_?"text-(--neba-disabled-fg)":"text-(--neba-fg)",R?.label),children:h}):null,p?e(i.Description,{className:t(d[s],"text-(--neba-muted-fg)",R?.description),children:p}):null,e(l,{ref:o,disabled:_,readOnly:k,className:t("flex","horizontal"===f?"flex-row flex-wrap":"flex-col",void 0===m?c[f][s]:"",R?.control),style:void 0===m?void 0:{gap:u(m)},...O,children:$}),e(i.Error,G?{match:!0,className:t(d[s],"text-(--n-accent)",R?.error),children:N}:{className:t(d[s],"text-(--n-accent)",R?.error)})]})})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e,jsxs as t}from"react/jsx-runtime";import*as o from"react";import{useLayoutEffectOnClient as i}from"../../internal/layout-effect.js";import{Toast as s}from"@base-ui/react/toast";import{boxPaddingClasses as n}from"../box/Box.js";import{actionMessages as a,toastMessages as r,useMessages as l}from"../../internal/i18n.js";import{CloseIcon as c,severityIcon as d}from"../../internal/icons.js";import{controlSlots as m,cx as u,focusRingClasses as f,hasContent as p,hitAreaClasses as b,iconClasses as v,metaTextClasses as x,popupFadeClasses as h,radiusClasses as w,sheetBodyClasses as g,sheetHeaderGapClasses as j,sheetSectionGapClasses as y,sheetTitleClasses as N,sheetTitleHeadingClasses as T,surfaceClasses as z}from"../../internal/styles.js";import{useStyleDefaults as L}from"../../internal/defaults.js";const k={"top-start":"top-0 items-start","top-center":"top-0 items-center","top-end":"top-0 items-end","bottom-start":"bottom-0 items-start flex-col-reverse","bottom-center":"bottom-0 items-center flex-col-reverse","bottom-end":"bottom-0 items-end flex-col-reverse"},_={solid:[z,"text-(--n-on-solid) bg-(--n-fill)","[box-shadow:var(--neba-shadow-3),var(--neba-plate-solid)]"].join(" "),outline:[z,"border text-(--neba-fg) bg-(--n-panel-press)","[border-color:var(--n-line)]","[box-shadow:var(--neba-shadow-3),var(--neba-plate-glass)]"].join(" "),text:[z,"text-(--neba-fg) bg-(--n-panel-press)","[box-shadow:var(--neba-shadow-3),var(--neba-plate-glass)]"].join(" ")},M={solid:"",outline:"text-(--n-on-tint)",text:"text-(--n-on-tint)"};function O(e){const{color:t,variant:o,icon:i,actionLabel:s,onAction:n,...a}=e;return{...a,data:{color:t,variant:o,icon:i},actionProps:void 0===s?void 0:{children:s,onClick:n}}}export function useToast(){const e=s.useToastManager(),t=o.useRef(e);i(()=>{t.current=e});const n=o.useMemo(()=>({add:e=>t.current.add(O(e)),close:e=>t.current.close(e),update:(e,o)=>t.current.update(e,e=>function(e,t){const{color:o,variant:i,icon:s,actionLabel:n,onAction:a,...r}=e,l=Object.fromEntries(Object.entries(r).filter(([,e])=>void 0!==e)),c=Object.fromEntries(Object.entries({color:o,variant:i,icon:s}).filter(([,e])=>void 0!==e));return{...l,...0===Object.keys(c).length?null:{data:{...t.data,...c}},...void 0===n?null:{actionProps:{children:n,onClick:a}}}}(o,e)),promise:(e,o)=>t.current.promise(e,{loading:O(o.loading),success:e=>O("function"==typeof o.success?o.success(e):o.success),error:e=>O("function"==typeof o.error?o.error(e):o.error)})}),[]);return o.useMemo(()=>({...n,toasts:e.toasts}),[n,e.toasts])}function ToastItem({toast:o,variant:i,color:a,size:r,density:l,closeLabel:z,swipeDirection:L,classNames:k}){const O=o.data?.variant??i??"outline",P=o.data?.color??a,D=void 0===o.data?.icon?d(P):o.data.icon,A=M[O],C=p(o.title);return t(s.Root,{toast:o,swipeDirection:L,className:u("pointer-events-auto flex w-full items-start",n[l??"default"][r],w[r],y[r],g[r],_[O],v,h,"data-[limited]:hidden",f,k?.toast),style:m(P,3,O),children:[p(D)?e("span",{className:`flex h-[1lh] shrink-0 items-center ${A}`,children:D}):null,t("div",{className:`flex min-w-0 flex-1 flex-col ${j[r]}`,children:[e(s.Title,{className:u(T,"font-semibold",N[r],A,k?.title)}),e(s.Description,{className:u(C&&"solid"!==O?"text-(--neba-muted-fg)":"",k?.description)})]}),e(s.Action,{className:u("flex h-[1lh] shrink-0 cursor-pointer items-center rounded-full px-2","font-medium underline-offset-2",A||"text-(--n-on-solid)","hover:underline","focus-visible:[outline:2px_solid_var(--n-ring)] focus-visible:outline-offset-2",x[r],k?.action)}),e("span",{className:"flex h-[1lh] shrink-0 items-center",children:e(s.Close,{"aria-label":z,className:u("relative inline-flex size-[1.15em] cursor-pointer items-center justify-center rounded-full",b,"opacity-70 [transition:opacity_var(--neba-duration)_var(--neba-ease)]","hover:opacity-100 focus-visible:opacity-100","focus-visible:[outline:2px_solid_var(--n-ring)] focus-visible:outline-offset-2",k?.close),children:e(c,{})})})]})}function ToastViewport(t){const{toasts:i}=s.useToastManager(),{position:n,width:a,classNames:r,regionLabel:l,...c}=t,d=o.useMemo(()=>[n.startsWith("top")?"up":"down","left","right"],[n]);return e(s.Portal,{children:e(s.Viewport,{"aria-label":l,className:u("neba-portal pointer-events-none fixed inset-x-0
|
|
1
|
+
"use client";import{jsx as e,jsxs as t}from"react/jsx-runtime";import*as o from"react";import{useLayoutEffectOnClient as i}from"../../internal/layout-effect.js";import{Toast as s}from"@base-ui/react/toast";import{boxPaddingClasses as n}from"../box/Box.js";import{actionMessages as a,toastMessages as r,useMessages as l}from"../../internal/i18n.js";import{CloseIcon as c,severityIcon as d}from"../../internal/icons.js";import{controlSlots as m,cx as u,focusRingClasses as f,hasContent as p,hitAreaClasses as b,iconClasses as v,metaTextClasses as x,popupFadeClasses as h,radiusClasses as w,sheetBodyClasses as g,sheetHeaderGapClasses as j,sheetSectionGapClasses as y,sheetTitleClasses as N,sheetTitleHeadingClasses as T,surfaceClasses as z}from"../../internal/styles.js";import{useStyleDefaults as L}from"../../internal/defaults.js";const k={"top-start":"top-0 items-start","top-center":"top-0 items-center","top-end":"top-0 items-end","bottom-start":"bottom-0 items-start flex-col-reverse","bottom-center":"bottom-0 items-center flex-col-reverse","bottom-end":"bottom-0 items-end flex-col-reverse"},_={solid:[z,"text-(--n-on-solid) bg-(--n-fill)","[box-shadow:var(--neba-shadow-3),var(--neba-plate-solid)]"].join(" "),outline:[z,"border text-(--neba-fg) bg-(--n-panel-press)","[border-color:var(--n-line)]","[box-shadow:var(--neba-shadow-3),var(--neba-plate-glass)]"].join(" "),text:[z,"text-(--neba-fg) bg-(--n-panel-press)","[box-shadow:var(--neba-shadow-3),var(--neba-plate-glass)]"].join(" ")},M={solid:"",outline:"text-(--n-on-tint)",text:"text-(--n-on-tint)"};function O(e){const{color:t,variant:o,icon:i,actionLabel:s,onAction:n,...a}=e;return{...a,data:{color:t,variant:o,icon:i},actionProps:void 0===s?void 0:{children:s,onClick:n}}}export function useToast(){const e=s.useToastManager(),t=o.useRef(e);i(()=>{t.current=e});const n=o.useMemo(()=>({add:e=>t.current.add(O(e)),close:e=>t.current.close(e),update:(e,o)=>t.current.update(e,e=>function(e,t){const{color:o,variant:i,icon:s,actionLabel:n,onAction:a,...r}=e,l=Object.fromEntries(Object.entries(r).filter(([,e])=>void 0!==e)),c=Object.fromEntries(Object.entries({color:o,variant:i,icon:s}).filter(([,e])=>void 0!==e));return{...l,...0===Object.keys(c).length?null:{data:{...t.data,...c}},...void 0===n?null:{actionProps:{children:n,onClick:a}}}}(o,e)),promise:(e,o)=>t.current.promise(e,{loading:O(o.loading),success:e=>O("function"==typeof o.success?o.success(e):o.success),error:e=>O("function"==typeof o.error?o.error(e):o.error)})}),[]);return o.useMemo(()=>({...n,toasts:e.toasts}),[n,e.toasts])}function ToastItem({toast:o,variant:i,color:a,size:r,density:l,closeLabel:z,swipeDirection:L,classNames:k}){const O=o.data?.variant??i??"outline",P=o.data?.color??a,D=void 0===o.data?.icon?d(P):o.data.icon,A=M[O],C=p(o.title);return t(s.Root,{toast:o,swipeDirection:L,className:u("pointer-events-auto flex w-full items-start",n[l??"default"][r],w[r],y[r],g[r],_[O],v,h,"data-[limited]:hidden",f,k?.toast),style:m(P,3,O),children:[p(D)?e("span",{className:`flex h-[1lh] shrink-0 items-center ${A}`,children:D}):null,t("div",{className:`flex min-w-0 flex-1 flex-col ${j[r]}`,children:[e(s.Title,{className:u(T,"font-semibold",N[r],A,k?.title)}),e(s.Description,{className:u(C&&"solid"!==O?"text-(--neba-muted-fg)":"",k?.description)})]}),e(s.Action,{className:u("flex h-[1lh] shrink-0 cursor-pointer items-center rounded-full px-2","font-medium underline-offset-2",A||"text-(--n-on-solid)","hover:underline","focus-visible:[outline:2px_solid_var(--n-ring)] focus-visible:outline-offset-2",x[r],k?.action)}),e("span",{className:"flex h-[1lh] shrink-0 items-center",children:e(s.Close,{"aria-label":z,className:u("relative inline-flex size-[1.15em] cursor-pointer items-center justify-center rounded-full",b,"opacity-70 [transition:opacity_var(--neba-duration)_var(--neba-ease)]","hover:opacity-100 focus-visible:opacity-100","focus-visible:[outline:2px_solid_var(--n-ring)] focus-visible:outline-offset-2",k?.close),children:e(c,{})})})]})}function ToastViewport(t){const{toasts:i}=s.useToastManager(),{position:n,width:a,classNames:r,regionLabel:l,...c}=t,d=o.useMemo(()=>[n.startsWith("top")?"up":"down","left","right"],[n]);return e(s.Portal,{children:e(s.Viewport,{"aria-label":l,className:u("neba-portal pointer-events-none fixed inset-x-0 flex flex-col gap-2 p-4","z-(--neba-z-toast,calc(var(--neba-z-portal)+1))",k[n],r?.viewport),children:i.map(t=>e("div",{className:"w-full",style:{maxWidth:"number"==typeof a?`${a}px`:a},children:e(ToastItem,{toast:t,swipeDirection:d,classNames:r,...c})},t.id))})})}export function ToastProvider(o){const{variant:i="outline",size:n="md",color:c="primary",density:d="default",position:m="bottom-end",timeout:u=5e3,limit:f=3,width:p=380,locale:b,closeLabel:v,label:x,classNames:h,children:w}=L(o,["size","density","variant","locale"]),g=l(a,b),j=l(r,b);return t(s.Provider,{timeout:u,limit:f,children:[w,e(ToastViewport,{position:m,variant:i,size:n,color:c,density:d,width:p,closeLabel:v??g.close,regionLabel:x??j.label,classNames:h})]})}
|
package/dist/index.d.ts
CHANGED
|
@@ -39,6 +39,7 @@ export * from './components/card/index.js';
|
|
|
39
39
|
export * from './components/carousel/index.js';
|
|
40
40
|
export * from './components/chat-bubble/index.js';
|
|
41
41
|
export * from './components/checkbox/index.js';
|
|
42
|
+
export * from './components/checkbox-group/index.js';
|
|
42
43
|
export * from './components/chip/index.js';
|
|
43
44
|
export * from './components/code-block/index.js';
|
|
44
45
|
export * from './components/collapsible/index.js';
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from"./types.js";export*from"./hooks/index.js";export*from"./components/accordion/index.js";export*from"./components/agent-steps/index.js";export*from"./components/alert/index.js";export*from"./components/anchor/index.js";export*from"./components/animate-appear/index.js";export*from"./components/app-logo/index.js";export*from"./components/approval/index.js";export*from"./components/animate-blink/index.js";export*from"./components/animate-counter/index.js";export*from"./components/animate-fade/index.js";export*from"./components/animate-float/index.js";export*from"./components/animate-grow/index.js";export*from"./components/animate-headline/index.js";export*from"./components/animate-lighting/index.js";export*from"./components/animate-marquee/index.js";export*from"./components/animate-reveal/index.js";export*from"./components/animate-rotate/index.js";export*from"./components/animate-scramble/index.js";export*from"./components/animate-shake/index.js";export*from"./components/animate-split/index.js";export*from"./components/animate-slide/index.js";export*from"./components/animate-typing/index.js";export*from"./components/animate-zoom/index.js";export*from"./components/area-chart/index.js";export*from"./components/aspect-ratio/index.js";export*from"./components/avatar/index.js";export*from"./components/badge/index.js";export*from"./components/bar-chart/index.js";export*from"./components/blockquote/index.js";export*from"./components/bottom-navigation/index.js";export*from"./components/box/index.js";export*from"./components/breadcrumb/index.js";export*from"./components/button/index.js";export*from"./components/button-group/index.js";export*from"./components/calendar/index.js";export*from"./components/card/index.js";export*from"./components/carousel/index.js";export*from"./components/chat-bubble/index.js";export*from"./components/checkbox/index.js";export*from"./components/chip/index.js";export*from"./components/code-block/index.js";export*from"./components/collapsible/index.js";export*from"./components/color-picker/index.js";export*from"./components/combobox/index.js";export*from"./components/command-palette/index.js";export*from"./components/confirm/index.js";export*from"./components/container/index.js";export*from"./components/context-window/index.js";export*from"./components/data-list/index.js";export*from"./components/data-table/index.js";export*from"./components/date-picker/index.js";export*from"./components/date-range-picker/index.js";export*from"./components/date-time-picker/index.js";export*from"./components/dialog/index.js";export*from"./components/divider/index.js";export*from"./components/drawer/index.js";export*from"./components/empty/index.js";export*from"./components/fieldset/index.js";export*from"./components/file-picker/index.js";export*from"./components/flex/index.js";export*from"./components/form/index.js";export*from"./components/gallery/index.js";export*from"./components/gauge-chart/index.js";export*from"./components/grid/index.js";export*from"./components/floating-action-button/index.js";export*from"./components/floating-bottom-navigation/index.js";export*from"./components/footer/index.js";export*from"./components/grid-container/index.js";export*from"./components/header/index.js";export*from"./components/heatmap-chart/index.js";export*from"./components/highlight/index.js";export*from"./components/hover-card/index.js";export*from"./components/how-to-steps/index.js";export*from"./components/icon/index.js";export*from"./components/icon-button/index.js";export*from"./components/image/index.js";export*from"./components/inline-citation/index.js";export*from"./components/line-chart/index.js";export*from"./components/list/index.js";export*from"./components/menu/index.js";export*from"./components/menubar/index.js";export*from"./components/meter/index.js";export*from"./components/mockup/index.js";export*from"./components/navigation-menu/index.js";export*from"./components/number-field/index.js";export*from"./components/otp-field/index.js";export*from"./components/overlay/index.js";export*from"./components/page-layout/index.js";export*from"./components/pagination/index.js";export*from"./components/panes/index.js";export*from"./components/pie-chart/index.js";export*from"./components/pill/index.js";export*from"./components/popconfirm/index.js";export*from"./components/popover/index.js";export*from"./components/portal/index.js";export*from"./components/progress-box/index.js";export*from"./components/progress-circular/index.js";export*from"./components/progress-linear/index.js";export*from"./components/prompt-input/index.js";export*from"./components/provider/index.js";export*from"./components/radio-group/index.js";export*from"./components/reasoning/index.js";export*from"./components/rating/index.js";export*from"./components/scatter-chart/index.js";export*from"./components/scroll-area/index.js";export*from"./components/scroll-zone/index.js";export*from"./components/segmented-button/index.js";export*from"./components/select/index.js";export*from"./components/shortcut/index.js";export*from"./components/show/index.js";export*from"./components/sidebar/index.js";export*from"./components/skeleton/index.js";export*from"./components/slider/index.js";export*from"./components/sparkline/index.js";export*from"./components/spoiler/index.js";export*from"./components/sources/index.js";export*from"./components/stack/index.js";export*from"./components/statistic/index.js";export*from"./components/streaming-text/index.js";export*from"./components/switch/index.js";export*from"./components/table/index.js";export*from"./components/tabs/index.js";export*from"./components/text-field/index.js";export*from"./components/text-link/index.js";export*from"./components/time-picker/index.js";export*from"./components/timeline/index.js";export*from"./components/timeline-chart/index.js";export*from"./components/toast/index.js";export*from"./components/toggle/index.js";export*from"./components/toggle-group/index.js";export*from"./components/toolbar/index.js";export*from"./components/tool-call/index.js";export*from"./components/tooltip/index.js";export*from"./components/tour/index.js";export*from"./components/transfer/index.js";export*from"./components/tree-select/index.js";export*from"./components/tree-view/index.js";export*from"./components/typography/index.js";export*from"./components/visually-hidden/index.js";export*from"./components/window-pane/index.js";
|
|
1
|
+
export*from"./types.js";export*from"./hooks/index.js";export*from"./components/accordion/index.js";export*from"./components/agent-steps/index.js";export*from"./components/alert/index.js";export*from"./components/anchor/index.js";export*from"./components/animate-appear/index.js";export*from"./components/app-logo/index.js";export*from"./components/approval/index.js";export*from"./components/animate-blink/index.js";export*from"./components/animate-counter/index.js";export*from"./components/animate-fade/index.js";export*from"./components/animate-float/index.js";export*from"./components/animate-grow/index.js";export*from"./components/animate-headline/index.js";export*from"./components/animate-lighting/index.js";export*from"./components/animate-marquee/index.js";export*from"./components/animate-reveal/index.js";export*from"./components/animate-rotate/index.js";export*from"./components/animate-scramble/index.js";export*from"./components/animate-shake/index.js";export*from"./components/animate-split/index.js";export*from"./components/animate-slide/index.js";export*from"./components/animate-typing/index.js";export*from"./components/animate-zoom/index.js";export*from"./components/area-chart/index.js";export*from"./components/aspect-ratio/index.js";export*from"./components/avatar/index.js";export*from"./components/badge/index.js";export*from"./components/bar-chart/index.js";export*from"./components/blockquote/index.js";export*from"./components/bottom-navigation/index.js";export*from"./components/box/index.js";export*from"./components/breadcrumb/index.js";export*from"./components/button/index.js";export*from"./components/button-group/index.js";export*from"./components/calendar/index.js";export*from"./components/card/index.js";export*from"./components/carousel/index.js";export*from"./components/chat-bubble/index.js";export*from"./components/checkbox/index.js";export*from"./components/checkbox-group/index.js";export*from"./components/chip/index.js";export*from"./components/code-block/index.js";export*from"./components/collapsible/index.js";export*from"./components/color-picker/index.js";export*from"./components/combobox/index.js";export*from"./components/command-palette/index.js";export*from"./components/confirm/index.js";export*from"./components/container/index.js";export*from"./components/context-window/index.js";export*from"./components/data-list/index.js";export*from"./components/data-table/index.js";export*from"./components/date-picker/index.js";export*from"./components/date-range-picker/index.js";export*from"./components/date-time-picker/index.js";export*from"./components/dialog/index.js";export*from"./components/divider/index.js";export*from"./components/drawer/index.js";export*from"./components/empty/index.js";export*from"./components/fieldset/index.js";export*from"./components/file-picker/index.js";export*from"./components/flex/index.js";export*from"./components/form/index.js";export*from"./components/gallery/index.js";export*from"./components/gauge-chart/index.js";export*from"./components/grid/index.js";export*from"./components/floating-action-button/index.js";export*from"./components/floating-bottom-navigation/index.js";export*from"./components/footer/index.js";export*from"./components/grid-container/index.js";export*from"./components/header/index.js";export*from"./components/heatmap-chart/index.js";export*from"./components/highlight/index.js";export*from"./components/hover-card/index.js";export*from"./components/how-to-steps/index.js";export*from"./components/icon/index.js";export*from"./components/icon-button/index.js";export*from"./components/image/index.js";export*from"./components/inline-citation/index.js";export*from"./components/line-chart/index.js";export*from"./components/list/index.js";export*from"./components/menu/index.js";export*from"./components/menubar/index.js";export*from"./components/meter/index.js";export*from"./components/mockup/index.js";export*from"./components/navigation-menu/index.js";export*from"./components/number-field/index.js";export*from"./components/otp-field/index.js";export*from"./components/overlay/index.js";export*from"./components/page-layout/index.js";export*from"./components/pagination/index.js";export*from"./components/panes/index.js";export*from"./components/pie-chart/index.js";export*from"./components/pill/index.js";export*from"./components/popconfirm/index.js";export*from"./components/popover/index.js";export*from"./components/portal/index.js";export*from"./components/progress-box/index.js";export*from"./components/progress-circular/index.js";export*from"./components/progress-linear/index.js";export*from"./components/prompt-input/index.js";export*from"./components/provider/index.js";export*from"./components/radio-group/index.js";export*from"./components/reasoning/index.js";export*from"./components/rating/index.js";export*from"./components/scatter-chart/index.js";export*from"./components/scroll-area/index.js";export*from"./components/scroll-zone/index.js";export*from"./components/segmented-button/index.js";export*from"./components/select/index.js";export*from"./components/shortcut/index.js";export*from"./components/show/index.js";export*from"./components/sidebar/index.js";export*from"./components/skeleton/index.js";export*from"./components/slider/index.js";export*from"./components/sparkline/index.js";export*from"./components/spoiler/index.js";export*from"./components/sources/index.js";export*from"./components/stack/index.js";export*from"./components/statistic/index.js";export*from"./components/streaming-text/index.js";export*from"./components/switch/index.js";export*from"./components/table/index.js";export*from"./components/tabs/index.js";export*from"./components/text-field/index.js";export*from"./components/text-link/index.js";export*from"./components/time-picker/index.js";export*from"./components/timeline/index.js";export*from"./components/timeline-chart/index.js";export*from"./components/toast/index.js";export*from"./components/toggle/index.js";export*from"./components/toggle-group/index.js";export*from"./components/toolbar/index.js";export*from"./components/tool-call/index.js";export*from"./components/tooltip/index.js";export*from"./components/tour/index.js";export*from"./components/transfer/index.js";export*from"./components/tree-select/index.js";export*from"./components/tree-view/index.js";export*from"./components/typography/index.js";export*from"./components/visually-hidden/index.js";export*from"./components/window-pane/index.js";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { NebaColor, NebaSize } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* What a Checkbox inherits from the CheckboxGroup around it.
|
|
5
|
+
*
|
|
6
|
+
* A Checkbox is a component in its own right and a group of them is a second
|
|
7
|
+
* one, so the context lives here rather than in either folder: Checkbox reads
|
|
8
|
+
* it without importing the group, which is the arrangement `button-group.ts`
|
|
9
|
+
* makes for a Button and the ButtonGroup around it.
|
|
10
|
+
*
|
|
11
|
+
* Unlike that context every field here is filled in, because the group has
|
|
12
|
+
* already settled each of them. A Checkbox's own prop still wins over `size`,
|
|
13
|
+
* `color`, `readOnly` and `name`. `invalid` and `disabled` win over the
|
|
14
|
+
* Checkbox instead: a question that was answered wrongly is wrong in every
|
|
15
|
+
* option, and a disabled group cannot hold an option that answers.
|
|
16
|
+
*
|
|
17
|
+
* `name` is the half Base UI does not carry. Its group takes the name from the
|
|
18
|
+
* Field around it, and each Neba Checkbox draws a Field of its own, so without
|
|
19
|
+
* this the inputs would reach a native submit with no name at all.
|
|
20
|
+
*/
|
|
21
|
+
export interface CheckboxGroupContextValue {
|
|
22
|
+
size: NebaSize;
|
|
23
|
+
color: NebaColor;
|
|
24
|
+
invalid: boolean;
|
|
25
|
+
disabled: boolean;
|
|
26
|
+
readOnly: boolean;
|
|
27
|
+
name: string | undefined;
|
|
28
|
+
}
|
|
29
|
+
export declare const CheckboxGroupContext: React.Context<CheckboxGroupContextValue | null>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import*as t from"react";export const CheckboxGroupContext=/*@__PURE__*/t.createContext(null);
|
|
@@ -3,7 +3,7 @@ import type { NebaDensity, NebaLabelPlacement, NebaSize, NebaVariant } from '../
|
|
|
3
3
|
/**
|
|
4
4
|
* The prop values an application can set once instead of at every call site.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* Six, and the list is closed on purpose. These are the axes whose right value
|
|
7
7
|
* is a property of the *product* rather than of the control — a dense
|
|
8
8
|
* application is dense everywhere, a Korean one is Korean everywhere, and a
|
|
9
9
|
* form whose fields put their labels in two different places looks assembled
|
|
@@ -24,8 +24,20 @@ export interface NebaDefaults {
|
|
|
24
24
|
locale?: string;
|
|
25
25
|
/** Where every field-shaped component draws its label. */
|
|
26
26
|
labelPlacement?: NebaLabelPlacement;
|
|
27
|
+
/**
|
|
28
|
+
* The gap a Form and a Fieldset stand their fields at, on Tailwind's spacing
|
|
29
|
+
* scale: `4` is `1rem`.
|
|
30
|
+
*
|
|
31
|
+
* Only those two read it. The options of a RadioGroup or a CheckboxGroup and
|
|
32
|
+
* the rows of a List take a `spacing` of their own: they start on the same
|
|
33
|
+
* step at `md`, but a product that spreads its fields apart should not spread
|
|
34
|
+
* every set of options with them, until the options stop reading as a set.
|
|
35
|
+
* Flex and GridContainer are layout, and a page-wide gutter would move every
|
|
36
|
+
* layout in the product.
|
|
37
|
+
*/
|
|
38
|
+
spacing?: number;
|
|
27
39
|
}
|
|
28
|
-
/** Which of the
|
|
40
|
+
/** Which of the six a given component actually accepts. */
|
|
29
41
|
export type DefaultableKey = keyof NebaDefaults;
|
|
30
42
|
/**
|
|
31
43
|
* `null` when there is no provider, which is the common case and the one worth
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* Chip before anything imported them.
|
|
23
23
|
*/
|
|
24
24
|
import type * as React from 'react';
|
|
25
|
-
import type { NebaColor, NebaDensity, NebaElevation, NebaSize, NebaVariant } from '../types.js';
|
|
25
|
+
import type { NebaColor, NebaDensity, NebaElevation, NebaOrientation, NebaSize, NebaVariant } from '../types.js';
|
|
26
26
|
/**
|
|
27
27
|
* Corner radius. ~45% of the control height at every step, held just short of
|
|
28
28
|
* the 50% that would make it a pill.
|
|
@@ -274,6 +274,18 @@ export declare const sheetBodyClasses: Record<NebaSize, string>;
|
|
|
274
274
|
export declare const sheetHeaderGapClasses: Record<NebaSize, string>;
|
|
275
275
|
/** Between a sheet's sections, when there are no dividers to separate them. */
|
|
276
276
|
export declare const sheetSectionGapClasses: Record<NebaSize, string>;
|
|
277
|
+
/**
|
|
278
|
+
* Between the options of a RadioGroup or a CheckboxGroup, when no `spacing`
|
|
279
|
+
* says otherwise.
|
|
280
|
+
*
|
|
281
|
+
* A column stands on the ladder above, the one a Form and a Fieldset put
|
|
282
|
+
* between their fields, so at `md` an option is as far from the next as a
|
|
283
|
+
* field is: a column of checkboxes and a column of text fields set side by side
|
|
284
|
+
* keep one rhythm. A row keeps a wider step along it, because a label has to
|
|
285
|
+
* end visibly before the next box starts, and puts its wrapped lines on the
|
|
286
|
+
* column's step.
|
|
287
|
+
*/
|
|
288
|
+
export declare const optionGapClasses: Record<NebaOrientation, Record<NebaSize, string>>;
|
|
277
289
|
/**
|
|
278
290
|
* The frosted surface: a translucent fill over a blurred backdrop, a tile of
|
|
279
291
|
* noise blended into it for tooth, and an angled sheen. The blur makes it a
|
package/dist/internal/styles.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const radiusClasses={xs:"rounded-(--neba-radius-xs)",sm:"rounded-(--neba-radius-sm)",md:"rounded-(--neba-radius-md)",lg:"rounded-(--neba-radius-lg)",xl:"rounded-(--neba-radius-xl)"};export const controlHeightClasses={xs:"h-5.5",sm:"h-6.5",md:"h-8",lg:"h-10",xl:"h-12"};export const fieldHeightClasses={xs:"min-h-5.5",sm:"min-h-6.5",md:"min-h-8",lg:"min-h-10",xl:"min-h-12"};export const controlHeightValues={xs:"1.375rem",sm:"1.625rem",md:"2rem",lg:"2.5rem",xl:"3rem"};export const measureWidths={xs:"30rem",sm:"40rem",md:"48rem",lg:"64rem",xl:"80rem"};export function measureValue(e){return"number"==typeof e?`${e}px`:measureWidths[e]??e}export const controlSquareClasses={xs:"w-5.5",sm:"w-6.5",md:"w-8",lg:"w-10",xl:"w-12"};export const controlTextClasses={xs:"text-[0.6875rem]",sm:"text-[0.75rem]",md:"text-[0.8125rem]",lg:"text-[0.9375rem]",xl:"text-[1.0625rem]"};export const controlTextLeadingClasses={xs:"text-[0.6875rem]/[0.875rem]",sm:"text-[0.75rem]/[1rem]",md:"text-[0.8125rem]/[1.25rem]",lg:"text-[0.9375rem]/[1.375rem]",xl:"text-[1.0625rem]/[1.625rem]"};export const metaTextClasses={xs:"text-[0.625rem]",sm:"text-[0.6875rem]",md:"text-[0.75rem]",lg:"text-[0.8125rem]",xl:"text-[0.875rem]"};export const metaTextValues={xs:"0.625rem",sm:"0.6875rem",md:"0.75rem",lg:"0.8125rem",xl:"0.875rem"};export const paddingXClasses={default:{xs:"px-2.5",sm:"px-3",md:"px-4",lg:"px-5",xl:"px-6"},compact:{xs:"px-1.5",sm:"px-2",md:"px-2.5",lg:"px-3",xl:"px-4"}};export const iconSizeClasses={xs:"size-3.5",sm:"size-4",md:"size-5",lg:"size-6",xl:"size-7"};export const tickSizeClasses={xs:"size-3.5",sm:"size-4",md:"size-4.5",lg:"size-5",xl:"size-6"};export const tickRadiusClasses={xs:"rounded-[0.25rem]",sm:"rounded-[0.3125rem]",md:"rounded-[0.375rem]",lg:"rounded-[0.4375rem]",xl:"rounded-[0.5rem]"};export const tickDotClasses={xs:"size-1.5",sm:"size-1.5",md:"size-2",lg:"size-2",xl:"size-2.5"};export const tickRowLeadingClasses="leading-[1.4]";export const hitAreaClasses="neba-hit";export const paddingXValues={default:{xs:"0.625rem",sm:"0.75rem",md:"1rem",lg:"1.25rem",xl:"1.5rem"},compact:{xs:"0.375rem",sm:"0.5rem",md:"0.625rem",lg:"0.75rem",xl:"1rem"}};export const gapClasses={xs:"gap-1",sm:"gap-1.5",md:"gap-1.5",lg:"gap-2",xl:"gap-2.5"};export const stackGapClasses={xs:"gap-1",sm:"gap-1",md:"gap-1.5",lg:"gap-1.5",xl:"gap-2"};export const sheetTitleClasses={xs:"text-[0.75rem]/[1rem]",sm:"text-[0.8125rem]/[1.125rem]",md:"text-[0.9375rem]/[1.25rem]",lg:"text-[1.0625rem]/[1.5rem]",xl:"text-[1.25rem]/[1.75rem]"};export const sheetTitleHeadingClasses="neba-title [&.neba-title_:where(h1,h2,h3,h4,h5,h6):not([class])]:[font:inherit] [&.neba-title_:where(h1,h2,h3,h4,h5,h6):not([class])]:m-0 [:where(&)_:where(h1,h2,h3,h4,h5,h6)]:[font:inherit] [:where(&)_:where(h1,h2,h3,h4,h5,h6)]:m-0";export const headingTitleClasses={xs:"[&.neba-heading]:text-[0.75rem]/[1rem]",sm:"[&.neba-heading]:text-[0.8125rem]/[1.125rem]",md:"[&.neba-heading]:text-[0.9375rem]/[1.25rem]",lg:"[&.neba-heading]:text-[1.0625rem]/[1.5rem]",xl:"[&.neba-heading]:text-[1.25rem]/[1.75rem]"};export const sheetBodyClasses={xs:"text-[0.6875rem]/[1rem]",sm:"text-[0.75rem]/[1.125rem]",md:"text-[0.8125rem]/[1.375rem]",lg:"text-[0.9375rem]/[1.5rem]",xl:"text-[1.0625rem]/[1.75rem]"};export const sheetHeaderGapClasses={xs:"gap-0.5",sm:"gap-0.5",md:"gap-1",lg:"gap-1",xl:"gap-1.5"};export const sheetSectionGapClasses={xs:"gap-1.5",sm:"gap-2",md:"gap-3",lg:"gap-3.5",xl:"gap-4"};export const surfaceClasses="[background-image:var(--neba-grain),var(--neba-sheen)] [background-blend-mode:overlay,normal] [backdrop-filter:var(--neba-blur)]";export const ringRestClasses="[outline:0_solid_transparent]";export const transitionClasses=`${ringRestClasses} [transition-property:background-color,border-color,box-shadow,color,outline-color] [transition-duration:var(--neba-duration-fill),var(--neba-duration),var(--neba-duration),var(--neba-duration),var(--neba-duration)] [transition-timing-function:var(--neba-ease)]`;export const pressTransitionClasses="active:[transition-duration:0ms]";export const popupFadeStateClasses="data-[starting-style]:opacity-0 data-[ending-style]:opacity-0";export const popupFadeClasses="[transition:opacity_var(--neba-duration)_var(--neba-ease)] "+popupFadeStateClasses;export const focusRingClasses=`${ringRestClasses} outline-offset-2 focus-visible:[outline:2px_solid_var(--n-ring)]`;export const insetRingClasses=`${ringRestClasses} outline-offset-[-2px] focus-visible:[outline:2px_solid_var(--n-ring)]`;export const focusWithinRingClasses=`${ringRestClasses} outline-offset-2 has-[:focus-visible]:[outline:2px_solid_var(--n-ring)] supports-[not_selector(:has(*))]:focus-within:[outline:2px_solid_var(--n-ring)]`;export const fieldRingClasses=`${ringRestClasses} outline-offset-0 has-[:focus-visible]:[outline:2px_solid_var(--n-ring)]`;export const fieldFocusTransitionClasses="focus-within:[transition-duration:var(--neba-duration)]";export function clampClasses(e){return e>1?"line-clamp-(--n-lines)":"truncate"}export function clampSlot(e){return void 0!==e&&e>1?{"--n-lines":Math.floor(e)}:void 0}export const iconClasses="[&_svg]:pointer-events-none [&_svg]:size-[1.2em] [&_svg]:shrink-0";const e="[transition:height_var(--neba-duration)_var(--neba-ease)] motion-reduce:[transition-duration:0ms] data-[starting-style]:h-0 data-[ending-style]:h-0";export const collapsiblePanelClasses=`h-(--collapsible-panel-height) overflow-hidden ${e}`;export const accordionPanelClasses=`h-(--accordion-panel-height) overflow-hidden ${e}`;export const disclosureTriggerClasses="group/disclosure";export const disclosureChevronClasses="flex h-[1lh] shrink-0 items-center [transition:rotate_var(--neba-duration)_var(--neba-ease)] group-data-[panel-open]/disclosure:rotate-180";export const preformattedClasses="m-0 overflow-auto rounded-(--neba-radius-sm) bg-(--neba-groove) p-2 font-mono text-[0.9em]/[1.5] whitespace-pre";export const srOnlyClasses="absolute size-px overflow-hidden whitespace-nowrap [clip-path:inset(50%)]";export function controlSlots(e,s,t){const n="solid"===t;return{"--n-fill":`var(--neba-${e}-fill)`,"--n-fill-hover":`var(--neba-${e}-fill-hover)`,"--n-fill-active":`var(--neba-${e}-fill-active)`,"--n-on-solid":`var(--neba-${e}-on-solid)`,"--n-accent":`var(--neba-${e}-accent)`,"--n-soft":`var(--neba-${e}-soft)`,"--n-soft-hover":`var(--neba-${e}-soft-hover)`,"--n-soft-press":`var(--neba-${e}-soft-press)`,"--n-on-tint":`var(--neba-${e}-on-tint)`,"--n-panel":`var(--neba-${e}-panel)`,"--n-panel-hover":`var(--neba-${e}-panel-hover)`,"--n-panel-press":`var(--neba-${e}-panel-press)`,"--n-line":`var(--neba-${e}-line)`,"--n-line-hover":`var(--neba-${e}-line-hover)`,"--n-ring":`var(--neba-${e}-ring)`,"--n-glow":n?"var(--neba-glow-on-fill)":`var(--neba-${e}-soft)`,"--n-flash":n?"var(--neba-flash-on-fill)":`var(--neba-${e}-soft-press)`,"--n-elev":`var(--neba-shadow-${s})`,"--n-elev-hover":`var(--neba-shadow-${Math.min(s+1,4)})`,"--n-elev-press":`var(--neba-shadow-${Math.max(s-1,0)})`}}export function surfaceSlots(e,s){return{"--n-accent":`var(--neba-${e}-accent)`,"--n-soft":`var(--neba-${e}-soft)`,"--n-soft-hover":`var(--neba-${e}-soft-hover)`,"--n-soft-press":`var(--neba-${e}-soft-press)`,"--n-on-tint":`var(--neba-${e}-on-tint)`,"--n-panel":"var(--neba-panel)","--n-panel-hover":"var(--neba-panel-hover)","--n-panel-press":"var(--neba-panel-press)","--n-line":`var(--neba-${e}-line)`,"--n-line-hover":`var(--neba-${e}-line-hover)`,"--n-ring":`var(--neba-${e}-ring)`,"--n-elev":`var(--neba-shadow-${s})`}}export const tintPlateClasses="neba-tint-plate";export const disabledClasses={solid:"cursor-not-allowed bg-(--neba-disabled-bg) text-(--neba-disabled-fg) shadow-none",outline:"cursor-not-allowed border bg-transparent text-(--neba-disabled-fg) [border-color:var(--neba-disabled-border)] shadow-none",text:"cursor-not-allowed bg-transparent text-(--neba-disabled-fg) shadow-none"};export const fieldRestClasses={solid:`${surfaceClasses} text-(--neba-fg) bg-(--n-panel-hover) [box-shadow:var(--n-elev),var(--neba-plate-solid)] hover:bg-(--n-panel-press) focus-within:bg-(--n-panel-press)`,outline:`${surfaceClasses} border text-(--neba-fg) bg-(--n-panel) [border-color:var(--n-line)] [box-shadow:var(--n-elev),var(--neba-plate-glass)] hover:bg-(--n-panel-hover) hover:[border-color:var(--n-line-hover)] focus-within:bg-(--n-panel-hover) focus-within:[border-color:var(--n-ring)] focus-within:hover:[border-color:var(--n-ring)]`,text:"text-(--neba-fg) bg-transparent hover:bg-(--n-soft) focus-within:bg-(--n-soft-hover) focus-within:hover:bg-(--n-soft-hover)"};export const fieldReadOnlyClasses={solid:`${surfaceClasses} text-(--neba-fg) bg-(--n-panel-hover) [box-shadow:var(--neba-plate-solid)] [filter:saturate(0.55)]`,outline:`${surfaceClasses} border text-(--neba-fg) bg-(--n-panel) [border-color:var(--n-line)] [box-shadow:var(--neba-plate-glass)] [filter:saturate(0.55)]`,text:"text-(--neba-fg) bg-transparent [filter:saturate(0.55)]"};export const readOnlyFilterClasses="[filter:saturate(0.55)]";export const fieldSheetClasses={solid:`${surfaceClasses} text-(--neba-fg) bg-(--n-panel-hover) [box-shadow:var(--n-elev)] hover:bg-(--n-panel-press) focus-within:bg-(--n-panel-press)`,outline:`${surfaceClasses} border [border-color:transparent] text-(--neba-fg) bg-(--n-panel) [box-shadow:var(--n-elev)] hover:bg-(--n-panel-hover) focus-within:bg-(--n-panel-hover)`,text:fieldRestClasses.text};export const fieldSheetReadOnlyClasses={solid:`${surfaceClasses} text-(--neba-fg) bg-(--n-panel-hover)`,outline:`${surfaceClasses} border [border-color:transparent] text-(--neba-fg) bg-(--n-panel)`,text:"text-(--neba-fg) bg-transparent"};export const fieldSheetDisabledClasses={solid:disabledClasses.solid,outline:"cursor-not-allowed border bg-transparent text-(--neba-disabled-fg) [border-color:transparent] shadow-none",text:disabledClasses.text};export const citationMarkClasses="inline-flex shrink-0 items-center justify-center rounded-[0.3em] min-w-[1.5em] px-[0.35em] py-[0.05em] bg-(--n-soft) text-[0.8em]/[1.6] font-semibold text-(--n-on-tint) tabular-nums";export const chipRemoveClasses="relative ms-0.5 inline-flex shrink-0 items-center justify-center rounded-full size-[1.15em] cursor-pointer opacity-70 neba-hit [transition:opacity_var(--neba-duration)_var(--neba-ease)] hover:opacity-100 focus-visible:opacity-100 focus-visible:[outline:2px_solid_var(--n-ring)] focus-visible:outline-offset-1 disabled:cursor-not-allowed";export const sheetCloseClasses="relative flex size-[1.6em] shrink-0 cursor-pointer items-center justify-center rounded-full text-(--neba-muted-fg) neba-hit [&_svg]:size-[1.1em] [&_svg]:shrink-0 [transition:background-color_var(--neba-duration)_var(--neba-ease),color_var(--neba-duration)_var(--neba-ease)] hover:bg-(--n-soft) hover:text-(--neba-fg) focus-visible:[outline:2px_solid_var(--n-ring)] focus-visible:outline-offset-2";export function hasContent(e){return null!=e&&!1!==e&&""!==e}export function toLength(e){if(null!=e)return"number"==typeof e?`${e}px`:e}const s=/^\s*(-?[\d.]+)\s*(px|rem|em|%)\s*$/;export function toPixels(e,n){const r=s.exec(e);if(!r)return;const a=Number(r[1]);if(!Number.isNaN(a))switch(r[2]){case"px":return a;case"%":return n.percentOf*a/100;case"em":return a*t(n.relativeTo);default:return a*t("undefined"==typeof document?null:document.documentElement)}}function t(e){return e&&"undefined"!=typeof getComputedStyle&&parseFloat(getComputedStyle(e).fontSize)||16}export function cx(...e){return e.filter(Boolean).join(" ")}
|
|
1
|
+
export const radiusClasses={xs:"rounded-(--neba-radius-xs)",sm:"rounded-(--neba-radius-sm)",md:"rounded-(--neba-radius-md)",lg:"rounded-(--neba-radius-lg)",xl:"rounded-(--neba-radius-xl)"};export const controlHeightClasses={xs:"h-5.5",sm:"h-6.5",md:"h-8",lg:"h-10",xl:"h-12"};export const fieldHeightClasses={xs:"min-h-5.5",sm:"min-h-6.5",md:"min-h-8",lg:"min-h-10",xl:"min-h-12"};export const controlHeightValues={xs:"1.375rem",sm:"1.625rem",md:"2rem",lg:"2.5rem",xl:"3rem"};export const measureWidths={xs:"30rem",sm:"40rem",md:"48rem",lg:"64rem",xl:"80rem"};export function measureValue(e){return"number"==typeof e?`${e}px`:measureWidths[e]??e}export const controlSquareClasses={xs:"w-5.5",sm:"w-6.5",md:"w-8",lg:"w-10",xl:"w-12"};export const controlTextClasses={xs:"text-[0.6875rem]",sm:"text-[0.75rem]",md:"text-[0.8125rem]",lg:"text-[0.9375rem]",xl:"text-[1.0625rem]"};export const controlTextLeadingClasses={xs:"text-[0.6875rem]/[0.875rem]",sm:"text-[0.75rem]/[1rem]",md:"text-[0.8125rem]/[1.25rem]",lg:"text-[0.9375rem]/[1.375rem]",xl:"text-[1.0625rem]/[1.625rem]"};export const metaTextClasses={xs:"text-[0.625rem]",sm:"text-[0.6875rem]",md:"text-[0.75rem]",lg:"text-[0.8125rem]",xl:"text-[0.875rem]"};export const metaTextValues={xs:"0.625rem",sm:"0.6875rem",md:"0.75rem",lg:"0.8125rem",xl:"0.875rem"};export const paddingXClasses={default:{xs:"px-2.5",sm:"px-3",md:"px-4",lg:"px-5",xl:"px-6"},compact:{xs:"px-1.5",sm:"px-2",md:"px-2.5",lg:"px-3",xl:"px-4"}};export const iconSizeClasses={xs:"size-3.5",sm:"size-4",md:"size-5",lg:"size-6",xl:"size-7"};export const tickSizeClasses={xs:"size-3.5",sm:"size-4",md:"size-4.5",lg:"size-5",xl:"size-6"};export const tickRadiusClasses={xs:"rounded-[0.25rem]",sm:"rounded-[0.3125rem]",md:"rounded-[0.375rem]",lg:"rounded-[0.4375rem]",xl:"rounded-[0.5rem]"};export const tickDotClasses={xs:"size-1.5",sm:"size-1.5",md:"size-2",lg:"size-2",xl:"size-2.5"};export const tickRowLeadingClasses="leading-[1.4]";export const hitAreaClasses="neba-hit";export const paddingXValues={default:{xs:"0.625rem",sm:"0.75rem",md:"1rem",lg:"1.25rem",xl:"1.5rem"},compact:{xs:"0.375rem",sm:"0.5rem",md:"0.625rem",lg:"0.75rem",xl:"1rem"}};export const gapClasses={xs:"gap-1",sm:"gap-1.5",md:"gap-1.5",lg:"gap-2",xl:"gap-2.5"};export const stackGapClasses={xs:"gap-1",sm:"gap-1",md:"gap-1.5",lg:"gap-1.5",xl:"gap-2"};export const sheetTitleClasses={xs:"text-[0.75rem]/[1rem]",sm:"text-[0.8125rem]/[1.125rem]",md:"text-[0.9375rem]/[1.25rem]",lg:"text-[1.0625rem]/[1.5rem]",xl:"text-[1.25rem]/[1.75rem]"};export const sheetTitleHeadingClasses="neba-title [&.neba-title_:where(h1,h2,h3,h4,h5,h6):not([class])]:[font:inherit] [&.neba-title_:where(h1,h2,h3,h4,h5,h6):not([class])]:m-0 [:where(&)_:where(h1,h2,h3,h4,h5,h6)]:[font:inherit] [:where(&)_:where(h1,h2,h3,h4,h5,h6)]:m-0";export const headingTitleClasses={xs:"[&.neba-heading]:text-[0.75rem]/[1rem]",sm:"[&.neba-heading]:text-[0.8125rem]/[1.125rem]",md:"[&.neba-heading]:text-[0.9375rem]/[1.25rem]",lg:"[&.neba-heading]:text-[1.0625rem]/[1.5rem]",xl:"[&.neba-heading]:text-[1.25rem]/[1.75rem]"};export const sheetBodyClasses={xs:"text-[0.6875rem]/[1rem]",sm:"text-[0.75rem]/[1.125rem]",md:"text-[0.8125rem]/[1.375rem]",lg:"text-[0.9375rem]/[1.5rem]",xl:"text-[1.0625rem]/[1.75rem]"};export const sheetHeaderGapClasses={xs:"gap-0.5",sm:"gap-0.5",md:"gap-1",lg:"gap-1",xl:"gap-1.5"};export const sheetSectionGapClasses={xs:"gap-1.5",sm:"gap-2",md:"gap-3",lg:"gap-3.5",xl:"gap-4"};export const optionGapClasses={vertical:sheetSectionGapClasses,horizontal:{xs:"gap-x-5 gap-y-1.5",sm:"gap-x-5 gap-y-2",md:"gap-x-5 gap-y-3",lg:"gap-x-5 gap-y-3.5",xl:"gap-x-5 gap-y-4"}};export const surfaceClasses="[background-image:var(--neba-grain),var(--neba-sheen)] [background-blend-mode:overlay,normal] [backdrop-filter:var(--neba-blur)]";export const ringRestClasses="[outline:0_solid_transparent]";export const transitionClasses=`${ringRestClasses} [transition-property:background-color,border-color,box-shadow,color,outline-color] [transition-duration:var(--neba-duration-fill),var(--neba-duration),var(--neba-duration),var(--neba-duration),var(--neba-duration)] [transition-timing-function:var(--neba-ease)]`;export const pressTransitionClasses="active:[transition-duration:0ms]";export const popupFadeStateClasses="data-[starting-style]:opacity-0 data-[ending-style]:opacity-0";export const popupFadeClasses="[transition:opacity_var(--neba-duration)_var(--neba-ease)] "+popupFadeStateClasses;export const focusRingClasses=`${ringRestClasses} outline-offset-2 focus-visible:[outline:2px_solid_var(--n-ring)]`;export const insetRingClasses=`${ringRestClasses} outline-offset-[-2px] focus-visible:[outline:2px_solid_var(--n-ring)]`;export const focusWithinRingClasses=`${ringRestClasses} outline-offset-2 has-[:focus-visible]:[outline:2px_solid_var(--n-ring)] supports-[not_selector(:has(*))]:focus-within:[outline:2px_solid_var(--n-ring)]`;export const fieldRingClasses=`${ringRestClasses} outline-offset-0 has-[:focus-visible]:[outline:2px_solid_var(--n-ring)]`;export const fieldFocusTransitionClasses="focus-within:[transition-duration:var(--neba-duration)]";export function clampClasses(e){return e>1?"line-clamp-(--n-lines)":"truncate"}export function clampSlot(e){return void 0!==e&&e>1?{"--n-lines":Math.floor(e)}:void 0}export const iconClasses="[&_svg]:pointer-events-none [&_svg]:size-[1.2em] [&_svg]:shrink-0";const e="[transition:height_var(--neba-duration)_var(--neba-ease)] motion-reduce:[transition-duration:0ms] data-[starting-style]:h-0 data-[ending-style]:h-0";export const collapsiblePanelClasses=`h-(--collapsible-panel-height) overflow-hidden ${e}`;export const accordionPanelClasses=`h-(--accordion-panel-height) overflow-hidden ${e}`;export const disclosureTriggerClasses="group/disclosure";export const disclosureChevronClasses="flex h-[1lh] shrink-0 items-center [transition:rotate_var(--neba-duration)_var(--neba-ease)] group-data-[panel-open]/disclosure:rotate-180";export const preformattedClasses="m-0 overflow-auto rounded-(--neba-radius-sm) bg-(--neba-groove) p-2 font-mono text-[0.9em]/[1.5] whitespace-pre";export const srOnlyClasses="absolute size-px overflow-hidden whitespace-nowrap [clip-path:inset(50%)]";export function controlSlots(e,s,t){const n="solid"===t;return{"--n-fill":`var(--neba-${e}-fill)`,"--n-fill-hover":`var(--neba-${e}-fill-hover)`,"--n-fill-active":`var(--neba-${e}-fill-active)`,"--n-on-solid":`var(--neba-${e}-on-solid)`,"--n-accent":`var(--neba-${e}-accent)`,"--n-soft":`var(--neba-${e}-soft)`,"--n-soft-hover":`var(--neba-${e}-soft-hover)`,"--n-soft-press":`var(--neba-${e}-soft-press)`,"--n-on-tint":`var(--neba-${e}-on-tint)`,"--n-panel":`var(--neba-${e}-panel)`,"--n-panel-hover":`var(--neba-${e}-panel-hover)`,"--n-panel-press":`var(--neba-${e}-panel-press)`,"--n-line":`var(--neba-${e}-line)`,"--n-line-hover":`var(--neba-${e}-line-hover)`,"--n-ring":`var(--neba-${e}-ring)`,"--n-glow":n?"var(--neba-glow-on-fill)":`var(--neba-${e}-soft)`,"--n-flash":n?"var(--neba-flash-on-fill)":`var(--neba-${e}-soft-press)`,"--n-elev":`var(--neba-shadow-${s})`,"--n-elev-hover":`var(--neba-shadow-${Math.min(s+1,4)})`,"--n-elev-press":`var(--neba-shadow-${Math.max(s-1,0)})`}}export function surfaceSlots(e,s){return{"--n-accent":`var(--neba-${e}-accent)`,"--n-soft":`var(--neba-${e}-soft)`,"--n-soft-hover":`var(--neba-${e}-soft-hover)`,"--n-soft-press":`var(--neba-${e}-soft-press)`,"--n-on-tint":`var(--neba-${e}-on-tint)`,"--n-panel":"var(--neba-panel)","--n-panel-hover":"var(--neba-panel-hover)","--n-panel-press":"var(--neba-panel-press)","--n-line":`var(--neba-${e}-line)`,"--n-line-hover":`var(--neba-${e}-line-hover)`,"--n-ring":`var(--neba-${e}-ring)`,"--n-elev":`var(--neba-shadow-${s})`}}export const tintPlateClasses="neba-tint-plate";export const disabledClasses={solid:"cursor-not-allowed bg-(--neba-disabled-bg) text-(--neba-disabled-fg) shadow-none",outline:"cursor-not-allowed border bg-transparent text-(--neba-disabled-fg) [border-color:var(--neba-disabled-border)] shadow-none",text:"cursor-not-allowed bg-transparent text-(--neba-disabled-fg) shadow-none"};export const fieldRestClasses={solid:`${surfaceClasses} text-(--neba-fg) bg-(--n-panel-hover) [box-shadow:var(--n-elev),var(--neba-plate-solid)] hover:bg-(--n-panel-press) focus-within:bg-(--n-panel-press)`,outline:`${surfaceClasses} border text-(--neba-fg) bg-(--n-panel) [border-color:var(--n-line)] [box-shadow:var(--n-elev),var(--neba-plate-glass)] hover:bg-(--n-panel-hover) hover:[border-color:var(--n-line-hover)] focus-within:bg-(--n-panel-hover) focus-within:[border-color:var(--n-ring)] focus-within:hover:[border-color:var(--n-ring)]`,text:"text-(--neba-fg) bg-transparent hover:bg-(--n-soft) focus-within:bg-(--n-soft-hover) focus-within:hover:bg-(--n-soft-hover)"};export const fieldReadOnlyClasses={solid:`${surfaceClasses} text-(--neba-fg) bg-(--n-panel-hover) [box-shadow:var(--neba-plate-solid)] [filter:saturate(0.55)]`,outline:`${surfaceClasses} border text-(--neba-fg) bg-(--n-panel) [border-color:var(--n-line)] [box-shadow:var(--neba-plate-glass)] [filter:saturate(0.55)]`,text:"text-(--neba-fg) bg-transparent [filter:saturate(0.55)]"};export const readOnlyFilterClasses="[filter:saturate(0.55)]";export const fieldSheetClasses={solid:`${surfaceClasses} text-(--neba-fg) bg-(--n-panel-hover) [box-shadow:var(--n-elev)] hover:bg-(--n-panel-press) focus-within:bg-(--n-panel-press)`,outline:`${surfaceClasses} border [border-color:transparent] text-(--neba-fg) bg-(--n-panel) [box-shadow:var(--n-elev)] hover:bg-(--n-panel-hover) focus-within:bg-(--n-panel-hover)`,text:fieldRestClasses.text};export const fieldSheetReadOnlyClasses={solid:`${surfaceClasses} text-(--neba-fg) bg-(--n-panel-hover)`,outline:`${surfaceClasses} border [border-color:transparent] text-(--neba-fg) bg-(--n-panel)`,text:"text-(--neba-fg) bg-transparent"};export const fieldSheetDisabledClasses={solid:disabledClasses.solid,outline:"cursor-not-allowed border bg-transparent text-(--neba-disabled-fg) [border-color:transparent] shadow-none",text:disabledClasses.text};export const citationMarkClasses="inline-flex shrink-0 items-center justify-center rounded-[0.3em] min-w-[1.5em] px-[0.35em] py-[0.05em] bg-(--n-soft) text-[0.8em]/[1.6] font-semibold text-(--n-on-tint) tabular-nums";export const chipRemoveClasses="relative ms-0.5 inline-flex shrink-0 items-center justify-center rounded-full size-[1.15em] cursor-pointer opacity-70 neba-hit [transition:opacity_var(--neba-duration)_var(--neba-ease)] hover:opacity-100 focus-visible:opacity-100 focus-visible:[outline:2px_solid_var(--n-ring)] focus-visible:outline-offset-1 disabled:cursor-not-allowed";export const sheetCloseClasses="relative flex size-[1.6em] shrink-0 cursor-pointer items-center justify-center rounded-full text-(--neba-muted-fg) neba-hit [&_svg]:size-[1.1em] [&_svg]:shrink-0 [transition:background-color_var(--neba-duration)_var(--neba-ease),color_var(--neba-duration)_var(--neba-ease)] hover:bg-(--n-soft) hover:text-(--neba-fg) focus-visible:[outline:2px_solid_var(--n-ring)] focus-visible:outline-offset-2";export function hasContent(e){return null!=e&&!1!==e&&""!==e}export function toLength(e){if(null!=e)return"number"==typeof e?`${e}px`:e}const s=/^\s*(-?[\d.]+)\s*(px|rem|em|%)\s*$/;export function toPixels(e,n){const r=s.exec(e);if(!r)return;const a=Number(r[1]);if(!Number.isNaN(a))switch(r[2]){case"px":return a;case"%":return n.percentOf*a/100;case"em":return a*t(n.relativeTo);default:return a*t("undefined"==typeof document?null:document.documentElement)}}function t(e){return e&&"undefined"!=typeof getComputedStyle&&parseFloat(getComputedStyle(e).fontSize)||16}export function cx(...e){return e.filter(Boolean).join(" ")}
|