@blakesteve/roster 2.9.4 → 3.0.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/README.md CHANGED
@@ -2,16 +2,16 @@
2
2
 
3
3
  A production-grade atomic component library built with **React 19**, **TypeScript**, **Tailwind CSS v4**, and **Vite**.
4
4
 
5
- Roster ships a curated set of accessible, theme-aware components organized around the Atomic Design methodology — atoms, molecules, and organisms — each with Storybook documentation and full test coverage.
5
+ Roster ships a curated set of accessible, theme-aware components organized around the Atomic Design methodology (atoms, molecules, and organisms), each with Storybook documentation and full test coverage.
6
6
 
7
7
  ## Features
8
8
 
9
- - **Atomic Design** — components organized as atoms, molecules, and organisms
10
- - **TypeScript first** — fully typed props with exported variant types for maximum DX
11
- - **Adaptive dark mode** — class-based toggling (`.dark`) independent of OS preferences
12
- - **`"use client"` pre-bundled** — all outputs include the directive for seamless Next.js App Router integration
13
- - **Accessible** — interactive components powered by [`@headlessui/react`](https://headlessui.com) and [`@radix-ui`](https://radix-ui.com)
14
- - **Tree-shakeable** — import only what you need
9
+ - **Atomic Design**: components organized as atoms, molecules, and organisms
10
+ - **TypeScript first**: fully typed props with exported variant types for maximum DX
11
+ - **Adaptive dark mode**: class-based toggling (`.dark`) independent of OS preferences
12
+ - **`"use client"` pre-bundled**: all outputs include the directive for seamless Next.js App Router integration
13
+ - **Accessible**: interactive components powered by [`@headlessui/react`](https://headlessui.com) and [`@radix-ui`](https://radix-ui.com)
14
+ - **Tree-shakeable**: import only what you need
15
15
 
16
16
  ## Installation
17
17
 
@@ -19,7 +19,7 @@ Roster ships a curated set of accessible, theme-aware components organized aroun
19
19
  npm install @blakesteve/roster
20
20
  ```
21
21
 
22
- Roster ships pre-compiled CSS — you do not need Tailwind installed in your host app to use it.
22
+ Roster ships pre-compiled CSS, so you do not need Tailwind installed in your host app to use it.
23
23
 
24
24
  ### Peer dependencies
25
25
 
@@ -30,12 +30,25 @@ Roster ships pre-compiled CSS — you do not need Tailwind installed in your hos
30
30
  }
31
31
  ```
32
32
 
33
+ `DataTable` additionally needs TanStack Table v9, declared as an **optional**
34
+ peer. Install it only if you use `DataTable`; every other component works
35
+ without it.
36
+
37
+ ```bash
38
+ npm install @tanstack/react-table
39
+ ```
40
+
41
+ It is a peer rather than a bundled dependency because v9 types column
42
+ definitions against the feature set that built the table. Two copies of the
43
+ package would mean two incompatible sets of those types, so roster and your
44
+ app have to resolve the same one.
45
+
33
46
  ## Setup
34
47
 
35
48
  Import Roster's CSS once at the root of your application (`layout.tsx`, `main.tsx`, or `App.tsx`):
36
49
 
37
50
  ```tsx
38
- // Compiled component styles — always required
51
+ // Compiled component styles (always required)
39
52
  import "@blakesteve/roster/style.css";
40
53
 
41
54
  // Default design tokens (color palette, spacing, radius)
@@ -43,6 +56,41 @@ import "@blakesteve/roster/style.css";
43
56
  import "@blakesteve/roster/tokens.css";
44
57
  ```
45
58
 
59
+ ### Import Roster before Tailwind
60
+
61
+ If your app uses Tailwind, import Roster's CSS **before** it:
62
+
63
+ ```css
64
+ /* globals.css */
65
+ @import "@blakesteve/roster/tokens.css";
66
+ @import "@blakesteve/roster/style.css";
67
+ @import "tailwindcss";
68
+ ```
69
+
70
+ Roster ships its styles inside a `roster` cascade layer, and CSS orders layers
71
+ by *first registration*. Importing Roster first places its layer beneath your
72
+ app's own utilities, so your styles always win. Import it second and the
73
+ opposite happens: Roster's `.block` starts beating your `dark:hidden`, and
74
+ variants fail silently with the rule present in the stylesheet.
75
+
76
+ ### The global reset is opt-in
77
+
78
+ Roster ships **no** preflight. A component library has no business resetting
79
+ its host's document, so importing Roster will not change your headings, lists,
80
+ or box sizing.
81
+
82
+ Roster's components do assume that normalization exists, though. If your app
83
+ runs Tailwind, you already have it and there is nothing to do. If it does not,
84
+ opt in, before the component styles:
85
+
86
+ ```tsx
87
+ import "@blakesteve/roster/preflight.css";
88
+ import "@blakesteve/roster/style.css";
89
+ ```
90
+
91
+ Skip it and components render against browser defaults: serif type, bulleted
92
+ lists, and `content-box` sizing.
93
+
46
94
  ## Quick start
47
95
 
48
96
  ```tsx
@@ -75,27 +123,30 @@ function App() {
75
123
  |---|---|
76
124
  | `Avatar` | User avatar with image, initials fallback, and optional popover |
77
125
  | `Badge` | Status label with semantic color schemes and fill variants |
78
- | `Button` | Primary interactive element — solid, soft, outline, ghost, link variants |
126
+ | `Button` | Primary interactive element: solid, soft, outline, ghost, link variants |
79
127
  | `Card` | Bordered surface container |
80
128
  | `Checkbox` | Accessible checkbox with label support |
81
129
  | `Disclosure` | Show/hide toggle using HeadlessUI |
82
130
  | `Input` | Text input with label, error state, and icon slots |
83
131
  | `Link` | Styled anchor with variant support |
132
+ | `PasswordInput` | Password field with a show/hide reveal toggle |
133
+ | `Pill` | Inline phrase chrome: social proof, live state, applied filters |
84
134
  | `AvatarStrip` | Stacked avatar row with overflow chip, dismiss button, trailing slot, and label area |
85
135
  | `CollapsibleSection` | Clamps any content (prose, chips, image grids) to a fixed height with a fade and expand/collapse toggle |
86
- | `LiquidTabs` | Controlled tab strip with a liquid sliding pill indicator — pill and filled variants |
136
+ | `LiquidTabs` | Controlled tab strip with a liquid sliding pill indicator: pill and filled variants |
87
137
  | `Select` | Dropdown selector |
88
138
  | `SegmentBar` | Proportional horizontal bar divided into colored segments with optional legend |
89
139
  | `Spinner` | Loading indicator |
90
140
  | `Switch` | Toggle switch |
91
141
  | `Textarea` | Multi-line text input |
92
- | `Tooltip` | Radix-powered tooltip — hover/focus on desktop, tap-to-toggle on mobile |
142
+ | `Tooltip` | Radix-powered tooltip: hover/focus on desktop, tap-to-toggle on mobile |
93
143
 
94
144
  ### Molecules
95
145
 
96
146
  | Component | Description |
97
147
  |---|---|
98
148
  | `Accordion` | Collapsible content sections (single or multi-expand) |
149
+ | `Alert` | Inline notice strip with optional title and dismiss |
99
150
  | `Breadcrumbs` | Navigation trail |
100
151
  | `CallToAction` | Prominent hero-style CTA block |
101
152
  | `EmptyState` | Zero-data placeholder with icon and action slot |
@@ -108,12 +159,39 @@ function App() {
108
159
  |---|---|
109
160
  | `ActionBar` | Sticky bottom action strip |
110
161
  | `Countdown` | Live countdown timer |
111
- | `DataTable` | Full-featured table with sorting and pagination via TanStack Table |
162
+ | `DataTable` | Full-featured table with sorting and pagination via TanStack Table v9 (see [DataTable columns](#datatable-columns)) |
112
163
  | `Dialog` | Modal dialog |
113
164
  | `Footer` | Site footer |
114
165
  | `Navbar` | Responsive navigation bar with mobile slide-out |
115
166
  | `Table` | Static data table |
116
167
 
168
+ ### DataTable columns
169
+
170
+ TanStack Table v9 types column definitions against the feature set that built
171
+ the table. `DataTable` registers sorting and pagination and exports that set as
172
+ `RosterTableFeatures`, so your columns name it:
173
+
174
+ ```tsx
175
+ import { DataTable, type RosterTableFeatures } from "@blakesteve/roster";
176
+ import { createColumnHelper, type ColumnDef } from "@tanstack/react-table";
177
+
178
+ type Player = { name: string; points: number };
179
+
180
+ const columns: ColumnDef<RosterTableFeatures, Player>[] = [
181
+ { accessorKey: "name", header: "Player" },
182
+ { accessorKey: "points", header: "Points" },
183
+ ];
184
+
185
+ // Or, to keep each column's value type:
186
+ const helper = createColumnHelper<RosterTableFeatures, Player>();
187
+ ```
188
+
189
+ Upgrading from roster 2.x: `ColumnDef<Player, unknown>` becomes
190
+ `ColumnDef<RosterTableFeatures, Player>`, and `DataTableProps` takes one type
191
+ argument instead of two. A columns array is heterogeneous, so v9 types each
192
+ entry's value as `unknown` and recovers the real type per column through
193
+ `createColumnHelper`.
194
+
117
195
  ### Hooks
118
196
 
119
197
  | Hook | Description |
@@ -155,8 +233,9 @@ Output in `dist/`:
155
233
  |---|---|
156
234
  | `roster.es.js` | ES module bundle |
157
235
  | `roster.umd.js` | UMD bundle |
158
- | `roster.css` | Compiled component styles |
236
+ | `roster.css` | Compiled component styles, in the `roster` cascade layer |
159
237
  | `tokens.css` | Design token CSS variables |
238
+ | `preflight.css` | Optional global reset (see Setup) |
160
239
  | `index.d.ts` | TypeScript definitions |
161
240
 
162
241
  ## Contributing
@@ -5,6 +5,16 @@ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElemen
5
5
  isLoading?: boolean;
6
6
  startIcon?: React.ReactNode;
7
7
  endIcon?: React.ReactNode;
8
+ /**
9
+ * Which surface the button sits on.
10
+ *
11
+ * Roster's dark styling keys off an ancestor carrying `.dark`, so a button
12
+ * placed on a hard-coded dark panel that never carries that class (a
13
+ * campfire overlay, a lantern-night backdrop) falls back to the LIGHT
14
+ * styles and flashes a near-white hover. Pass `surface="dark"` to force the
15
+ * dark treatment regardless of the app's theme.
16
+ */
17
+ surface?: "auto" | "dark";
8
18
  }
9
19
  declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
10
20
  export { Button };
@@ -0,0 +1,30 @@
1
+ import { default as React } from 'react';
2
+ import { InputProps } from '../Input/Input';
3
+ export interface PasswordInputProps extends Omit<InputProps, "type" | "endIcon"> {
4
+ /**
5
+ * Whether to render the reveal toggle at all. Turn it off where policy
6
+ * forbids showing the value on screen.
7
+ */
8
+ revealable?: boolean;
9
+ /** Starts revealed. Uncontrolled; pair with `onRevealChange` to observe. */
10
+ defaultRevealed?: boolean;
11
+ /** Controls the reveal state. Pass with `onRevealChange` for a controlled field. */
12
+ revealed?: boolean;
13
+ /** Fires whenever the reveal state changes, controlled or not. */
14
+ onRevealChange?: (revealed: boolean) => void;
15
+ /** Accessible label for the toggle while the value is hidden. */
16
+ showLabel?: string;
17
+ /** Accessible label for the toggle while the value is visible. */
18
+ hideLabel?: string;
19
+ }
20
+ /**
21
+ * A password field with a reveal toggle: the pattern every sign-in form needs
22
+ * and nobody should rewrite.
23
+ *
24
+ * Wraps `Input`, so labels, helper and error text, and every variant behave
25
+ * exactly as they do everywhere else. The toggle is a real button: keyboard
26
+ * reachable, `type="button"` so it never submits the form, and disabled
27
+ * alongside the field.
28
+ */
29
+ declare const PasswordInput: React.ForwardRefExoticComponent<PasswordInputProps & React.RefAttributes<HTMLInputElement>>;
30
+ export { PasswordInput };
@@ -0,0 +1,22 @@
1
+ import { default as React } from 'react';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import { pillVariants } from './pill-variants';
4
+ export interface PillProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof pillVariants> {
5
+ children: React.ReactNode;
6
+ /** Leading status dot, in the pill's color scheme. */
7
+ dot?: boolean;
8
+ /**
9
+ * Animates the dot for genuinely live state: "Live now", "12 watching".
10
+ * Requires `dot`. Honors `prefers-reduced-motion`, in which case the dot
11
+ * still renders, it just stops moving.
12
+ */
13
+ pulse?: boolean;
14
+ /** Leading icon or avatar. Ignored when `dot` is set. */
15
+ leadingIcon?: React.ReactNode;
16
+ }
17
+ /**
18
+ * Inline chrome for a short phrase: social proof, live state, an applied
19
+ * filter. See pill-variants.ts for how this differs from Badge.
20
+ */
21
+ declare const Pill: React.ForwardRefExoticComponent<PillProps & React.RefAttributes<HTMLSpanElement>>;
22
+ export { Pill };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Pill vs Badge.
3
+ *
4
+ * Badge is a compact label attached to something else: a count on an avatar,
5
+ * a status on a table row. It is sized to sit in a corner.
6
+ *
7
+ * Pill is standalone inline chrome carrying a short phrase: social proof
8
+ * ("3 friends voted"), live state ("Live now"), or a filter that reads as a
9
+ * sentence fragment. It is always fully rounded, has roomier horizontal
10
+ * padding so words breathe, and can lead with a status dot.
11
+ */
12
+ export declare const pillVariants: (props?: ({
13
+ colorScheme?: "primary" | "amber" | "success" | "error" | "neutral" | "info" | null | undefined;
14
+ variant?: "soft" | "solid" | "outline" | null | undefined;
15
+ size?: "sm" | "md" | null | undefined;
16
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
17
+ /**
18
+ * The leading status dot. On solid pills it borrows the text color so it
19
+ * stays legible against the filled background; elsewhere it takes the scheme.
20
+ */
21
+ export declare const pillDotVariants: (props?: ({
22
+ colorScheme?: "primary" | "amber" | "success" | "error" | "neutral" | "info" | null | undefined;
23
+ variant?: "soft" | "solid" | "outline" | null | undefined;
24
+ size?: "sm" | "md" | null | undefined;
25
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
@@ -0,0 +1,25 @@
1
+ import { default as React } from 'react';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import { alertVariants } from './alert-variants';
4
+ export interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title">, VariantProps<typeof alertVariants> {
5
+ /** Optional bolded first line above the message. */
6
+ title?: React.ReactNode;
7
+ /** The message itself. */
8
+ children: React.ReactNode;
9
+ /** Replaces the icon chosen for the color scheme. Pass `null` for none. */
10
+ icon?: React.ReactNode;
11
+ /** Renders a dismiss button when provided. */
12
+ onDismiss?: () => void;
13
+ /** Accessible label for the dismiss button. */
14
+ dismissLabel?: string;
15
+ }
16
+ /**
17
+ * Inline notice strip for feedback in the flow of a page: "this action
18
+ * failed", "changes saved". For a full zero-data panel reach for EmptyState or
19
+ * ErrorState instead.
20
+ *
21
+ * Errors announce themselves assertively; every other scheme is polite, so a
22
+ * success note does not interrupt whatever a screen reader is currently saying.
23
+ */
24
+ declare const Alert: React.ForwardRefExoticComponent<AlertProps & React.RefAttributes<HTMLDivElement>>;
25
+ export { Alert };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Inline notice strip. Deliberately lighter than ErrorState, which is a full
3
+ * empty-state panel. Alert is for "this action failed" feedback sitting in
4
+ * the flow of a page or a form.
5
+ *
6
+ * The left stripe carries the color weight so the fill can stay quiet enough
7
+ * to sit inside a form without shouting.
8
+ */
9
+ export declare const alertVariants: (props?: ({
10
+ colorScheme?: "primary" | "amber" | "success" | "error" | "neutral" | "info" | null | undefined;
11
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
@@ -1,7 +1,41 @@
1
- import { ColumnDef } from '@tanstack/react-table';
1
+ import { ColumnDef, RowData } from '@tanstack/react-table';
2
2
  import { TableProps } from '../Table/Table';
3
- export interface DataTableProps<TData, TValue> {
4
- columns: ColumnDef<TData, TValue>[];
3
+ /**
4
+ * The feature set DataTable registers: sorting and pagination, plus the row
5
+ * models each one needs. v9 requires features to be declared up front, and it
6
+ * types column definitions against them, so consumers need this type to write
7
+ * their columns:
8
+ *
9
+ * ```ts
10
+ * const columns: ColumnDef<RosterTableFeatures, Person>[] = [...]
11
+ * // or
12
+ * const helper = createColumnHelper<RosterTableFeatures, Person>()
13
+ * ```
14
+ *
15
+ * Built statically at module scope, as v9 requires.
16
+ */
17
+ declare const dataTableFeatures: {
18
+ rowSortingFeature: import('@tanstack/table-core').TableFeature;
19
+ rowPaginationFeature: import('@tanstack/table-core').TableFeature;
20
+ sortedRowModel: (table: import('@tanstack/table-core').Table<any, any>) => () => import('@tanstack/table-core').RowModel<any, any>;
21
+ paginatedRowModel: (table: import('@tanstack/table-core').Table<any, any>) => () => import('@tanstack/table-core').RowModel<any, any>;
22
+ sortFns: {
23
+ alphanumeric: import('@tanstack/table-core').CreatedSortFn<any, any>;
24
+ alphanumericCaseSensitive: import('@tanstack/table-core').CreatedSortFn<any, any>;
25
+ basic: import('@tanstack/table-core').CreatedSortFn<any, any>;
26
+ datetime: import('@tanstack/table-core').CreatedSortFn<any, any>;
27
+ text: import('@tanstack/table-core').CreatedSortFn<any, any>;
28
+ textCaseSensitive: import('@tanstack/table-core').CreatedSortFn<any, any>;
29
+ };
30
+ };
31
+ export type RosterTableFeatures = typeof dataTableFeatures;
32
+ /**
33
+ * `TValue` is gone from v8's `DataTableProps<TData, TValue>`: a columns array
34
+ * is heterogeneous, so v9 types each entry's value as `unknown` and recovers
35
+ * the real type per column through `createColumnHelper`.
36
+ */
37
+ export interface DataTableProps<TData extends RowData> {
38
+ columns: ColumnDef<RosterTableFeatures, TData>[];
5
39
  data: TData[];
6
40
  className?: string;
7
41
  tableClassName?: string;
@@ -10,4 +44,5 @@ export interface DataTableProps<TData, TValue> {
10
44
  size?: TableProps["size"];
11
45
  hoverable?: boolean;
12
46
  }
13
- export declare function DataTable<TData, TValue>({ columns, data, className, tableClassName, paginationClassName, variant, size, hoverable, }: DataTableProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;
47
+ export declare function DataTable<TData extends RowData>({ columns, data, className, tableClassName, paginationClassName, variant, size, hoverable, }: DataTableProps<TData>): import("react/jsx-runtime").JSX.Element;
48
+ export {};
@@ -1,16 +1,35 @@
1
1
  import { default as React } from 'react';
2
2
  import { VariantProps } from 'class-variance-authority';
3
3
  import { navbarVariants } from './navbar-variants';
4
+ /**
5
+ * Content for a consumer-supplied slot. Pass a plain node, or a function that
6
+ * receives `close` so anything inside the slot can dismiss the mobile panel —
7
+ * needed when the slot holds a link, since the nav has no way to know a click
8
+ * on arbitrary content was a navigation.
9
+ */
10
+ export type NavbarSlot = React.ReactNode | ((props: {
11
+ close: () => void;
12
+ }) => React.ReactNode);
4
13
  export interface NavItem {
5
14
  label: string;
6
15
  path: string;
7
- /** Optional badge rendered inline after the link label — any ReactNode.
16
+ /** Optional badge rendered inline after the link label. Any ReactNode.
8
17
  * Use for "New" labels, notification counts, or status indicators.
9
18
  * Appears in both the desktop nav and the mobile slide-out panel. */
10
19
  badge?: React.ReactNode;
11
20
  }
12
21
  export interface NavbarProps extends React.HTMLAttributes<HTMLElement>, VariantProps<typeof navbarVariants> {
13
22
  logoSrc: string;
23
+ /**
24
+ * Size of the logo image. Accepts any CSS length (`"2.75rem"`, `44`).
25
+ * Defaults to `2rem`, the previous hard-coded `h-8 w-8`.
26
+ */
27
+ logoSize?: string | number;
28
+ /**
29
+ * Classes applied to the logo image. Replaces the default rounding, so a
30
+ * circular mark can pass `"rounded-full"` and a square one `""`.
31
+ */
32
+ logoClassName?: string;
14
33
  brandName: string;
15
34
  items: NavItem[];
16
35
  activePath?: string;
@@ -25,17 +44,34 @@ export interface NavbarProps extends React.HTMLAttributes<HTMLElement>, VariantP
25
44
  onLogout?: () => void;
26
45
  onInboxClick?: () => void;
27
46
  onThemeToggle?: () => void;
28
- themeMode?: "light" | "dark";
47
+ /**
48
+ * Which palette the nav paints itself with.
49
+ *
50
+ * `"auto"` follows the nearest ancestor carrying the `.dark` class, matching
51
+ * how the rest of Roster handles dark mode. Use it in class-based dark apps
52
+ * so the nav does not need wiring into your theme state. Omit the prop
53
+ * entirely and the mode is inferred from `variant`, as before.
54
+ */
55
+ themeMode?: "light" | "dark" | "auto";
29
56
  notificationVariant?: "primary" | "error" | "amber" | "success" | "neutral" | "orange" | "teal" | "purple";
57
+ /**
58
+ * Fill style of the notification count badge. Defaults to `"solid"`, which
59
+ * is what the nav rendered before this was configurable. Use `"soft"` or
60
+ * `"outline"` where a solid dot competes with a busy or colored nav surface.
61
+ */
62
+ notificationFill?: "soft" | "light" | "solid" | "outline";
30
63
  /**
31
64
  * Custom content rendered in the right-side action area. When provided it
32
65
  * replaces the built-in user menu / "Log In" button on desktop and the user
33
66
  * section in the mobile panel, giving you full control over auth UI.
67
+ *
68
+ * Pass a function to receive `close` and dismiss the mobile panel from
69
+ * inside the slot: `actions={({ close }) => <Link onClick={close} … />}`.
34
70
  */
35
- actions?: React.ReactNode;
71
+ actions?: NavbarSlot;
36
72
  /**
37
73
  * Replaces the default brand name `<span>` with arbitrary markup. Use this
38
- * when you need mixed weights, colours, or other rich styling that a plain
74
+ * when you need mixed weights, colors, or other rich styling that a plain
39
75
  * string cannot express (e.g. bold "GAME" + thin "VERDICT").
40
76
  * The logo image is always rendered; this only affects the text element.
41
77
  */
@@ -44,10 +80,13 @@ export interface NavbarProps extends React.HTMLAttributes<HTMLElement>, VariantP
44
80
  * Extra content rendered between the nav link list and the user menu / Log In
45
81
  * button on desktop, and above the nav links in the mobile slide-out panel.
46
82
  * Use this for persistent nav-level controls like a search toggle that should
47
- * coexist with the built-in user menu. Does not replace the user menu —
83
+ * coexist with the built-in user menu. Does not replace the user menu;
48
84
  * see `actions` for full replacement.
85
+ *
86
+ * Pass a function to receive `close` and dismiss the mobile panel from
87
+ * inside the slot: `navActions={({ close }) => <Link onClick={close} … />}`.
49
88
  */
50
- navActions?: React.ReactNode;
89
+ navActions?: NavbarSlot;
51
90
  /**
52
91
  * Auth-gated navigation items appended to the built-in user avatar dropdown
53
92
  * on desktop and to the nav section of the mobile slide-out panel. Only
@@ -55,5 +94,5 @@ export interface NavbarProps extends React.HTMLAttributes<HTMLElement>, VariantP
55
94
  */
56
95
  userMenuItems?: NavItem[];
57
96
  }
58
- declare const Navbar: ({ logoSrc, brandName, items, activePath, routerElement, user, onLogin, onLogout, onInboxClick, onThemeToggle, actions, brandElement, navActions, userMenuItems, className, variant, position, themeMode, notificationVariant, ...props }: NavbarProps) => import("react/jsx-runtime").JSX.Element;
97
+ declare const Navbar: ({ logoSrc, logoSize, logoClassName, brandName, items, activePath, routerElement, user, onLogin, onLogout, onInboxClick, onThemeToggle, actions, brandElement, navActions, userMenuItems, className, variant, position, themeMode, notificationVariant, notificationFill, ...props }: NavbarProps) => import("react/jsx-runtime").JSX.Element;
59
98
  export { Navbar };
package/dist/index.d.ts CHANGED
@@ -14,6 +14,9 @@ export * from './components/atoms/Input/Input';
14
14
  export * from './components/atoms/Input/input-variants';
15
15
  export * from './components/atoms/Link/Link';
16
16
  export * from './components/atoms/Link/link-variants';
17
+ export * from './components/atoms/PasswordInput/PasswordInput';
18
+ export * from './components/atoms/Pill/Pill';
19
+ export * from './components/atoms/Pill/pill-variants';
17
20
  export * from './components/atoms/Select/Select';
18
21
  export * from './components/atoms/Select/select-variants';
19
22
  export * from './components/atoms/Spinner/Spinner';
@@ -26,6 +29,8 @@ export * from './components/atoms/LiquidTabs/LiquidTabs';
26
29
  export * from './components/atoms/Tooltip/Tooltip';
27
30
  export * from './components/atoms/CollapsibleSection/CollapsibleSection';
28
31
  export * from './components/atoms/SegmentBar/SegmentBar';
32
+ export * from './components/molecules/Alert/Alert';
33
+ export * from './components/molecules/Alert/alert-variants';
29
34
  export * from './components/molecules/Accordion/Accordion';
30
35
  export * from './components/molecules/Breadcrumbs/Breadcrumbs';
31
36
  export * from './components/molecules/Breadcrumbs/breadcrumb-variants';
@@ -0,0 +1 @@
1
+ "use client";"use strict";
@@ -0,0 +1 @@
1
+ @layer roster-preflight{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer roster;
File without changes
@@ -0,0 +1 @@
1
+ "use client";