@1money/component-ui 0.0.46 β†’ 0.0.48

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 (75) hide show
  1. package/es/components/Table/Table.d.ts +2 -2
  2. package/es/components/Table/Table.js +25 -148
  3. package/es/components/Table/VirtualTable.d.ts +2 -2
  4. package/es/components/Table/VirtualTable.js +30 -143
  5. package/es/components/Table/core/useTableColumns.d.ts +21 -7
  6. package/es/components/Table/core/useTableColumns.js +76 -14
  7. package/es/components/Table/core/useTableDataPipeline.d.ts +13 -6
  8. package/es/components/Table/core/useTableDataPipeline.js +193 -27
  9. package/es/components/Table/core/useTableExpand.d.ts +4 -2
  10. package/es/components/Table/core/useTableExpand.js +30 -5
  11. package/es/components/Table/core/useTableSelection.d.ts +3 -5
  12. package/es/components/Table/core/useTableSelection.js +1 -1
  13. package/es/components/Table/core/useTableSetup.d.ts +42 -0
  14. package/es/components/Table/core/useTableSetup.js +195 -0
  15. package/es/components/Table/features/ExpandTrigger.js +10 -2
  16. package/es/components/Table/features/FilterTrigger.d.ts +9 -0
  17. package/es/components/Table/features/FilterTrigger.js +157 -0
  18. package/es/components/Table/features/SelectionColumn.d.ts +3 -2
  19. package/es/components/Table/features/SelectionColumn.js +19 -6
  20. package/es/components/Table/interface.d.ts +103 -21
  21. package/es/components/Table/internal/kernel/FixedHolder/index.js +1 -2
  22. package/es/components/Table/internal/kernel/Table.d.ts +1 -1
  23. package/es/components/Table/internal/kernel/Table.js +2 -8
  24. package/es/components/Table/internal/kernel/VirtualTable/BodyGrid.js +1 -2
  25. package/es/components/Table/internal/kernel/VirtualTable/index.js +1 -2
  26. package/es/components/Table/internal/kernel/constant.d.ts +1 -1
  27. package/es/components/Table/internal/kernel/constant.js +1 -1
  28. package/es/components/Table/internal/kernel/hooks/useExpand.js +1 -2
  29. package/es/components/Table/internal/kernel/utils/offsetUtil.js +1 -2
  30. package/es/components/Table/renderers/BodyCell.d.ts +4 -4
  31. package/es/components/Table/renderers/BodyCell.js +1 -1
  32. package/es/components/Table/renderers/HeaderCell.d.ts +8 -4
  33. package/es/components/Table/renderers/HeaderCell.js +13 -3
  34. package/es/components/Table/style/Table.css +1 -1
  35. package/es/components/VirtualList/ScrollBar.js +1 -2
  36. package/es/index.css +1 -1
  37. package/lib/components/Table/Table.d.ts +2 -2
  38. package/lib/components/Table/Table.js +24 -150
  39. package/lib/components/Table/VirtualTable.d.ts +2 -2
  40. package/lib/components/Table/VirtualTable.js +28 -144
  41. package/lib/components/Table/core/useTableColumns.d.ts +21 -7
  42. package/lib/components/Table/core/useTableColumns.js +76 -14
  43. package/lib/components/Table/core/useTableDataPipeline.d.ts +13 -6
  44. package/lib/components/Table/core/useTableDataPipeline.js +192 -26
  45. package/lib/components/Table/core/useTableExpand.d.ts +4 -2
  46. package/lib/components/Table/core/useTableExpand.js +30 -5
  47. package/lib/components/Table/core/useTableSelection.d.ts +3 -5
  48. package/lib/components/Table/core/useTableSelection.js +1 -1
  49. package/lib/components/Table/core/useTableSetup.d.ts +42 -0
  50. package/lib/components/Table/core/useTableSetup.js +204 -0
  51. package/lib/components/Table/features/ExpandTrigger.js +10 -2
  52. package/lib/components/Table/features/FilterTrigger.d.ts +9 -0
  53. package/lib/components/Table/features/FilterTrigger.js +164 -0
  54. package/lib/components/Table/features/SelectionColumn.d.ts +3 -2
  55. package/lib/components/Table/features/SelectionColumn.js +19 -6
  56. package/lib/components/Table/interface.d.ts +103 -21
  57. package/lib/components/Table/internal/kernel/FixedHolder/index.js +1 -2
  58. package/lib/components/Table/internal/kernel/Table.d.ts +1 -1
  59. package/lib/components/Table/internal/kernel/Table.js +2 -8
  60. package/lib/components/Table/internal/kernel/VirtualTable/BodyGrid.js +1 -2
  61. package/lib/components/Table/internal/kernel/VirtualTable/index.js +1 -2
  62. package/lib/components/Table/internal/kernel/constant.d.ts +1 -1
  63. package/lib/components/Table/internal/kernel/constant.js +1 -1
  64. package/lib/components/Table/internal/kernel/hooks/useExpand.js +1 -2
  65. package/lib/components/Table/internal/kernel/utils/offsetUtil.js +1 -2
  66. package/lib/components/Table/renderers/BodyCell.d.ts +4 -4
  67. package/lib/components/Table/renderers/BodyCell.js +1 -1
  68. package/lib/components/Table/renderers/HeaderCell.d.ts +8 -4
  69. package/lib/components/Table/renderers/HeaderCell.js +13 -3
  70. package/lib/components/Table/style/Table.css +1 -1
  71. package/lib/components/VirtualList/ScrollBar.js +1 -2
  72. package/lib/index.css +1 -1
  73. package/package.json +1 -1
  74. package/scripts/mcp-server/examples.generated.json +132 -0
  75. package/scripts/mcp-server/index.generated.json +344 -14
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1money/component-ui",
3
- "version": "0.0.46",
3
+ "version": "0.0.48",
4
4
  "description": "React Components based on primereact for 1money front-end projects",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
@@ -115,6 +115,12 @@
115
115
  "source": "readme",
116
116
  "compilable": true
117
117
  },
