@code-sherpas/pharos-react 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Card.d.ts +63 -0
- package/dist/components/Card.d.ts.map +1 -0
- package/dist/components/Separator.d.ts +29 -0
- package/dist/components/Separator.d.ts.map +1 -0
- package/dist/components/Textarea.d.ts +41 -0
- package/dist/components/Textarea.d.ts.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +108 -1
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { ComponentPropsWithoutRef } from 'react';
|
|
2
|
+
import { VariantProps } from 'class-variance-authority';
|
|
3
|
+
/**
|
|
4
|
+
* Container surface for grouped content. Three variants on the
|
|
5
|
+
* border-intensity hierarchy (Decision D12):
|
|
6
|
+
*
|
|
7
|
+
* - `default` (subtle border, no shadow) — the most common card. Sits
|
|
8
|
+
* on the same `neutral-200` tone as `Separator`, so panels and
|
|
9
|
+
* dividers harmonise visually.
|
|
10
|
+
* - `elevated` (no border, soft shadow) — for surfaces that should lift
|
|
11
|
+
* off the canvas (modals' inner cards, important callouts).
|
|
12
|
+
* - `outlined` (deliberately stronger border, no shadow) — emphasised
|
|
13
|
+
* container. Sits on `neutral-300`, between subtle non-interactive
|
|
14
|
+
* tone and the strong interactive tone reserved for controls.
|
|
15
|
+
*
|
|
16
|
+
* Sub-components (`CardHeader`, `CardTitle`, `CardDescription`,
|
|
17
|
+
* `CardContent`, `CardFooter`) are slot primitives, not separate atoms
|
|
18
|
+
* — same pattern shadcn uses. They are exported individually so the
|
|
19
|
+
* consumer composes the structure they need; an empty Card with no
|
|
20
|
+
* slots is equally valid.
|
|
21
|
+
*/
|
|
22
|
+
declare const cardVariants: (props?: ({
|
|
23
|
+
variant?: "default" | "elevated" | "outlined" | null | undefined;
|
|
24
|
+
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
25
|
+
type CardVariantProps = VariantProps<typeof cardVariants>;
|
|
26
|
+
export interface CardProps extends ComponentPropsWithoutRef<'div'>, CardVariantProps {
|
|
27
|
+
}
|
|
28
|
+
export declare function Card({ variant, className, ...rest }: CardProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
export declare namespace Card {
|
|
30
|
+
var displayName: string;
|
|
31
|
+
}
|
|
32
|
+
export interface CardHeaderProps extends ComponentPropsWithoutRef<'div'> {
|
|
33
|
+
}
|
|
34
|
+
export declare function CardHeader({ className, ...rest }: CardHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
export declare namespace CardHeader {
|
|
36
|
+
var displayName: string;
|
|
37
|
+
}
|
|
38
|
+
export interface CardTitleProps extends ComponentPropsWithoutRef<'div'> {
|
|
39
|
+
}
|
|
40
|
+
export declare function CardTitle({ className, ...rest }: CardTitleProps): import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
export declare namespace CardTitle {
|
|
42
|
+
var displayName: string;
|
|
43
|
+
}
|
|
44
|
+
export interface CardDescriptionProps extends ComponentPropsWithoutRef<'p'> {
|
|
45
|
+
}
|
|
46
|
+
export declare function CardDescription({ className, ...rest }: CardDescriptionProps): import("react/jsx-runtime").JSX.Element;
|
|
47
|
+
export declare namespace CardDescription {
|
|
48
|
+
var displayName: string;
|
|
49
|
+
}
|
|
50
|
+
export interface CardContentProps extends ComponentPropsWithoutRef<'div'> {
|
|
51
|
+
}
|
|
52
|
+
export declare function CardContent({ className, ...rest }: CardContentProps): import("react/jsx-runtime").JSX.Element;
|
|
53
|
+
export declare namespace CardContent {
|
|
54
|
+
var displayName: string;
|
|
55
|
+
}
|
|
56
|
+
export interface CardFooterProps extends ComponentPropsWithoutRef<'div'> {
|
|
57
|
+
}
|
|
58
|
+
export declare function CardFooter({ className, ...rest }: CardFooterProps): import("react/jsx-runtime").JSX.Element;
|
|
59
|
+
export declare namespace CardFooter {
|
|
60
|
+
var displayName: string;
|
|
61
|
+
}
|
|
62
|
+
export { cardVariants };
|
|
63
|
+
//# sourceMappingURL=Card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../src/components/Card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIlE;;;;;;;;;;;;;;;;;;GAkBG;AACH,QAAA,MAAM,YAAY;;8EAWhB,CAAC;AAEH,KAAK,gBAAgB,GAAG,YAAY,CAAC,OAAO,YAAY,CAAC,CAAC;AAE1D,MAAM,WAAW,SAAU,SAAQ,wBAAwB,CAAC,KAAK,CAAC,EAAE,gBAAgB;CAAG;AAEvF,wBAAgB,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,2CAS9D;yBATe,IAAI;;;AAapB,MAAM,WAAW,eAAgB,SAAQ,wBAAwB,CAAC,KAAK,CAAC;CAAG;AAE3E,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,eAAe,2CAEjE;yBAFe,UAAU;;;AAM1B,MAAM,WAAW,cAAe,SAAQ,wBAAwB,CAAC,KAAK,CAAC;CAAG;AAE1E,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,2CAM/D;yBANe,SAAS;;;AAUzB,MAAM,WAAW,oBAAqB,SAAQ,wBAAwB,CAAC,GAAG,CAAC;CAAG;AAE9E,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,oBAAoB,2CAQ3E;yBARe,eAAe;;;AAY/B,MAAM,WAAW,gBAAiB,SAAQ,wBAAwB,CAAC,KAAK,CAAC;CAAG;AAE5E,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,gBAAgB,2CAInE;yBAJe,WAAW;;;AAQ3B,MAAM,WAAW,eAAgB,SAAQ,wBAAwB,CAAC,KAAK,CAAC;CAAG;AAE3E,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,eAAe,2CAEjE;yBAFe,UAAU;;;AAM1B,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ComponentPropsWithoutRef } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Visual or semantic divider between two regions. Renders a thin line in
|
|
4
|
+
* either orientation. Two contracts coexist behind the same component:
|
|
5
|
+
*
|
|
6
|
+
* - **Decorative** (default, `decorative={true}`) — the line is purely
|
|
7
|
+
* visual chrome. Marked `role="none"` so assistive tech ignores it,
|
|
8
|
+
* the same way shadcn / Radix Separator do.
|
|
9
|
+
* - **Semantic** (`decorative={false}`) — the line announces a logical
|
|
10
|
+
* partition (e.g. between groups in a menu). Marked `role="separator"`
|
|
11
|
+
* and, for vertical separators, `aria-orientation="vertical"` per the
|
|
12
|
+
* ARIA APG (the spec defaults `aria-orientation` to "horizontal" for
|
|
13
|
+
* role=separator, so we emit the attribute only when it differs).
|
|
14
|
+
*
|
|
15
|
+
* The resting border tone is `--pharos-color-neutral-200` (Decision D12:
|
|
16
|
+
* subtle borders for non-interactive surfaces). WCAG 1.4.11 does not
|
|
17
|
+
* apply to decorative separators or to the boundaries of non-interactive
|
|
18
|
+
* containers; the system reserves the stronger `neutral-500` tone for
|
|
19
|
+
* interactive controls (Input, Button secondary, Badge outline — D10).
|
|
20
|
+
*/
|
|
21
|
+
export interface SeparatorProps extends ComponentPropsWithoutRef<'div'> {
|
|
22
|
+
orientation?: 'horizontal' | 'vertical';
|
|
23
|
+
decorative?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function Separator({ orientation, decorative, className, ...rest }: SeparatorProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
export declare namespace Separator {
|
|
27
|
+
var displayName: string;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=Separator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Separator.d.ts","sourceRoot":"","sources":["../../src/components/Separator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAItD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,cAAe,SAAQ,wBAAwB,CAAC,KAAK,CAAC;IACrE,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,EACxB,WAA0B,EAC1B,UAAiB,EACjB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,cAAc,2CAUhB;yBAfe,SAAS"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ComponentProps } from 'react';
|
|
2
|
+
import { VariantProps } from 'class-variance-authority';
|
|
3
|
+
/**
|
|
4
|
+
* Maps the `size` axis to per-class names inside `Textarea.module.css`. Like
|
|
5
|
+
* `Input`, `Textarea` has no `variant` axis on purpose — shadcn's primitive
|
|
6
|
+
* contract is a single styled `<textarea>` and the design-system best
|
|
7
|
+
* practice for form controls is one chrome with explicit error / disabled /
|
|
8
|
+
* readonly states. Composition around the textarea (label, helper, error
|
|
9
|
+
* message) belongs to the future `<Field>` molecule, not to this atom
|
|
10
|
+
* (Escuela 1 from the field-pattern decision, 2026-04-27).
|
|
11
|
+
*
|
|
12
|
+
* The three sizes share the resting visual contract with `<Input size>` so
|
|
13
|
+
* a textarea sits flush next to inputs of the same size in a form: identical
|
|
14
|
+
* inline padding, identical resting border tone (`neutral-500`), identical
|
|
15
|
+
* font-size hop at `lg`, identical focus ring. The vertical dimension is
|
|
16
|
+
* `min-height` instead of a fixed `height` because textareas grow with
|
|
17
|
+
* content and the user can drag them taller (`resize: vertical`).
|
|
18
|
+
*/
|
|
19
|
+
declare const textareaVariants: (props?: ({
|
|
20
|
+
size?: "sm" | "md" | "lg" | null | undefined;
|
|
21
|
+
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
22
|
+
type TextareaVariantProps = VariantProps<typeof textareaVariants>;
|
|
23
|
+
/**
|
|
24
|
+
* Props accepted by `<Textarea>`. Extends every native `<textarea>`
|
|
25
|
+
* attribute. Unlike `<Input>`, no native attribute is shadowed — the native
|
|
26
|
+
* `<textarea>` does not have a `size` attribute, so the typed Pharos size
|
|
27
|
+
* axis takes the slot without collision.
|
|
28
|
+
*
|
|
29
|
+
* Error state is conveyed through the standard `aria-invalid` attribute,
|
|
30
|
+
* not a custom `error` prop. The CSS reacts to `[aria-invalid="true"]`,
|
|
31
|
+
* matching shadcn / Base UI / Mantine. The actual error message is rendered
|
|
32
|
+
* by the consumer next to the textarea (or by the future `<Field>` molecule).
|
|
33
|
+
*/
|
|
34
|
+
export interface TextareaProps extends ComponentProps<'textarea'>, TextareaVariantProps {
|
|
35
|
+
}
|
|
36
|
+
export declare function Textarea({ size, className, ref, ...rest }: TextareaProps): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
export declare namespace Textarea {
|
|
38
|
+
var displayName: string;
|
|
39
|
+
}
|
|
40
|
+
export { textareaVariants };
|
|
41
|
+
//# sourceMappingURL=Textarea.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Textarea.d.ts","sourceRoot":"","sources":["../../src/components/Textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIlE;;;;;;;;;;;;;;;GAeG;AACH,QAAA,MAAM,gBAAgB;;8EAWpB,CAAC;AAEH,KAAK,oBAAoB,GAAG,YAAY,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAElE;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAc,SAAQ,cAAc,CAAC,UAAU,CAAC,EAAE,oBAAoB;CAAG;AAE1F,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,aAAa,2CAUxE;yBAVe,QAAQ;;;AAcxB,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,5 +4,11 @@ export { Badge, badgeVariants } from './components/Badge';
|
|
|
4
4
|
export type { BadgeProps } from './components/Badge';
|
|
5
5
|
export { Input, inputVariants } from './components/Input';
|
|
6
6
|
export type { InputProps } from './components/Input';
|
|
7
|
+
export { Textarea, textareaVariants } from './components/Textarea';
|
|
8
|
+
export type { TextareaProps } from './components/Textarea';
|
|
9
|
+
export { Separator } from './components/Separator';
|
|
10
|
+
export type { SeparatorProps } from './components/Separator';
|
|
11
|
+
export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, cardVariants, } from './components/Card';
|
|
12
|
+
export type { CardProps, CardHeaderProps, CardTitleProps, CardDescriptionProps, CardContentProps, CardFooterProps, } from './components/Card';
|
|
7
13
|
export { cn } from './lib/cn';
|
|
8
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACL,IAAI,EACJ,UAAU,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,SAAS,EACT,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -151,7 +151,114 @@ function g({ size: e, className: n, type: r = "text", ref: i, ...a }) {
|
|
|
151
151
|
});
|
|
152
152
|
}
|
|
153
153
|
g.displayName = "Input";
|
|
154
|
+
var _ = {
|
|
155
|
+
textarea: "_textarea_1mec8_21",
|
|
156
|
+
sizeSm: "_sizeSm_1mec8_113",
|
|
157
|
+
sizeMd: "_sizeMd_1mec8_119",
|
|
158
|
+
sizeLg: "_sizeLg_1mec8_125"
|
|
159
|
+
}, v = o(_.textarea, {
|
|
160
|
+
variants: { size: {
|
|
161
|
+
sm: _.sizeSm,
|
|
162
|
+
md: _.sizeMd,
|
|
163
|
+
lg: _.sizeLg
|
|
164
|
+
} },
|
|
165
|
+
defaultVariants: { size: "md" }
|
|
166
|
+
});
|
|
167
|
+
function y({ size: e, className: n, ref: r, ...i }) {
|
|
168
|
+
let a = e ?? "md";
|
|
169
|
+
return /* @__PURE__ */ t("textarea", {
|
|
170
|
+
ref: r,
|
|
171
|
+
"data-pharos-size": a,
|
|
172
|
+
className: s(v({ size: a }), n),
|
|
173
|
+
...i
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
y.displayName = "Textarea";
|
|
177
|
+
var b = {
|
|
178
|
+
separator: "_separator_da90p_13",
|
|
179
|
+
horizontal: "_horizontal_da90p_29",
|
|
180
|
+
vertical: "_vertical_da90p_34"
|
|
181
|
+
};
|
|
182
|
+
//#endregion
|
|
183
|
+
//#region src/components/Separator.tsx
|
|
184
|
+
function x({ orientation: e = "horizontal", decorative: n = !0, className: r, ...i }) {
|
|
185
|
+
return /* @__PURE__ */ t("div", {
|
|
186
|
+
role: n ? "none" : "separator",
|
|
187
|
+
"aria-orientation": !n && e === "vertical" ? "vertical" : void 0,
|
|
188
|
+
"data-pharos-orientation": e,
|
|
189
|
+
className: s(b.separator, b[e], r),
|
|
190
|
+
...i
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
x.displayName = "Separator";
|
|
194
|
+
var S = {
|
|
195
|
+
card: "_card_yxgwa_10",
|
|
196
|
+
default: "_default_yxgwa_42",
|
|
197
|
+
elevated: "_elevated_yxgwa_46",
|
|
198
|
+
outlined: "_outlined_yxgwa_51",
|
|
199
|
+
header: "_header_yxgwa_62",
|
|
200
|
+
title: "_title_yxgwa_69",
|
|
201
|
+
description: "_description_yxgwa_77",
|
|
202
|
+
content: "_content_yxgwa_85",
|
|
203
|
+
footer: "_footer_yxgwa_95"
|
|
204
|
+
}, C = o(S.card, {
|
|
205
|
+
variants: { variant: {
|
|
206
|
+
default: S.default,
|
|
207
|
+
elevated: S.elevated,
|
|
208
|
+
outlined: S.outlined
|
|
209
|
+
} },
|
|
210
|
+
defaultVariants: { variant: "default" }
|
|
211
|
+
});
|
|
212
|
+
function w({ variant: e, className: n, ...r }) {
|
|
213
|
+
let i = e ?? "default";
|
|
214
|
+
return /* @__PURE__ */ t("div", {
|
|
215
|
+
"data-pharos-variant": i,
|
|
216
|
+
className: s(C({ variant: i }), n),
|
|
217
|
+
...r
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
w.displayName = "Card";
|
|
221
|
+
function T({ className: e, ...n }) {
|
|
222
|
+
return /* @__PURE__ */ t("div", {
|
|
223
|
+
"data-pharos-slot": "card-header",
|
|
224
|
+
className: s(S.header, e),
|
|
225
|
+
...n
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
T.displayName = "CardHeader";
|
|
229
|
+
function E({ className: e, ...n }) {
|
|
230
|
+
return /* @__PURE__ */ t("div", {
|
|
231
|
+
"data-pharos-slot": "card-title",
|
|
232
|
+
className: s(S.title, e),
|
|
233
|
+
...n
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
E.displayName = "CardTitle";
|
|
237
|
+
function D({ className: e, ...n }) {
|
|
238
|
+
return /* @__PURE__ */ t("p", {
|
|
239
|
+
"data-pharos-slot": "card-description",
|
|
240
|
+
className: s(S.description, e),
|
|
241
|
+
...n
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
D.displayName = "CardDescription";
|
|
245
|
+
function O({ className: e, ...n }) {
|
|
246
|
+
return /* @__PURE__ */ t("div", {
|
|
247
|
+
"data-pharos-slot": "card-content",
|
|
248
|
+
className: s(S.content, e),
|
|
249
|
+
...n
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
O.displayName = "CardContent";
|
|
253
|
+
function k({ className: e, ...n }) {
|
|
254
|
+
return /* @__PURE__ */ t("div", {
|
|
255
|
+
"data-pharos-slot": "card-footer",
|
|
256
|
+
className: s(S.footer, e),
|
|
257
|
+
...n
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
k.displayName = "CardFooter";
|
|
154
261
|
//#endregion
|
|
155
|
-
export { p as Badge, u as Button, g as Input, f as badgeVariants, l as buttonVariants, s as cn, h as inputVariants };
|
|
262
|
+
export { p as Badge, u as Button, w as Card, O as CardContent, D as CardDescription, k as CardFooter, T as CardHeader, E as CardTitle, g as Input, x as Separator, y as Textarea, f as badgeVariants, l as buttonVariants, C as cardVariants, s as cn, h as inputVariants, v as textareaVariants };
|
|
156
263
|
|
|
157
264
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.mjs","../src/lib/cn.ts","../src/components/Button.module.css","../src/components/Button.tsx","../src/components/Badge.module.css","../src/components/Badge.tsx","../src/components/Input.module.css","../src/components/Input.tsx"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/**\n * Copyright 2022 Joe Bell. All rights reserved.\n *\n * This file is licensed to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */ import { clsx } from \"clsx\";\nconst falsyToString = (value)=>typeof value === \"boolean\" ? `${value}` : value === 0 ? \"0\" : value;\nexport const cx = clsx;\nexport const cva = (base, config)=>(props)=>{\n var _config_compoundVariants;\n if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n const { variants, defaultVariants } = config;\n const getVariantClassNames = Object.keys(variants).map((variant)=>{\n const variantProp = props === null || props === void 0 ? void 0 : props[variant];\n const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];\n if (variantProp === null) return null;\n const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);\n return variants[variant][variantKey];\n });\n const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{\n let [key, value] = param;\n if (value === undefined) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{\n let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;\n return Object.entries(compoundVariantOptions).every((param)=>{\n let [key, value] = param;\n return Array.isArray(value) ? value.includes({\n ...defaultVariants,\n ...propsWithoutUndefined\n }[key]) : ({\n ...defaultVariants,\n ...propsWithoutUndefined\n })[key] === value;\n }) ? [\n ...acc,\n cvClass,\n cvClassName\n ] : acc;\n }, []);\n return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n };\n\n","import { clsx, type ClassValue } from 'clsx';\n\n/**\n * Merge a list of class-name inputs into a single string.\n *\n * `clsx`-only by design (Decision D9): pharos-react no longer ships Tailwind\n * classes, so the previous `twMerge` step was wrapping each call with a\n * Tailwind-conflict resolver that nothing in the bundle benefited from.\n *\n * Consumers that build with Tailwind and want the conflict-resolution\n * behavior should keep using their own `tailwind-merge` helper alongside\n * Pharos components — `<Button className={twMerge(myClasses)} />` works\n * because Pharos-side class names are CSS Modules hashes that no Tailwind\n * resolver will ever try to deduplicate.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return clsx(inputs);\n}\n","/* Button.module.css\n *\n * Per-component CSS Modules definition (Decision D9). The build emits hashed\n * class names (e.g. `Button_button__a3f2`) into dist/styles.css; the runtime\n * JS references those names through the `styles` object imported by Button.tsx.\n *\n * Every visual value comes from a `--pharos-*` token. No hex, no raw px/rem\n * for design dimensions, no Tailwind. Hover / active / focus states are\n * authored with native CSS pseudo-classes — no preprocessor, no utility-first\n * shorthand, no framework dependency at runtime.\n *\n * Consumers do not need Tailwind (any version) or any other CSS framework to\n * use this component. They only need to load the published `dist/styles.css`\n * once and the consumer's app must define `--pharos-*` (achieved by importing\n * `@code-sherpas/pharos-tokens/css`, which is a peer dependency).\n */\n\n.button {\n /* Strip native button rendering. The component is fully custom-styled,\n * so platform-specific drawing (rounded corners, shadows, focus rings\n * on macOS, push-button gradient on iOS) only adds variance without\n * adding value. `appearance: none` keeps every consumer rendering the\n * exact same pixel set. The `-webkit-appearance` line is a no-op on\n * modern Chromium but stays for older WebKit. */\n appearance: none;\n -webkit-appearance: none;\n\n /* === Box model ===\n * Explicit so the rendered control matches the height set in the size\n * rules even when the consumer's app does not ship a CSS reset. With\n * the consumer-side preflight gone, `border-box`, `margin: 0` and the\n * zero block-padding neutralise the user-agent's `padding: 1px 6px`\n * (Chrome) or `padding: 0 8px` (Firefox) on `<button>`. */\n box-sizing: border-box;\n margin: 0;\n padding-top: 0;\n padding-bottom: 0;\n border: 0 solid transparent;\n border-radius: var(--pharos-radius-full);\n\n /* === Layout === */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n\n /* === Optical text centering ===\n * `text-box-trim` strips the leading above the cap-line and below the\n * alphabetic baseline so `align-items: center` centres the actual\n * cap-block instead of the line-box (which includes per-font half-\n * leading that biases the visual centre upward or downward depending\n * on the font's vertical metrics). Without this, fonts with a high\n * baseline like Outfit (the D8 sans) render visibly above the\n * geometric centre even though `align-items: center` is correctly\n * applied — matching what Chromatic flagged on the migration PR.\n * The `text-box-edge` longhand picks the cap-line at the start and\n * the alphabetic baseline at the end so descenders (\"y\", \"g\", ...)\n * still hang below the cap-block as the font intended; only the\n * extra leading is trimmed.\n *\n * Browser support: Chromium 133+ / Safari 18.2+ ship the property,\n * Firefox has it behind a flag at the time of writing. In engines\n * without support the declaration is ignored and the text falls\n * back to standard line-box centring — which is the same behaviour\n * the bundle had before this rule, so the fallback is safe. */\n text-box-trim: trim-both;\n text-box-edge: cap alphabetic;\n\n /* === Typography ===\n * Each font longhand is set explicitly. The shorthand `font: inherit`\n * was tempting but the CSS spec says the `font` shorthand resets a\n * dozen related properties (`font-feature-settings`,\n * `font-variation-settings`, `font-kerning`, `font-optical-sizing`,\n * `font-size-adjust`, etc.) to their *initial* values rather than\n * inheriting them. That subtle reset shifted the rendered baseline\n * by a fraction of a pixel against the consumer's surrounding text,\n * which Chromatic flagged as a diff vs 0.2.x. The size variants\n * below override `font-size` and `line-height` per size. */\n font-family: var(--pharos-font-family-sans);\n font-style: normal;\n font-weight: var(--pharos-font-weight-medium);\n font-stretch: normal;\n font-variant: normal;\n font-kerning: auto;\n font-optical-sizing: auto;\n font-size-adjust: none;\n font-feature-settings: normal;\n font-variation-settings: normal;\n letter-spacing: normal;\n text-decoration: none;\n text-transform: none;\n /* Default size (overridden per size variant) — keeps a sensible\n * fallback if a Button is somehow rendered without a size class. */\n font-size: var(--pharos-font-size-sm);\n line-height: 1.5;\n\n /* === Interactivity === */\n user-select: none;\n cursor: pointer;\n background-color: transparent;\n color: inherit;\n\n /* === Transitions === */\n transition-property: color, background-color, border-color, box-shadow;\n transition-duration: var(--pharos-duration-normal);\n transition-timing-function: var(--pharos-easing-out);\n}\n\n.button:focus-visible {\n outline: none;\n /* Two-stop box-shadow mimics the Tailwind `ring-offset-2 ring-2` pattern:\n * an inner halo in the surface color separates the ring from the button\n * fill, and the outer color is the per-intent focus accent. */\n box-shadow:\n 0 0 0 2px var(--pharos-color-base-white),\n 0 0 0 4px var(--button-focus-ring, var(--pharos-color-primary-600));\n}\n\n.button:disabled {\n pointer-events: none;\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* === Intents === */\n\n.primary {\n background-color: var(--pharos-color-neutral-900);\n color: var(--pharos-color-base-white);\n --button-focus-ring: var(--pharos-color-primary-600);\n}\n\n.primary:hover {\n background-color: var(--pharos-color-neutral-700);\n}\n\n.primary:active {\n background-color: var(--pharos-color-neutral-950);\n}\n\n.secondary {\n background-color: var(--pharos-color-base-white);\n color: var(--pharos-color-neutral-900);\n /* `neutral-500` clears WCAG 1.4.11 (Non-text Contrast, 3:1 against the\n * surrounding surface). See Input.module.css for the full rationale and\n * the cross-DS comparison; Button secondary, Input and Badge outline\n * share the same border tone so the system has one accessible boundary\n * intensity across primitives. */\n border: 1px solid var(--pharos-color-neutral-500);\n --button-focus-ring: var(--pharos-color-primary-600);\n}\n\n.secondary:hover {\n background-color: var(--pharos-color-neutral-50);\n}\n\n.secondary:active {\n background-color: var(--pharos-color-neutral-100);\n}\n\n.ghost {\n background-color: transparent;\n color: var(--pharos-color-neutral-900);\n --button-focus-ring: var(--pharos-color-primary-600);\n}\n\n.ghost:hover {\n background-color: var(--pharos-color-neutral-100);\n}\n\n.ghost:active {\n background-color: var(--pharos-color-neutral-200);\n}\n\n.destructive {\n background-color: var(--pharos-color-semantic-error-fg);\n color: var(--pharos-color-semantic-error-on);\n --button-focus-ring: var(--pharos-color-semantic-error-fg);\n}\n\n.destructive:hover {\n background-color: var(--pharos-color-semantic-error-fg-hover);\n}\n\n.destructive:active {\n background-color: var(--pharos-color-semantic-error-fg-active);\n}\n\n/* === Sizes ===\n *\n * Heights and paddings are derived from `--pharos-spacing-*` so a runtime\n * override of the spacing scale rescales the whole control proportionally.\n * Font sizes use `--pharos-font-size-*` tokens; the line-height ratios match\n * the Tailwind v4 defaults that shipped in 0.2.x so visual fidelity is\n * preserved across the migration. */\n\n.sizeSm {\n height: var(--pharos-spacing-8);\n gap: var(--pharos-spacing-1-5);\n padding: 0 var(--pharos-spacing-3);\n font-size: var(--pharos-font-size-sm);\n line-height: calc(1.25 / 0.875);\n}\n\n.sizeMd {\n height: var(--pharos-spacing-10);\n gap: var(--pharos-spacing-2);\n padding: 0 var(--pharos-spacing-4);\n font-size: var(--pharos-font-size-sm);\n line-height: calc(1.25 / 0.875);\n}\n\n.sizeLg {\n height: var(--pharos-spacing-12);\n gap: var(--pharos-spacing-2);\n padding: 0 var(--pharos-spacing-6);\n font-size: var(--pharos-font-size-base);\n line-height: 1.5;\n}\n","import { useRender } from '@base-ui/react/use-render';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/cn';\nimport styles from './Button.module.css';\n\n/**\n * Maps the two public variant axes (`intent`, `size`) to the per-class names\n * inside `Button.module.css`. CVA stays as the typed-variants mechanism\n * (Decision D9 keeps the authoring DX) but each value points at a hashed\n * CSS Modules class instead of a Tailwind utility string. The base class\n * carries layout, typography and the focus-visible ring — every variant\n * stacks on top of it.\n */\nconst buttonVariants = cva(styles.button, {\n variants: {\n intent: {\n // `primary` is the most emphasized CTA. It renders in neutral-900,\n // matching Alexandria's `NewButton variant=\"filled\" tone=\"default\"`\n // and the Linear/Vercel/Notion convention of \"brand color as accent,\n // dark neutral as primary action\". The blue `primary-*` palette is\n // reserved for brand accents (focus rings, highlights, badges) —\n // not for the default filled button.\n primary: styles.primary,\n secondary: styles.secondary,\n ghost: styles.ghost,\n destructive: styles.destructive,\n },\n size: {\n sm: styles.sizeSm,\n md: styles.sizeMd,\n lg: styles.sizeLg,\n },\n },\n defaultVariants: {\n intent: 'primary',\n size: 'md',\n },\n});\n\ntype ButtonVariantProps = VariantProps<typeof buttonVariants>;\n\n/**\n * Props accepted by `<Button>`. Extends Base UI's `useRender.ComponentProps<'button'>`,\n * which means the component accepts every native `<button>` attribute plus the\n * `render` prop for composition:\n *\n * ```tsx\n * // Render as a router link (inherits all Button styles and behavior):\n * <Button render={<Link to=\"/dashboard\" />}>Dashboard</Button>\n * // Or as a function receiving props + state:\n * <Button render={(props) => <a {...props} href=\"/x\" />}>External</Button>\n * ```\n */\nexport interface ButtonProps extends useRender.ComponentProps<'button'>, ButtonVariantProps {}\n\nexport function Button({\n render,\n className,\n intent,\n size,\n type = 'button',\n ref,\n ...rest\n}: ButtonProps) {\n const resolvedIntent = intent ?? 'primary';\n const resolvedSize = size ?? 'md';\n return useRender({\n render: render ?? <button />,\n ref,\n defaultTagName: 'button',\n props: {\n type,\n // `data-pharos-intent` / `data-pharos-size` are stable hooks for\n // selectors and tests. They mirror the CSS Modules class but stay\n // semantic — consumer queries do not need to know the hashed class\n // name and tests do not need to import the module to assert variant.\n 'data-pharos-intent': resolvedIntent,\n 'data-pharos-size': resolvedSize,\n className: cn(buttonVariants({ intent: resolvedIntent, size: resolvedSize }), className),\n ...rest,\n },\n });\n}\n\nButton.displayName = 'Button';\n\nexport { buttonVariants };\n","/* Base layout. Same across every variant — only surface, label and border\n * change. Inline-flex so a child SVG (rendered by the consumer as plain\n * children) sits on the same baseline as the label. The font-relative SVG\n * sizing rule mirrors shadcn's `[&>svg]:size-3` utility. */\n.badge {\n display: inline-flex;\n align-items: center;\n gap: var(--pharos-spacing-1);\n padding: 0 var(--pharos-spacing-2);\n height: var(--pharos-spacing-5);\n border: 1px solid transparent;\n border-radius: var(--pharos-radius-full);\n font-family: var(--pharos-font-family-sans);\n font-size: var(--pharos-font-size-xs);\n font-weight: var(--pharos-font-weight-medium);\n line-height: 1;\n white-space: nowrap;\n width: fit-content;\n text-box-trim: trim-both;\n text-box-edge: cap alphabetic;\n}\n\n.badge > svg {\n width: 0.75em;\n height: 0.75em;\n flex: 0 0 auto;\n pointer-events: none;\n}\n\n.default {\n background: var(--pharos-color-neutral-900);\n color: var(--pharos-color-base-white);\n}\n\n.secondary {\n background: var(--pharos-color-neutral-100);\n color: var(--pharos-color-neutral-900);\n}\n\n.destructive {\n background: var(--pharos-color-semantic-error-fg);\n color: var(--pharos-color-semantic-error-on);\n}\n\n.outline {\n background: transparent;\n color: var(--pharos-color-neutral-900);\n /* `neutral-500` clears WCAG 1.4.11 (Non-text Contrast, 3:1 against the\n * surrounding surface) and matches the resting border of Input and\n * Button secondary so the system has one accessible boundary intensity\n * across primitives. See `Input.module.css` for the cross-DS rationale. */\n border-color: var(--pharos-color-neutral-500);\n}\n\n.success {\n background: var(--pharos-color-semantic-success-fg);\n color: var(--pharos-color-semantic-success-on);\n}\n\n.warning {\n background: var(--pharos-color-semantic-warning-fg);\n color: var(--pharos-color-semantic-warning-on);\n}\n\n.info {\n background: var(--pharos-color-semantic-info-fg);\n color: var(--pharos-color-semantic-info-on);\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/cn';\nimport styles from './Badge.module.css';\n\n/**\n * Maps the `variant` axis to per-class names inside `Badge.module.css`.\n * The variant set follows shadcn/ui — `default`, `secondary`, `destructive`,\n * `outline` — extended with the semantic tones every modern DS exposes\n * (`success`, `warning`, `info`). Naming stays asymmetric on purpose:\n * `destructive` is the canonical shadcn name for \"negative tone\" and we\n * keep it instead of renaming it to `error`, so consumers familiar with\n * shadcn pick the right value without re-learning the API.\n */\nconst badgeVariants = cva(styles.badge, {\n variants: {\n variant: {\n default: styles.default,\n secondary: styles.secondary,\n destructive: styles.destructive,\n outline: styles.outline,\n success: styles.success,\n warning: styles.warning,\n info: styles.info,\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\ntype BadgeVariantProps = VariantProps<typeof badgeVariants>;\n\nexport interface BadgeProps extends ComponentPropsWithoutRef<'span'>, BadgeVariantProps {}\n\nexport function Badge({ variant, className, ...rest }: BadgeProps) {\n const resolvedVariant = variant ?? 'default';\n return (\n <span\n data-pharos-variant={resolvedVariant}\n className={cn(badgeVariants({ variant: resolvedVariant }), className)}\n {...rest}\n />\n );\n}\n\nBadge.displayName = 'Badge';\n\nexport { badgeVariants };\n","/* Input.module.css\n *\n * Per-component CSS Modules definition (Decision D9). The build emits hashed\n * class names (`Input_input__xxxx`) into `dist/styles.css`; the runtime JS\n * references them through the `styles` object imported by Input.tsx.\n *\n * Every visual value comes from a `--pharos-*` token. No hex, no Tailwind,\n * no preflight. Hover / focus-visible / invalid / disabled states are\n * authored with native CSS pseudo-classes and the `[aria-invalid=\"true\"]`\n * attribute selector — the component does not own any \"error mode\" state\n * itself; it reflects what the consumer puts on the DOM.\n */\n\n.input {\n /* Strip the user-agent input chrome (gradient backgrounds, internal\n * padding, rounded corners on macOS, the right-edge spinner on number).\n * With preflight gone from the consumer, this is the only line that\n * normalizes the rendering across browsers. */\n appearance: none;\n -webkit-appearance: none;\n\n /* === Box model === */\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n /* `neutral-500` lands the resting border at ~5.4:1 contrast against a\n * white surface, clearing WCAG 1.4.11 (Non-text Contrast, 3:1 for UI\n * component boundaries). The shadcn / Radix Themes / Mantine default\n * sits around oklch 92% (~1.3:1) and fails the requirement; Pharos\n * deliberately diverges to comply. Carbon `border-strong-01` (#8d8d8d)\n * and Adobe Spectrum's outline tone are at the same intensity. */\n border: 1px solid var(--pharos-color-neutral-500);\n border-radius: var(--pharos-radius-md);\n background-color: var(--pharos-color-base-white);\n color: var(--pharos-color-neutral-900);\n\n /* === Typography ===\n * `font-family` and weight are explicit so the input does not inherit a\n * system-ui fallback when it lives inside surfaces that haven't set the\n * Pharos sans stack (e.g. inside a `<dialog>` rendered to the top layer).\n * The size variants below override `font-size` and the `padding-inline`. */\n font-family: var(--pharos-font-family-sans);\n font-size: var(--pharos-font-size-sm);\n font-weight: var(--pharos-font-weight-regular);\n line-height: 1.25;\n\n /* === Transitions === */\n transition-property: border-color, box-shadow;\n transition-duration: var(--pharos-duration-normal);\n transition-timing-function: var(--pharos-easing-out);\n}\n\n.input::placeholder {\n color: var(--pharos-color-neutral-500);\n /* Some Linux/Chromium builds dim placeholders to ~54% by default; the\n * explicit `opacity: 1` keeps the rendered tone equal to the token. */\n opacity: 1;\n}\n\n.input:focus-visible {\n outline: none;\n border-color: var(--pharos-color-primary-600);\n /* Two-stop box-shadow mirrors the Button focus ring: an inner halo in the\n * surface color separates the ring from the input fill, and the outer\n * stop is the brand accent. Same tokens as Button so the system has a\n * single focus look. */\n box-shadow:\n 0 0 0 2px var(--pharos-color-base-white),\n 0 0 0 4px var(--pharos-color-primary-600);\n}\n\n.input:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.input[aria-invalid='true'] {\n border-color: var(--pharos-color-semantic-error-fg);\n}\n\n.input[aria-invalid='true']:focus-visible {\n border-color: var(--pharos-color-semantic-error-fg);\n box-shadow:\n 0 0 0 2px var(--pharos-color-base-white),\n 0 0 0 4px var(--pharos-color-semantic-error-fg);\n}\n\n/* === Sizes ===\n *\n * Heights match the Button grid exactly — the system has one vertical\n * rhythm across pressable controls and form fields, so an `<Input size>`\n * sits flush next to a `<Button size>` on the same row. Horizontal padding\n * follows the same scale Button uses; font-size hops to `base` (16px) at\n * `lg` because larger controls usually pair with prominent layouts where\n * the body 14px starts to feel undersized. */\n\n.sizeSm {\n height: var(--pharos-spacing-8);\n padding: 0 var(--pharos-spacing-3);\n font-size: var(--pharos-font-size-sm);\n}\n\n.sizeMd {\n height: var(--pharos-spacing-10);\n padding: 0 var(--pharos-spacing-4);\n font-size: var(--pharos-font-size-sm);\n}\n\n.sizeLg {\n height: var(--pharos-spacing-12);\n padding: 0 var(--pharos-spacing-6);\n font-size: var(--pharos-font-size-base);\n}\n","import type { ComponentProps } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/cn';\nimport styles from './Input.module.css';\n\n/**\n * Maps the `size` axis to per-class names inside `Input.module.css`. Input\n * has no `variant` axis on purpose — shadcn's primitive contract is a single\n * styled `<input>` and the design-system best practice for form controls is\n * one chrome with explicit error / disabled / readonly states. Composition\n * around the input (label, helper, error message) belongs to a future\n * `<Field>` molecule, not to this atom (Escuela 1 from the field-pattern\n * decision, 2026-04-27).\n */\nconst inputVariants = cva(styles.input, {\n variants: {\n size: {\n sm: styles.sizeSm,\n md: styles.sizeMd,\n lg: styles.sizeLg,\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\ntype InputVariantProps = VariantProps<typeof inputVariants>;\n\n/**\n * Props accepted by `<Input>`. Extends every native `<input>` attribute\n * except `size` — the native `size` attribute is a number (visible width\n * in characters) that is rarely used in modern apps where width comes from\n * CSS, so the slot is reused for the typed Pharos size axis. Consumers that\n * truly need the HTML attribute can set it through `style.width` or via a\n * dedicated `htmlSize` prop if we expose one later.\n *\n * Error state is conveyed through the standard `aria-invalid` attribute,\n * not a custom `error` prop. The CSS reacts to `[aria-invalid=\"true\"]`,\n * matching shadcn / Base UI / Mantine. The actual error message is rendered\n * by the consumer next to the input (or by the future `<Field>` molecule).\n */\nexport interface InputProps extends Omit<ComponentProps<'input'>, 'size'>, InputVariantProps {}\n\nexport function Input({ size, className, type = 'text', ref, ...rest }: InputProps) {\n const resolvedSize = size ?? 'md';\n return (\n <input\n ref={ref}\n type={type}\n data-pharos-size={resolvedSize}\n className={cn(inputVariants({ size: resolvedSize }), className)}\n {...rest}\n />\n );\n}\n\nInput.displayName = 'Input';\n\nexport { inputVariants };\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.mjs","../src/lib/cn.ts","../src/components/Button.module.css","../src/components/Button.tsx","../src/components/Badge.module.css","../src/components/Badge.tsx","../src/components/Input.module.css","../src/components/Input.tsx","../src/components/Textarea.module.css","../src/components/Textarea.tsx","../src/components/Separator.module.css","../src/components/Separator.tsx","../src/components/Card.module.css","../src/components/Card.tsx"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/**\n * Copyright 2022 Joe Bell. All rights reserved.\n *\n * This file is licensed to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */ import { clsx } from \"clsx\";\nconst falsyToString = (value)=>typeof value === \"boolean\" ? `${value}` : value === 0 ? \"0\" : value;\nexport const cx = clsx;\nexport const cva = (base, config)=>(props)=>{\n var _config_compoundVariants;\n if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n const { variants, defaultVariants } = config;\n const getVariantClassNames = Object.keys(variants).map((variant)=>{\n const variantProp = props === null || props === void 0 ? void 0 : props[variant];\n const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];\n if (variantProp === null) return null;\n const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);\n return variants[variant][variantKey];\n });\n const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{\n let [key, value] = param;\n if (value === undefined) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{\n let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;\n return Object.entries(compoundVariantOptions).every((param)=>{\n let [key, value] = param;\n return Array.isArray(value) ? value.includes({\n ...defaultVariants,\n ...propsWithoutUndefined\n }[key]) : ({\n ...defaultVariants,\n ...propsWithoutUndefined\n })[key] === value;\n }) ? [\n ...acc,\n cvClass,\n cvClassName\n ] : acc;\n }, []);\n return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n };\n\n","import { clsx, type ClassValue } from 'clsx';\n\n/**\n * Merge a list of class-name inputs into a single string.\n *\n * `clsx`-only by design (Decision D9): pharos-react no longer ships Tailwind\n * classes, so the previous `twMerge` step was wrapping each call with a\n * Tailwind-conflict resolver that nothing in the bundle benefited from.\n *\n * Consumers that build with Tailwind and want the conflict-resolution\n * behavior should keep using their own `tailwind-merge` helper alongside\n * Pharos components — `<Button className={twMerge(myClasses)} />` works\n * because Pharos-side class names are CSS Modules hashes that no Tailwind\n * resolver will ever try to deduplicate.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return clsx(inputs);\n}\n","/* Button.module.css\n *\n * Per-component CSS Modules definition (Decision D9). The build emits hashed\n * class names (e.g. `Button_button__a3f2`) into dist/styles.css; the runtime\n * JS references those names through the `styles` object imported by Button.tsx.\n *\n * Every visual value comes from a `--pharos-*` token. No hex, no raw px/rem\n * for design dimensions, no Tailwind. Hover / active / focus states are\n * authored with native CSS pseudo-classes — no preprocessor, no utility-first\n * shorthand, no framework dependency at runtime.\n *\n * Consumers do not need Tailwind (any version) or any other CSS framework to\n * use this component. They only need to load the published `dist/styles.css`\n * once and the consumer's app must define `--pharos-*` (achieved by importing\n * `@code-sherpas/pharos-tokens/css`, which is a peer dependency).\n */\n\n.button {\n /* Strip native button rendering. The component is fully custom-styled,\n * so platform-specific drawing (rounded corners, shadows, focus rings\n * on macOS, push-button gradient on iOS) only adds variance without\n * adding value. `appearance: none` keeps every consumer rendering the\n * exact same pixel set. The `-webkit-appearance` line is a no-op on\n * modern Chromium but stays for older WebKit. */\n appearance: none;\n -webkit-appearance: none;\n\n /* === Box model ===\n * Explicit so the rendered control matches the height set in the size\n * rules even when the consumer's app does not ship a CSS reset. With\n * the consumer-side preflight gone, `border-box`, `margin: 0` and the\n * zero block-padding neutralise the user-agent's `padding: 1px 6px`\n * (Chrome) or `padding: 0 8px` (Firefox) on `<button>`. */\n box-sizing: border-box;\n margin: 0;\n padding-top: 0;\n padding-bottom: 0;\n border: 0 solid transparent;\n border-radius: var(--pharos-radius-full);\n\n /* === Layout === */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n\n /* === Optical text centering ===\n * `text-box-trim` strips the leading above the cap-line and below the\n * alphabetic baseline so `align-items: center` centres the actual\n * cap-block instead of the line-box (which includes per-font half-\n * leading that biases the visual centre upward or downward depending\n * on the font's vertical metrics). Without this, fonts with a high\n * baseline like Outfit (the D8 sans) render visibly above the\n * geometric centre even though `align-items: center` is correctly\n * applied — matching what Chromatic flagged on the migration PR.\n * The `text-box-edge` longhand picks the cap-line at the start and\n * the alphabetic baseline at the end so descenders (\"y\", \"g\", ...)\n * still hang below the cap-block as the font intended; only the\n * extra leading is trimmed.\n *\n * Browser support: Chromium 133+ / Safari 18.2+ ship the property,\n * Firefox has it behind a flag at the time of writing. In engines\n * without support the declaration is ignored and the text falls\n * back to standard line-box centring — which is the same behaviour\n * the bundle had before this rule, so the fallback is safe. */\n text-box-trim: trim-both;\n text-box-edge: cap alphabetic;\n\n /* === Typography ===\n * Each font longhand is set explicitly. The shorthand `font: inherit`\n * was tempting but the CSS spec says the `font` shorthand resets a\n * dozen related properties (`font-feature-settings`,\n * `font-variation-settings`, `font-kerning`, `font-optical-sizing`,\n * `font-size-adjust`, etc.) to their *initial* values rather than\n * inheriting them. That subtle reset shifted the rendered baseline\n * by a fraction of a pixel against the consumer's surrounding text,\n * which Chromatic flagged as a diff vs 0.2.x. The size variants\n * below override `font-size` and `line-height` per size. */\n font-family: var(--pharos-font-family-sans);\n font-style: normal;\n font-weight: var(--pharos-font-weight-medium);\n font-stretch: normal;\n font-variant: normal;\n font-kerning: auto;\n font-optical-sizing: auto;\n font-size-adjust: none;\n font-feature-settings: normal;\n font-variation-settings: normal;\n letter-spacing: normal;\n text-decoration: none;\n text-transform: none;\n /* Default size (overridden per size variant) — keeps a sensible\n * fallback if a Button is somehow rendered without a size class. */\n font-size: var(--pharos-font-size-sm);\n line-height: 1.5;\n\n /* === Interactivity === */\n user-select: none;\n cursor: pointer;\n background-color: transparent;\n color: inherit;\n\n /* === Transitions === */\n transition-property: color, background-color, border-color, box-shadow;\n transition-duration: var(--pharos-duration-normal);\n transition-timing-function: var(--pharos-easing-out);\n}\n\n.button:focus-visible {\n outline: none;\n /* Two-stop box-shadow mimics the Tailwind `ring-offset-2 ring-2` pattern:\n * an inner halo in the surface color separates the ring from the button\n * fill, and the outer color is the per-intent focus accent. */\n box-shadow:\n 0 0 0 2px var(--pharos-color-base-white),\n 0 0 0 4px var(--button-focus-ring, var(--pharos-color-primary-600));\n}\n\n.button:disabled {\n pointer-events: none;\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* === Intents === */\n\n.primary {\n background-color: var(--pharos-color-neutral-900);\n color: var(--pharos-color-base-white);\n --button-focus-ring: var(--pharos-color-primary-600);\n}\n\n.primary:hover {\n background-color: var(--pharos-color-neutral-700);\n}\n\n.primary:active {\n background-color: var(--pharos-color-neutral-950);\n}\n\n.secondary {\n background-color: var(--pharos-color-base-white);\n color: var(--pharos-color-neutral-900);\n /* `neutral-500` clears WCAG 1.4.11 (Non-text Contrast, 3:1 against the\n * surrounding surface). See Input.module.css for the full rationale and\n * the cross-DS comparison; Button secondary, Input and Badge outline\n * share the same border tone so the system has one accessible boundary\n * intensity across primitives. */\n border: 1px solid var(--pharos-color-neutral-500);\n --button-focus-ring: var(--pharos-color-primary-600);\n}\n\n.secondary:hover {\n background-color: var(--pharos-color-neutral-50);\n}\n\n.secondary:active {\n background-color: var(--pharos-color-neutral-100);\n}\n\n.ghost {\n background-color: transparent;\n color: var(--pharos-color-neutral-900);\n --button-focus-ring: var(--pharos-color-primary-600);\n}\n\n.ghost:hover {\n background-color: var(--pharos-color-neutral-100);\n}\n\n.ghost:active {\n background-color: var(--pharos-color-neutral-200);\n}\n\n.destructive {\n background-color: var(--pharos-color-semantic-error-fg);\n color: var(--pharos-color-semantic-error-on);\n --button-focus-ring: var(--pharos-color-semantic-error-fg);\n}\n\n.destructive:hover {\n background-color: var(--pharos-color-semantic-error-fg-hover);\n}\n\n.destructive:active {\n background-color: var(--pharos-color-semantic-error-fg-active);\n}\n\n/* === Sizes ===\n *\n * Heights and paddings are derived from `--pharos-spacing-*` so a runtime\n * override of the spacing scale rescales the whole control proportionally.\n * Font sizes use `--pharos-font-size-*` tokens; the line-height ratios match\n * the Tailwind v4 defaults that shipped in 0.2.x so visual fidelity is\n * preserved across the migration. */\n\n.sizeSm {\n height: var(--pharos-spacing-8);\n gap: var(--pharos-spacing-1-5);\n padding: 0 var(--pharos-spacing-3);\n font-size: var(--pharos-font-size-sm);\n line-height: calc(1.25 / 0.875);\n}\n\n.sizeMd {\n height: var(--pharos-spacing-10);\n gap: var(--pharos-spacing-2);\n padding: 0 var(--pharos-spacing-4);\n font-size: var(--pharos-font-size-sm);\n line-height: calc(1.25 / 0.875);\n}\n\n.sizeLg {\n height: var(--pharos-spacing-12);\n gap: var(--pharos-spacing-2);\n padding: 0 var(--pharos-spacing-6);\n font-size: var(--pharos-font-size-base);\n line-height: 1.5;\n}\n","import { useRender } from '@base-ui/react/use-render';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/cn';\nimport styles from './Button.module.css';\n\n/**\n * Maps the two public variant axes (`intent`, `size`) to the per-class names\n * inside `Button.module.css`. CVA stays as the typed-variants mechanism\n * (Decision D9 keeps the authoring DX) but each value points at a hashed\n * CSS Modules class instead of a Tailwind utility string. The base class\n * carries layout, typography and the focus-visible ring — every variant\n * stacks on top of it.\n */\nconst buttonVariants = cva(styles.button, {\n variants: {\n intent: {\n // `primary` is the most emphasized CTA. It renders in neutral-900,\n // matching Alexandria's `NewButton variant=\"filled\" tone=\"default\"`\n // and the Linear/Vercel/Notion convention of \"brand color as accent,\n // dark neutral as primary action\". The blue `primary-*` palette is\n // reserved for brand accents (focus rings, highlights, badges) —\n // not for the default filled button.\n primary: styles.primary,\n secondary: styles.secondary,\n ghost: styles.ghost,\n destructive: styles.destructive,\n },\n size: {\n sm: styles.sizeSm,\n md: styles.sizeMd,\n lg: styles.sizeLg,\n },\n },\n defaultVariants: {\n intent: 'primary',\n size: 'md',\n },\n});\n\ntype ButtonVariantProps = VariantProps<typeof buttonVariants>;\n\n/**\n * Props accepted by `<Button>`. Extends Base UI's `useRender.ComponentProps<'button'>`,\n * which means the component accepts every native `<button>` attribute plus the\n * `render` prop for composition:\n *\n * ```tsx\n * // Render as a router link (inherits all Button styles and behavior):\n * <Button render={<Link to=\"/dashboard\" />}>Dashboard</Button>\n * // Or as a function receiving props + state:\n * <Button render={(props) => <a {...props} href=\"/x\" />}>External</Button>\n * ```\n */\nexport interface ButtonProps extends useRender.ComponentProps<'button'>, ButtonVariantProps {}\n\nexport function Button({\n render,\n className,\n intent,\n size,\n type = 'button',\n ref,\n ...rest\n}: ButtonProps) {\n const resolvedIntent = intent ?? 'primary';\n const resolvedSize = size ?? 'md';\n return useRender({\n render: render ?? <button />,\n ref,\n defaultTagName: 'button',\n props: {\n type,\n // `data-pharos-intent` / `data-pharos-size` are stable hooks for\n // selectors and tests. They mirror the CSS Modules class but stay\n // semantic — consumer queries do not need to know the hashed class\n // name and tests do not need to import the module to assert variant.\n 'data-pharos-intent': resolvedIntent,\n 'data-pharos-size': resolvedSize,\n className: cn(buttonVariants({ intent: resolvedIntent, size: resolvedSize }), className),\n ...rest,\n },\n });\n}\n\nButton.displayName = 'Button';\n\nexport { buttonVariants };\n","/* Base layout. Same across every variant — only surface, label and border\n * change. Inline-flex so a child SVG (rendered by the consumer as plain\n * children) sits on the same baseline as the label. The font-relative SVG\n * sizing rule mirrors shadcn's `[&>svg]:size-3` utility. */\n.badge {\n display: inline-flex;\n align-items: center;\n gap: var(--pharos-spacing-1);\n padding: 0 var(--pharos-spacing-2);\n height: var(--pharos-spacing-5);\n border: 1px solid transparent;\n border-radius: var(--pharos-radius-full);\n font-family: var(--pharos-font-family-sans);\n font-size: var(--pharos-font-size-xs);\n font-weight: var(--pharos-font-weight-medium);\n line-height: 1;\n white-space: nowrap;\n width: fit-content;\n text-box-trim: trim-both;\n text-box-edge: cap alphabetic;\n}\n\n.badge > svg {\n width: 0.75em;\n height: 0.75em;\n flex: 0 0 auto;\n pointer-events: none;\n}\n\n.default {\n background: var(--pharos-color-neutral-900);\n color: var(--pharos-color-base-white);\n}\n\n.secondary {\n background: var(--pharos-color-neutral-100);\n color: var(--pharos-color-neutral-900);\n}\n\n.destructive {\n background: var(--pharos-color-semantic-error-fg);\n color: var(--pharos-color-semantic-error-on);\n}\n\n.outline {\n background: transparent;\n color: var(--pharos-color-neutral-900);\n /* `neutral-500` clears WCAG 1.4.11 (Non-text Contrast, 3:1 against the\n * surrounding surface) and matches the resting border of Input and\n * Button secondary so the system has one accessible boundary intensity\n * across primitives. See `Input.module.css` for the cross-DS rationale. */\n border-color: var(--pharos-color-neutral-500);\n}\n\n.success {\n background: var(--pharos-color-semantic-success-fg);\n color: var(--pharos-color-semantic-success-on);\n}\n\n.warning {\n background: var(--pharos-color-semantic-warning-fg);\n color: var(--pharos-color-semantic-warning-on);\n}\n\n.info {\n background: var(--pharos-color-semantic-info-fg);\n color: var(--pharos-color-semantic-info-on);\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/cn';\nimport styles from './Badge.module.css';\n\n/**\n * Maps the `variant` axis to per-class names inside `Badge.module.css`.\n * The variant set follows shadcn/ui — `default`, `secondary`, `destructive`,\n * `outline` — extended with the semantic tones every modern DS exposes\n * (`success`, `warning`, `info`). Naming stays asymmetric on purpose:\n * `destructive` is the canonical shadcn name for \"negative tone\" and we\n * keep it instead of renaming it to `error`, so consumers familiar with\n * shadcn pick the right value without re-learning the API.\n */\nconst badgeVariants = cva(styles.badge, {\n variants: {\n variant: {\n default: styles.default,\n secondary: styles.secondary,\n destructive: styles.destructive,\n outline: styles.outline,\n success: styles.success,\n warning: styles.warning,\n info: styles.info,\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\ntype BadgeVariantProps = VariantProps<typeof badgeVariants>;\n\nexport interface BadgeProps extends ComponentPropsWithoutRef<'span'>, BadgeVariantProps {}\n\nexport function Badge({ variant, className, ...rest }: BadgeProps) {\n const resolvedVariant = variant ?? 'default';\n return (\n <span\n data-pharos-variant={resolvedVariant}\n className={cn(badgeVariants({ variant: resolvedVariant }), className)}\n {...rest}\n />\n );\n}\n\nBadge.displayName = 'Badge';\n\nexport { badgeVariants };\n","/* Input.module.css\n *\n * Per-component CSS Modules definition (Decision D9). The build emits hashed\n * class names (`Input_input__xxxx`) into `dist/styles.css`; the runtime JS\n * references them through the `styles` object imported by Input.tsx.\n *\n * Every visual value comes from a `--pharos-*` token. No hex, no Tailwind,\n * no preflight. Hover / focus-visible / invalid / disabled states are\n * authored with native CSS pseudo-classes and the `[aria-invalid=\"true\"]`\n * attribute selector — the component does not own any \"error mode\" state\n * itself; it reflects what the consumer puts on the DOM.\n */\n\n.input {\n /* Strip the user-agent input chrome (gradient backgrounds, internal\n * padding, rounded corners on macOS, the right-edge spinner on number).\n * With preflight gone from the consumer, this is the only line that\n * normalizes the rendering across browsers. */\n appearance: none;\n -webkit-appearance: none;\n\n /* === Box model === */\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n /* `neutral-500` lands the resting border at ~5.4:1 contrast against a\n * white surface, clearing WCAG 1.4.11 (Non-text Contrast, 3:1 for UI\n * component boundaries). The shadcn / Radix Themes / Mantine default\n * sits around oklch 92% (~1.3:1) and fails the requirement; Pharos\n * deliberately diverges to comply. Carbon `border-strong-01` (#8d8d8d)\n * and Adobe Spectrum's outline tone are at the same intensity. */\n border: 1px solid var(--pharos-color-neutral-500);\n border-radius: var(--pharos-radius-md);\n background-color: var(--pharos-color-base-white);\n color: var(--pharos-color-neutral-900);\n\n /* === Typography ===\n * `font-family` and weight are explicit so the input does not inherit a\n * system-ui fallback when it lives inside surfaces that haven't set the\n * Pharos sans stack (e.g. inside a `<dialog>` rendered to the top layer).\n * The size variants below override `font-size` and the `padding-inline`. */\n font-family: var(--pharos-font-family-sans);\n font-size: var(--pharos-font-size-sm);\n font-weight: var(--pharos-font-weight-regular);\n line-height: 1.25;\n\n /* === Transitions === */\n transition-property: border-color, box-shadow;\n transition-duration: var(--pharos-duration-normal);\n transition-timing-function: var(--pharos-easing-out);\n}\n\n.input::placeholder {\n color: var(--pharos-color-neutral-500);\n /* Some Linux/Chromium builds dim placeholders to ~54% by default; the\n * explicit `opacity: 1` keeps the rendered tone equal to the token. */\n opacity: 1;\n}\n\n.input:focus-visible {\n outline: none;\n border-color: var(--pharos-color-primary-600);\n /* Two-stop box-shadow mirrors the Button focus ring: an inner halo in the\n * surface color separates the ring from the input fill, and the outer\n * stop is the brand accent. Same tokens as Button so the system has a\n * single focus look. */\n box-shadow:\n 0 0 0 2px var(--pharos-color-base-white),\n 0 0 0 4px var(--pharos-color-primary-600);\n}\n\n.input:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.input[aria-invalid='true'] {\n border-color: var(--pharos-color-semantic-error-fg);\n}\n\n.input[aria-invalid='true']:focus-visible {\n border-color: var(--pharos-color-semantic-error-fg);\n box-shadow:\n 0 0 0 2px var(--pharos-color-base-white),\n 0 0 0 4px var(--pharos-color-semantic-error-fg);\n}\n\n/* === Sizes ===\n *\n * Heights match the Button grid exactly — the system has one vertical\n * rhythm across pressable controls and form fields, so an `<Input size>`\n * sits flush next to a `<Button size>` on the same row. Horizontal padding\n * follows the same scale Button uses; font-size hops to `base` (16px) at\n * `lg` because larger controls usually pair with prominent layouts where\n * the body 14px starts to feel undersized. */\n\n.sizeSm {\n height: var(--pharos-spacing-8);\n padding: 0 var(--pharos-spacing-3);\n font-size: var(--pharos-font-size-sm);\n}\n\n.sizeMd {\n height: var(--pharos-spacing-10);\n padding: 0 var(--pharos-spacing-4);\n font-size: var(--pharos-font-size-sm);\n}\n\n.sizeLg {\n height: var(--pharos-spacing-12);\n padding: 0 var(--pharos-spacing-6);\n font-size: var(--pharos-font-size-base);\n}\n","import type { ComponentProps } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/cn';\nimport styles from './Input.module.css';\n\n/**\n * Maps the `size` axis to per-class names inside `Input.module.css`. Input\n * has no `variant` axis on purpose — shadcn's primitive contract is a single\n * styled `<input>` and the design-system best practice for form controls is\n * one chrome with explicit error / disabled / readonly states. Composition\n * around the input (label, helper, error message) belongs to a future\n * `<Field>` molecule, not to this atom (Escuela 1 from the field-pattern\n * decision, 2026-04-27).\n */\nconst inputVariants = cva(styles.input, {\n variants: {\n size: {\n sm: styles.sizeSm,\n md: styles.sizeMd,\n lg: styles.sizeLg,\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\ntype InputVariantProps = VariantProps<typeof inputVariants>;\n\n/**\n * Props accepted by `<Input>`. Extends every native `<input>` attribute\n * except `size` — the native `size` attribute is a number (visible width\n * in characters) that is rarely used in modern apps where width comes from\n * CSS, so the slot is reused for the typed Pharos size axis. Consumers that\n * truly need the HTML attribute can set it through `style.width` or via a\n * dedicated `htmlSize` prop if we expose one later.\n *\n * Error state is conveyed through the standard `aria-invalid` attribute,\n * not a custom `error` prop. The CSS reacts to `[aria-invalid=\"true\"]`,\n * matching shadcn / Base UI / Mantine. The actual error message is rendered\n * by the consumer next to the input (or by the future `<Field>` molecule).\n */\nexport interface InputProps extends Omit<ComponentProps<'input'>, 'size'>, InputVariantProps {}\n\nexport function Input({ size, className, type = 'text', ref, ...rest }: InputProps) {\n const resolvedSize = size ?? 'md';\n return (\n <input\n ref={ref}\n type={type}\n data-pharos-size={resolvedSize}\n className={cn(inputVariants({ size: resolvedSize }), className)}\n {...rest}\n />\n );\n}\n\nInput.displayName = 'Input';\n\nexport { inputVariants };\n","/* Textarea.module.css\n *\n * Per-component CSS Modules definition (Decision D9). The build emits hashed\n * class names (`Textarea_textarea__xxxx`) into `dist/styles.css`; the runtime\n * JS references them through the `styles` object imported by Textarea.tsx.\n *\n * Every visual value comes from a `--pharos-*` token. No hex, no Tailwind,\n * no preflight. Hover / focus-visible / invalid / disabled states are\n * authored with native CSS pseudo-classes and the `[aria-invalid=\"true\"]`\n * attribute selector — the component does not own any \"error mode\" state\n * itself; it reflects what the consumer puts on the DOM.\n *\n * The chrome (border, radius, focus ring, invalid ring, disabled opacity)\n * is identical to `Input.module.css` so the two atoms read as siblings of\n * the same form-control family. The two genuine differences are:\n * - `min-height` instead of fixed `height` (textareas grow with content).\n * - `resize: vertical` (state-of-the-art shadcn default; consumer can\n * override via `style.resize` if needed).\n */\n\n.textarea {\n /* Strip the user-agent textarea chrome. With preflight gone from the\n * consumer, this is the only line that normalizes the rendering across\n * browsers. */\n appearance: none;\n -webkit-appearance: none;\n\n /* === Box model === */\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n /* `neutral-500` lands the resting border at ~5.4:1 contrast against a\n * white surface, clearing WCAG 1.4.11 (Non-text Contrast, 3:1 for UI\n * component boundaries). Same tone Input uses; the form-control family\n * shares the resting border. */\n border: 1px solid var(--pharos-color-neutral-500);\n border-radius: var(--pharos-radius-md);\n background-color: var(--pharos-color-base-white);\n color: var(--pharos-color-neutral-900);\n\n /* === Layout ===\n * `resize: vertical` matches shadcn / Mantine / Radix Themes — the user\n * can drag the bottom edge to grow the textarea but cannot stretch it\n * horizontally (which would break form layouts). Consumers can opt out\n * via `style={{ resize: 'none' }}` if needed. */\n resize: vertical;\n\n /* === Typography ===\n * `font-family` and weight are explicit so the textarea does not inherit\n * a system-ui fallback when it lives inside surfaces that haven't set the\n * Pharos sans stack. Line-height 1.5 is more legible than Input's 1.25\n * because users frequently paste multi-line content here. */\n font-family: var(--pharos-font-family-sans);\n font-size: var(--pharos-font-size-sm);\n font-weight: var(--pharos-font-weight-regular);\n line-height: 1.5;\n\n /* === Transitions === */\n transition-property: border-color, box-shadow;\n transition-duration: var(--pharos-duration-normal);\n transition-timing-function: var(--pharos-easing-out);\n}\n\n.textarea::placeholder {\n color: var(--pharos-color-neutral-500);\n opacity: 1;\n}\n\n.textarea:focus-visible {\n outline: none;\n border-color: var(--pharos-color-primary-600);\n /* Two-stop box-shadow mirrors Input + Button focus rings: an inner halo\n * in the surface color separates the ring from the textarea fill, and\n * the outer stop is the brand accent. Same tokens as Input so the\n * system has a single focus look across every form control. */\n box-shadow:\n 0 0 0 2px var(--pharos-color-base-white),\n 0 0 0 4px var(--pharos-color-primary-600);\n}\n\n.textarea:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n /* Dragging the resize handle on a disabled control is jarring; mirror\n * `cursor: not-allowed` by removing the affordance entirely. */\n resize: none;\n}\n\n.textarea[aria-invalid='true'] {\n border-color: var(--pharos-color-semantic-error-fg);\n}\n\n.textarea[aria-invalid='true']:focus-visible {\n border-color: var(--pharos-color-semantic-error-fg);\n box-shadow:\n 0 0 0 2px var(--pharos-color-base-white),\n 0 0 0 4px var(--pharos-color-semantic-error-fg);\n}\n\n/* === Sizes ===\n *\n * Inline padding matches Input exactly so a textarea sits flush next to an\n * input of the same size (no horizontal jog when stacked). Vertical padding\n * is set explicitly because textareas don't have the fixed-height that lets\n * Input use vertical centring. `min-height` is sized to ~3-4 lines of body\n * text at the corresponding font-size; `resize: vertical` lets the user\n * grow it past that.\n *\n * Font-size hops to `base` (16px) at `lg` for the same reason Input does:\n * larger controls usually pair with prominent layouts where 14px feels\n * undersized. */\n\n.sizeSm {\n min-height: var(--pharos-spacing-16);\n padding: var(--pharos-spacing-2) var(--pharos-spacing-3);\n font-size: var(--pharos-font-size-sm);\n}\n\n.sizeMd {\n min-height: var(--pharos-spacing-20);\n padding: var(--pharos-spacing-2-5) var(--pharos-spacing-4);\n font-size: var(--pharos-font-size-sm);\n}\n\n.sizeLg {\n min-height: var(--pharos-spacing-24);\n padding: var(--pharos-spacing-3) var(--pharos-spacing-6);\n font-size: var(--pharos-font-size-base);\n}\n","import type { ComponentProps } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/cn';\nimport styles from './Textarea.module.css';\n\n/**\n * Maps the `size` axis to per-class names inside `Textarea.module.css`. Like\n * `Input`, `Textarea` has no `variant` axis on purpose — shadcn's primitive\n * contract is a single styled `<textarea>` and the design-system best\n * practice for form controls is one chrome with explicit error / disabled /\n * readonly states. Composition around the textarea (label, helper, error\n * message) belongs to the future `<Field>` molecule, not to this atom\n * (Escuela 1 from the field-pattern decision, 2026-04-27).\n *\n * The three sizes share the resting visual contract with `<Input size>` so\n * a textarea sits flush next to inputs of the same size in a form: identical\n * inline padding, identical resting border tone (`neutral-500`), identical\n * font-size hop at `lg`, identical focus ring. The vertical dimension is\n * `min-height` instead of a fixed `height` because textareas grow with\n * content and the user can drag them taller (`resize: vertical`).\n */\nconst textareaVariants = cva(styles.textarea, {\n variants: {\n size: {\n sm: styles.sizeSm,\n md: styles.sizeMd,\n lg: styles.sizeLg,\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\ntype TextareaVariantProps = VariantProps<typeof textareaVariants>;\n\n/**\n * Props accepted by `<Textarea>`. Extends every native `<textarea>`\n * attribute. Unlike `<Input>`, no native attribute is shadowed — the native\n * `<textarea>` does not have a `size` attribute, so the typed Pharos size\n * axis takes the slot without collision.\n *\n * Error state is conveyed through the standard `aria-invalid` attribute,\n * not a custom `error` prop. The CSS reacts to `[aria-invalid=\"true\"]`,\n * matching shadcn / Base UI / Mantine. The actual error message is rendered\n * by the consumer next to the textarea (or by the future `<Field>` molecule).\n */\nexport interface TextareaProps extends ComponentProps<'textarea'>, TextareaVariantProps {}\n\nexport function Textarea({ size, className, ref, ...rest }: TextareaProps) {\n const resolvedSize = size ?? 'md';\n return (\n <textarea\n ref={ref}\n data-pharos-size={resolvedSize}\n className={cn(textareaVariants({ size: resolvedSize }), className)}\n {...rest}\n />\n );\n}\n\nTextarea.displayName = 'Textarea';\n\nexport { textareaVariants };\n","/* Separator.module.css\n *\n * Per-component CSS Modules definition (Decision D9). Hashed into\n * `dist/styles.css` like the rest of pharos-react. The token of the\n * border colour comes from D12 (subtle borders for non-interactive\n * surfaces): a Separator is decorative or semantic but never an\n * interactive control, so WCAG 1.4.11 (3:1) does not apply and the\n * resting tone stays at `neutral-200` — same intensity Carbon\n * `border-subtle`, Adobe Spectrum gray-200 and Polaris use for\n * dividers.\n */\n\n.separator {\n /* `flex-shrink: 0` keeps a vertical Separator at 1px wide inside flex\n * rows that would otherwise compress it to zero. shadcn does the same\n * via the Tailwind `shrink-0` utility; we hard-code it because every\n * Separator wants this behaviour and there is no axis where dropping\n * it would be useful. */\n flex-shrink: 0;\n background-color: var(--pharos-color-neutral-200);\n /* Reset any user-agent margin (notably the default `<hr>` margin) when\n * the Separator is rendered as a `<div>`. A consumer that wants\n * spacing controls it from the outside via flex / margin / padding,\n * not via implicit user-agent rules. */\n margin: 0;\n border: 0;\n}\n\n.horizontal {\n width: 100%;\n height: 1px;\n}\n\n.vertical {\n height: 100%;\n width: 1px;\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '../lib/cn';\nimport styles from './Separator.module.css';\n\n/**\n * Visual or semantic divider between two regions. Renders a thin line in\n * either orientation. Two contracts coexist behind the same component:\n *\n * - **Decorative** (default, `decorative={true}`) — the line is purely\n * visual chrome. Marked `role=\"none\"` so assistive tech ignores it,\n * the same way shadcn / Radix Separator do.\n * - **Semantic** (`decorative={false}`) — the line announces a logical\n * partition (e.g. between groups in a menu). Marked `role=\"separator\"`\n * and, for vertical separators, `aria-orientation=\"vertical\"` per the\n * ARIA APG (the spec defaults `aria-orientation` to \"horizontal\" for\n * role=separator, so we emit the attribute only when it differs).\n *\n * The resting border tone is `--pharos-color-neutral-200` (Decision D12:\n * subtle borders for non-interactive surfaces). WCAG 1.4.11 does not\n * apply to decorative separators or to the boundaries of non-interactive\n * containers; the system reserves the stronger `neutral-500` tone for\n * interactive controls (Input, Button secondary, Badge outline — D10).\n */\nexport interface SeparatorProps extends ComponentPropsWithoutRef<'div'> {\n orientation?: 'horizontal' | 'vertical';\n decorative?: boolean;\n}\n\nexport function Separator({\n orientation = 'horizontal',\n decorative = true,\n className,\n ...rest\n}: SeparatorProps) {\n return (\n <div\n role={decorative ? 'none' : 'separator'}\n aria-orientation={!decorative && orientation === 'vertical' ? 'vertical' : undefined}\n data-pharos-orientation={orientation}\n className={cn(styles.separator, styles[orientation], className)}\n {...rest}\n />\n );\n}\n\nSeparator.displayName = 'Separator';\n","/* Card.module.css\n *\n * Per-component CSS Modules definition (Decision D9). Hashed into\n * `dist/styles.css`. The variant tones land on the border-intensity\n * hierarchy from D12: `default` and `elevated` carry the subtle tier,\n * `outlined` carries the emphasised tier. None of them reach the\n * strong tier reserved for interactive controls.\n */\n\n.card {\n /* === Surface === */\n background-color: var(--pharos-color-base-white);\n border-radius: var(--pharos-radius-2xl);\n /* Default to no border / no shadow at the base level — variants opt\n * into one or the other. Keeping the base neutral means a consumer\n * that overrides via `className` does not have to fight defaults. */\n border: 0 solid transparent;\n\n /* === Layout ===\n * Cards default to vertical stacking of their slots (Header / Content /\n * Footer). The slots themselves carry their own padding so the Card\n * never imposes a global padding that would conflict with full-bleed\n * media headers. */\n display: flex;\n flex-direction: column;\n gap: var(--pharos-spacing-6);\n\n /* === Typography ===\n * Set the body baseline for the card so `<CardTitle>` and\n * `<CardDescription>` can size relatively if a future caller wants. */\n font-family: var(--pharos-font-family-sans);\n color: var(--pharos-color-neutral-900);\n\n /* === Transitions === */\n transition-property: border-color, box-shadow;\n transition-duration: var(--pharos-duration-normal);\n transition-timing-function: var(--pharos-easing-out);\n}\n\n/* === Variants === */\n\n.default {\n border: 1px solid var(--pharos-color-neutral-200);\n}\n\n.elevated {\n border: 0 solid transparent;\n box-shadow: var(--pharos-shadow-md);\n}\n\n.outlined {\n border: 1px solid var(--pharos-color-neutral-300);\n}\n\n/* === Slots ===\n *\n * Every slot is a styled `<div>` (CardTitle stays a `<div>` like shadcn,\n * so the consumer picks the semantic heading level). Padding is consistent\n * across the three slots — the consumer composes them inside `<Card>`\n * without thinking about layout details. */\n\n.header {\n display: flex;\n flex-direction: column;\n gap: var(--pharos-spacing-1-5);\n padding: var(--pharos-spacing-6) var(--pharos-spacing-6) 0;\n}\n\n.title {\n margin: 0;\n font-size: var(--pharos-font-size-base);\n font-weight: var(--pharos-font-weight-semibold);\n line-height: 1.25;\n color: var(--pharos-color-neutral-900);\n}\n\n.description {\n margin: 0;\n font-size: var(--pharos-font-size-sm);\n font-weight: var(--pharos-font-weight-regular);\n line-height: 1.5;\n color: var(--pharos-color-neutral-500);\n}\n\n.content {\n /* Header padding-top + Footer padding-bottom already provide the\n * vertical breathing room. Content itself only carries inline padding;\n * its vertical rhythm comes from the parent `gap`. When the card has\n * no Header/Footer, Content's lack of vertical padding means the card\n * is content-only with the card-level `gap` collapsing to zero — the\n * consumer applies their own padding via `style` or `className`. */\n padding: 0 var(--pharos-spacing-6);\n}\n\n.footer {\n display: flex;\n align-items: center;\n gap: var(--pharos-spacing-3);\n padding: 0 var(--pharos-spacing-6) var(--pharos-spacing-6);\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/cn';\nimport styles from './Card.module.css';\n\n/**\n * Container surface for grouped content. Three variants on the\n * border-intensity hierarchy (Decision D12):\n *\n * - `default` (subtle border, no shadow) — the most common card. Sits\n * on the same `neutral-200` tone as `Separator`, so panels and\n * dividers harmonise visually.\n * - `elevated` (no border, soft shadow) — for surfaces that should lift\n * off the canvas (modals' inner cards, important callouts).\n * - `outlined` (deliberately stronger border, no shadow) — emphasised\n * container. Sits on `neutral-300`, between subtle non-interactive\n * tone and the strong interactive tone reserved for controls.\n *\n * Sub-components (`CardHeader`, `CardTitle`, `CardDescription`,\n * `CardContent`, `CardFooter`) are slot primitives, not separate atoms\n * — same pattern shadcn uses. They are exported individually so the\n * consumer composes the structure they need; an empty Card with no\n * slots is equally valid.\n */\nconst cardVariants = cva(styles.card, {\n variants: {\n variant: {\n default: styles.default,\n elevated: styles.elevated,\n outlined: styles.outlined,\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\ntype CardVariantProps = VariantProps<typeof cardVariants>;\n\nexport interface CardProps extends ComponentPropsWithoutRef<'div'>, CardVariantProps {}\n\nexport function Card({ variant, className, ...rest }: CardProps) {\n const resolvedVariant = variant ?? 'default';\n return (\n <div\n data-pharos-variant={resolvedVariant}\n className={cn(cardVariants({ variant: resolvedVariant }), className)}\n {...rest}\n />\n );\n}\n\nCard.displayName = 'Card';\n\nexport interface CardHeaderProps extends ComponentPropsWithoutRef<'div'> {}\n\nexport function CardHeader({ className, ...rest }: CardHeaderProps) {\n return <div data-pharos-slot=\"card-header\" className={cn(styles.header, className)} {...rest} />;\n}\n\nCardHeader.displayName = 'CardHeader';\n\nexport interface CardTitleProps extends ComponentPropsWithoutRef<'div'> {}\n\nexport function CardTitle({ className, ...rest }: CardTitleProps) {\n // Renders as a `<div>` so the consumer picks the semantic heading\n // level (`<h2>`, `<h3>`, etc.) by wrapping or by using the native\n // `role` and `aria-level` attributes if needed. Same default as\n // shadcn's CardTitle — atoms do not impose document outline.\n return <div data-pharos-slot=\"card-title\" className={cn(styles.title, className)} {...rest} />;\n}\n\nCardTitle.displayName = 'CardTitle';\n\nexport interface CardDescriptionProps extends ComponentPropsWithoutRef<'p'> {}\n\nexport function CardDescription({ className, ...rest }: CardDescriptionProps) {\n return (\n <p\n data-pharos-slot=\"card-description\"\n className={cn(styles.description, className)}\n {...rest}\n />\n );\n}\n\nCardDescription.displayName = 'CardDescription';\n\nexport interface CardContentProps extends ComponentPropsWithoutRef<'div'> {}\n\nexport function CardContent({ className, ...rest }: CardContentProps) {\n return (\n <div data-pharos-slot=\"card-content\" className={cn(styles.content, className)} {...rest} />\n );\n}\n\nCardContent.displayName = 'CardContent';\n\nexport interface CardFooterProps extends ComponentPropsWithoutRef<'div'> {}\n\nexport function CardFooter({ className, ...rest }: CardFooterProps) {\n return <div data-pharos-slot=\"card-footer\" className={cn(styles.footer, className)} {...rest} />;\n}\n\nCardFooter.displayName = 'CardFooter';\n\nexport { cardVariants };\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
package/dist/styles.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
._button_iu0wg_18{appearance:none;box-sizing:border-box;border-radius:var(--pharos-radius-full);white-space:nowrap;text-box-trim:trim-both;text-box-edge:cap alphabetic;font-family:var(--pharos-font-family-sans);font-style:normal;font-weight:var(--pharos-font-weight-medium);font-variant:normal;font-kerning:auto;font-optical-sizing:auto;font-size-adjust:none;font-feature-settings:normal;font-variation-settings:normal;letter-spacing:normal;text-transform:none;font-stretch:100%;font-size:var(--pharos-font-size-sm);-webkit-user-select:none;user-select:none;cursor:pointer;color:inherit;transition-property:color,background-color,border-color,box-shadow;transition-duration:var(--pharos-duration-normal);transition-timing-function:var(--pharos-easing-out);background-color:#0000;border:0 solid #0000;justify-content:center;align-items:center;margin:0;padding-top:0;padding-bottom:0;line-height:1.5;text-decoration:none;display:inline-flex}._button_iu0wg_18:focus-visible{box-shadow:0 0 0 2px var(--pharos-color-base-white), 0 0 0 4px var(--button-focus-ring,var(--pharos-color-primary-600));outline:none}._button_iu0wg_18:disabled{pointer-events:none;cursor:not-allowed;opacity:.5}._primary_iu0wg_127{background-color:var(--pharos-color-neutral-900);color:var(--pharos-color-base-white);--button-focus-ring:var(--pharos-color-primary-600)}._primary_iu0wg_127:hover{background-color:var(--pharos-color-neutral-700)}._primary_iu0wg_127:active{background-color:var(--pharos-color-neutral-950)}._secondary_iu0wg_141{background-color:var(--pharos-color-base-white);color:var(--pharos-color-neutral-900);border:1px solid var(--pharos-color-neutral-500);--button-focus-ring:var(--pharos-color-primary-600)}._secondary_iu0wg_141:hover{background-color:var(--pharos-color-neutral-50)}._secondary_iu0wg_141:active{background-color:var(--pharos-color-neutral-100)}._ghost_iu0wg_161{color:var(--pharos-color-neutral-900);--button-focus-ring:var(--pharos-color-primary-600);background-color:#0000}._ghost_iu0wg_161:hover{background-color:var(--pharos-color-neutral-100)}._ghost_iu0wg_161:active{background-color:var(--pharos-color-neutral-200)}._destructive_iu0wg_175{background-color:var(--pharos-color-semantic-error-fg);color:var(--pharos-color-semantic-error-on);--button-focus-ring:var(--pharos-color-semantic-error-fg)}._destructive_iu0wg_175:hover{background-color:var(--pharos-color-semantic-error-fg-hover)}._destructive_iu0wg_175:active{background-color:var(--pharos-color-semantic-error-fg-active)}._sizeSm_iu0wg_197{height:var(--pharos-spacing-8);gap:var(--pharos-spacing-1-5);padding:0 var(--pharos-spacing-3);font-size:var(--pharos-font-size-sm);line-height:1.42857}._sizeMd_iu0wg_205{height:var(--pharos-spacing-10);gap:var(--pharos-spacing-2);padding:0 var(--pharos-spacing-4);font-size:var(--pharos-font-size-sm);line-height:1.42857}._sizeLg_iu0wg_213{height:var(--pharos-spacing-12);gap:var(--pharos-spacing-2);padding:0 var(--pharos-spacing-6);font-size:var(--pharos-font-size-base);line-height:1.5}._badge_zrawy_5{align-items:center;gap:var(--pharos-spacing-1);padding:0 var(--pharos-spacing-2);height:var(--pharos-spacing-5);border-radius:var(--pharos-radius-full);font-family:var(--pharos-font-family-sans);font-size:var(--pharos-font-size-xs);font-weight:var(--pharos-font-weight-medium);white-space:nowrap;text-box-trim:trim-both;text-box-edge:cap alphabetic;border:1px solid #0000;width:fit-content;line-height:1;display:inline-flex}._badge_zrawy_5>svg{pointer-events:none;flex:none;width:.75em;height:.75em}._default_zrawy_30{background:var(--pharos-color-neutral-900);color:var(--pharos-color-base-white)}._secondary_zrawy_35{background:var(--pharos-color-neutral-100);color:var(--pharos-color-neutral-900)}._destructive_zrawy_40{background:var(--pharos-color-semantic-error-fg);color:var(--pharos-color-semantic-error-on)}._outline_zrawy_45{color:var(--pharos-color-neutral-900);border-color:var(--pharos-color-neutral-500);background:0 0}._success_zrawy_55{background:var(--pharos-color-semantic-success-fg);color:var(--pharos-color-semantic-success-on)}._warning_zrawy_60{background:var(--pharos-color-semantic-warning-fg);color:var(--pharos-color-semantic-warning-on)}._info_zrawy_65{background:var(--pharos-color-semantic-info-fg);color:var(--pharos-color-semantic-info-on)}._input_11emo_14{appearance:none;box-sizing:border-box;border:1px solid var(--pharos-color-neutral-500);border-radius:var(--pharos-radius-md);background-color:var(--pharos-color-base-white);width:100%;color:var(--pharos-color-neutral-900);font-family:var(--pharos-font-family-sans);font-size:var(--pharos-font-size-sm);font-weight:var(--pharos-font-weight-regular);transition-property:border-color,box-shadow;transition-duration:var(--pharos-duration-normal);transition-timing-function:var(--pharos-easing-out);margin:0;line-height:1.25}._input_11emo_14::placeholder{color:var(--pharos-color-neutral-500);opacity:1}._input_11emo_14:focus-visible{border-color:var(--pharos-color-primary-600);box-shadow:0 0 0 2px var(--pharos-color-base-white), 0 0 0 4px var(--pharos-color-primary-600);outline:none}._input_11emo_14:disabled{cursor:not-allowed;opacity:.5}._input_11emo_14[aria-invalid=true]{border-color:var(--pharos-color-semantic-error-fg)}._input_11emo_14[aria-invalid=true]:focus-visible{border-color:var(--pharos-color-semantic-error-fg);box-shadow:0 0 0 2px var(--pharos-color-base-white), 0 0 0 4px var(--pharos-color-semantic-error-fg)}._sizeSm_11emo_97{height:var(--pharos-spacing-8);padding:0 var(--pharos-spacing-3);font-size:var(--pharos-font-size-sm)}._sizeMd_11emo_103{height:var(--pharos-spacing-10);padding:0 var(--pharos-spacing-4);font-size:var(--pharos-font-size-sm)}._sizeLg_11emo_109{height:var(--pharos-spacing-12);padding:0 var(--pharos-spacing-6);font-size:var(--pharos-font-size-base)}
|
|
1
|
+
._button_iu0wg_18{appearance:none;box-sizing:border-box;border-radius:var(--pharos-radius-full);white-space:nowrap;text-box-trim:trim-both;text-box-edge:cap alphabetic;font-family:var(--pharos-font-family-sans);font-style:normal;font-weight:var(--pharos-font-weight-medium);font-variant:normal;font-kerning:auto;font-optical-sizing:auto;font-size-adjust:none;font-feature-settings:normal;font-variation-settings:normal;letter-spacing:normal;text-transform:none;font-stretch:100%;font-size:var(--pharos-font-size-sm);-webkit-user-select:none;user-select:none;cursor:pointer;color:inherit;transition-property:color,background-color,border-color,box-shadow;transition-duration:var(--pharos-duration-normal);transition-timing-function:var(--pharos-easing-out);background-color:#0000;border:0 solid #0000;justify-content:center;align-items:center;margin:0;padding-top:0;padding-bottom:0;line-height:1.5;text-decoration:none;display:inline-flex}._button_iu0wg_18:focus-visible{box-shadow:0 0 0 2px var(--pharos-color-base-white), 0 0 0 4px var(--button-focus-ring,var(--pharos-color-primary-600));outline:none}._button_iu0wg_18:disabled{pointer-events:none;cursor:not-allowed;opacity:.5}._primary_iu0wg_127{background-color:var(--pharos-color-neutral-900);color:var(--pharos-color-base-white);--button-focus-ring:var(--pharos-color-primary-600)}._primary_iu0wg_127:hover{background-color:var(--pharos-color-neutral-700)}._primary_iu0wg_127:active{background-color:var(--pharos-color-neutral-950)}._secondary_iu0wg_141{background-color:var(--pharos-color-base-white);color:var(--pharos-color-neutral-900);border:1px solid var(--pharos-color-neutral-500);--button-focus-ring:var(--pharos-color-primary-600)}._secondary_iu0wg_141:hover{background-color:var(--pharos-color-neutral-50)}._secondary_iu0wg_141:active{background-color:var(--pharos-color-neutral-100)}._ghost_iu0wg_161{color:var(--pharos-color-neutral-900);--button-focus-ring:var(--pharos-color-primary-600);background-color:#0000}._ghost_iu0wg_161:hover{background-color:var(--pharos-color-neutral-100)}._ghost_iu0wg_161:active{background-color:var(--pharos-color-neutral-200)}._destructive_iu0wg_175{background-color:var(--pharos-color-semantic-error-fg);color:var(--pharos-color-semantic-error-on);--button-focus-ring:var(--pharos-color-semantic-error-fg)}._destructive_iu0wg_175:hover{background-color:var(--pharos-color-semantic-error-fg-hover)}._destructive_iu0wg_175:active{background-color:var(--pharos-color-semantic-error-fg-active)}._sizeSm_iu0wg_197{height:var(--pharos-spacing-8);gap:var(--pharos-spacing-1-5);padding:0 var(--pharos-spacing-3);font-size:var(--pharos-font-size-sm);line-height:1.42857}._sizeMd_iu0wg_205{height:var(--pharos-spacing-10);gap:var(--pharos-spacing-2);padding:0 var(--pharos-spacing-4);font-size:var(--pharos-font-size-sm);line-height:1.42857}._sizeLg_iu0wg_213{height:var(--pharos-spacing-12);gap:var(--pharos-spacing-2);padding:0 var(--pharos-spacing-6);font-size:var(--pharos-font-size-base);line-height:1.5}._badge_zrawy_5{align-items:center;gap:var(--pharos-spacing-1);padding:0 var(--pharos-spacing-2);height:var(--pharos-spacing-5);border-radius:var(--pharos-radius-full);font-family:var(--pharos-font-family-sans);font-size:var(--pharos-font-size-xs);font-weight:var(--pharos-font-weight-medium);white-space:nowrap;text-box-trim:trim-both;text-box-edge:cap alphabetic;border:1px solid #0000;width:fit-content;line-height:1;display:inline-flex}._badge_zrawy_5>svg{pointer-events:none;flex:none;width:.75em;height:.75em}._default_zrawy_30{background:var(--pharos-color-neutral-900);color:var(--pharos-color-base-white)}._secondary_zrawy_35{background:var(--pharos-color-neutral-100);color:var(--pharos-color-neutral-900)}._destructive_zrawy_40{background:var(--pharos-color-semantic-error-fg);color:var(--pharos-color-semantic-error-on)}._outline_zrawy_45{color:var(--pharos-color-neutral-900);border-color:var(--pharos-color-neutral-500);background:0 0}._success_zrawy_55{background:var(--pharos-color-semantic-success-fg);color:var(--pharos-color-semantic-success-on)}._warning_zrawy_60{background:var(--pharos-color-semantic-warning-fg);color:var(--pharos-color-semantic-warning-on)}._info_zrawy_65{background:var(--pharos-color-semantic-info-fg);color:var(--pharos-color-semantic-info-on)}._input_11emo_14{appearance:none;box-sizing:border-box;border:1px solid var(--pharos-color-neutral-500);border-radius:var(--pharos-radius-md);background-color:var(--pharos-color-base-white);width:100%;color:var(--pharos-color-neutral-900);font-family:var(--pharos-font-family-sans);font-size:var(--pharos-font-size-sm);font-weight:var(--pharos-font-weight-regular);transition-property:border-color,box-shadow;transition-duration:var(--pharos-duration-normal);transition-timing-function:var(--pharos-easing-out);margin:0;line-height:1.25}._input_11emo_14::placeholder{color:var(--pharos-color-neutral-500);opacity:1}._input_11emo_14:focus-visible{border-color:var(--pharos-color-primary-600);box-shadow:0 0 0 2px var(--pharos-color-base-white), 0 0 0 4px var(--pharos-color-primary-600);outline:none}._input_11emo_14:disabled{cursor:not-allowed;opacity:.5}._input_11emo_14[aria-invalid=true]{border-color:var(--pharos-color-semantic-error-fg)}._input_11emo_14[aria-invalid=true]:focus-visible{border-color:var(--pharos-color-semantic-error-fg);box-shadow:0 0 0 2px var(--pharos-color-base-white), 0 0 0 4px var(--pharos-color-semantic-error-fg)}._sizeSm_11emo_97{height:var(--pharos-spacing-8);padding:0 var(--pharos-spacing-3);font-size:var(--pharos-font-size-sm)}._sizeMd_11emo_103{height:var(--pharos-spacing-10);padding:0 var(--pharos-spacing-4);font-size:var(--pharos-font-size-sm)}._sizeLg_11emo_109{height:var(--pharos-spacing-12);padding:0 var(--pharos-spacing-6);font-size:var(--pharos-font-size-base)}._textarea_1mec8_21{appearance:none;box-sizing:border-box;border:1px solid var(--pharos-color-neutral-500);border-radius:var(--pharos-radius-md);background-color:var(--pharos-color-base-white);width:100%;color:var(--pharos-color-neutral-900);resize:vertical;font-family:var(--pharos-font-family-sans);font-size:var(--pharos-font-size-sm);font-weight:var(--pharos-font-weight-regular);transition-property:border-color,box-shadow;transition-duration:var(--pharos-duration-normal);transition-timing-function:var(--pharos-easing-out);margin:0;line-height:1.5}._textarea_1mec8_21::placeholder{color:var(--pharos-color-neutral-500);opacity:1}._textarea_1mec8_21:focus-visible{border-color:var(--pharos-color-primary-600);box-shadow:0 0 0 2px var(--pharos-color-base-white), 0 0 0 4px var(--pharos-color-primary-600);outline:none}._textarea_1mec8_21:disabled{cursor:not-allowed;opacity:.5;resize:none}._textarea_1mec8_21[aria-invalid=true]{border-color:var(--pharos-color-semantic-error-fg)}._textarea_1mec8_21[aria-invalid=true]:focus-visible{border-color:var(--pharos-color-semantic-error-fg);box-shadow:0 0 0 2px var(--pharos-color-base-white), 0 0 0 4px var(--pharos-color-semantic-error-fg)}._sizeSm_1mec8_113{min-height:var(--pharos-spacing-16);padding:var(--pharos-spacing-2) var(--pharos-spacing-3);font-size:var(--pharos-font-size-sm)}._sizeMd_1mec8_119{min-height:var(--pharos-spacing-20);padding:var(--pharos-spacing-2-5) var(--pharos-spacing-4);font-size:var(--pharos-font-size-sm)}._sizeLg_1mec8_125{min-height:var(--pharos-spacing-24);padding:var(--pharos-spacing-3) var(--pharos-spacing-6);font-size:var(--pharos-font-size-base)}._separator_da90p_13{background-color:var(--pharos-color-neutral-200);border:0;flex-shrink:0;margin:0}._horizontal_da90p_29{width:100%;height:1px}._vertical_da90p_34{width:1px;height:100%}._card_yxgwa_10{background-color:var(--pharos-color-base-white);border-radius:var(--pharos-radius-2xl);gap:var(--pharos-spacing-6);font-family:var(--pharos-font-family-sans);color:var(--pharos-color-neutral-900);transition-property:border-color,box-shadow;transition-duration:var(--pharos-duration-normal);transition-timing-function:var(--pharos-easing-out);border:0 solid #0000;flex-direction:column;display:flex}._default_yxgwa_42{border:1px solid var(--pharos-color-neutral-200)}._elevated_yxgwa_46{box-shadow:var(--pharos-shadow-md);border:0 solid #0000}._outlined_yxgwa_51{border:1px solid var(--pharos-color-neutral-300)}._header_yxgwa_62{gap:var(--pharos-spacing-1-5);padding:var(--pharos-spacing-6) var(--pharos-spacing-6) 0;flex-direction:column;display:flex}._title_yxgwa_69{font-size:var(--pharos-font-size-base);font-weight:var(--pharos-font-weight-semibold);color:var(--pharos-color-neutral-900);margin:0;line-height:1.25}._description_yxgwa_77{font-size:var(--pharos-font-size-sm);font-weight:var(--pharos-font-weight-regular);color:var(--pharos-color-neutral-500);margin:0;line-height:1.5}._content_yxgwa_85{padding:0 var(--pharos-spacing-6)}._footer_yxgwa_95{align-items:center;gap:var(--pharos-spacing-3);padding:0 var(--pharos-spacing-6) var(--pharos-spacing-6);display:flex}
|
|
2
2
|
/*$vite$:1*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-sherpas/pharos-react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "React component library for Code Sherpas. Consumes @code-sherpas/pharos-tokens. Vite library mode + CSS Modules — no Tailwind, no CSS framework required at the consumer.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|