@dybo-ai/design 1.0.1 → 1.2.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/CLAUDE.md CHANGED
@@ -12,15 +12,17 @@ This `CLAUDE.md` is itself shipped to consumers (it's in `package.json`'s `files
12
12
 
13
13
  `tokens.json` is canonical (values + original Figma variable names). Every other token surface is a **manually maintained mirror** of it — there is no code generation:
14
14
 
15
- | File | Mirrors tokens.json as... |
16
- |---|---|
17
- | `tokens.mjs` | ESM flat exports (`color`, `space`, `radius`, etc.) |
18
- | `tokens.cjs` | CommonJS mirror of `tokens.mjs` |
19
- | `theme.css` | CSS custom properties + `.dybo-*` helper classes (`.dybo-glass`, `.dybo-btn`, `.dybo-input`, `.dybo-badge`) |
20
- | `tailwind-preset.cjs` | Tailwind theme extension (`dybo-*` utilities) |
21
- | `react/index.jsx` | Thin React wrappers (`Button`, `Card`, `Input`, `Badge`) over the `theme.css` classes — requires the consumer to import `theme.css` separately |
15
+ | File | Mirrors tokens.json as... |
16
+ | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
17
+ | `tokens.mjs` | ESM flat exports (`color`, `space`, `radius`, etc.) |
18
+ | `tokens.cjs` | CommonJS mirror of `tokens.mjs` |
19
+ | `theme.css` | CSS custom properties + `.dybo-*` helper classes (`.dybo-glass`, `.dybo-btn`, `.dybo-input`, `.dybo-badge`) |
20
+ | `portal-tokens.css` | HSL shadcn drop-in for client portal / ticket prototype (`--background`, `--primary`, etc.) — mirrors `portal` namespace in `tokens.json` |
21
+ | `src/index.tsx` | React components over `theme.css` classes — requires the consumer to import `theme.css` separately |
22
22
 
23
- **When changing a token value or adding a new one, update all five in the same change.** There's no automated check that catches drift between them (a Style Dictionary generation pipeline is proposed but not implemented — see `docs/SETUP.md` Part E).
23
+ **When changing a token value or adding a new one, update all mirrors in the same change** (`tokens.json`, `tokens.mjs`, `tokens.cjs`, `theme.css`, and `portal-tokens.css` when portal HSL vars are affected). There's no automated check that catches drift between them (a Style Dictionary generation pipeline is proposed but not implemented — see `docs/SETUP.md` Part E).
24
+
25
+ `portal` namespace in `tokens.json` holds ticket-management / client-portal values (priority badges, ChatWoot statuses, operator background). See `docs/portal-token-mapping.md` for the full ticket ↔ dybo mapping.
24
26
 
25
27
  `assets/` holds static brand image files (currently the logo) — it's shipped via `package.json`'s `files` list and importable as `@dybo-ai/design/assets/<file>`, but it's not part of the token-mirror sync described above.
26
28
 
@@ -31,11 +33,13 @@ This `CLAUDE.md` is itself shipped to consumers (it's in `package.json`'s `files
31
33
  There is no build, lint, or test tooling in this repo — don't invent npm scripts that don't exist (`package.json` has no `scripts` field).
32
34
 
33
35
  Publishing (manual, no CI):
36
+
34
37
  ```bash
35
38
  npm version patch # or minor / major — see docs/SETUP.md Part D for the semver rule
36
39
  npm publish
37
40
  git push --follow-tags
38
41
  ```
42
+
39
43
  `npm publish --dry-run` is useful to confirm the packed file list matches `package.json`'s `files` array before actually publishing. Publishing requires a `.npmrc` (git-ignored, copy from `.npmrc.example`) with a `GITHUB_TOKEN` that has `write:packages`.
40
44
 
41
45
  ## Design system rules for consuming apps
@@ -49,9 +53,11 @@ When building UI in a DYBO app, use `@dybo-ai/design`. Do not hard-code hex valu
49
53
  - **Radius:** 12 (buttons/inputs), 20 (cards), 999 (pills).
50
54
 
51
55
  How to consume (pick per app):
52
- - Tailwind app → `presets: [require("@dybo-ai/design/tailwind")]`, use `dybo-*` utilities.
56
+
57
+ - Tailwind app → `@import "@dybo-ai/design/theme.css"` in CSS, use `dybo-*` utilities.
53
58
  - Non-Tailwind → `import "@dybo-ai/design/theme.css"` and use `.dybo-glass`, `.dybo-btn`, `.dybo-input`, `.dybo-badge`.
54
- - React `import { Button, Card, Input, Badge } from "@dybo-ai/design/react"` (also import the CSS).
55
- - Programmatic values → `import { color, space, radius } from "@dybo-ai/design"`.
59
+ - Client portal / Tickets (shadcn HSL) `@import "@dybo-ai/design/portal-tokens.css"` as drop-in for prototype `tokens.css`.
60
+ - React → `import { Button, Card, IconRail, ScopeTabs, PriorityBadge, TicketStatusBadge } from "@dybo-ai/design"` (also import the CSS).
61
+ - Programmatic values → `import { color, portal, space, radius } from "@dybo-ai/design/tokens"`.
56
62
 
57
63
  Reference `tokens.json` for the full token list and `docs/design-system.md` for rationale. Semantic "danger" is red `#a21a17` — ignore Figma's mislabeled orange "Feedback/Error".
package/README.md CHANGED
@@ -55,7 +55,7 @@ import "@dybo-ai/design/theme.css";
55
55
 
56
56
  ```tsx
57
57
  import "@dybo-ai/design/theme.css";
58
- import { Button, Card, Input, Badge } from "@dybo-ai/design/react";
58
+ import { Button, Card, Input, Badge } from "@dybo-ai/design";
59
59
  ```
60
60
 
61
61
  All components are TypeScript with `I`-prefixed interfaces.
@@ -87,7 +87,7 @@ import {
87
87
  TopBar,
88
88
  NavItem,
89
89
  NavSection,
90
- } from "@dybo-ai/design/react";
90
+ } from "@dybo-ai/design";
91
91
 