118
+ "082ec26c8081a863c586ce7bb5d2c1fc35a0e901d02e7fe1a7e0d66fe526848e": {
119
+ "title": "Variants",
120
+ "code": "<div style={stackStyle}>\n <div>\n <TypographyTitle size=\"sm\" strong style={sectionTitleStyle}>\n Stroke\n </TypographyTitle>\n <Table {...(args as TableProps<Record<string, any>>)} dataSource={portfolioRows.slice(0, 4)} variant=\"stroke\" />\n </div>\n <div>\n <TypographyTitle size=\"sm\" strong style={sectionTitleStyle}>\n Fill\n </TypographyTitle>\n <Table {...(args as TableProps<Record<string, any>>)} dataSource={portfolioRows.slice(0, 4)} variant=\"fill\" />\n </div>\n </div>",
121
+ "source": "stories",
122
+ "compilable": false
123
+ },
118
124
  "08616eb7b07c701d8cd3872fb1e802eac207a2cf2a3a802b28360fc7112d1ca8": {
119
125
  "title": "Import",
120
126
  "code": "import { Calendar } from '@1money/component-ui';\n// or\nimport { Calendar } from '@1money/component-ui/Calendar';",
@@ -139,6 +145,12 @@
139
145
  "source": "readme",
140
146
  "compilable": true
141
147
  },
148
+ "0b1bd0a0c931658fda5287f712844f21f5f69c50228164f8c97deeb385ed9187": {
149
+ "title": "Filters",
150
+ "code": "<div>\n <TypographyBody size=\"sm\" color=\"default-tertiary\" style={hintStyle}>\n Click the funnel icon in a column header to filter. Multi-select is the\n default; selections apply on <em>OK</em>.\n </TypographyBody>\n <Table<PortfolioRow>\n rowKey=\"id\"\n size=\"large\"\n variant=\"stroke\"\n pagination={false}\n dataSource={portfolioRows}\n columns={[\n portfolioColumns[0],\n {\n ...portfolioColumns[1],\n filters: NETWORK_FILTER_ITEMS,\n onFilter: (value, record) => record.network === value,\n },\n {\n ...portfolioColumns[2],\n filters: STATUS_FILTER_ITEMS,\n onFilter: (value, record) => record.status === value,\n },\n portfolioColumns[3],\n portfolioColumns[4],\n ]}\n />\n </div>",
151
+ "source": "stories",
152
+ "compilable": true
153
+ },
142
154
  "0c7c04366337519cd94b38f5358dfa8f9eec80c8f289ba172def5f00e1a89ba3": {
143
155
  "title": "Date Picker Story",
144
156
  "code": "<ProForm\n {...args}\n initialValues={{ birthday: null, startDate: null }}\n onFinish={(values) => alert(JSON.stringify(values, null, 2))}\n >\n <ProFormDatePicker\n name=\"birthday\"\n label=\"Birthday\"\n fieldProps={{ dateFormat: 'yy-mm-dd', showIcon: true }}\n />\n <ProFormDatePicker\n name=\"startDate\"\n label=\"Start Date\"\n fieldProps={{ dateFormat: 'mm/dd/yy', showButtonBar: true }}\n />\n </ProForm>",
@@ -169,6 +181,12 @@
169
181
  "source": "readme",
170
182
  "compilable": true
171
183
  },
184
+ "0e53815284d097cccdcb6cdff3952b42734dda8b58b4cdeac1948e5f1d2b3587": {
185
+ "title": "Expandable List",
186
+ "code": "<WalletRegistryStory\n dataSource={expandableListRows}\n defaultExpandedKeys={['wallet-big-tom', 'wallet-global-treasury']}\n />",
187
+ "source": "stories",
188
+ "compilable": true
189
+ },
172
190
  "10c3dc4b995524ead942626d1a9e7ef96f11e52235700d42ddbf138090b3a9ad": {
173
191
  "title": "Canonical usage",
174
192
  "code": "import { Slider } from '@1money/component-ui';\n// or\nimport { Slider } from '@1money/component-ui/Slider';",
@@ -205,6 +223,12 @@
205
223
  "source": "stories",
206
224
  "compilable": false
207
225
  },
226
+ "1622196bc98fc696224e0af42f3858aefbb46ae0237ebd7ed753d40c2e0f87d6": {
227
+ "title": "Single Select Filter",
228
+ "code": "<Table<PortfolioRow>\n rowKey=\"id\"\n pagination={false}\n dataSource={portfolioRows}\n columns={[\n portfolioColumns[0],\n {\n ...portfolioColumns[1],\n filters: NETWORK_FILTER_ITEMS,\n filterMultiple: false,\n onFilter: (value, record) => record.network === value,\n },\n portfolioColumns[2],\n portfolioColumns[3],\n ]}\n />",
229
+ "source": "stories",
230
+ "compilable": true
231
+ },
208
232
  "1673418288f034d6e46db906f3b2fb8a2079625c30f15ed4c7c35c0e4568f940": {
209
233
  "title": "Basic Usage",
210
234
  "code": "import { Grid } from '@1money/component-ui';\nimport { GRID_ALIGN, GRID_JUSTIFY } from '@1money/component-ui/Grid';\n\nconst GRID_GUTTER: [number, number] = [16, 8];\nconst SPAN_HALF = 6;\n\n<Grid gutter={GRID_GUTTER} justify={GRID_JUSTIFY.spaceBetween} align={GRID_ALIGN.middle}>\n <Grid.Col span={SPAN_HALF}>Left</Grid.Col>\n <Grid.Col span={SPAN_HALF}>Right</Grid.Col>\n</Grid>",
@@ -253,6 +277,12 @@
253
277
  "source": "canonical",
254
278
  "compilable": true
255
279
  },
280
+ "1c879c8d080ccdc8a79261e997d29861634e6ae8f74d950f7305a1167ddb1fb5": {
281
+ "title": "Figma Auto Conversion Table",
282
+ "code": "{\n const [expandedKeys, setExpandedKeys] = useState<React.Key[]>(['activity-row-2']);\n\n const handleToggle = (rowId: string) => {\n setExpandedKeys((currentKeys) => (\n currentKeys.includes(rowId)\n ? currentKeys.filter((key) => key !== rowId)\n : [...currentKeys, rowId]\n ));\n };\n\n return (\n <div style={figmaFrameStyle}>\n <Table<ActivityLedgerRow>\n rowKey=\"id\"\n size=\"small\"\n variant=\"stroke\"\n pagination={false}\n columns={createActivityLedgerColumns({\n expandedKeys,\n onToggle: handleToggle,\n })}\n dataSource={activityLedgerRows}\n expandable={{\n showExpandColumn: false,\n expandedRowKeys: expandedKeys,\n rowExpandable: (record) => Boolean(record.details?.length),\n expandedRowRender: (record) => (\n record.details\n ? <ActivityLedgerDetailsPanel details={record.details} />\n : null\n ),\n }}\n />\n </div>\n );\n }",
283
+ "source": "stories",
284
+ "compilable": true
285
+ },
256
286
  "1cc244bf13712c43e79b378e25198234696ed488d0a147473327f0eb16c461bc": {
257
287
  "title": "Searchable Sizes",
258
288
  "code": "{\n const [largeValue, setLargeValue] = useState<string | number | undefined>('usdt');\n const [smallValue, setSmallValue] = useState<string | number | undefined>('usdt');\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 24, width: 320 }}>\n <Select\n {...args}\n size=\"large\"\n label=\"Large\"\n value={largeValue}\n onChange={(nextValue, option) => {\n setLargeValue(nextValue as string | number | undefined);\n args.onChange?.(nextValue, option);\n }}\n />\n <Select\n {...args}\n size=\"small\"\n label=\"Small\"\n filterInputAutoFocus={false}\n value={smallValue}\n onChange={(nextValue, option) => {\n setSmallValue(nextValue as string | number | undefined);\n args.onChange?.(nextValue, option);\n }}\n />\n </div>\n );\n }",
@@ -277,6 +307,12 @@
277
307
  "source": "stories",
278
308
  "compilable": false
279
309
  },
