@you-agent-factory/components 0.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.
Files changed (92) hide show
  1. package/README.md +223 -0
  2. package/docs/README.md +83 -0
  3. package/docs/button.md +119 -0
  4. package/docs/charts.md +325 -0
  5. package/docs/data-display-code-panel.md +120 -0
  6. package/docs/feedback-alert-panel.md +117 -0
  7. package/docs/feedback-skeleton.md +54 -0
  8. package/docs/forms-form-field.md +490 -0
  9. package/docs/forms-input-primitives.md +311 -0
  10. package/docs/forms-select-primitives.md +362 -0
  11. package/docs/graphs.md +250 -0
  12. package/docs/layout-display-primitives.md +211 -0
  13. package/docs/overlays.md +414 -0
  14. package/docs/table-data-table.md +331 -0
  15. package/docs/typography-roles.md +182 -0
  16. package/docs/widget-frame-recipes.md +273 -0
  17. package/package.json +161 -0
  18. package/src/category-paths.ts +20 -0
  19. package/src/charts/chart-state-panel.tsx +103 -0
  20. package/src/charts/chart.tsx +287 -0
  21. package/src/charts/index.ts +21 -0
  22. package/src/data-display/code-panel.tsx +67 -0
  23. package/src/data-display/data-table.tsx +180 -0
  24. package/src/data-display/description-list.tsx +24 -0
  25. package/src/data-display/index.ts +34 -0
  26. package/src/data-display/table-layout.ts +12 -0
  27. package/src/data-display/table.tsx +131 -0
  28. package/src/feedback/alert-panel-semantics.ts +75 -0
  29. package/src/feedback/alert-panel.tsx +187 -0
  30. package/src/feedback/index.ts +21 -0
  31. package/src/feedback/skeleton.tsx +16 -0
  32. package/src/forms/index.ts +73 -0
  33. package/src/forms/package-checkbox.tsx +50 -0
  34. package/src/forms/package-enum-select.tsx +185 -0
  35. package/src/forms/package-file-input.tsx +25 -0
  36. package/src/forms/package-form-field.tsx +202 -0
  37. package/src/forms/package-input.tsx +25 -0
  38. package/src/forms/package-native-select.tsx +25 -0
  39. package/src/forms/package-select.tsx +209 -0
  40. package/src/forms/package-textarea.tsx +35 -0
  41. package/src/forms/select-icons.tsx +35 -0
  42. package/src/graphs/graph-edge-path.ts +241 -0
  43. package/src/graphs/graph-edge.tsx +130 -0
  44. package/src/graphs/graph-interactive-example.tsx +187 -0
  45. package/src/graphs/graph-node-button.tsx +51 -0
  46. package/src/graphs/graph-node-handle-badge.tsx +108 -0
  47. package/src/graphs/graph-node-handle.ts +28 -0
  48. package/src/graphs/graph-node-shell.tsx +111 -0
  49. package/src/graphs/graph-node-state-indicator.tsx +47 -0
  50. package/src/graphs/graph-node-state.ts +111 -0
  51. package/src/graphs/graph-viewport-surface.tsx +27 -0
  52. package/src/graphs/index.ts +41 -0
  53. package/src/icons/index.ts +4 -0
  54. package/src/index.ts +209 -0
  55. package/src/layout/action-row.tsx +53 -0
  56. package/src/layout/index.ts +9 -0
  57. package/src/layout/surface-panel.tsx +91 -0
  58. package/src/navigation/index.ts +4 -0
  59. package/src/overlays/collapsible.tsx +22 -0
  60. package/src/overlays/dialog.tsx +148 -0
  61. package/src/overlays/index.ts +31 -0
  62. package/src/overlays/overlay-layout.ts +9 -0
  63. package/src/overlays/popover.tsx +29 -0
  64. package/src/overlays/scroll-area.tsx +78 -0
  65. package/src/primitives/button-link.tsx +22 -0
  66. package/src/primitives/button.tsx +258 -0
  67. package/src/primitives/icon-button-shell.tsx +49 -0
  68. package/src/primitives/index.ts +31 -0
  69. package/src/primitives/package-text.tsx +29 -0
  70. package/src/primitives/typography-roles.ts +12 -0
  71. package/src/primitives/typography.tsx +165 -0
  72. package/src/recipes/index.ts +61 -0
  73. package/src/recipes/widget-frame-content.tsx +114 -0
  74. package/src/recipes/widget-frame-disclosure.tsx +161 -0
  75. package/src/recipes/widget-frame-layout.ts +40 -0
  76. package/src/recipes/widget-frame-skeleton.tsx +16 -0
  77. package/src/recipes/widget-frame-states.tsx +99 -0
  78. package/src/recipes/widget-frame-typography.ts +19 -0
  79. package/src/recipes/widget-frame.tsx +84 -0
  80. package/src/styles/color-palette-presets.css +167 -0
  81. package/src/styles/color-role-tokens.css +163 -0
  82. package/src/styles/layout-role-tokens.css +27 -0
  83. package/src/styles/text-color-role-tokens.css +29 -0
  84. package/src/styles/typography-role-tokens.css +72 -0
  85. package/src/styles/typography-role-utilities.css +73 -0
  86. package/src/styles/typography-roles.css +53 -0
  87. package/src/styles.css +32 -0
  88. package/src/testing/index.ts +13 -0
  89. package/src/testing/render.tsx +16 -0
  90. package/src/tokens/index.ts +4 -0
  91. package/src/utilities/cn.ts +5 -0
  92. package/src/utilities/index.ts +6 -0
