@sovereignfs/ui 0.21.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 (141) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE +24 -0
  3. package/dist/Avatar.module.css +38 -0
  4. package/dist/Badge.module.css +88 -0
  5. package/dist/Button.module.css +77 -0
  6. package/dist/Card.module.css +34 -0
  7. package/dist/Dialog.module.css +188 -0
  8. package/dist/Drawer.module.css +30 -0
  9. package/dist/EmptyState.module.css +27 -0
  10. package/dist/FormField.module.css +28 -0
  11. package/dist/Icon.module.css +22 -0
  12. package/dist/Input.module.css +37 -0
  13. package/dist/NavTabs.module.css +48 -0
  14. package/dist/PageHeader.module.css +32 -0
  15. package/dist/Popover.module.css +44 -0
  16. package/dist/SegmentedControl.module.css +53 -0
  17. package/dist/Select.module.css +69 -0
  18. package/dist/Spinner.module.css +39 -0
  19. package/dist/SystemBanner.module.css +67 -0
  20. package/dist/Tabs.module.css +49 -0
  21. package/dist/Toast.module.css +130 -0
  22. package/dist/Toggle.module.css +52 -0
  23. package/dist/Tooltip.module.css +51 -0
  24. package/dist/index.d.ts +327 -0
  25. package/dist/index.js +1370 -0
  26. package/dist/tokens/primitives.css +99 -0
  27. package/dist/tokens/semantic.css +111 -0
  28. package/dist/tokens.css +5 -0
  29. package/package.json +50 -0
  30. package/src/components/Avatar/Avatar.module.css +38 -0
  31. package/src/components/Avatar/Avatar.tsx +42 -0
  32. package/src/components/Badge/Badge.module.css +88 -0
  33. package/src/components/Badge/Badge.stories.tsx +118 -0
  34. package/src/components/Badge/Badge.tsx +59 -0
  35. package/src/components/Badge/__tests__/Badge.test.tsx +64 -0
  36. package/src/components/Button/Button.module.css +77 -0
  37. package/src/components/Button/Button.stories.tsx +76 -0
  38. package/src/components/Button/Button.tsx +36 -0
  39. package/src/components/Button/__tests__/Button.test.tsx +37 -0
  40. package/src/components/Card/Card.module.css +34 -0
  41. package/src/components/Card/Card.tsx +34 -0
  42. package/src/components/Dialog/Dialog.module.css +188 -0
  43. package/src/components/Dialog/Dialog.stories.tsx +97 -0
  44. package/src/components/Dialog/Dialog.tsx +137 -0
  45. package/src/components/Dialog/__tests__/Dialog.test.tsx +73 -0
  46. package/src/components/Drawer/Drawer.module.css +30 -0
  47. package/src/components/Drawer/Drawer.stories.tsx +88 -0
  48. package/src/components/Drawer/Drawer.tsx +103 -0
  49. package/src/components/Drawer/__tests__/Drawer.test.tsx +56 -0
  50. package/src/components/EmptyState/EmptyState.module.css +27 -0
  51. package/src/components/EmptyState/EmptyState.tsx +27 -0
  52. package/src/components/FormField/FormField.module.css +28 -0
  53. package/src/components/FormField/FormField.tsx +53 -0
  54. package/src/components/Icon/Icon.module.css +22 -0
  55. package/src/components/Icon/Icon.stories.tsx +94 -0
  56. package/src/components/Icon/Icon.tsx +43 -0
  57. package/src/components/Icon/__tests__/Icon.test.tsx +40 -0
  58. package/src/components/Icon/icons/activity.tsx +20 -0
  59. package/src/components/Icon/icons/alert-triangle.tsx +22 -0
  60. package/src/components/Icon/icons/bell.tsx +21 -0
  61. package/src/components/Icon/icons/check.tsx +20 -0
  62. package/src/components/Icon/icons/chevron-down.tsx +20 -0
  63. package/src/components/Icon/icons/chevron-left.tsx +20 -0
  64. package/src/components/Icon/icons/chevron-right.tsx +20 -0
  65. package/src/components/Icon/icons/chevron-up.tsx +20 -0
  66. package/src/components/Icon/icons/eye-off.tsx +23 -0
  67. package/src/components/Icon/icons/eye.tsx +21 -0
  68. package/src/components/Icon/icons/grid-2x2.tsx +22 -0
  69. package/src/components/Icon/icons/house.tsx +21 -0
  70. package/src/components/Icon/icons/index.ts +122 -0
  71. package/src/components/Icon/icons/info.tsx +22 -0
  72. package/src/components/Icon/icons/lock.tsx +21 -0
  73. package/src/components/Icon/icons/log-out.tsx +22 -0
  74. package/src/components/Icon/icons/mail.tsx +21 -0
  75. package/src/components/Icon/icons/package.tsx +23 -0
  76. package/src/components/Icon/icons/pencil.tsx +21 -0
  77. package/src/components/Icon/icons/plus.tsx +21 -0
  78. package/src/components/Icon/icons/rotate-ccw.tsx +21 -0
  79. package/src/components/Icon/icons/search.tsx +21 -0
  80. package/src/components/Icon/icons/settings.tsx +21 -0
  81. package/src/components/Icon/icons/shield.tsx +20 -0
  82. package/src/components/Icon/icons/sliders-horizontal.tsx +28 -0
  83. package/src/components/Icon/icons/terminal.tsx +19 -0
  84. package/src/components/Icon/icons/trash-2.tsx +24 -0
  85. package/src/components/Icon/icons/user.tsx +21 -0
  86. package/src/components/Icon/icons/x.tsx +21 -0
  87. package/src/components/Input/Input.module.css +37 -0
  88. package/src/components/Input/Input.stories.tsx +86 -0
  89. package/src/components/Input/Input.tsx +14 -0
  90. package/src/components/Input/__tests__/Input.test.tsx +22 -0
  91. package/src/components/NavTabs/NavTabs.module.css +48 -0
  92. package/src/components/NavTabs/NavTabs.tsx +33 -0
  93. package/src/components/PageHeader/PageHeader.module.css +32 -0
  94. package/src/components/PageHeader/PageHeader.tsx +21 -0
  95. package/src/components/Popover/Popover.module.css +44 -0
  96. package/src/components/Popover/Popover.stories.tsx +232 -0
  97. package/src/components/Popover/Popover.tsx +75 -0
  98. package/src/components/Popover/__tests__/Popover.test.tsx +98 -0
  99. package/src/components/SegmentedControl/SegmentedControl.module.css +53 -0
  100. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +118 -0
  101. package/src/components/SegmentedControl/SegmentedControl.tsx +56 -0
  102. package/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx +63 -0
  103. package/src/components/Select/Select.module.css +69 -0
  104. package/src/components/Select/Select.stories.tsx +115 -0
  105. package/src/components/Select/Select.tsx +40 -0
  106. package/src/components/Select/__tests__/Select.test.tsx +59 -0
  107. package/src/components/Spinner/Spinner.module.css +39 -0
  108. package/src/components/Spinner/Spinner.tsx +23 -0
  109. package/src/components/SystemBanner/SystemBanner.module.css +67 -0
  110. package/src/components/SystemBanner/SystemBanner.stories.tsx +86 -0
  111. package/src/components/SystemBanner/SystemBanner.tsx +50 -0
  112. package/src/components/SystemBanner/__tests__/SystemBanner.test.tsx +50 -0
  113. package/src/components/Tabs/Tabs.module.css +49 -0
  114. package/src/components/Tabs/Tabs.stories.tsx +100 -0
  115. package/src/components/Tabs/Tabs.tsx +46 -0
  116. package/src/components/Tabs/__tests__/Tabs.test.tsx +45 -0
  117. package/src/components/Toast/Toast.module.css +130 -0
  118. package/src/components/Toast/Toast.stories.tsx +191 -0
  119. package/src/components/Toast/Toast.tsx +139 -0
  120. package/src/components/Toggle/Toggle.module.css +52 -0
  121. package/src/components/Toggle/Toggle.stories.tsx +95 -0
  122. package/src/components/Toggle/Toggle.tsx +39 -0
  123. package/src/components/Toggle/__tests__/Toggle.test.tsx +47 -0
  124. package/src/components/Tooltip/Tooltip.module.css +51 -0
  125. package/src/components/Tooltip/Tooltip.tsx +30 -0
  126. package/src/css-modules.d.ts +4 -0
  127. package/src/index.ts +45 -0
  128. package/src/stories/Avatar.stories.tsx +44 -0
  129. package/src/stories/Card.stories.tsx +35 -0
  130. package/src/stories/DesignSystemOverview.stories.tsx +1683 -0
  131. package/src/stories/EmptyState.stories.tsx +33 -0
  132. package/src/stories/FormField.stories.tsx +47 -0
  133. package/src/stories/MobilePatterns.stories.tsx +1285 -0
  134. package/src/stories/NavTabs.stories.tsx +35 -0
  135. package/src/stories/PageHeader.stories.tsx +31 -0
  136. package/src/stories/Spinner.stories.tsx +25 -0
  137. package/src/stories/TokenGallery.stories.tsx +355 -0
  138. package/src/stories/Tooltip.stories.tsx +59 -0
  139. package/src/tokens/primitives.css +99 -0
  140. package/src/tokens/semantic.css +111 -0
  141. package/src/tokens.css +5 -0