310
+ "1df04178d3aa417559337049bac95bb324b380eefa44e8c04836ddf3595bc5b8": {
311
+ "title": "Expandable Column Config",
312
+ "code": "{\n const rows: RowExpandableDemoRow[] = [\n { id: 'r1', title: 'Order #1001', notes: 'Awaiting carrier handoff.' },\n { id: 'r2', title: 'Order #1002', notes: 'Refund issued for SKU-ABC.' },\n { id: 'r3', title: 'Order #1003', notes: 'Customer requested expedited shipping.' },\n ];\n\n const columns: TableColumn<RowExpandableDemoRow>[] = [\n { key: 'title', dataIndex: 'title', title: 'Order' },\n {\n key: 'status',\n title: 'Status',\n render: () => <Tag label=\"Open\" color=\"success\" />,\n },\n ];\n\n return (\n <div style={{ width: 720 }}>\n <TypographyBody className=\"om-mb-3\">\n Custom <code>columnTitle</code> / <code>columnWidth</code> / <code>fixed</code> on\n the expand column, plus <code>defaultExpandAllRows</code> to seed every\n row open on mount.\n </TypographyBody>\n <Table<RowExpandableDemoRow>\n rowKey=\"id\"\n size=\"small\"\n variant=\"stroke\"\n pagination={false}\n dataSource={rows}\n columns={columns}\n expandable={{\n columnTitle: 'Detail',\n columnWidth: 72,\n fixed: 'left',\n defaultExpandAllRows: true,\n expandedRowRender: (record) => (\n <div style={{ padding: '8px 16px', background: '#fafafa' }}>\n <TypographyLabel>{record.notes}</TypographyLabel>\n </div>\n ),\n }}\n />\n </div>\n );\n }",
313
+ "source": "stories",
314
+ "compilable": true
315
+ },
280
316
  "1e2ce5743dcd5a069489baf67169280a5ebfc7ed959fc8cb1f7f52f846c1b544": {
281
317
  "title": "Text Variant",
282
318
  "code": "<div style={columnStyle}>\n {BUTTON_SIZES.map((size) => (\n <div key={size}>\n <h3 style={sectionHeaderStyle}>Text - {size}</h3>\n <div style={rowStyle}>\n <Button {...args} variant={BUTTON_VARIANT.text} size={size}>\n Button\n </Button>\n <Button {...args} variant={BUTTON_VARIANT.text} size={size} disabled>\n Disabled\n </Button>\n <Button {...args} variant={BUTTON_VARIANT.text} size={size} loading>\n Loading\n </Button>\n </div>\n </div>\n ))}\n </div>",
@@ -469,6 +505,12 @@
469
505
  "source": "stories",
470
506
  "compilable": true
471
507
  },
508
+ "2bfe01695a2d2aa890db17bef359b1c81761ad66301c5c548fe2e23750a8e5c8": {
509
+ "title": "Figma-aligned Expandable Example",
510
+ "code": "import { useState } from 'react';\n\ninterface WalletRow {\n id: string;\n walletName: string;\n walletSummary: string;\n}\n\nconst rows: WalletRow[] = [\n {\n id: 'wallet-ops',\n walletName: 'Operations wallet',\n walletSummary: '0x1234...abcd',\n },\n];\n\nfunction WalletDetails({ record }: { record: WalletRow }) {\n return <div>{record.walletSummary}</div>;\n}\n\nfunction WalletRegistryTable() {\n const [expandedRowKeys, setExpandedRowKeys] = useState<React.Key[]>(['wallet-ops']);\n\n return (\n <Table\n rowKey=\"id\"\n size=\"small\"\n variant=\"stroke\"\n pagination={false}\n columns={[\n {\n key: 'walletName',\n title: 'Wallet name',\n render: (_value, record) => (\n <button\n type=\"button\"\n onClick={() => {\n setExpandedRowKeys((current) => (\n current.includes(record.id)\n ? current.filter((key) => key !== record.id)\n : [...current, record.id]\n ));\n }}\n >\n {record.walletName}\n </button>\n ),\n },\n {\n key: 'walletSummary',\n dataIndex: 'walletSummary',\n title: 'Wallet address',\n },\n {\n key: 'actions',\n title: 'Actions',\n align: 'right',\n render: () => '...',\n },\n ]}\n dataSource={rows}\n expandable={{\n showExpandColumn: false,\n expandedRowKeys,\n expandedRowRender: (record) => <WalletDetails record={record} />,\n }}\n />\n );\n}",
511
+ "source": "readme",
512
+ "compilable": true
513
+ },
472
514
  "2cca976a647db275dfb45ce8bb53bc85d304e49c3d91f76e5987d11e95b604c1": {
473
515
  "title": "Import",
474
516
  "code": "import { Cell } from '@1money/component-ui';\n// or\nimport { Cell } from '@1money/component-ui/Cell';",
@@ -847,6 +889,12 @@
847
889
  "source": "stories",
848
890
  "compilable": false
849
891
  },