92
92
  function MyApp() {
93
93
  return (
@@ -116,7 +116,7 @@ function MyApp() {
116
116
  ### Glassmorphism card
117
117
 
118
118
  ```tsx
119
- import { Card, Button, Input } from "@dybo-ai/design/react";
119
+ import { Card, Button, Input } from "@dybo-ai/design";
120
120
 
121
121
  <Card>
122
122
  <Input label="Name" placeholder="Enter your name" />
@@ -129,8 +129,8 @@ import { Card, Button, Input } from "@dybo-ai/design/react";
129
129
  ### DataTable
130
130
 
131
131
  ```tsx
132
- import { DataTable } from "@dybo-ai/design/react";
133
- import type { IColumn } from "@dybo-ai/design/react";
132
+ import { DataTable } from "@dybo-ai/design";
133
+ import type { IColumn } from "@dybo-ai/design";
134
134
 
135
135
  interface IUser {
136
136
  id: number;
@@ -161,7 +161,7 @@ const columns: IColumn<IUser>[] = [
161
161
 
162
162
  ```tsx
163
163
  import { useState } from "react";
164
- import { Tabs } from "@dybo-ai/design/react";
164
+ import { Tabs } from "@dybo-ai/design";
165
165
 
166
166
  const TABS = [
167
167
  { key: "federal", label: "Federal (IRS)" },
@@ -185,7 +185,7 @@ function ProjectDetail() {
185
185
  ### Overview grid
186
186
 
187
187
  ```tsx
188
- import { OverviewGrid } from "@dybo-ai/design/react";
188
+ import { OverviewGrid } from "@dybo-ai/design";
189
189
 
190
190
  <OverviewGrid
191
191
  fields={[
@@ -200,7 +200,7 @@ import { OverviewGrid } from "@dybo-ai/design/react";
200
200
  ### Alert
201
201
 
202
202
  ```tsx
203
- import { Alert } from "@dybo-ai/design/react";
203
+ import { Alert } from "@dybo-ai/design";
204
204
 
205
205
  <Alert variant="danger" onClose={() => setError(null)}>
206
206
  Failed to save. Please check the data and try again.
@@ -211,7 +211,7 @@ import { Alert } from "@dybo-ai/design/react";
211
211
 
212
212
  ```tsx
213
213
  import { useState } from "react";
214
- import { Modal, Button } from "@dybo-ai/design/react";
214
+ import { Modal, Button } from "@dybo-ai/design";
215
215
 
216
216
  function ConfirmDelete() {
217
217
  const [open, setOpen] = useState(false);
@@ -245,7 +245,7 @@ function ConfirmDelete() {
245
245
  ### Login card
246
246
 
247
247
  ```tsx
248
- import { LoginCard, Input, Button } from "@dybo-ai/design/react";
248
+ import { LoginCard, Input, Button } from "@dybo-ai/design";
249
249
 
250
250
  <LoginCard
251
251
  logo={<img src="/logo.png" alt="DYBO" height={44} />}
@@ -273,7 +273,7 @@ import { LoginCard, Input, Button } from "@dybo-ai/design/react";
273
273
  ### Select
274
274
 
275
275
  ```tsx
276
- import { Select } from "@dybo-ai/design/react";
276
+ import { Select } from "@dybo-ai/design";
277
277
 
278
278
  <Select
279
279
  label="State"
@@ -292,7 +292,7 @@ import { Select } from "@dybo-ai/design/react";
292
292
  ## Tokens in JS/TS
293
293
 
294
294
  ```ts
295
- import { color, space, radius } from "@dybo-ai/design";
295
+ import { color, space, radius } from "@dybo-ai/design/tokens";
296
296
 
297
297
  color.brand.blue; // "#5878a7"
298
298
  color.semantic.danger.solid; // "#a21a17"
package/dist/index.cjs CHANGED
@@ -112,13 +112,122 @@ function Badge({ status = "brand", className, ...props }) {
112
112
  );
113
113
  }
114
114
  var cx5 = (...c) => c.filter(Boolean).join(" ");
115
+ function IconRailItem({
116
+ active = false,
117
+ className,
118
+ children,
119
+ ...props
120
+ }) {
121
+ return /* @__PURE__ */ jsxRuntime.jsx(
122
+ "a",
123
+ {
124
+ className: cx5(
125
+ "dybo-icon-rail__item",
126
+ active ? "dybo-icon-rail__item--active" : void 0,
127
+ className
128
+ ),
129
+ ...props,
130
+ children
131
+ }
132
+ );
133
+ }
134
+ function IconRail({ brand, children, className }) {
135
+ return /* @__PURE__ */ jsxRuntime.jsxs("aside", { className: cx5("dybo-icon-rail", className), children: [
136
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "dybo-icon-rail__brand", children: brand }),
137
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "dybo-icon-rail__nav", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "dybo-icon-rail__pill", children: /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "dybo-icon-rail__items", children }) }) })
138
+ ] });
139
+ }
140
+ var cx6 = (...c) => c.filter(Boolean).join(" ");
141
+ function NavTabs({ tabs, active, onChange, className }) {
142
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cx6("dybo-navtabs", className), role: "tablist", children: tabs.map((tab) => /* @__PURE__ */ jsxRuntime.jsx(
143
+ "button",
144
+ {
145
+ type: "button",
146
+ role: "tab",
147
+ "aria-selected": tab.key === active,
148
+ disabled: tab.disabled,
149
+ className: cx6(
150
+ "dybo-navtab",
151
+ tab.key === active ? "dybo-navtab--active" : void 0
152
+ ),
153
+ onClick: () => !tab.disabled && onChange(tab.key),
154
+ children: tab.label
155
+ },
156
+ tab.key
157
+ )) });
158
+ }
159
+ var cx7 = (...c) => c.filter(Boolean).join(" ");
160
+ function ScopeTabs({ tabs, active, onChange, className }) {
161
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cx7("dybo-scope", className), role: "tablist", children: tabs.map((tab) => /* @__PURE__ */ jsxRuntime.jsxs(
162
+ "button",
163
+ {
164
+ type: "button",
165
+ role: "tab",
166
+ "aria-selected": tab.key === active,
167
+ disabled: tab.disabled,
168
+ className: cx7(
169
+ "dybo-scope-tab",
170
+ tab.key === active ? "dybo-scope-tab--active" : void 0
171
+ ),
172
+ onClick: () => !tab.disabled && onChange(tab.key),
173
+ children: [
174
+ tab.label,
175
+ tab.count !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "dybo-scope-count", children: tab.count })
176
+ ]
177
+ },
178
+ tab.key
179
+ )) });
180
+ }
181
+ var cx8 = (...c) => c.filter(Boolean).join(" ");
182
+ function PriorityBadge({
183
+ priority,
184
+ className,
185
+ children,
186
+ ...props
187
+ }) {
188
+ return /* @__PURE__ */ jsxRuntime.jsx(
189
+ "span",
190
+ {
191
+ className: cx8("dybo-priority", `dybo-priority--${priority}`, className),
192
+ ...props,
193
+ children: children ?? priority
194
+ }
195
+ );
196
+ }
197
+ var cx9 = (...c) => c.filter(Boolean).join(" ");
198
+ var defaultLabels = {
199
+ open: "Open",
200
+ pending: "Pending",
201
+ snoozed: "Snoozed",
202
+ resolved: "Resolved"
203
+ };
204
+ function TicketStatusBadge({
205
+ status,
206
+ className,
207
+ children,
208
+ ...props
209
+ }) {
210
+ return /* @__PURE__ */ jsxRuntime.jsx(
211
+ "span",
212
+ {
213
+ className: cx9(
214
+ "dybo-ticket-status",
215
+ `dybo-ticket-status--${status}`,
216
+ className
217
+ ),
218
+ ...props,
219
+ children: children ?? defaultLabels[status]
220
+ }
221
+ );
222
+ }
223
+ var cx10 = (...c) => c.filter(Boolean).join(" ");
115
224
  function AppShell({
116
225
  sidebar,
117
226
  topBar,
118
227
  children,
119
228
  className
120
229
  }) {
121
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cx5("dybo-app-shell", className), children: [
230
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cx10("dybo-app-shell", className), children: [
122
231
  sidebar,
123
232
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "dybo-main", children: [
124
233
  topBar,
@@ -126,7 +235,7 @@ function AppShell({
126
235
  ] })
127
236
  ] });
128
237
  }
129
- var cx6 = (...c) => c.filter(Boolean).join(" ");
238
+ var cx11 = (...c) => c.filter(Boolean).join(" ");
130
239
  function Sidebar({
131
240
  brand,
132
241
  children,
@@ -135,7 +244,7 @@ function Sidebar({
135
244
  onLogout,
136
245
  className
137
246
  }) {
138
- return /* @__PURE__ */ jsxRuntime.jsxs("aside", { className: cx6("dybo-sidebar", className), children: [
247
+ return /* @__PURE__ */ jsxRuntime.jsxs("aside", { className: cx11("dybo-sidebar", className), children: [
139
248
  brand && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "dybo-sidebar__brand", children: brand }),
140
249
  /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "dybo-sidebar__nav", children }),
141
250
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "dybo-sidebar__footer", children: [
@@ -176,14 +285,14 @@ function Sidebar({
176
285
  ] })
177
286
  ] });
178
287
  }
179
- var cx7 = (...c) => c.filter(Boolean).join(" ");
288
+ var cx12 = (...c) => c.filter(Boolean).join(" ");
180
289
  function TopBar({ title, children, className }) {
181
- return /* @__PURE__ */ jsxRuntime.jsxs("header", { className: cx7("dybo-topbar", className), children: [
290
+ return /* @__PURE__ */ jsxRuntime.jsxs("header", { className: cx12("dybo-topbar", className), children: [
182
291
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "dybo-topbar__title", children: title }),
183
292
  children
184
293
  ] });
185
294
  }
186
- var cx8 = (...c) => c.filter(Boolean).join(" ");
295
+ var cx13 = (...c) => c.filter(Boolean).join(" ");
187
296
  function NavItem({
188
297
  label,
189
298
  href,
@@ -192,7 +301,7 @@ function NavItem({
192
301
  onClick,
193
302
  className
194
303
  }) {
195
- const baseClass = cx8(
304
+ const baseClass = cx13(
196
305
  "dybo-nav-item",
197
306
  active ? "dybo-nav-item--active" : void 0,
198
307
  className
@@ -209,7 +318,7 @@ function NavItem({
209
318
  function NavSection({ label }) {
210
319
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "dybo-sidebar__section", children: label });
211
320
  }
212
- var cx9 = (...c) => c.filter(Boolean).join(" ");
321
+ var cx14 = (...c) => c.filter(Boolean).join(" ");
213
322
  function DataTable({
214
323
  columns,
215
324
  rows,
@@ -223,11 +332,11 @@ function DataTable({
223
332
  if (typeof rowKey === "function") return rowKey(row, index);
224
333
  return row[rowKey];
225
334
  }
226
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cx9("dybo-table-wrap", className), children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "dybo-table", children: [
335
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cx14("dybo-table-wrap", className), children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "dybo-table", children: [
227
336
  /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsx("tr", { children: columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx(
228
337
  "th",
229
338
  {
230
- className: cx9(
339
+ className: cx14(
231
340
  col.align === "left" ? "left" : void 0,
232
341
  col.className
233
342
  ),
@@ -249,7 +358,7 @@ function DataTable({
249
358
  ) }) : rows.map((row, index) => /* @__PURE__ */ jsxRuntime.jsx(
250
359
  "tr",
251
360
  {
252
- className: cx9(
361
+ className: cx14(
253
362
  onRowClick ? "dybo-table__row--clickable" : void 0
254
363
  ),
255
364
  onClick: onRowClick ? () => onRowClick(row) : void 0,
@@ -258,7 +367,7 @@ function DataTable({
258
367
  return /* @__PURE__ */ jsxRuntime.jsx(
259
368
  "td",
260
369
  {
261
- className: cx9(
370
+ className: cx14(
262
371
  col.align === "left" ? "left" : void 0,
263
372
  col.className
264
373
  ),
@@ -272,16 +381,16 @@ function DataTable({
272
381
  )) })
273
382
  ] }) });
274
383
  }
275
- var cx10 = (...c) => c.filter(Boolean).join(" ");
384
+ var cx15 = (...c) => c.filter(Boolean).join(" ");
276
385
  function Tabs({ tabs, active, onChange, className }) {
277
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cx10("dybo-tabs", className), role: "tablist", children: tabs.map((tab) => /* @__PURE__ */ jsxRuntime.jsx(
386
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cx15("dybo-tabs", className), role: "tablist", children: tabs.map((tab) => /* @__PURE__ */ jsxRuntime.jsx(
278
387
  "button",
279
388
  {
280
389
  type: "button",
281
390
  role: "tab",
282
391
  "aria-selected": tab.key === active,
283
392
  disabled: tab.disabled,
284
- className: cx10(
393
+ className: cx15(
285
394
  "dybo-tab",
286
395
  tab.key === active ? "dybo-tab--active" : void 0
287
396
  ),
@@ -291,22 +400,22 @@ function Tabs({ tabs, active, onChange, className }) {
291
400
  tab.key
292
401
  )) });
293
402
  }
294
- var cx11 = (...c) => c.filter(Boolean).join(" ");
403
+ var cx16 = (...c) => c.filter(Boolean).join(" ");
295
404
  function OverviewField({
296
405
  label,
297
406
  value,
298
407
  className,
299
408
  style
300
409
  }) {
301
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cx11("dybo-overview-field", className), style, children: [
410
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cx16("dybo-overview-field", className), style, children: [
302
411
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "dybo-overview-field__label", children: label }),
303
412
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "dybo-overview-field__value", children: value })
304
413
  ] });
305
414
  }
306
415
  function OverviewGrid({ fields, className }) {
307
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cx11("dybo-overview-grid", className), children: fields.map((field, i) => /* @__PURE__ */ jsxRuntime.jsx(OverviewField, { ...field }, i)) });
416
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cx16("dybo-overview-grid", className), children: fields.map((field, i) => /* @__PURE__ */ jsxRuntime.jsx(OverviewField, { ...field }, i)) });
308
417
  }
309
- var cx12 = (...c) => c.filter(Boolean).join(" ");
418
+ var cx17 = (...c) => c.filter(Boolean).join(" ");
310
419
  function Select({
311
420
  label,
312
421
  error,
@@ -334,7 +443,7 @@ function Select({
334
443
  "select",
335
444
  {
336
445
  id: selectId,
337
- className: cx12("dybo-select", className),
446
+ className: cx17("dybo-select", className),
338
447
  style: error ? {
339
448
  borderColor: "var(--dybo-danger)",
340
449
  boxShadow: "0 0 0 3px rgba(162,26,23,0.12)"
@@ -365,7 +474,7 @@ var icons = {
365
474
  danger: "\u2715",
366
475
  info: "\u2139"
367
476
  };
368
- var cx13 = (...c) => c.filter(Boolean).join(" ");
477
+ var cx18 = (...c) => c.filter(Boolean).join(" ");
369
478
  function Alert({
370
479
  variant = "info",
371
480
  children,
@@ -375,7 +484,7 @@ function Alert({
375
484
  return /* @__PURE__ */ jsxRuntime.jsxs(
376
485
  "div",
377
486
  {
378
- className: cx13("dybo-alert", `dybo-alert--${variant}`, className),
487
+ className: cx18("dybo-alert", `dybo-alert--${variant}`, className),
379
488
  role: "alert",
380
489
  children: [
381
490
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: { flexShrink: 0, fontWeight: 700 }, children: icons[variant] }),
@@ -470,14 +579,14 @@ function Modal({
470
579
  document.body
471
580
  );
472
581
  }
473
- var cx14 = (...c) => c.filter(Boolean).join(" ");
582
+ var cx19 = (...c) => c.filter(Boolean).join(" ");
474
583
  function LoginCard({
475
584
  logo,
476
585
  subtitle,
477
586
  children,
478
587
  className
479
588
  }) {
480
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "dybo-login-wrap", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cx14("dybo-login-card", className), children: [
589
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "dybo-login-wrap", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cx19("dybo-login-card", className), children: [
481
590
  logo && /* @__PURE__ */ jsxRuntime.jsx(
482
591
  "div",
483
592
  {
@@ -500,16 +609,22 @@ exports.Badge = Badge;
500
609
  exports.Button = Button;
501
610
  exports.Card = Card;
502
611
  exports.DataTable = DataTable;
612
+ exports.IconRail = IconRail;
613
+ exports.IconRailItem = IconRailItem;
503
614
  exports.Input = Input;
504
615
  exports.LoginCard = LoginCard;
505
616
  exports.Modal = Modal;
506
617
  exports.NavItem = NavItem;
507
618
  exports.NavSection = NavSection;
619
+ exports.NavTabs = NavTabs;
508
620
  exports.OverviewField = OverviewField;
509
621
  exports.OverviewGrid = OverviewGrid;
622
+ exports.PriorityBadge = PriorityBadge;
623
+ exports.ScopeTabs = ScopeTabs;
510
624
  exports.Select = Select;
511
625
  exports.Sidebar = Sidebar;
512
626
  exports.Tabs = Tabs;
627
+ exports.TicketStatusBadge = TicketStatusBadge;
513
628
  exports.TopBar = TopBar;
514
629
  //# sourceMappingURL=index.cjs.map
515
630
  //# sourceMappingURL=index.cjs.map