noecosystem-design 0.1.3 → 0.2.1
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 +73 -35
- package/apps/showcase/src/catalog/catalog-index.tsx +3 -3
- package/apps/storybook/stories/catalog/card.stories.tsx +13 -0
- package/apps/storybook/stories/catalog/icon-system.stories.tsx +3 -2
- package/docs/adr/0006-icons8-icon-policy.md +4 -4
- package/docs/design-system/architecture.md +1 -1
- package/docs/design-system/ci-cd.md +22 -7
- package/docs/design-system/components.md +5 -0
- package/docs/design-system/foundations.md +9 -0
- package/docs/design-system/rtl.md +1 -1
- package/docs/design-system/surface-policy.md +59 -0
- package/llms.txt +1 -0
- package/package.json +1 -1
- package/packages/design-tokens/src/base.css +1 -1
- package/packages/design-tokens/src/tokens.css +12 -12
- package/packages/design-tokens/src/tokens.json +8 -8
- package/packages/design-tokens/src/tokens.mjs +8 -8
- package/packages/icons/package.json +3 -0
- package/packages/icons/src/adapters.tsx +4 -4
- package/packages/icons/src/iconsax.tsx +233 -0
- package/packages/icons/src/index.tsx +1 -103
- package/packages/registry/catalog-index.json +2 -2
- package/packages/registry/component-audit.json +1 -1
- package/packages/registry/docs-index.json +1 -1
- package/packages/registry/manifest.json +27 -14
- package/packages/registry/r/calendar.json +12 -1
- package/packages/registry/r/card.json +11 -5
- package/packages/registry/r/date-picker.json +12 -1
- package/packages/registry/r/icon-system.json +6 -1
- package/packages/registry/r/inline-cta.json +6 -1
- package/packages/registry/r/pagination.json +12 -1
- package/packages/registry/registry.json +8 -2
- package/packages/registry/search-index.json +21 -8
- package/packages/ui/src/card.tsx +14 -2
- package/packages/ui/src/theme-provider.browser.test.tsx +3 -2
- package/scripts/generate-manifest.mjs +92 -39
- package/scripts/validate-manifest.mjs +3 -29
- package/tests/e2e/catalog-typography.spec.ts +1 -2
- package/tests/icons.test.mjs +5 -5
- package/tests/tokens.test.mjs +14 -0
- package/apps/showcase/src/catalog/__screenshots__/catalog-shell.browser.test.tsx/filters-the-component-inventory-and-exposes-the-selected-audit-state-1.png +0 -0
- package/apps/showcase/src/catalog/__screenshots__/catalog-shell.browser.test.tsx/opens-a-component-detail-view-and-returns-to-the-grid-1.png +0 -0
- package/apps/showcase/src/catalog/__screenshots__/catalog-shell.browser.test.tsx/switching-locale-to-Persian-updates-document-direction-to-rtl-1.png +0 -0
- package/packages/ui/src/__screenshots__/button.browser.test.tsx/Button-preserves-native--busy--disabled--and-ref-contracts-1.png +0 -0
- package/packages/ui/src/__screenshots__/button.browser.test.tsx/a-disabled-polymorphic-Button-cannot-navigate-or-receive-focus-1.png +0 -0
- package/packages/ui/src/__screenshots__/date-picker.browser.test.tsx/DatePicker-Escape-closes-popover-and-returns-focus-to-input-1.png +0 -0
- package/packages/ui/src/__screenshots__/date-picker.browser.test.tsx/DatePicker-click-outside-closes-popover-1.png +0 -0
- package/packages/ui/src/__screenshots__/dialog.browser.test.tsx/Dialog-propagates-RTL-into-the-portal-and-traps-then-restores-focus-1.png +0 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Add as IconsaxAdd,
|
|
4
|
+
ArchiveBook as IconsaxArchiveBook,
|
|
5
|
+
ArrowDown as IconsaxArrowDown,
|
|
6
|
+
ArrowDown2 as IconsaxArrowDown2,
|
|
7
|
+
ArrowLeft2 as IconsaxArrowLeft2,
|
|
8
|
+
ArrowRight2 as IconsaxArrowRight2,
|
|
9
|
+
ArrowUp as IconsaxArrowUp,
|
|
10
|
+
ArrowUp2 as IconsaxArrowUp2,
|
|
11
|
+
AttachCircle as IconsaxAttachCircle,
|
|
12
|
+
BoxSearch as IconsaxBoxSearch,
|
|
13
|
+
Briefcase as IconsaxBriefcase,
|
|
14
|
+
Calendar as IconsaxCalendar,
|
|
15
|
+
Call as IconsaxCall,
|
|
16
|
+
CallCalling as IconsaxCallCalling,
|
|
17
|
+
CallRemove as IconsaxCallRemove,
|
|
18
|
+
ChartSquare as IconsaxChartSquare,
|
|
19
|
+
CloseCircle as IconsaxCloseCircle,
|
|
20
|
+
Copy as IconsaxCopy,
|
|
21
|
+
Cpu as IconsaxCpu,
|
|
22
|
+
Dislike as IconsaxDislike,
|
|
23
|
+
DocumentText as IconsaxDocumentText,
|
|
24
|
+
DocumentUpload as IconsaxDocumentUpload,
|
|
25
|
+
Edit2 as IconsaxEdit2,
|
|
26
|
+
HambergerMenu as IconsaxHambergerMenu,
|
|
27
|
+
Judge as IconsaxJudge,
|
|
28
|
+
Like1 as IconsaxLike1,
|
|
29
|
+
Link2 as IconsaxLink2,
|
|
30
|
+
Lock as IconsaxLock,
|
|
31
|
+
LogoutCurve as IconsaxLogoutCurve,
|
|
32
|
+
MagicStar as IconsaxMagicStar,
|
|
33
|
+
MessageText as IconsaxMessageText,
|
|
34
|
+
Messages3 as IconsaxMessages3,
|
|
35
|
+
MoneyRecive as IconsaxMoneyRecive,
|
|
36
|
+
More as IconsaxMore,
|
|
37
|
+
Paperclip2 as IconsaxPaperclip2,
|
|
38
|
+
Profile2User as IconsaxProfile2User,
|
|
39
|
+
ProfileCircle as IconsaxProfileCircle,
|
|
40
|
+
ReceiptSearch as IconsaxReceiptSearch,
|
|
41
|
+
SecurityUser as IconsaxSecurityUser,
|
|
42
|
+
Setting2 as IconsaxSetting2,
|
|
43
|
+
Star1 as IconsaxStar1,
|
|
44
|
+
StopCircle as IconsaxStopCircle,
|
|
45
|
+
TickCircle as IconsaxTickCircle,
|
|
46
|
+
TicketDiscount as IconsaxTicketDiscount,
|
|
47
|
+
Trash as IconsaxTrash,
|
|
48
|
+
User as IconsaxUser,
|
|
49
|
+
UserSearch as IconsaxUserSearch,
|
|
50
|
+
Verify as IconsaxVerify,
|
|
51
|
+
Wallet3 as IconsaxWallet3,
|
|
52
|
+
WalletMoney as IconsaxWalletMoney,
|
|
53
|
+
Warning2 as IconsaxWarning2,
|
|
54
|
+
type Icon as IconsaxIcon,
|
|
55
|
+
type IconProps as IconsaxIconProps,
|
|
56
|
+
} from 'iconsax-react';
|
|
57
|
+
|
|
58
|
+
export type LogicalIconDirection = 'forward' | 'backward';
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The only product icon provider. Iconsax Free is MIT licensed; consuming
|
|
62
|
+
* applications import from @noe/icons, never from the provider directly.
|
|
63
|
+
*/
|
|
64
|
+
export const iconsaxFreeSource = Object.freeze({
|
|
65
|
+
provider: 'Iconsax Free',
|
|
66
|
+
package: 'iconsax-react',
|
|
67
|
+
version: '0.0.8',
|
|
68
|
+
license: 'MIT',
|
|
69
|
+
url: 'https://github.com/rendinjast/iconsax-react',
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
export type NoeIconProps = IconsaxIconProps & {
|
|
73
|
+
/** Makes a meaningful icon available to assistive technology. */
|
|
74
|
+
label?: string;
|
|
75
|
+
/** Applies NOE's scoped, logical RTL mirroring policy. */
|
|
76
|
+
direction?: LogicalIconDirection;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
type NoeSvgProps = Omit<React.SVGProps<SVGSVGElement>, 'ref'>;
|
|
80
|
+
|
|
81
|
+
function createNoeIcon(Icon: IconsaxIcon, defaultDirection?: LogicalIconDirection) {
|
|
82
|
+
function NoeIcon({ label, direction = defaultDirection, className, ...props }: NoeIconProps) {
|
|
83
|
+
const directionalClass = direction ? 'noe-logical-icon' : undefined;
|
|
84
|
+
const resolvedClassName = [directionalClass, className].filter(Boolean).join(' ') || undefined;
|
|
85
|
+
const accessibilityProps = label
|
|
86
|
+
? { role: 'img' as const, 'aria-label': label }
|
|
87
|
+
: { 'aria-hidden': true as const, focusable: false };
|
|
88
|
+
|
|
89
|
+
return (
|
|
90
|
+
<Icon
|
|
91
|
+
{...props}
|
|
92
|
+
{...accessibilityProps}
|
|
93
|
+
className={resolvedClassName}
|
|
94
|
+
data-icon-source="iconsax-free"
|
|
95
|
+
data-logical-direction={direction}
|
|
96
|
+
/>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return NoeIcon;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Semantic navigation icons. Prefer these over physical arrow aliases. */
|
|
104
|
+
export const ForwardIcon = createNoeIcon(IconsaxArrowRight2, 'forward');
|
|
105
|
+
export const BackwardIcon = createNoeIcon(IconsaxArrowRight2, 'backward');
|
|
106
|
+
export const ChevronIcon = ForwardIcon;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Application icon catalog. These compatibility names are provider-free at the
|
|
110
|
+
* call site; new code should use semantic names such as ForwardIcon/BackwardIcon
|
|
111
|
+
* whenever the meaning is navigation rather than a physical direction.
|
|
112
|
+
*/
|
|
113
|
+
export const Add = createNoeIcon(IconsaxAdd);
|
|
114
|
+
export const ArchiveBook = createNoeIcon(IconsaxArchiveBook);
|
|
115
|
+
export const ArrowDown = createNoeIcon(IconsaxArrowDown);
|
|
116
|
+
export const ArrowDown2 = createNoeIcon(IconsaxArrowDown2);
|
|
117
|
+
export const ArrowLeft2 = createNoeIcon(IconsaxArrowLeft2);
|
|
118
|
+
export const ArrowRight2 = createNoeIcon(IconsaxArrowRight2);
|
|
119
|
+
export const ArrowUp = createNoeIcon(IconsaxArrowUp);
|
|
120
|
+
export const ArrowUp2 = createNoeIcon(IconsaxArrowUp2);
|
|
121
|
+
export const AttachCircle = createNoeIcon(IconsaxAttachCircle);
|
|
122
|
+
export const BoxSearch = createNoeIcon(IconsaxBoxSearch);
|
|
123
|
+
export const Briefcase = createNoeIcon(IconsaxBriefcase);
|
|
124
|
+
export const Calendar = createNoeIcon(IconsaxCalendar);
|
|
125
|
+
export const Call = createNoeIcon(IconsaxCall);
|
|
126
|
+
export const CallCalling = createNoeIcon(IconsaxCallCalling);
|
|
127
|
+
export const CallRemove = createNoeIcon(IconsaxCallRemove);
|
|
128
|
+
export const ChartSquare = createNoeIcon(IconsaxChartSquare);
|
|
129
|
+
export const CloseCircle = createNoeIcon(IconsaxCloseCircle);
|
|
130
|
+
export const Copy = createNoeIcon(IconsaxCopy);
|
|
131
|
+
export const Cpu = createNoeIcon(IconsaxCpu);
|
|
132
|
+
export const Dislike = createNoeIcon(IconsaxDislike);
|
|
133
|
+
export const DocumentText = createNoeIcon(IconsaxDocumentText);
|
|
134
|
+
export const DocumentUpload = createNoeIcon(IconsaxDocumentUpload);
|
|
135
|
+
export const Edit2 = createNoeIcon(IconsaxEdit2);
|
|
136
|
+
export const HambergerMenu = createNoeIcon(IconsaxHambergerMenu);
|
|
137
|
+
export const Judge = createNoeIcon(IconsaxJudge);
|
|
138
|
+
export const Like1 = createNoeIcon(IconsaxLike1);
|
|
139
|
+
export const Link2 = createNoeIcon(IconsaxLink2);
|
|
140
|
+
export const Lock = createNoeIcon(IconsaxLock);
|
|
141
|
+
export const LogoutCurve = createNoeIcon(IconsaxLogoutCurve);
|
|
142
|
+
export const MagicStar = createNoeIcon(IconsaxMagicStar);
|
|
143
|
+
export const MessageText = createNoeIcon(IconsaxMessageText);
|
|
144
|
+
export const Messages3 = createNoeIcon(IconsaxMessages3);
|
|
145
|
+
export const MoneyRecive = createNoeIcon(IconsaxMoneyRecive);
|
|
146
|
+
export const More = createNoeIcon(IconsaxMore);
|
|
147
|
+
export const Paperclip2 = createNoeIcon(IconsaxPaperclip2);
|
|
148
|
+
export const Profile2User = createNoeIcon(IconsaxProfile2User);
|
|
149
|
+
export const ProfileCircle = createNoeIcon(IconsaxProfileCircle);
|
|
150
|
+
export const ReceiptSearch = createNoeIcon(IconsaxReceiptSearch);
|
|
151
|
+
export const SecurityUser = createNoeIcon(IconsaxSecurityUser);
|
|
152
|
+
export const Setting2 = createNoeIcon(IconsaxSetting2);
|
|
153
|
+
export const Star1 = createNoeIcon(IconsaxStar1);
|
|
154
|
+
export const StopCircle = createNoeIcon(IconsaxStopCircle);
|
|
155
|
+
export const TickCircle = createNoeIcon(IconsaxTickCircle);
|
|
156
|
+
export const TicketDiscount = createNoeIcon(IconsaxTicketDiscount);
|
|
157
|
+
export const Trash = createNoeIcon(IconsaxTrash);
|
|
158
|
+
export const User = createNoeIcon(IconsaxUser);
|
|
159
|
+
export const UserSearch = createNoeIcon(IconsaxUserSearch);
|
|
160
|
+
export const Verify = createNoeIcon(IconsaxVerify);
|
|
161
|
+
export const Wallet3 = createNoeIcon(IconsaxWallet3);
|
|
162
|
+
export const WalletMoney = createNoeIcon(IconsaxWalletMoney);
|
|
163
|
+
export const Warning2 = createNoeIcon(IconsaxWarning2);
|
|
164
|
+
|
|
165
|
+
export function NoeMark(props: NoeSvgProps) {
|
|
166
|
+
return (
|
|
167
|
+
<svg viewBox="0 0 32 32" role="img" aria-label="NOEcosystem" {...props}>
|
|
168
|
+
<circle cx="16" cy="16" r="12" fill="none" stroke="currentColor" strokeWidth="2" />
|
|
169
|
+
<circle cx="16" cy="16" r="3" fill="currentColor" />
|
|
170
|
+
<path d="M4 16h9M19 16h9M16 4v9M16 19v9" stroke="currentColor" strokeWidth="2" />
|
|
171
|
+
</svg>
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export function SunIcon(props: NoeSvgProps) {
|
|
176
|
+
return (
|
|
177
|
+
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false" {...props}>
|
|
178
|
+
<g className="noe-theme-toggle__sun">
|
|
179
|
+
<circle
|
|
180
|
+
cx="12"
|
|
181
|
+
cy="12"
|
|
182
|
+
r="3.75"
|
|
183
|
+
fill="none"
|
|
184
|
+
stroke="currentColor"
|
|
185
|
+
strokeWidth="1.6"
|
|
186
|
+
strokeLinecap="round"
|
|
187
|
+
strokeLinejoin="round"
|
|
188
|
+
/>
|
|
189
|
+
<path
|
|
190
|
+
d="M12 2.25v2.1M12 19.65v2.1M2.25 12h2.1M19.65 12h2.1M5.1 5.1l1.48 1.48M17.42 17.42l1.48 1.48M18.9 5.1l-1.48 1.48M6.58 17.42 5.1 18.9"
|
|
191
|
+
fill="none"
|
|
192
|
+
stroke="currentColor"
|
|
193
|
+
strokeWidth="1.6"
|
|
194
|
+
strokeLinecap="round"
|
|
195
|
+
strokeLinejoin="round"
|
|
196
|
+
/>
|
|
197
|
+
</g>
|
|
198
|
+
</svg>
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export function MoonIcon(props: NoeSvgProps) {
|
|
203
|
+
return (
|
|
204
|
+
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false" {...props}>
|
|
205
|
+
<path
|
|
206
|
+
className="noe-theme-toggle__moon"
|
|
207
|
+
d="M20.2 15.25A8.25 8.25 0 0 1 8.75 3.8a8.26 8.26 0 1 0 11.45 11.45Z"
|
|
208
|
+
fill="none"
|
|
209
|
+
stroke="currentColor"
|
|
210
|
+
strokeWidth="1.6"
|
|
211
|
+
strokeLinecap="round"
|
|
212
|
+
strokeLinejoin="round"
|
|
213
|
+
/>
|
|
214
|
+
</svg>
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export const iconDirectionPolicy = Object.freeze({
|
|
219
|
+
mirror: ['forward', 'backward', 'next', 'previous', 'indent', 'outdent', 'panel-open'],
|
|
220
|
+
neverMirror: [
|
|
221
|
+
'brand',
|
|
222
|
+
'play',
|
|
223
|
+
'pause',
|
|
224
|
+
'download',
|
|
225
|
+
'upload',
|
|
226
|
+
'search',
|
|
227
|
+
'settings',
|
|
228
|
+
'check',
|
|
229
|
+
'close',
|
|
230
|
+
'chart',
|
|
231
|
+
'code',
|
|
232
|
+
],
|
|
233
|
+
});
|
|
@@ -1,103 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export type LogicalIconDirection = 'forward' | 'backward';
|
|
4
|
-
|
|
5
|
-
export const icons8Source = Object.freeze({
|
|
6
|
-
provider: 'Icons8',
|
|
7
|
-
asset: 'chevronRight.svg',
|
|
8
|
-
url: 'https://maxst.icons8.com/vue-static/icon/svg/chevronRight.svg',
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
export function NoeMark(props: React.SVGProps<SVGSVGElement>) {
|
|
12
|
-
return (
|
|
13
|
-
<svg viewBox="0 0 32 32" role="img" aria-label="NOEcosystem" {...props}>
|
|
14
|
-
<circle cx="16" cy="16" r="12" fill="none" stroke="currentColor" strokeWidth="2" />
|
|
15
|
-
<circle cx="16" cy="16" r="3" fill="currentColor" />
|
|
16
|
-
<path d="M4 16h9M19 16h9M16 4v9M16 19v9" stroke="currentColor" strokeWidth="2" />
|
|
17
|
-
</svg>
|
|
18
|
-
);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function ChevronIcon({
|
|
22
|
-
direction = 'forward',
|
|
23
|
-
className,
|
|
24
|
-
...props
|
|
25
|
-
}: React.SVGProps<SVGSVGElement> & { direction?: LogicalIconDirection }) {
|
|
26
|
-
return (
|
|
27
|
-
<svg
|
|
28
|
-
aria-hidden="true"
|
|
29
|
-
className={['noe-logical-icon', className].filter(Boolean).join(' ')}
|
|
30
|
-
data-icon-source="icons8"
|
|
31
|
-
data-logical-direction={direction}
|
|
32
|
-
viewBox="0 0 16 16"
|
|
33
|
-
{...props}
|
|
34
|
-
>
|
|
35
|
-
<path
|
|
36
|
-
d="M6.71875 3.5L6 4.20312L9.66016 7.97656L6 11.7539L6.71875 12.4492L11.0586 7.97656L6.71875 3.5Z"
|
|
37
|
-
fill="currentColor"
|
|
38
|
-
/>
|
|
39
|
-
</svg>
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function SunIcon(props: React.SVGProps<SVGSVGElement>) {
|
|
44
|
-
return (
|
|
45
|
-
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false" {...props}>
|
|
46
|
-
<g className="noe-theme-toggle__sun">
|
|
47
|
-
<circle
|
|
48
|
-
cx="12"
|
|
49
|
-
cy="12"
|
|
50
|
-
r="3.75"
|
|
51
|
-
fill="none"
|
|
52
|
-
stroke="currentColor"
|
|
53
|
-
strokeWidth="1.6"
|
|
54
|
-
strokeLinecap="round"
|
|
55
|
-
strokeLinejoin="round"
|
|
56
|
-
/>
|
|
57
|
-
<path
|
|
58
|
-
d="M12 2.25v2.1M12 19.65v2.1M2.25 12h2.1M19.65 12h2.1M5.1 5.1l1.48 1.48M17.42 17.42l1.48 1.48M18.9 5.1l-1.48 1.48M6.58 17.42 5.1 18.9"
|
|
59
|
-
fill="none"
|
|
60
|
-
stroke="currentColor"
|
|
61
|
-
strokeWidth="1.6"
|
|
62
|
-
strokeLinecap="round"
|
|
63
|
-
strokeLinejoin="round"
|
|
64
|
-
/>
|
|
65
|
-
</g>
|
|
66
|
-
</svg>
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export function MoonIcon(props: React.SVGProps<SVGSVGElement>) {
|
|
71
|
-
return (
|
|
72
|
-
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false" {...props}>
|
|
73
|
-
<path
|
|
74
|
-
className="noe-theme-toggle__moon"
|
|
75
|
-
d="M20.2 15.25A8.25 8.25 0 0 1 8.75 3.8a8.26 8.26 0 1 0 11.45 11.45Z"
|
|
76
|
-
fill="none"
|
|
77
|
-
stroke="currentColor"
|
|
78
|
-
strokeWidth="1.6"
|
|
79
|
-
strokeLinecap="round"
|
|
80
|
-
strokeLinejoin="round"
|
|
81
|
-
/>
|
|
82
|
-
</svg>
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export const iconDirectionPolicy = Object.freeze({
|
|
87
|
-
mirror: ['forward', 'backward', 'next', 'previous', 'indent', 'outdent', 'panel-open'],
|
|
88
|
-
neverMirror: [
|
|
89
|
-
'brand',
|
|
90
|
-
'play',
|
|
91
|
-
'pause',
|
|
92
|
-
'download',
|
|
93
|
-
'upload',
|
|
94
|
-
'search',
|
|
95
|
-
'settings',
|
|
96
|
-
'check',
|
|
97
|
-
'close',
|
|
98
|
-
'chart',
|
|
99
|
-
'code',
|
|
100
|
-
'theme-sun',
|
|
101
|
-
'theme-moon',
|
|
102
|
-
],
|
|
103
|
-
});
|
|
1
|
+
export * from './iconsax';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-08-
|
|
2
|
+
"generatedAt": "2026-08-29T09:30:43.936Z",
|
|
3
3
|
"items": [
|
|
4
4
|
{
|
|
5
5
|
"id": "bidi-text",
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"package": "@noe/ui",
|
|
89
89
|
"status": "available",
|
|
90
90
|
"maturity": "beta",
|
|
91
|
-
"description": "
|
|
91
|
+
"description": "Flat raised section primitive. It separates content from its page canvas through semantic surface tone, spacing and radius—not decorative borders or shadows. Use outlined only where a boundary conveys selection or data-entry state.",
|
|
92
92
|
"registryItem": "card"
|
|
93
93
|
},
|
|
94
94
|
{
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://noecosystem.com/schema/component-audit.json",
|
|
3
|
-
"generatedNote": "Canonical NOE public-component inventory. status=available requires a public export, a Storybook story at storyId, and (where distributable) a registry entry. Do not mark an item available without all three. (derived from manifest.json)
|
|
3
|
+
"generatedNote": "Canonical NOE public-component inventory. status=available requires a public export, a Storybook story at storyId, and (where distributable) a registry entry. Do not mark an item available without all three. (derived from manifest.json)",
|
|
4
4
|
"items": [
|
|
5
5
|
{
|
|
6
6
|
"id": "bidi-text",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifestVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-08-
|
|
3
|
+
"generatedAt": "2026-08-29T09:30:43.923Z",
|
|
4
4
|
"generatedNote": "Canonical NOE manifest — single source of truth for catalog, audit, registry, stories, docs and agent search. Generated by pnpm gen:manifest; do not edit by hand for automated fields.",
|
|
5
5
|
"items": [
|
|
6
6
|
{
|
|
@@ -428,12 +428,25 @@
|
|
|
428
428
|
"status": "available",
|
|
429
429
|
"maturity": "beta",
|
|
430
430
|
"category": "Primitives / Layout",
|
|
431
|
-
"description": "
|
|
432
|
-
"capabilityAliases": ["card", "card"],
|
|
433
|
-
"searchTerms": [
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
431
|
+
"description": "Flat raised section primitive. It separates content from its page canvas through semantic surface tone, spacing and radius—not decorative borders or shadows. Use outlined only where a boundary conveys selection or data-entry state.",
|
|
432
|
+
"capabilityAliases": ["flat card", "raised surface", "borderless section", "outlined card"],
|
|
433
|
+
"searchTerms": [
|
|
434
|
+
"card",
|
|
435
|
+
"raised surface",
|
|
436
|
+
"flat section",
|
|
437
|
+
"borderless panel",
|
|
438
|
+
"outlined boundary"
|
|
439
|
+
],
|
|
440
|
+
"useWhen": [
|
|
441
|
+
"grouping a top-level application region with a semantic raised surface",
|
|
442
|
+
"separating sections by color tone rather than elevation or decorative chrome",
|
|
443
|
+
"using appearance=\"outlined\" only for selection, data-entry or comparison boundaries"
|
|
444
|
+
],
|
|
445
|
+
"doNotUseWhen": [
|
|
446
|
+
"adding a nested card solely to create visual depth",
|
|
447
|
+
"using an outlined boundary when spacing and surface tone already express grouping"
|
|
448
|
+
],
|
|
449
|
+
"alternatives": ["SectionHeader", "Field"],
|
|
437
450
|
"dependencies": [],
|
|
438
451
|
"registryDependencies": [],
|
|
439
452
|
"peerDependencies": ["react"],
|
|
@@ -441,20 +454,20 @@
|
|
|
441
454
|
"label": "string | ReactNode",
|
|
442
455
|
"children": "ReactNode"
|
|
443
456
|
},
|
|
444
|
-
"variants": ["
|
|
457
|
+
"variants": ["raised", "outlined"],
|
|
445
458
|
"sizes": [],
|
|
446
459
|
"slots": [],
|
|
447
|
-
"states": ["default"
|
|
448
|
-
"tokenContracts": ["color.
|
|
460
|
+
"states": ["default"],
|
|
461
|
+
"tokenContracts": ["color.background", "color.surface", "color.surfaceRaised", "radius.lg"],
|
|
449
462
|
"accessibility": {
|
|
450
|
-
"keyboard": [
|
|
463
|
+
"keyboard": [],
|
|
451
464
|
"announcements": [],
|
|
452
|
-
"focusBehavior": ["
|
|
465
|
+
"focusBehavior": ["not focusable unless its content contains an interactive control"]
|
|
453
466
|
},
|
|
454
467
|
"internationalization": {
|
|
455
468
|
"messageKeys": [],
|
|
456
469
|
"rtl": "required",
|
|
457
|
-
"bidiNotes": ["logical
|
|
470
|
+
"bidiNotes": ["logical spacing; no directional layout override"]
|
|
458
471
|
},
|
|
459
472
|
"examples": [
|
|
460
473
|
{
|
|
@@ -463,7 +476,7 @@
|
|
|
463
476
|
"files": ["apps/storybook/stories/catalog/card.stories.tsx"]
|
|
464
477
|
}
|
|
465
478
|
],
|
|
466
|
-
"relatedPatterns": [],
|
|
479
|
+
"relatedPatterns": ["app-frame", "dashboard-shell", "section-header"],
|
|
467
480
|
"untitledMapping": null,
|
|
468
481
|
"storyId": "catalog-primitives-card--default",
|
|
469
482
|
"registryItem": "card"
|
|
@@ -5,13 +5,24 @@
|
|
|
5
5
|
"title": "Calendar",
|
|
6
6
|
"description": "Calendar — Base / Pickers component. calendar provides base / pickers behavior with RTL, i18n and accessibility built-in.",
|
|
7
7
|
"registryDependencies": [],
|
|
8
|
-
"dependencies": [
|
|
8
|
+
"dependencies": [
|
|
9
|
+
"@base-ui/react",
|
|
10
|
+
"class-variance-authority",
|
|
11
|
+
"clsx",
|
|
12
|
+
"iconsax-react",
|
|
13
|
+
"tailwind-merge"
|
|
14
|
+
],
|
|
9
15
|
"files": [
|
|
10
16
|
{
|
|
11
17
|
"path": "packages/icons/src/index.tsx",
|
|
12
18
|
"type": "registry:component",
|
|
13
19
|
"target": "packages/icons/src/index.tsx"
|
|
14
20
|
},
|
|
21
|
+
{
|
|
22
|
+
"path": "packages/icons/src/iconsax.tsx",
|
|
23
|
+
"type": "registry:component",
|
|
24
|
+
"target": "packages/icons/src/iconsax.tsx"
|
|
25
|
+
},
|
|
15
26
|
{
|
|
16
27
|
"path": "packages/ui/src/button.tsx",
|
|
17
28
|
"type": "registry:component",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "card",
|
|
4
4
|
"type": "registry:ui",
|
|
5
5
|
"title": "Card",
|
|
6
|
-
"description": "
|
|
6
|
+
"description": "Flat raised section primitive. It separates content through semantic surface tone, spacing and radius—not decorative borders or shadows. Use an outlined boundary only for selection or data-entry state.",
|
|
7
7
|
"files": [
|
|
8
8
|
{
|
|
9
9
|
"path": "packages/ui/src/card.tsx",
|
|
@@ -37,8 +37,14 @@
|
|
|
37
37
|
"announcements": [],
|
|
38
38
|
"focusBehavior": ["visible ring 2px"]
|
|
39
39
|
},
|
|
40
|
-
"tokenContracts": ["color.
|
|
41
|
-
"capabilityAliases": ["card", "card"],
|
|
42
|
-
"useWhen": [
|
|
43
|
-
|
|
40
|
+
"tokenContracts": ["color.background", "color.surface", "color.surfaceRaised", "radius.lg"],
|
|
41
|
+
"capabilityAliases": ["flat card", "raised surface", "borderless section", "outlined card"],
|
|
42
|
+
"useWhen": [
|
|
43
|
+
"grouping a top-level application region with a semantic raised surface",
|
|
44
|
+
"using an outlined boundary only for selection, data-entry or comparison state"
|
|
45
|
+
],
|
|
46
|
+
"doNotUseWhen": [
|
|
47
|
+
"adding a nested card solely to create visual depth",
|
|
48
|
+
"using a decorative stroke when spacing and surface tone already express grouping"
|
|
49
|
+
]
|
|
44
50
|
}
|
|
@@ -5,13 +5,24 @@
|
|
|
5
5
|
"title": "Date Picker",
|
|
6
6
|
"description": "Date Picker — Base / Pickers component. date-picker provides base / pickers behavior with RTL, i18n and accessibility built-in.",
|
|
7
7
|
"registryDependencies": [],
|
|
8
|
-
"dependencies": [
|
|
8
|
+
"dependencies": [
|
|
9
|
+
"@base-ui/react",
|
|
10
|
+
"class-variance-authority",
|
|
11
|
+
"clsx",
|
|
12
|
+
"iconsax-react",
|
|
13
|
+
"tailwind-merge"
|
|
14
|
+
],
|
|
9
15
|
"files": [
|
|
10
16
|
{
|
|
11
17
|
"path": "packages/icons/src/index.tsx",
|
|
12
18
|
"type": "registry:component",
|
|
13
19
|
"target": "packages/icons/src/index.tsx"
|
|
14
20
|
},
|
|
21
|
+
{
|
|
22
|
+
"path": "packages/icons/src/iconsax.tsx",
|
|
23
|
+
"type": "registry:component",
|
|
24
|
+
"target": "packages/icons/src/iconsax.tsx"
|
|
25
|
+
},
|
|
15
26
|
{
|
|
16
27
|
"path": "packages/ui/src/button.tsx",
|
|
17
28
|
"type": "registry:component",
|
|
@@ -9,6 +9,11 @@
|
|
|
9
9
|
"path": "packages/icons/src/index.tsx",
|
|
10
10
|
"type": "registry:component",
|
|
11
11
|
"target": "packages/icons/src/index.tsx"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"path": "packages/icons/src/iconsax.tsx",
|
|
15
|
+
"type": "registry:component",
|
|
16
|
+
"target": "packages/icons/src/iconsax.tsx"
|
|
12
17
|
}
|
|
13
18
|
],
|
|
14
19
|
"registryDependencies": [],
|
|
@@ -20,7 +25,7 @@
|
|
|
20
25
|
"install": "pnpm dlx shadcn@latest add @noe/icon-system",
|
|
21
26
|
"import": "import { ChevronIcon } from '@noe/icons'",
|
|
22
27
|
"requiredProviders": [],
|
|
23
|
-
"dependencies": [],
|
|
28
|
+
"dependencies": ["iconsax-react"],
|
|
24
29
|
"peerDependencies": ["react"],
|
|
25
30
|
"rtl": "required",
|
|
26
31
|
"i18n": {
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
"type": "registry:component",
|
|
11
11
|
"target": "packages/icons/src/index.tsx"
|
|
12
12
|
},
|
|
13
|
+
{
|
|
14
|
+
"path": "packages/icons/src/iconsax.tsx",
|
|
15
|
+
"type": "registry:component",
|
|
16
|
+
"target": "packages/icons/src/iconsax.tsx"
|
|
17
|
+
},
|
|
13
18
|
{
|
|
14
19
|
"path": "packages/ui/src/inline-cta.tsx",
|
|
15
20
|
"type": "registry:component",
|
|
@@ -22,7 +27,7 @@
|
|
|
22
27
|
}
|
|
23
28
|
],
|
|
24
29
|
"registryDependencies": [],
|
|
25
|
-
"dependencies": ["clsx", "tailwind-merge"],
|
|
30
|
+
"dependencies": ["clsx", "iconsax-react", "tailwind-merge"],
|
|
26
31
|
"status": "available",
|
|
27
32
|
"maturity": "beta",
|
|
28
33
|
"package": "@noe/ui",
|
|
@@ -15,6 +15,11 @@
|
|
|
15
15
|
"type": "registry:component",
|
|
16
16
|
"target": "packages/icons/src/index.tsx"
|
|
17
17
|
},
|
|
18
|
+
{
|
|
19
|
+
"path": "packages/icons/src/iconsax.tsx",
|
|
20
|
+
"type": "registry:component",
|
|
21
|
+
"target": "packages/icons/src/iconsax.tsx"
|
|
22
|
+
},
|
|
18
23
|
{
|
|
19
24
|
"path": "packages/ui/src/button.tsx",
|
|
20
25
|
"type": "registry:component",
|
|
@@ -32,7 +37,13 @@
|
|
|
32
37
|
}
|
|
33
38
|
],
|
|
34
39
|
"registryDependencies": [],
|
|
35
|
-
"dependencies": [
|
|
40
|
+
"dependencies": [
|
|
41
|
+
"@base-ui/react",
|
|
42
|
+
"class-variance-authority",
|
|
43
|
+
"clsx",
|
|
44
|
+
"iconsax-react",
|
|
45
|
+
"tailwind-merge"
|
|
46
|
+
],
|
|
36
47
|
"status": "available",
|
|
37
48
|
"maturity": "beta",
|
|
38
49
|
"package": "@noe/data-ui",
|
|
@@ -1040,8 +1040,14 @@
|
|
|
1040
1040
|
"dependencies": ["clsx", "tailwind-merge"],
|
|
1041
1041
|
"peerDependencies": ["react"],
|
|
1042
1042
|
"manifestId": "card",
|
|
1043
|
-
"capabilityAliases": ["card", "card"],
|
|
1044
|
-
"searchTerms": [
|
|
1043
|
+
"capabilityAliases": ["flat card", "raised surface", "borderless section", "outlined card"],
|
|
1044
|
+
"searchTerms": [
|
|
1045
|
+
"card",
|
|
1046
|
+
"raised surface",
|
|
1047
|
+
"flat section",
|
|
1048
|
+
"borderless panel",
|
|
1049
|
+
"outlined boundary"
|
|
1050
|
+
]
|
|
1045
1051
|
},
|
|
1046
1052
|
{
|
|
1047
1053
|
"name": "alert",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-08-
|
|
2
|
+
"generatedAt": "2026-08-29T09:30:43.933Z",
|
|
3
3
|
"items": [
|
|
4
4
|
{
|
|
5
5
|
"id": "bidi-text",
|
|
@@ -160,15 +160,28 @@
|
|
|
160
160
|
"id": "card",
|
|
161
161
|
"package": "@noe/ui",
|
|
162
162
|
"title": "Card",
|
|
163
|
-
"description": "
|
|
163
|
+
"description": "Flat raised section primitive. It separates content from its page canvas through semantic surface tone, spacing and radius—not decorative borders or shadows. Use outlined only where a boundary conveys selection or data-entry state.",
|
|
164
164
|
"category": "Primitives / Layout",
|
|
165
165
|
"status": "available",
|
|
166
|
-
"capabilityAliases": ["card", "card"],
|
|
167
|
-
"searchTerms": [
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
166
|
+
"capabilityAliases": ["flat card", "raised surface", "borderless section", "outlined card"],
|
|
167
|
+
"searchTerms": [
|
|
168
|
+
"card",
|
|
169
|
+
"raised surface",
|
|
170
|
+
"flat section",
|
|
171
|
+
"borderless panel",
|
|
172
|
+
"outlined boundary"
|
|
173
|
+
],
|
|
174
|
+
"useWhen": [
|
|
175
|
+
"grouping a top-level application region with a semantic raised surface",
|
|
176
|
+
"separating sections by color tone rather than elevation or decorative chrome",
|
|
177
|
+
"using appearance=\"outlined\" only for selection, data-entry or comparison boundaries"
|
|
178
|
+
],
|
|
179
|
+
"doNotUseWhen": [
|
|
180
|
+
"adding a nested card solely to create visual depth",
|
|
181
|
+
"using an outlined boundary when spacing and surface tone already express grouping"
|
|
182
|
+
],
|
|
183
|
+
"alternatives": ["SectionHeader", "Field"],
|
|
184
|
+
"relatedPatterns": ["app-frame", "dashboard-shell", "section-header"],
|
|
172
185
|
"exportName": "Card",
|
|
173
186
|
"registryItem": "card",
|
|
174
187
|
"maturity": "beta"
|