892
+ "5b6e430e96dfe718f6bd3291f933d68b2a94eed3e1bd87766079d71544d56592": {
893
+ "title": "Selection And Sort",
894
+ "code": "{\n const [selectedKeys, setSelectedKeys] = useState<React.Key[]>(['2']);\n\n return (\n <div>\n <TypographyBody size=\"sm\" color=\"default-tertiary\" style={hintStyle}>\n Selected rows: {selectedKeys.join(', ')}\n </TypographyBody>\n <Table\n {...(args as TableProps<Record<string, any>>)}\n rowSelection={{\n type: 'checkbox',\n selectedRowKeys: selectedKeys,\n onChange: (keys) => setSelectedKeys(keys),\n }}\n />\n </div>\n );\n }",
895
+ "source": "stories",
896
+ "compilable": false
897
+ },
850
898
  "5bbda57b2d06dfefaed853ba5ad655bb306fd8ecfbc92a6a96dee1deffc1af2f": {
851
899
  "title": "With Content",
852
900
  "code": "<Tabs\n defaultActiveKey=\"tab1\"\n items={[\n { key: 'tab1', label: 'Overview', children: <div>Overview content goes here</div> },\n { key: 'tab2', label: 'Transactions', children: <div>Transactions content goes here</div> },\n { key: 'tab3', label: 'Analytics', children: <div>Analytics content goes here</div> },\n ]}\n />",
@@ -991,6 +1039,12 @@
991
1039
  "source": "readme",
992
1040
  "compilable": true
993
1041
  },
1042
+ "6f1ac382a21af48aded6d900902e14d386aec026b6a51b8efa0fbac1f515290a": {
1043
+ "title": "Fixed And Sticky",
1044
+ "code": "<Table<PortfolioRow>\n rowKey=\"id\"\n pagination={false}\n sticky\n scroll={{ x: 1120, y: 280 }}\n dataSource={portfolioRows}\n columns={[\n {\n ...portfolioColumns[0],\n fixed: 'left',\n },\n portfolioColumns[1],\n portfolioColumns[2],\n {\n key: 'owner',\n dataIndex: 'owner',\n title: 'Owner',\n width: 220,\n },\n {\n key: 'balance',\n dataIndex: 'balance',\n title: 'Balance',\n width: 160,\n align: 'right',\n render: (value) => formatBalance(value as number),\n },\n {\n ...portfolioColumns[4],\n fixed: 'right',\n },\n ]}\n />",
1045
+ "source": "stories",
1046
+ "compilable": true
1047
+ },
994
1048
  "6f2b7da00479a6033fdaca36f0646a924c61cbf09cd0e07da6948a884af98a61": {
995
1049
  "title": "Dependency",
996
1050
  "code": "<ProForm\n {...args}\n initialValues={{ hasAccount: false, accountType: '' }}\n >\n <ProFormSwitch name=\"hasAccount\" label=\"Has Account\" />\n <ProFormDependency name={['hasAccount']}>\n {({ hasAccount }) =>\n hasAccount ? (\n <>\n <ProFormText\n name=\"accountId\"\n label=\"Account ID\"\n rules={[{ required: true }]}\n />\n <ProFormText name=\"accountName\" label=\"Account Name\" />\n </>\n ) : null\n }\n </ProFormDependency>\n </ProForm>",
@@ -1207,6 +1261,12 @@
1207
1261
  "source": "readme",
1208
1262
  "compilable": true
1209
1263
  },
1264
+ "83d457fb7d2b3478dda19b79185daa8909a55b9786ff1b3cf560cec95743926d": {
1265
+ "title": "Basic Usage",
1266
+ "code": "<Table rowKey=\"id\" columns={columns} dataSource={rows} />",
1267
+ "source": "readme",
1268
+ "compilable": true
1269
+ },
1210
1270
  "842244e70f89e2aaf6941718de836ab3a6e08d642a4d4bb2e80cee160158470f": {
1211
1271
  "title": "Default",
1212
1272
  "code": "{\n const sizes = ['large', 'small'] as const;\n const statuses = ['default', 'error'] as const;\n const valueTypes = ['Placeholder', 'Filled'] as const;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 40 }}>\n {sizes.map((size) => (\n <div key={size}>\n <h3 style={{ margin: '0 0 16px', textTransform: 'capitalize' }}>{size}</h3>\n <div style={{ display: 'flex', gap: 24, flexWrap: 'wrap' }}>\n {statuses.map((status) =>\n valueTypes.map((vt) => (\n <div key={`${status}-${vt}`} style={{ width: 310 }}>\n <p style={{ margin: '0 0 4px', fontSize: 12, color: '#999' }}>\n {status} / {vt}\n </p>\n <Input\n size={size}\n status={status}\n label=\"Label\"\n feedback=\"Feedback\"\n feedbackIcon={status === 'error' ? <Icons name=\"error\" size={16} /> : <Icons name=\"info\" size={16} />}\n placeholder=\"Value\"\n allowClear\n defaultValue={vt === 'Filled' ? 'Input value' : undefined}\n />\n </div>\n )),\n )}\n {/* Read-Only */}\n {valueTypes.map((vt) => (\n <div key={`readonly-${vt}`} style={{ width: 310 }}>\n <p style={{ margin: '0 0 4px', fontSize: 12, color: '#999' }}>\n read-only / {vt}\n </p>\n <Input\n size={size}\n readOnly\n label=\"Label\"\n feedback=\"Feedback\"\n feedbackIcon={<Icons name=\"info\" size={16} />}\n placeholder=\"Value\"\n defaultValue={vt === 'Filled' ? 'Read-only value' : undefined}\n />\n </div>\n ))}\n {/* Disabled */}\n {valueTypes.map((vt) => (\n <div key={`disabled-${vt}`} style={{ width: 310 }}>\n <p style={{ margin: '0 0 4px', fontSize: 12, color: '#999' }}>\n disabled / {vt}\n </p>\n <Input\n size={size}\n disabled\n label=\"Label\"\n feedback=\"Feedback\"\n feedbackIcon={<Icons name=\"info\" size={16} />}\n placeholder=\"Value\"\n defaultValue={vt === 'Filled' ? 'Disabled value' : undefined}\n />\n </div>\n ))}\n </div>\n </div>\n ))}\n\n {/* ── With Prefix / Suffix ── */}\n <div>\n <h3 style={{ margin: '0 0 16px' }}>With Prefix / Suffix</h3>\n <div style={{ display: 'flex', gap: 24, flexWrap: 'wrap' }}>\n <div style={{ width: 310 }}>\n <p style={{ margin: '0 0 4px', fontSize: 12, color: '#999' }}>Prefix + Suffix</p>\n <Input\n label=\"Label\"\n defaultValue=\"100\"\n prefix={<span>USD</span>}\n suffix={<span>Max</span>}\n allowClear\n />\n </div>\n <div style={{ width: 310 }}>\n <p style={{ margin: '0 0 4px', fontSize: 12, color: '#999' }}>Prefix only</p>\n <Input\n label=\"Label\"\n placeholder=\"Enter amount\"\n prefix={<span>$</span>}\n allowClear\n />\n </div>\n <div style={{ width: 310 }}>\n <p style={{ margin: '0 0 4px', fontSize: 12, color: '#999' }}>Suffix only</p>\n <Input\n label=\"Label\"\n placeholder=\"Enter email\"\n suffix={<span>@gmail.com</span>}\n />\n </div>\n </div>\n </div>\n\n {/* ── Required / Info ── */}\n <div>\n <h3 style={{ margin: '0 0 16px' }}>Required / Info</h3>\n <div style={{ display: 'flex', gap: 24, flexWrap: 'wrap' }}>\n <div style={{ width: 310 }}>\n <p style={{ margin: '0 0 4px', fontSize: 12, color: '#999' }}>Required</p>\n <Input\n label=\"Label\"\n required\n placeholder=\"Required field\"\n />\n </div>\n <div style={{ width: 310 }}>\n <p style={{ margin: '0 0 4px', fontSize: 12, color: '#999' }}>Optional (required=false)</p>\n <Input\n label=\"Label\"\n required={false}\n placeholder=\"Optional field\"\n />\n </div>\n <div style={{ width: 310 }}>\n <p style={{ margin: '0 0 4px', fontSize: 12, color: '#999' }}>With Info</p>\n <Input\n label=\"Label\"\n info=\"Optional hint\"\n placeholder=\"Value\"\n />\n </div>\n <div style={{ width: 310 }}>\n <p style={{ margin: '0 0 4px', fontSize: 12, color: '#999' }}>With Tip</p>\n <Input\n label=\"Label\"\n tip=\"This is a helpful tooltip\"\n placeholder=\"Value\"\n />\n </div>\n <div style={{ width: 310 }}>\n <p style={{ margin: '0 0 4px', fontSize: 12, color: '#999' }}>Optional + Info + Tip</p>\n <Input\n label=\"Label\"\n required={false}\n info=\"Optional hint\"\n tip=\"This is a helpful tooltip\"\n placeholder=\"Value\"\n />\n </div>\n </div>\n </div>\n </div>\n );\n }",
@@ -1351,6 +1411,12 @@
1351
1411
  "source": "stories",
1352
1412
  "compilable": false
1353
1413
  },