@@ -0,0 +1,94 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { ICONS, type IconName } from './icons';
3
+ import { Icon } from './Icon';
4
+
5
+ const ALL_NAMES = Object.keys(ICONS) as IconName[];
6
+
7
+ const meta = {
8
+ title: 'Components/Icon',
9
+ component: Icon,
10
+ parameters: {
11
+ layout: 'centered',
12
+ docs: {
13
+ description: {
14
+ component:
15
+ 'SVG icon primitive. Icons are either **decorative** (`aria-hidden`) or **meaningful** (`aria-label`). Size is controlled by `--sv-icon-size-*` tokens.',
16
+ },
17
+ },
18
+ },
19
+ argTypes: {
20
+ name: { control: 'select', options: ALL_NAMES },
21
+ size: { control: 'select', options: ['sm', 'md', 'lg'] },
22
+ },
23
+ } satisfies Meta<typeof Icon>;
24
+
25
+ export default meta;
26
+ type Story = StoryObj<typeof meta>;
27
+
28
+ // ---------------------------------------------------------------------------
29
+
30
+ export const Decorative: Story = {
31
+ args: { name: 'house', size: 'md', 'aria-hidden': true },
32
+ };
33
+
34
+ export const Meaningful: Story = {
35
+ args: { name: 'settings', size: 'md', 'aria-label': 'Open settings' },
36
+ };
37
+
38
+ export const SizeSmall: Story = { args: { name: 'bell', size: 'sm', 'aria-hidden': true } };
39
+ export const SizeMedium: Story = { args: { name: 'bell', size: 'md', 'aria-hidden': true } };
40
+ export const SizeLarge: Story = { args: { name: 'bell', size: 'lg', 'aria-hidden': true } };
41
+
42
+ /** Full icon grid — every name across all three sizes. */
43
+ export const AllIcons: Story = {
44
+ parameters: { layout: 'padded' },
45
+ args: { name: 'house', 'aria-hidden': true },
46
+ render: (_args) => (
47
+ <div>
48
+ {(['sm', 'md', 'lg'] as const).map((sz) => (
49
+ <section key={sz} style={{ marginBottom: 32 }}>
50
+ <h3
51
+ style={{
52
+ fontFamily: 'system-ui',
53
+ fontSize: 13,
54
+ fontWeight: 600,
55
+ color: 'var(--sv-color-text-muted)',
56
+ textTransform: 'uppercase',
57
+ letterSpacing: '0.08em',
58
+ marginBottom: 12,
59
+ }}
60
+ >
61
+ Size: {sz}
62
+ </h3>
63
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: 16 }}>
64
+ {ALL_NAMES.map((name) => (
65
+ <div
66
+ key={name}
67
+ style={{
68
+ display: 'flex',
69
+ flexDirection: 'column',
70
+ alignItems: 'center',
71
+ gap: 4,
72
+ width: 64,
73
+ }}
74
+ >
75
+ <Icon name={name} size={sz} aria-hidden />
76
+ <span
77
+ style={{
78
+ fontFamily: 'monospace',
79
+ fontSize: 10,
80
+ color: 'var(--sv-color-text-muted)',
81
+ textAlign: 'center',
82
+ wordBreak: 'break-word',
83
+ }}
84
+ >
85
+ {name}
86
+ </span>
87
+ </div>
88
+ ))}
89
+ </div>
90
+ </section>
91
+ ))}
92
+ </div>
93
+ ),
94
+ };
@@ -0,0 +1,43 @@
1
+ import { ICONS, type IconName } from './icons';
2
+ import styles from './Icon.module.css';
3
+
4
+ export type { IconName };
5
+
6
+ /** Decorative icon — visually meaningful but described by surrounding text. */
7
+ type DecorativeProps = { 'aria-hidden': true; 'aria-label'?: never };
8
+ /** Meaningful icon — standalone affordance that requires a label for screen readers. */
9
+ type MeaningfulProps = { 'aria-label': string; 'aria-hidden'?: never };
10
+
11
+ export interface IconProps {
12
+ /** Name of the icon from the curated Sovereign set. */
13
+ name: IconName;
14
+ /** Visual size. Defaults to `"md"` (20 px). */
15
+ size?: 'sm' | 'md' | 'lg';
16
+ /** Additional CSS class applied to the SVG element. */
17
+ className?: string;
18
+ }
19
+
20
+ /**
21
+ * `<Icon>` — the Sovereign design system icon primitive.
22
+ *
23
+ * Icons are either **decorative** (described by surrounding text — pass `aria-hidden`)
24
+ * or **meaningful** (standalone affordance — pass `aria-label`):
25
+ *
26
+ * ```tsx
27
+ * <Icon name="house" aria-hidden /> // decorative
28
+ * <Icon name="log-out" aria-label="Sign out" /> // meaningful
29
+ * ```
30
+ *
31
+ * Color follows `currentColor` so an icon automatically inherits the text color
32
+ * of its container and recolors with theme changes — no extra CSS required.
33
+ */
34
+ export function Icon({
35
+ name,
36
+ size = 'md',
37
+ className,
38
+ ...aria
39
+ }: IconProps & (DecorativeProps | MeaningfulProps)) {
40
+ const Svg = ICONS[name];
41
+ const classes = [styles.root, styles[size], className].filter(Boolean).join(' ');
42
+ return <Svg className={classes} role={aria['aria-label'] ? 'img' : undefined} {...aria} />;
43
+ }
@@ -0,0 +1,40 @@
1
+ // @vitest-environment jsdom
2
+ import { render, screen } from '@testing-library/react';
3
+ import { describe, expect, it } from 'vitest';
4
+ import { Icon } from '../Icon';
5
+
6
+ describe('Icon', () => {
7
+ it('renders an SVG element', () => {
8
+ const { container } = render(<Icon name="house" aria-hidden />);
9
+ expect(container.querySelector('svg')).toBeTruthy();
10
+ });
11
+
12
+ it('applies aria-hidden for decorative icons', () => {
13
+ const { container } = render(<Icon name="house" aria-hidden />);
14
+ expect(container.querySelector('svg')?.getAttribute('aria-hidden')).toBe('true');
15
+ });
16
+
17
+ it('applies aria-label and role="img" for meaningful icons', () => {
18
+ render(<Icon name="log-out" aria-label="Sign out" />);
19
+ const svg = screen.getByRole('img', { name: 'Sign out' });
20
+ expect(svg).toBeTruthy();
21
+ });
22
+
23
+ it('defaults to md size', () => {
24
+ const { container } = render(<Icon name="settings" aria-hidden />);
25
+ const svg = container.querySelector('svg');
26
+ // SVG className is an SVGAnimatedString in the DOM — use getAttribute('class').
27
+ // CSS Modules are identity-mapped in the test environment, so 'md' is literal.
28
+ expect(svg?.getAttribute('class')).toContain('md');
29
+ });
30
+
31
+ it('applies the requested size class', () => {
32
+ const { container } = render(<Icon name="settings" size="lg" aria-hidden />);
33
+ expect(container.querySelector('svg')?.getAttribute('class')).toContain('lg');
34
+ });
35
+
36
+ it('merges an additional className', () => {
37
+ const { container } = render(<Icon name="x" aria-hidden className="my-class" />);
38
+ expect(container.querySelector('svg')?.getAttribute('class')).toContain('my-class');
39
+ });
40
+ });
@@ -0,0 +1,20 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function ActivityIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2" />
18
+ </svg>
19
+ );
20
+ }
@@ -0,0 +1,22 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function AlertTriangleIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" />
18
+ <path d="M12 9v4" />
19
+ <path d="M12 17h.01" />
20
+ </svg>
21
+ );
22
+ }
@@ -0,0 +1,21 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function BellIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M10.268 21a2 2 0 0 0 3.464 0" />
18
+ <path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326" />
19
+ </svg>
20
+ );
21
+ }
@@ -0,0 +1,20 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function CheckIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M20 6 9 17l-5-5" />
18
+ </svg>
19
+ );
20
+ }
@@ -0,0 +1,20 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function ChevronDownIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="m6 9 6 6 6-6" />
18
+ </svg>
19
+ );
20
+ }
@@ -0,0 +1,20 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function ChevronLeftIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="m15 18-6-6 6-6" />
18
+ </svg>
19
+ );
20
+ }
@@ -0,0 +1,20 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function ChevronRightIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="m9 18 6-6-6-6" />
18
+ </svg>
19
+ );
20
+ }
@@ -0,0 +1,20 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function ChevronUpIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="m18 15-6-6-6 6" />
18
+ </svg>
19
+ );
20
+ }
@@ -0,0 +1,23 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function EyeOffIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49" />
18
+ <path d="M14.084 14.158a3 3 0 0 1-4.242-4.242" />
19
+ <path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143" />
20
+ <path d="m2 2 20 20" />
21
+ </svg>
22
+ );
23
+ }
@@ -0,0 +1,21 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function EyeIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0" />
18
+ <circle cx="12" cy="12" r="3" />
19
+ </svg>
20
+ );
21
+ }
@@ -0,0 +1,22 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function Grid2x2Icon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M12 3v18" />
18
+ <path d="M3 12h18" />
19
+ <rect x="3" y="3" width="18" height="18" rx="2" />
20
+ </svg>
21
+ );
22
+ }
@@ -0,0 +1,21 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function HouseIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8" />
18
+ <path d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
19
+ </svg>
20
+ );
21
+ }
@@ -0,0 +1,122 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ import type { ReactElement, SVGProps } from 'react';
3
+ import { HouseIcon } from './house';
4
+ import { SettingsIcon } from './settings';
5
+ import { LogOutIcon } from './log-out';
6
+ import { ChevronRightIcon } from './chevron-right';
7
+ import { ChevronLeftIcon } from './chevron-left';
8
+ import { ChevronDownIcon } from './chevron-down';
9
+ import { ChevronUpIcon } from './chevron-up';
10
+ import { XIcon } from './x';
11
+ import { CheckIcon } from './check';
12
+ import { PlusIcon } from './plus';
13
+ import { Trash2Icon } from './trash-2';
14
+ import { PencilIcon } from './pencil';
15
+ import { RotateCcwIcon } from './rotate-ccw';
16
+ import { SearchIcon } from './search';
17
+ import { UserIcon } from './user';
18
+ import { ShieldIcon } from './shield';
19
+ import { LockIcon } from './lock';
20
+ import { EyeIcon } from './eye';
21
+ import { EyeOffIcon } from './eye-off';
22
+ import { MailIcon } from './mail';
23
+ import { BellIcon } from './bell';
24
+ import { ActivityIcon } from './activity';
25
+ import { PackageIcon } from './package';
26
+ import { Grid2x2Icon } from './grid-2x2';
27
+ import { InfoIcon } from './info';
28
+ import { AlertTriangleIcon } from './alert-triangle';
29
+ import { SlidersHorizontalIcon } from './sliders-horizontal';
30
+ import { TerminalIcon } from './terminal';
31
+
32
+ export type IconName =
33
+ | 'house'
34
+ | 'settings'
35
+ | 'log-out'
36
+ | 'chevron-right'
37
+ | 'chevron-left'
38
+ | 'chevron-down'
39
+ | 'chevron-up'
40
+ | 'x'
41
+ | 'check'
42
+ | 'plus'
43
+ | 'trash-2'
44
+ | 'pencil'
45
+ | 'rotate-ccw'
46
+ | 'search'
47
+ | 'user'
48
+ | 'shield'
49
+ | 'lock'
50
+ | 'eye'
51
+ | 'eye-off'
52
+ | 'mail'
53
+ | 'bell'
54
+ | 'activity'
55
+ | 'package'
56
+ | 'grid-2x2'
57
+ | 'info'
58
+ | 'alert-triangle'
59
+ | 'sliders-horizontal'
60
+ | 'terminal';
61
+
62
+ export type IconComponent = (props: SVGProps<SVGSVGElement>) => ReactElement;
63
+
64
+ export const ICONS: Record<IconName, IconComponent> = {
65
+ house: HouseIcon,
66
+ settings: SettingsIcon,
67
+ 'log-out': LogOutIcon,
68
+ 'chevron-right': ChevronRightIcon,
69
+ 'chevron-left': ChevronLeftIcon,
70
+ 'chevron-down': ChevronDownIcon,
71
+ 'chevron-up': ChevronUpIcon,
72
+ x: XIcon,
73
+ check: CheckIcon,
74
+ plus: PlusIcon,
75
+ 'trash-2': Trash2Icon,
76
+ pencil: PencilIcon,
77
+ 'rotate-ccw': RotateCcwIcon,
78
+ search: SearchIcon,
79
+ user: UserIcon,
80
+ shield: ShieldIcon,
81
+ lock: LockIcon,
82
+ eye: EyeIcon,
83
+ 'eye-off': EyeOffIcon,
84
+ mail: MailIcon,
85
+ bell: BellIcon,
86
+ activity: ActivityIcon,
87
+ package: PackageIcon,
88
+ 'grid-2x2': Grid2x2Icon,
89
+ info: InfoIcon,
90
+ 'alert-triangle': AlertTriangleIcon,
91
+ 'sliders-horizontal': SlidersHorizontalIcon,
92
+ terminal: TerminalIcon,
93
+ };
94
+
95
+ export { HouseIcon } from './house';
96
+ export { SettingsIcon } from './settings';
97
+ export { LogOutIcon } from './log-out';
98
+ export { ChevronRightIcon } from './chevron-right';
99
+ export { ChevronLeftIcon } from './chevron-left';
100
+ export { ChevronDownIcon } from './chevron-down';
101
+ export { ChevronUpIcon } from './chevron-up';
102
+ export { XIcon } from './x';
103
+ export { CheckIcon } from './check';
104
+ export { PlusIcon } from './plus';
105
+ export { Trash2Icon } from './trash-2';
106
+ export { PencilIcon } from './pencil';
107
+ export { RotateCcwIcon } from './rotate-ccw';
108
+ export { SearchIcon } from './search';
109
+ export { UserIcon } from './user';
110
+ export { ShieldIcon } from './shield';
111
+ export { LockIcon } from './lock';
112
+ export { EyeIcon } from './eye';
113
+ export { EyeOffIcon } from './eye-off';
114
+ export { MailIcon } from './mail';
115
+ export { BellIcon } from './bell';
116
+ export { ActivityIcon } from './activity';
117
+ export { PackageIcon } from './package';
118
+ export { Grid2x2Icon } from './grid-2x2';
119
+ export { InfoIcon } from './info';
120
+ export { AlertTriangleIcon } from './alert-triangle';
121
+ export { SlidersHorizontalIcon } from './sliders-horizontal';
122
+ export { TerminalIcon } from './terminal';
@@ -0,0 +1,22 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function InfoIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <circle cx="12" cy="12" r="10" />
18
+ <path d="M12 16v-4" />
19
+ <path d="M12 8h.01" />
20
+ </svg>
21
+ );
22
+ }
@@ -0,0 +1,21 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function LockIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <rect width="18" height="11" x="3" y="11" rx="2" ry="2" />
18
+ <path d="M7 11V7a5 5 0 0 1 10 0v4" />
19
+ </svg>
20
+ );
21
+ }
@@ -0,0 +1,22 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function LogOutIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="m16 17 5-5-5-5" />
18
+ <path d="M21 12H9" />
19
+ <path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" />
20
+ </svg>
21
+ );
22
+ }
@@ -0,0 +1,21 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function MailIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7" />
18
+ <rect x="2" y="4" width="20" height="16" rx="2" />
19
+ </svg>
20
+ );
21
+ }