@@ -0,0 +1,163 @@
1
+ /*
2
+ * Material-inspired color role tokens (Factory Dark baseline).
3
+ *
4
+ * Long-term theme API for dashboard UI. Product --color-af-* keys that map to
5
+ * roles are defined in this file; foundation/chart keys remain in styles.css.
6
+ *
7
+ * Accent intent:
8
+ * - primary: yellow brand accent (most prominent)
9
+ * - secondary: cool cyan supporting accent (af-foundation-secondary-accent)
10
+ * - tertiary: violet supporting accent (af-foundation-tertiary-accent)
11
+ *
12
+ * Semantic families are status-only; do not substitute for accent emphasis.
13
+ */
14
+
15
+ @theme {
16
+ /* --- Neutral roles --- */
17
+ --color-background: var(--color-af-foundation-background);
18
+ --color-surface: var(--color-af-foundation-surface);
19
+ --color-surface-container-low: rgb(
20
+ from var(--color-af-foundation-overlay) r g b /
21
+ 0.04
22
+ );
23
+ --color-surface-container: rgb(
24
+ from var(--color-af-foundation-overlay) r g b /
25
+ 0.06
26
+ );
27
+ --color-surface-container-high: rgb(
28
+ from var(--color-af-foundation-surface) r g b /
29
+ 0.94
30
+ );
31
+ --color-surface-container-highest: rgb(
32
+ from var(--color-af-foundation-overlay) r g b /
33
+ 0.1
34
+ );
35
+ /* on-surface text roles: text-color-role-tokens.css */
36
+ --color-outline: rgb(from var(--color-af-foundation-overlay) r g b / 0.1);
37
+ --color-outline-variant: rgb(
38
+ from var(--color-af-foundation-overlay) r g b /
39
+ 0.18
40
+ );
41
+
42
+ /* --- Primary accent (yellow brand) --- */
43
+ --color-primary: var(--color-af-foundation-accent);
44
+ --color-on-primary: var(--color-af-foundation-accent-ink);
45
+ --color-primary-container: rgb(
46
+ from var(--color-af-foundation-accent) r g b /
47
+ 0.18
48
+ );
49
+ --color-on-primary-container: var(--color-af-foundation-accent-strong);
50
+
51
+ /* --- Secondary accent (cyan; calmer than semantic info and primary) --- */
52
+ --color-secondary: var(--color-af-foundation-secondary-accent);
53
+ --color-on-secondary: var(--color-af-foundation-canvas);
54
+ --color-secondary-container: rgb(
55
+ from var(--color-af-foundation-secondary-accent) r g b /
56
+ 0.12
57
+ );
58
+ --color-on-secondary-container: var(
59
+ --color-af-foundation-secondary-accent-ink
60
+ );
61
+
62
+ /* --- Tertiary accent (violet; calmer than legacy worker chrome) --- */
63
+ --color-tertiary: var(--color-af-foundation-tertiary-accent);
64
+ --color-on-tertiary: var(--color-af-foundation-canvas);
65
+ --color-tertiary-container: rgb(
66
+ from var(--color-af-foundation-tertiary-accent) r g b /
67
+ 0.13
68
+ );
69
+ --color-on-tertiary-container: var(--color-af-foundation-tertiary-accent-ink);
70
+
71
+ /* --- Semantic: success --- */
72
+ --color-success: var(--color-af-foundation-success);
73
+ --color-on-success: var(--color-af-foundation-canvas);
74
+ --color-success-container: rgb(
75
+ from var(--color-af-foundation-success) r g b /
76
+ 0.12
77
+ );
78
+ --color-on-success-container: var(--color-af-foundation-success-ink);
79
+
80
+ /* --- Semantic: warning --- */
81
+ --color-warning: var(--color-af-foundation-warning);
82
+ --color-on-warning: var(--color-af-foundation-canvas);
83
+ --color-warning-container: rgb(
84
+ from var(--color-af-foundation-warning) r g b /
85
+ 0.14
86
+ );
87
+ --color-on-warning-container: var(--color-af-foundation-warning-ink);
88
+
89
+ /* --- Semantic: error --- */
90
+ --color-error: var(--color-af-foundation-danger);
91
+ --color-on-error: var(--color-af-foundation-canvas);
92
+ --color-error-container: rgb(
93
+ from var(--color-af-foundation-danger) r g b /
94
+ 0.18
95
+ );
96
+ --color-on-error-container: var(--color-af-foundation-danger-ink);
97
+
98
+ /* --- Semantic: info --- */
99
+ --color-info: var(--color-af-foundation-info);
100
+ --color-on-info: var(--color-af-foundation-canvas);
101
+ --color-info-container: rgb(
102
+ from var(--color-af-foundation-info) r g b /
103
+ 0.12
104
+ );
105
+ --color-on-info-container: var(--color-af-foundation-info-ink);
106
+
107
+ /* --- Product af-* keys (role-backed; formerly color-role-aliases.css) --- */
108
+ --color-af-background: var(--color-background);
109
+ --color-af-surface: var(--color-surface);
110
+ --color-af-surface-subtle: var(--color-surface-container-low);
111
+ --color-af-surface-raised: var(--color-surface-container-high);
112
+ --color-af-border: var(--color-outline);
113
+ --color-af-border-strong: var(--color-outline-variant);
114
+ --color-af-text: var(--color-on-surface);
115
+ --color-af-text-muted: var(--color-on-surface-variant);
116
+ --color-af-text-subtle: var(--color-on-surface-subtle);
117
+ --color-af-text-disabled: var(--color-on-surface-disabled);
118
+ --color-af-text-inverse: var(--color-on-inverse);
119
+ --color-af-code-ink: var(--color-code);
120
+ --color-af-accent: var(--color-primary);
121
+ --color-af-accent-hover: var(--color-on-primary-container);
122
+ --color-af-accent-surface: var(--color-primary-container);
123
+ --color-af-accent-border: var(--color-primary);
124
+ --color-af-on-accent: var(--color-on-primary);
125
+ --color-af-success: var(--color-success);
126
+ --color-af-success-surface: var(--color-success-container);
127
+ --color-af-success-text: var(--color-on-success-container);
128
+ --color-af-on-success: var(--color-on-success);
129
+ --color-af-warning: var(--color-warning);
130
+ --color-af-warning-surface: var(--color-warning-container);
131
+ --color-af-warning-text: var(--color-on-warning-container);
132
+ --color-af-on-warning: var(--color-on-warning);
133
+ --color-af-danger: var(--color-error);
134
+ --color-af-danger-surface: var(--color-error-container);
135
+ --color-af-danger-text: var(--color-on-error-container);
136
+ --color-af-on-danger: var(--color-on-error);
137
+ --color-af-info: var(--color-info);
138
+ --color-af-info-surface: var(--color-info-container);
139
+ --color-af-info-text: var(--color-on-info-container);
140
+ --color-af-on-info: var(--color-on-info);
141
+ --color-af-worker: var(--color-tertiary);
142
+ --color-af-worker-surface: var(--color-tertiary-container);
143
+ --color-af-worker-text: var(--color-on-tertiary-container);
144
+
145
+ /* Semantic border and overlay tokens for feedback and loading surfaces */
146
+ --color-af-overlay: rgb(from var(--color-af-foundation-overlay) r g b / 0.08);
147
+ --color-af-success-border: rgb(
148
+ from var(--color-af-foundation-success) r g b /
149
+ 0.28
150
+ );
151
+ --color-af-warning-border: rgb(
152
+ from var(--color-af-foundation-warning) r g b /
153
+ 0.3
154
+ );
155
+ --color-af-danger-border: rgb(
156
+ from var(--color-af-foundation-danger) r g b /
157
+ 0.3
158
+ );
159
+ --color-af-info-border: rgb(
160
+ from var(--color-af-foundation-info) r g b /
161
+ 0.28
162
+ );
163
+ }
@@ -0,0 +1,27 @@
1
+ /*
2
+ * Dashboard layout spacing scale (4px grid, Material-aligned rhythm).
3
+ *
4
+ * Semantic layout spacing roles map to Tailwind gap/padding utilities:
5
+ * gap-layout-tight, p-layout-inset-dialog, etc.
6
+ *
7
+ * Prefer layout primitives and dashboard-layout.ts constants in TSX;
8
+ * use raw Tailwind spacing utilities only for one-off composition (US-007).
9
+ */
10
+
11
+ @theme {
12
+ /* Vertical / horizontal gaps between related elements */
13
+ --spacing-layout-tight: 0.5rem;
14
+ --spacing-layout-element: 0.75rem;
15
+ --spacing-layout-group: 1rem;
16
+ --spacing-layout-block: 1.25rem;
17
+ --spacing-layout-section: 1.5rem;
18
+ --spacing-layout-page: 2rem;
19
+
20
+ /* Insets for recurring shells */
21
+ --spacing-layout-inset-card: 1rem;
22
+ --spacing-layout-inset-card-relaxed: 1.25rem;
23
+ --spacing-layout-inset-dialog: 1.5rem;
24
+
25
+ /* Card elevation for framed widget shells */
26
+ --shadow-af-card: 0 12px 28px rgb(from var(--color-af-shadow) r g b / 0.2);
27
+ }
@@ -0,0 +1,29 @@
1
+ /*
2
+ * Text color roles (Factory Dark baseline).
3
+ *
4
+ * Complements surface/accent/semantic fill roles in color-role-tokens.css.
5
+ * Use utilities such as text-on-surface, text-on-inverse, text-on-primary-container.
6
+ */
7
+
8
+ @theme {
9
+ /* High- and medium-emphasis text on neutral surfaces */
10
+ --color-on-surface: var(--color-af-foundation-ink);
11
+ --color-on-surface-variant: rgb(
12
+ from var(--color-af-foundation-ink) r g b /
13
+ 0.78
14
+ );
15
+ --color-on-surface-subtle: rgb(
16
+ from var(--color-af-foundation-ink) r g b /
17
+ 0.58
18
+ );
19
+ --color-on-surface-disabled: rgb(
20
+ from var(--color-af-foundation-ink) r g b /
21
+ 0.42
22
+ );
23
+
24
+ /* Inverse / on-dark fills (accent chips, inverted tooltips) */
25
+ --color-on-inverse: var(--color-af-foundation-canvas);
26
+
27
+ /* Product extension: monospace and code blocks beside Material body roles */
28
+ --color-code: var(--color-af-foundation-code-ink);
29
+ }
@@ -0,0 +1,72 @@
1
+ /*
2
+ * Material 3 typography scale (Factory Dark baseline).
3
+ *
4
+ * Role families: display, headline, title, body, label (+ product code extension).
5
+ * Tailwind utilities: text-display-medium, text-body-small, type-title-large, etc.
6
+ *
7
+ * Intent follows Material applying-type guidance; sizes are tuned for dashboard density.
8
+ */
9
+
10
+ @theme {
11
+ --font-sans: "IBM Plex Sans", "Segoe UI", sans-serif;
12
+ --font-display: "Space Grotesk", "Segoe UI", sans-serif;
13
+ --font-mono: "IBM Plex Mono", "Consolas", monospace;
14
+
15
+ /* --- Display (hero / high-emphasis numeric) --- */
16
+ --text-display-large: clamp(2.25rem, 5vw, 3.75rem);
17
+ --text-display-large--line-height: 1;
18
+ --text-display-large--letter-spacing: 0;
19
+ --text-display-medium: clamp(1.85rem, 4vw, 3rem);
20
+ --text-display-medium--line-height: 1;
21
+ --text-display-medium--letter-spacing: 0;
22
+ --text-display-small: 2rem;
23
+ --text-display-small--line-height: 1.1;
24
+ --text-display-small--letter-spacing: 0;
25
+
26
+ /* --- Headline (prominent short headings) --- */
27
+ --text-headline-large: 1.5rem;
28
+ --text-headline-large--line-height: 1.2;
29
+ --text-headline-large--letter-spacing: 0;
30
+ --text-headline-medium: 1.25rem;
31
+ --text-headline-medium--line-height: 1.25;
32
+ --text-headline-small: 1.125rem;
33
+ --text-headline-small--line-height: 1.3;
34
+
35
+ /* --- Title (page / section / subsection wayfinding) --- */
36
+ --text-title-large: 1.02rem;
37
+ --text-title-large--line-height: 1.25;
38
+ --text-title-large--font-weight: 600;
39
+ --text-title-medium: 0.95rem;
40
+ --text-title-medium--line-height: 1.3;
41
+ --text-title-medium--font-weight: 600;
42
+ --text-title-small: 0.875rem;
43
+ --text-title-small--line-height: 1.35;
44
+ --text-title-small--font-weight: 600;
45
+
46
+ /* --- Body (long-form reading) --- */
47
+ --text-body-large: 1rem;
48
+ --text-body-large--line-height: 1.55;
49
+ --text-body-medium: 0.9rem;
50
+ --text-body-medium--line-height: 1.55;
51
+ --text-body-small: 0.8rem;
52
+ --text-body-small--line-height: 1.45;
53
+
54
+ /* --- Label (controls, compact annotations) --- */
55
+ --text-label-large: 0.875rem;
56
+ --text-label-large--line-height: 1.35;
57
+ --text-label-large--font-weight: 600;
58
+ --text-label-medium: 0.8rem;
59
+ --text-label-medium--line-height: 1.35;
60
+ --text-label-medium--font-weight: 700;
61
+ --text-label-medium--letter-spacing: 0.08em;
62
+ --text-label-small: 0.75rem;
63
+ --text-label-small--line-height: 1.3;
64
+ --text-label-small--font-weight: 700;
65
+ --text-label-small--letter-spacing: 0.1em;
66
+
67
+ /* --- Code (product extension, monospace) --- */
68
+ --text-code-medium: 0.9rem;
69
+ --text-code-medium--line-height: 1.55;
70
+ --text-code-small: 0.8rem;
71
+ --text-code-small--line-height: 1.45;
72
+ }
@@ -0,0 +1,73 @@
1
+ /*
2
+ * Composed typography utilities pairing Material scale roles with text color roles.
3
+ */
4
+
5
+ @layer components {
6
+ .type-display-large {
7
+ @apply font-display text-display-large;
8
+ }
9
+
10
+ .type-display-medium {
11
+ @apply font-display text-display-medium;
12
+ }
13
+
14
+ .type-display-small {
15
+ @apply font-display text-display-small;
16
+ }
17
+
18
+ .type-headline-large {
19
+ @apply font-sans text-headline-large font-semibold;
20
+ }
21
+
22
+ .type-headline-medium {
23
+ @apply font-sans text-headline-medium font-semibold;
24
+ }
25
+
26
+ .type-headline-small {
27
+ @apply font-sans text-headline-small font-semibold;
28
+ }
29
+
30
+ .type-title-large {
31
+ @apply font-sans text-title-large;
32
+ }
33
+
34
+ .type-title-medium {
35
+ @apply font-sans text-title-medium;
36
+ }
37
+
38
+ .type-title-small {
39
+ @apply font-sans text-title-small;
40
+ }
41
+
42
+ .type-body-large {
43
+ @apply font-sans text-body-large;
44
+ }
45
+
46
+ .type-body-medium {
47
+ @apply font-sans text-body-medium;
48
+ }
49
+
50
+ .type-body-small {
51
+ @apply font-sans text-body-small;
52
+ }
53
+
54
+ .type-label-large {
55
+ @apply font-sans text-label-large uppercase;
56
+ }
57
+
58
+ .type-label-medium {
59
+ @apply font-sans text-label-medium uppercase;
60
+ }
61
+
62
+ .type-label-small {
63
+ @apply font-sans text-label-small uppercase;
64
+ }
65
+
66
+ .type-code-medium {
67
+ @apply font-mono text-code-medium;
68
+ }
69
+
70
+ .type-code-small {
71
+ @apply font-mono text-code-small;
72
+ }
73
+ }
@@ -0,0 +1,53 @@
1
+ /*
2
+ * Domain-free typography role classes for package consumers.
3
+ */
4
+
5
+ @layer components {
6
+ .af-page-heading {
7
+ @apply font-display text-display-medium text-on-surface;
8
+ }
9
+
10
+ .af-section-heading {
11
+ @apply text-title-large uppercase text-on-surface;
12
+ }
13
+
14
+ .af-body-text {
15
+ @apply text-body-medium text-on-surface-variant;
16
+ }
17
+
18
+ .af-supporting-text {
19
+ @apply text-body-small text-on-surface-variant;
20
+ }
21
+
22
+ .af-supporting-label {
23
+ @apply text-label-medium uppercase text-on-surface-subtle;
24
+ }
25
+
26
+ .af-body-code {
27
+ @apply font-mono text-code-medium text-code;
28
+ }
29
+
30
+ .af-supporting-code {
31
+ @apply font-mono text-code-small text-code;
32
+ }
33
+
34
+ .af-muted-text {
35
+ @apply text-body-medium text-on-surface-subtle;
36
+ }
37
+
38
+ .af-caption-text {
39
+ @apply text-label-small text-on-surface-subtle;
40
+ }
41
+
42
+ .af-dense-body-text {
43
+ @apply text-body-small leading-tight text-on-surface-variant;
44
+ }
45
+
46
+ .af-text-truncate {
47
+ @apply block min-w-0 max-w-full truncate whitespace-nowrap;
48
+ }
49
+
50
+ .af-text-wrap {
51
+ @apply min-w-0 break-words [overflow-wrap:anywhere];
52
+ }
53
+ }
package/src/styles.css ADDED
@@ -0,0 +1,32 @@
1
+ /*
2
+ * @you-agent-factory/components package styles entrypoint.
3
+ * Shared role, palette, typography, and layout tokens for component consumers.
4
+ */
5
+
6
+ @import "./styles/color-palette-presets.css";
7
+ @import "./styles/color-role-tokens.css";
8
+ @import "./styles/text-color-role-tokens.css";
9
+ @import "./styles/typography-role-tokens.css";
10
+ @import "./styles/typography-role-utilities.css";
11
+ @import "./styles/typography-roles.css";
12
+ @import "./styles/layout-role-tokens.css";
13
+
14
+ @keyframes overlay-collapsible-down {
15
+ from {
16
+ height: 0;
17
+ }
18
+
19
+ to {
20
+ height: var(--radix-collapsible-content-height);
21
+ }
22
+ }
23
+
24
+ @keyframes overlay-collapsible-up {
25
+ from {
26
+ height: var(--radix-collapsible-content-height);
27
+ }
28
+
29
+ to {
30
+ height: 0;
31
+ }
32
+ }
@@ -0,0 +1,13 @@
1
+ /** Stable category path for `@you-agent-factory/components/testing`. */
2
+ export const COMPONENTS_CATEGORY = "testing" as const;
3
+
4
+ export type ComponentsCategory = typeof COMPONENTS_CATEGORY;
5
+
6
+ export {
7
+ render,
8
+ renderPackageComponent,
9
+ screen,
10
+ userEvent,
11
+ waitFor,
12
+ within,
13
+ } from "./render";
@@ -0,0 +1,16 @@
1
+ import {
2
+ render,
3
+ type RenderOptions,
4
+ type RenderResult,
5
+ } from "@testing-library/react";
6
+ import type { ReactElement } from "react";
7
+
8
+ export function renderPackageComponent(
9
+ ui: ReactElement,
10
+ options?: Omit<RenderOptions, "wrapper">,
11
+ ): RenderResult {
12
+ return render(ui, options);
13
+ }
14
+
15
+ export { fireEvent, render, screen, within, waitFor } from "@testing-library/react";
16
+ export { default as userEvent } from "@testing-library/user-event";
@@ -0,0 +1,4 @@
1
+ /** Stable category path for `@you-agent-factory/components/tokens`. */
2
+ export const COMPONENTS_CATEGORY = "tokens" as const;
3
+
4
+ export type ComponentsCategory = typeof COMPONENTS_CATEGORY;
@@ -0,0 +1,5 @@
1
+ export function cn(
2
+ ...classes: Array<false | null | string | undefined>
3
+ ): string {
4
+ return classes.filter(Boolean).join(" ");
5
+ }
@@ -0,0 +1,6 @@
1
+ /** Stable category path for `@you-agent-factory/components/utilities`. */
2
+ export const COMPONENTS_CATEGORY = "utilities" as const;
3
+
4
+ export type ComponentsCategory = typeof COMPONENTS_CATEGORY;
5
+
6
+ export { cn } from "./cn";