1414
+ "96217a515862bd694993e67890c003764d3d7dae09ba8304339664ed91eb84ac": {
1415
+ "title": "Filters With Sort And Pagination",
1416
+ "code": "{\n const [lastAction, setLastAction] = useState<string>('β€”');\n const [lastCount, setLastCount] = useState<number>(portfolioRows.length);\n\n return (\n <div>\n <TypographyBody size=\"sm\" color=\"default-tertiary\" style={hintStyle}>\n Filter on Network / Status, sort on Balance, paginate (size 3).{' '}\n Last <code>onChange</code> action: <strong>{lastAction}</strong>{' '}\n (rows on page: {lastCount}).\n </TypographyBody>\n <Table<PortfolioRow>\n rowKey=\"id\"\n dataSource={portfolioRows}\n pagination={{ pageSize: 3 }}\n onChange={(meta) => {\n setLastAction(meta.action);\n setLastCount(meta.currentDataSource.length);\n }}\n columns={[\n portfolioColumns[0],\n {\n ...portfolioColumns[1],\n filters: NETWORK_FILTER_ITEMS,\n onFilter: (value, record) => record.network === value,\n },\n {\n ...portfolioColumns[2],\n filters: STATUS_FILTER_ITEMS,\n onFilter: (value, record) => record.status === value,\n },\n portfolioColumns[3],\n portfolioColumns[4],\n ]}\n />\n </div>\n );\n }",
1417
+ "source": "stories",
1418
+ "compilable": true
1419
+ },
1354
1420
  "96a4fb49627068cd32df95bce74ab746a2901c627dcd70fa9bf9c9247f21b7a3": {
1355
1421
  "title": "Canonical usage",
1356
1422
  "code": "import { Trigger } from '@1money/component-ui';\n// or\nimport { Trigger } from '@1money/component-ui/Trigger';",
@@ -1423,6 +1489,12 @@
1423
1489
  "source": "canonical",
1424
1490
  "compilable": true
1425
1491
  },
1492
+ "9c1283e9fdf9b6890dff56e79eee2e25f49c665934a1a11e56ef9e636b23642d": {
1493
+ "title": "Figma Wallet Registry",
1494
+ "code": "<WalletRegistryStory\n dataSource={walletRegistryRows}\n defaultExpandedKeys={['wallet-ops']}\n />",
1495
+ "source": "stories",
1496
+ "compilable": true
1497
+ },
1426
1498
  "9eae41b47da6d3b07d6bfdb98fe407b6be85aa68db3fe695699cf9588b65eda8": {
1427
1499
  "title": "Placements",
1428
1500
  "code": "{\n const placements: Placement[] = [\n 'top',\n 'top-start',\n 'top-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end',\n ];\n\n return (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 12,\n padding: 120,\n justifyContent: 'center',\n }}\n >\n {placements.map((placement) => (\n <Dropdown\n {...args}\n key={placement}\n placement={placement}\n content={\n <div style={{ padding: 8, fontSize: 13, whiteSpace: 'nowrap' }}>\n {placement}\n </div>\n }\n >\n <Button size=\"small\">{placement}</Button>\n </Dropdown>\n ))}\n </div>\n );\n }",
@@ -1489,6 +1561,12 @@
1489
1561
  "source": "stories",
1490
1562
  "compilable": false
1491
1563
  },
1564
+ "a5a0117d707475ad307fab2299eec3c085bafe1954ddc3724c5fdd67f326f19d": {
1565
+ "title": "Wallet List Panel",
1566
+ "code": "<div style={figmaFrameStyle}>\n <Table<WalletListRow>\n rowKey=\"id\"\n size=\"large\"\n variant=\"stroke\"\n pagination={false}\n columns={walletListPanelColumns}\n dataSource={walletListPanelRows}\n />\n </div>",
1567
+ "source": "stories",
1568
+ "compilable": true
1569
+ },
1492
1570
  "a5a04f0b0f7ad14c2ae616df4f7820ea44171f7317f4ba0ab23f15985159dc24": {
1493
1571
  "title": "Group Directions",
1494
1572
  "code": "{\n const [verticalValue, setVerticalValue] = React.useState<string | number>('a');\n const [horizontalValue, setHorizontalValue] = React.useState<string | number>('a');\n\n const handleVerticalChange = (event: RadioChangeEvent) => {\n if (event.target.value !== undefined) {\n setVerticalValue(event.target.value);\n }\n };\n\n const handleHorizontalChange = (event: RadioChangeEvent) => {\n if (event.target.value !== undefined) {\n setHorizontalValue(event.target.value);\n }\n };\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 24 }}>\n <div>\n <h3 style={{ marginBottom: 12 }}>Direction Vertical</h3>\n <RadioGroup value={verticalValue} onChange={handleVerticalChange} direction=\"vertical\">\n <Radio value=\"a\" label=\"Option A\" />\n <Radio value=\"b\" label=\"Option B\" />\n <Radio value=\"c\" label=\"Option C\" />\n </RadioGroup>\n </div>\n <div>\n <h3 style={{ marginBottom: 12 }}>Direction Horizontal</h3>\n <RadioGroup value={horizontalValue} onChange={handleHorizontalChange} direction=\"horizontal\">\n <Radio value=\"a\" label=\"Option A\" />\n <Radio value=\"b\" label=\"Option B\" />\n <Radio value=\"c\" label=\"Option C\" />\n </RadioGroup>\n </div>\n </div>\n );\n }",
@@ -1693,6 +1771,18 @@
1693
1771
  "source": "readme",
1694
1772
  "compilable": true
1695
1773
  },
1774
+ "b8db243638e9c756f8cc0fc389226284ba74cf2edceef451b608cb3ab9bfc07e": {
1775
+ "title": "Controlled Filters",
1776
+ "code": "{\n const [networkFilter, setNetworkFilter] = useState<TableFilterValue>(['Ethereum']);\n\n return (\n <div>\n <div style={controlBarStyle}>\n <TypographyBody size=\"sm\" color=\"default-tertiary\">\n Programmatically force network filter:\n </TypographyBody>\n <Button size=\"small\" color=\"grey\" onClick={() => setNetworkFilter(['Ethereum'])}>\n Ethereum\n </Button>\n <Button size=\"small\" color=\"grey\" onClick={() => setNetworkFilter(['Solana'])}>\n Solana\n </Button>\n <Button\n size=\"small\"\n color=\"grey\"\n onClick={() => setNetworkFilter(['Ethereum', 'Solana'])}\n >\n ETH + SOL\n </Button>\n <Button size=\"small\" variant=\"text\" onClick={() => setNetworkFilter([])}>\n Reset\n </Button>\n </div>\n <Table<PortfolioRow>\n rowKey=\"id\"\n pagination={false}\n dataSource={portfolioRows}\n // In controlled mode, the built-in filter dropdown's OK / Reset cannot\n // mutate the parent's state directly β€” listen to `onChange` and mirror\n // the new selection back into local state so the round-trip works.\n onChange={(meta) => {\n if (meta.action === 'filter') {\n setNetworkFilter(meta.filters?.network ?? []);\n }\n }}\n columns={[\n portfolioColumns[0],\n {\n ...portfolioColumns[1],\n filters: NETWORK_FILTER_ITEMS,\n filteredValue: networkFilter,\n onFilter: (value, record) => record.network === value,\n },\n portfolioColumns[2],\n portfolioColumns[3],\n ]}\n />\n </div>\n );\n }",
1777
+ "source": "stories",
1778
+ "compilable": true
1779
+ },
1780
+ "b9cc21db46c34c1f749ec2f5cc996c0eb92608376b07b2eb61f2bc427f045927": {
1781
+ "title": "Virtual Scrolling",
1782
+ "code": "{\n const largeData: PortfolioRow[] = Array.from({ length: 5000 }, (_, index) => ({\n id: `virtual-${index + 1}`,\n wallet: `Wallet ${index + 1}`,\n owner: `Desk ${index % 12}`,\n network: ['Ethereum', 'Solana', 'Polygon', 'Arbitrum'][index % 4],\n status: (['active', 'hold', 'review'] as const)[index % 3],\n balance: 200000 + (index * 1375),\n actionLabel: 'Open',\n countryFlag: index % 2 === 0 ? 'πŸ‡ΊπŸ‡Έ' : 'πŸ‡ͺπŸ‡Ί',\n }));\n\n return (\n <div>\n <TypographyBody size=\"sm\" color=\"default-tertiary\" style={hintStyle}>\n 5,000 rows rendered with the virtualized table kernel.\n </TypographyBody>\n <VirtualTable<PortfolioRow>\n rowKey=\"id\"\n columns={virtualColumns}\n dataSource={largeData}\n scroll={{ x: 740, y: 360 }}\n pagination={false}\n />\n </div>\n );\n }",
1783
+ "source": "stories",
1784
+ "compilable": true
1785
+ },
1696
1786
  "ba061872d363c81e7be320d4e4c26b4ed1989d21480077c3a3055d45d54f1afd": {
1697
1787
  "title": "Icon Hover Demo",
1698
1788
  "code": "<div style={{ display: 'flex', gap: 24, flexWrap: 'wrap', alignItems: 'center' }}>\n <IconHover>\n <Icons {...args} name='deposit' />\n </IconHover>\n <IconHover>\n <Icons {...args} name='withdrawal' />\n </IconHover>\n <IconHover>\n <Icons {...args} name='conversion' />\n </IconHover>\n <IconHover>\n <Icons {...args} name='settings' />\n </IconHover>\n <IconHover>\n <Icons {...args} name='notifications' />\n </IconHover>\n <IconHover>\n <Icons {...args} name='cross' />\n </IconHover>\n <IconHover disabled>\n <Icons {...args} name='cross' />\n </IconHover>\n </div>",
@@ -1759,6 +1849,12 @@
1759
1849
  "source": "stories",
1760
1850
  "compilable": true
1761
1851
  },
1852
+ "c23b54aeab8234b5665b9182a68e75b1d9b5ea969d997e08e1d4a41b85679209": {
1853
+ "title": "Sizes",
1854
+ "code": "<div style={stackStyle}>\n <div>\n <TypographyTitle size=\"sm\" strong style={sectionTitleStyle}>\n Large\n </TypographyTitle>\n <Table {...(args as TableProps<Record<string, any>>)} dataSource={portfolioRows.slice(0, 3)} size=\"large\" />\n </div>\n <div>\n <TypographyTitle size=\"sm\" strong style={sectionTitleStyle}>\n Small\n </TypographyTitle>\n <Table {...(args as TableProps<Record<string, any>>)} dataSource={portfolioRows.slice(0, 3)} size=\"small\" />\n </div>\n </div>",
1855
+ "source": "stories",
1856
+ "compilable": false
1857
+ },
1762
1858
  "c2c42c200e9bad53b274260619d36029e7257a5f80b73408ffe619abdf14a9d9": {
1763
1859
  "title": "Canonical usage",
1764
1860
  "code": "import { Drawer } from '@1money/component-ui';\n// or\nimport { Drawer } from '@1money/component-ui/Drawer';",
@@ -1957,12 +2053,24 @@
1957
2053
  "source": "stories",
1958
2054
  "compilable": false
1959
2055
  },
2056
+ "da280e337376d16711ea44dd2d411fa903a7b572376669f415c392652b3c6142": {
2057
+ "title": "Custom Filter Dropdown",
2058
+ "code": "<div>\n <TypographyBody size=\"sm\" color=\"default-tertiary\" style={hintStyle}>\n A consumer-provided dropdown β€” substring match against the wallet name.\n </TypographyBody>\n <Table<PortfolioRow>\n rowKey=\"id\"\n pagination={false}\n dataSource={portfolioRows}\n columns={[\n {\n ...portfolioColumns[0],\n filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (\n <div style={filterDropdownStyle}>\n <input\n autoFocus\n placeholder=\"Search wallet name\"\n value={String(selectedKeys[0] ?? '')}\n onChange={(e) =>\n setSelectedKeys(e.target.value ? [e.target.value] : [])\n }\n style={filterDropdownInputStyle}\n />\n <div style={filterDropdownFooterStyle}>\n <Button size=\"small\" variant=\"text\" onClick={clearFilters}>\n Clear\n </Button>\n <Button size=\"small\" color=\"primary\" onClick={confirm}>\n Search\n </Button>\n </div>\n </div>\n ),\n onFilter: (value, record) =>\n record.wallet.toLowerCase().includes(String(value).toLowerCase()),\n },\n portfolioColumns[1],\n portfolioColumns[2],\n portfolioColumns[3],\n ]}\n />\n </div>",
2059
+ "source": "stories",
2060
+ "compilable": true
2061
+ },
1960
2062
  "da48319e963f8bce14fd2d0e6276dbdb8273cee567181e50abfb14f902872b76": {
1961
2063
  "title": "Colors",
1962
2064
  "code": "<div style={{ display: 'flex', flexWrap: 'wrap', gap: 12, alignItems: 'center' }}>\n {TAG_COLORS.map((color) => (\n <Tag {...args} key={color} color={color} label={color} />\n ))}\n </div>",
1963
2065
  "source": "stories",
1964
2066
  "compilable": false
1965
2067
  },
2068
+ "da7b2e8d26561713d8946001e3c1ba6ea8c38e7fe99e4982b9eadd4fec64215d": {
2069
+ "title": "Nested Data Index",
2070
+ "code": "<div>\n <TypographyBody size=\"sm\" color=\"default-tertiary\" style={hintStyle}>\n Columns read from <code>user.profile.name</code>,{' '}\n <code>user.profile.email</code>, and <code>balance.fiat</code> via\n array-form <code>dataIndex</code>.\n </TypographyBody>\n <Table<NestedWalletRow>\n rowKey=\"id\"\n pagination={false}\n dataSource={nestedRows}\n columns={[\n {\n key: 'name',\n dataIndex: ['user', 'profile', 'name'],\n title: 'Name',\n width: 220,\n },\n {\n key: 'email',\n dataIndex: ['user', 'profile', 'email'],\n title: 'Email',\n width: 260,\n },\n {\n key: 'asset',\n dataIndex: ['balance', 'asset'],\n title: 'Asset',\n width: 120,\n },\n {\n key: 'fiat',\n dataIndex: ['balance', 'fiat'],\n title: 'Balance',\n width: 160,\n align: 'right',\n sorter: (a, b) => a.balance.fiat - b.balance.fiat,\n render: (value) => formatBalance(value as number),\n },\n ]}\n />\n </div>",
2071
+ "source": "stories",
2072
+ "compilable": true
2073
+ },
1966
2074
  "db11dae227995e92880a75b42e93f034782b06757a643753f468b4e0b598692a": {
1967
2075
  "title": "Filter Wrap Spacing",
1968
2076
  "code": "<div style={DEMO_PAGE_STYLE}>\n <Space size={[8, 12]} wrap style={{ maxWidth: 640 }}>\n <div style={DEMO_CHIP_ITEM_STYLE}>All</div>\n <div style={DEMO_CHIP_ITEM_STYLE}>High Risk</div>\n <div style={DEMO_CHIP_ITEM_STYLE}>KYC Pending</div>\n <div style={DEMO_CHIP_ITEM_STYLE}>Manual Review</div>\n <div style={DEMO_CHIP_ITEM_STYLE}>Today</div>\n <div style={DEMO_CHIP_ITEM_STYLE}>This Week</div>\n <div style={DEMO_CHIP_ITEM_STYLE}>Large Amount</div>\n <div style={DEMO_CHIP_ITEM_STYLE}>USDT</div>\n <div style={DEMO_CHIP_ITEM_STYLE}>USD</div>\n </Space>\n </div>",
@@ -2065,6 +2173,12 @@
2065
2173
  "source": "stories",
2066
2174
  "compilable": false
2067
2175
  },
2176
+ "e507eed4788971490bf4cdd4a72e99bbbbb78635073b89a32022fdb2055c6a3b": {
2177
+ "title": "Virtual Usage",
2178
+ "code": "<VirtualTable\n rowKey=\"id\"\n columns={columns}\n dataSource={rows}\n scroll={{ x: 1200, y: 360 }}\n/>",
2179
+ "source": "readme",
2180
+ "compilable": true
2181
+ },
2068
2182
  "e57037f057f4da5ac90baae9ad1d85153cb48c9cfff34a65cbe2a927bf5cb713": {
2069
2183
  "title": "Usage",
2070
2184
  "code": "<Dialog\n open={open}\n title=\"Confirm transfer\"\n onCancel={() => setOpen(false)}\n onOk={handleSubmit}\n/>",
@@ -2143,6 +2257,12 @@
2143
2257
  "source": "stories",
2144
2258
  "compilable": false
2145
2259
  },
2260
+ "ef4904f8e094b98c456651c4a86b1a206b470678f945596a762b38b9855c76ae": {
2261
+ "title": "Rich Checkbox Props",
2262
+ "code": "<div>\n <TypographyBody size=\"sm\" color=\"default-tertiary\" style={hintStyle}>\n Rows in <code>hold</code> state are disabled and carry a per-row{' '}\n <code>title</code> / <code>aria-label</code> for accessibility.\n </TypographyBody>\n <Table<PortfolioRow>\n rowKey=\"id\"\n pagination={false}\n dataSource={portfolioRows.slice(0, 5)}\n columns={portfolioColumns}\n rowSelection={{\n type: 'checkbox',\n getCheckboxProps: (record) => ({\n disabled: record.status === 'hold',\n title:\n record.status === 'hold'\n ? `Locked β€” ${record.wallet} is on hold`\n : `Select ${record.wallet}`,\n 'aria-label': `Toggle selection for ${record.wallet}`,\n }),\n }}\n />\n </div>",
2263
+ "source": "stories",
2264
+ "compilable": true
2265
+ },
2146
2266
  "efb94a978c87bf9343e9605b358b08efa2db1f476e21029ee2bda3da4f275448": {
2147
2267
  "title": "Api Examples",
2148
2268
  "code": "<div style={DEMO_SECTION_STYLE}>\n <Flex\n gap={GAP_MIDDLE}\n align={FLEX_ALIGN.center}\n justify={FLEX_JUSTIFY.spaceBetween}\n wrap={WRAP_DISABLED}\n prefixCls={FLEX_PREFIX}\n >\n <div style={DEMO_BOX_STYLE}>Align</div>\n <div style={DEMO_BOX_STYLE}>Justify</div>\n </Flex>\n\n <Flex vertical gap={GAP_LARGE} wrap={WRAP_ENABLED} prefixCls={FLEX_PREFIX}>\n <div style={DEMO_BOX_STYLE}>Vertical</div>\n <div style={DEMO_BOX_STYLE}>Wrap</div>\n </Flex>\n </div>",
@@ -2161,6 +2281,12 @@
2161
2281
  "source": "stories",
2162
2282
  "compilable": false
2163
2283
  },
2284
+ "f0b43407e5af920de287ba579078143cd869cfc5885640bde4a41c50636377d4": {
2285
+ "title": "Row Expandable",
2286
+ "code": "{\n // Seed `r2` (a non-expandable row) into the controlled keys to prove the\n // render layer refuses to draw expanded content for it.\n const [expandedKeys, setExpandedKeys] = useState<React.Key[]>(['r1', 'r2']);\n\n const columns: TableColumn<RowExpandableDemoRow>[] = [\n { key: 'title', dataIndex: 'title', title: 'Order' },\n {\n key: 'kind',\n title: 'Kind',\n render: (_v, record) => (\n <Tag\n label={record.notes ? 'Has notes' : 'No notes'}\n color={record.notes ? 'success' : 'neutral'}\n />\n ),\n },\n ];\n\n return (\n <div style={{ width: 640 }}>\n <TypographyBody className=\"om-mb-3\">\n Rows without <code>notes</code> have no chevron, ignore the\n <code> expandRowByClick</code> shortcut, and refuse to render expanded content\n even when their key is forced into <code>expandedRowKeys</code>.\n </TypographyBody>\n <Table<RowExpandableDemoRow>\n rowKey=\"id\"\n size=\"small\"\n variant=\"stroke\"\n pagination={false}\n dataSource={rowExpandableDemoData}\n columns={columns}\n expandable={{\n expandedRowKeys: expandedKeys,\n onExpandedRowsChange: (keys) => setExpandedKeys([...keys]),\n expandRowByClick: true,\n rowExpandable: (record) => Boolean(record.notes),\n expandedRowRender: (record) => (\n <div style={{ padding: '8px 16px', background: '#fafafa' }}>\n <TypographyLabel>{record.notes}</TypographyLabel>\n </div>\n ),\n }}\n />\n </div>\n );\n }",
2287
+ "source": "stories",
2288
+ "compilable": true
2289
+ },
2164
2290
  "f2c3b9fe0a35d0f3e87ed98754d67b66bdf140128496a16d3ebc5ba4819068cc": {
2165
2291
  "title": "All Variants",
2166
2292
  "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: 32 }}>\n <div>\n <h3 style={{ marginBottom: 12 }}>Default</h3>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n <Radio label=\"Unchecked\" />\n <Radio label=\"Checked\" checked />\n <Radio label=\"Disabled unchecked\" disabled />\n <Radio label=\"Disabled checked\" checked disabled />\n </div>\n </div>\n <div>\n <h3 style={{ marginBottom: 12 }}>With Description</h3>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n <Radio label=\"Unchecked\" description=\"Helper text\" />\n <Radio label=\"Checked\" description=\"Helper text\" checked />\n <Radio\n label=\"Disabled unchecked\"\n description=\"Helper text\"\n disabled\n />\n <Radio\n label=\"Disabled checked\"\n description=\"Helper text\"\n checked\n disabled\n />\n </div>\n </div>\n <div>\n <h3 style={{ marginBottom: 12 }}>Label Placement: Right</h3>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n <Radio label=\"Unchecked\" labelPlacement=\"right\" />\n <Radio label=\"Checked\" labelPlacement=\"right\" checked />\n <Radio\n label=\"With description\"\n description=\"Helper text\"\n labelPlacement=\"right\"\n />\n </div>\n </div>\n <div>\n <h3 style={{ marginBottom: 12 }}>Cell</h3>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n <Radio\n checked\n variant=\"cell\"\n size=\"large\"\n alignment=\"left\"\n icon=\"swift\"\n label=\"Wire transfer\"\n description=\"Receive via SWIFT\"\n style={{ width: 320 }}\n />\n <Radio\n variant=\"cell\"\n size=\"medium\"\n alignment=\"left\"\n icon=\"usd\"\n label=\"USD1\"\n style={{ width: 180 }}\n />\n <Radio\n checked\n variant=\"cell\"\n size=\"large\"\n alignment=\"center\"\n icon=\"language\"\n tag=\"Popular\"\n label=\"Global account\"\n description=\"Use for international settlement\"\n style={{ width: 220 }}\n />\n </div>\n </div>\n </div>",
@@ -2203,6 +2329,12 @@
2203
2329
  "source": "readme",
2204
2330
  "compilable": true
2205
2331
  },
2332
+ "f59241468963f180aad8e4bfdf87c64b8defd166186019821c0a5462fcd36f72": {
2333
+ "title": "Import",
2334
+ "code": "import { Table, VirtualTable } from '@1money/component-ui';\n// or\nimport { Table, VirtualTable } from '@1money/component-ui/Table';",
2335
+ "source": "readme",
2336
+ "compilable": true
2337
+ },
2206
2338
  "f5e88271260df2b0e8df1a0b03d96a4c3004f14d0e5aaec8892007d6c41fddb4": {
2207
2339
  "title": "With Disabled",
2208
2340
  "code": "<Tabs\n items={[\n { key: 'tab1', label: 'Overview' },\n { key: 'tab2', label: 'Transactions' },\n { key: 'tab3', label: 'Analytics', disabled: true },\n { key: 'tab4', label: 'Settings' },\n ]}\n />",