@1money/component-ui 0.0.50 → 0.0.51

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1money/component-ui",
3
- "version": "0.0.50",
3
+ "version": "0.0.51",
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",
@@ -37,12 +37,6 @@
37
37
  "source": "readme",
38
38
  "compilable": true
39
39
  },
40
- "034773bdaca67ca0d5a236ca92c3d84403ca823cb8249eacea2414545523ab3d": {
41
- "title": "Grouped",
42
- "code": "{\n const [value, setValue] = useState<string | number | undefined>('usdt');\n\n return (\n <Select\n {...args}\n value={value}\n onChange={(nextValue, option) => {\n setValue(nextValue as string | number | undefined);\n args.onChange?.(nextValue, option);\n }}\n />\n );\n }",
43
- "source": "stories",
44
- "compilable": false
45
- },
46
40
  "03ae4647e3bd8aa48fde505061070eb0425296d0b86b97f0b240c36897efc68f": {
47
41
  "title": "Split",
48
42
  "code": "<Space split={<span>|</span>} size={SPACE_SIZE.large}>\n <span>Alpha</span>\n <span>Beta</span>\n <span>Gamma</span>\n </Space>",
@@ -205,12 +199,6 @@
205
199
  "source": "stories",
206
200
  "compilable": false
207
201
  },
208
- "123291e7b1b33126adc91e8204e4002c37c71a74eb5bfca67a4da71b9aec2f6a": {
209
- "title": "Default",
210
- "code": "{\n const [value, setValue] = useState<string | number | undefined>('btc');\n\n return (\n <Select\n {...args}\n value={value}\n onChange={(nextValue, option) => {\n setValue(nextValue as string | number | undefined);\n args.onChange?.(nextValue, option);\n }}\n />\n );\n }",
211
- "source": "stories",
212
- "compilable": false
213
- },
214
202
  "1238535c7f91f78671738663cda3f3ed6984f0c29a539c190b264b03630e6d69": {
215
203
  "title": "Disabled",
216
204
  "code": "<Dropdown {...args} disabled content={<MenuContent />}>\n <Button disabled>Disabled</Button>\n </Dropdown>",
@@ -235,12 +223,6 @@
235
223
  "source": "readme",
236
224
  "compilable": true
237
225
  },
238
- "17a413d259fae192ca2f0c09fc23af856852b5f5ca65c1efa9dcb95480776ede": {
239
- "title": "Disabled Vs Read Only",
240
- "code": "<div style={{ display: 'flex', gap: 24 }}>\n <div style={storyContainerStyle}>\n <Select\n label=\"Disabled\"\n options={OPTIONS}\n value=\"btc\"\n disabled\n />\n </div>\n <div style={storyContainerStyle}>\n <Select\n label=\"Read only\"\n options={OPTIONS}\n value=\"btc\"\n readOnly\n />\n </div>\n </div>",
241
- "source": "stories",
242
- "compilable": true
243
- },
244
226
  "17aad2a9b23bb7f9a4768f770a9b9b5b06d74dab24c5200037505b0047ec2391": {
245
227
  "title": "Controlled",
246
228
  "code": "{\n const [open, setOpen] = useState(false);\n return (\n <div style={ANCHOR_WRAPPER_STYLE}>\n <button id=\"tooltip-controlled\">Anchor</button>\n <div style={CONTROL_ROW_STYLE}>\n <button onClick={() => setOpen(true)}>Open</button>\n <button onClick={() => setOpen(false)}>Close</button>\n <button onClick={() => setOpen((v) => !v)}>Toggle</button>\n </div>\n <Tooltip\n anchorSelect=\"#tooltip-controlled\"\n title=\"Controlled\"\n body=\"This tooltip is controlled externally.\"\n open={open}\n onOpenChange={setOpen}\n />\n </div>\n );\n }",
@@ -283,12 +265,6 @@
283
265
  "source": "stories",
284
266
  "compilable": true
285
267
  },
286
- "1cc244bf13712c43e79b378e25198234696ed488d0a147473327f0eb16c461bc": {
287
- "title": "Searchable Sizes",
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 }",
289
- "source": "stories",
290
- "compilable": false
291
- },
292
268
  "1d0cc410e4f667fa13d9ad249ca801acda6fd51fc78c87c3b00209163c48df6b": {
293
269
  "title": "Range Selection",
294
270
  "code": "<Calendar\n label=\"Date Range\"\n selectionMode=\"range\"\n numberOfMonths={2}\n/>",
@@ -349,12 +325,6 @@
349
325
  "source": "readme",
350
326
  "compilable": true
351
327
  },
352
- "20ec463b0b6df55a2fa2c5df4836735067151eb22ca13e76ea7b7795465b3141": {
353
- "title": "Without Portal",
354
- "code": "{\n const [value, setValue] = useState<string | number | undefined>('btc');\n\n return (\n <div style={{ position: 'relative' }}>\n <Select\n {...args}\n portal={false}\n value={value}\n onChange={(nextValue, option) => {\n setValue(nextValue as string | number | undefined);\n args.onChange?.(nextValue, option);\n }}\n />\n </div>\n );\n }",
355
- "source": "stories",
356
- "compilable": false
357
- },
358
328
  "216b625401b1ee29a2c8f02427f776e18dd670858e53fd87ea414473832ba9c9": {
359
329
  "title": "With Title",
360
330
  "code": "<div style={ANCHOR_WRAPPER_STYLE}>\n <button id=\"tooltip-title\">Hover me</button>\n <Tooltip {...args} anchorSelect=\"#tooltip-title\" />\n </div>",
@@ -385,6 +355,12 @@
385
355
  "source": "stories",
386
356
  "compilable": false
387
357
  },
358
+ "22db460cb1da47a1d59eeff302bd4b045cc8fa5f8597eba6047dfc4c668f58f6": {
359
+ "title": "Overview",
360
+ "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={stackStyle}>\n {sizes.map((size) => (\n <div key={size}>\n <h3 style={{ ...sectionTitleStyle, textTransform: 'capitalize' }}>{size}</h3>\n <div style={rowStyle}>\n {statuses.map((status) =>\n valueTypes.map((vt) => (\n <div key={`${status}-${vt}`} style={cellStyle(310)}>\n <p style={captionStyle}>\n {status} / {vt}\n </p>\n <Select\n size={size}\n status={status}\n label=\"Label\"\n feedback=\"Feedback\"\n placeholder=\"Value\"\n options={OPTIONS}\n defaultValue={vt === 'Filled' ? 'btc' : undefined}\n />\n </div>\n )),\n )}\n {valueTypes.map((vt) => (\n <div key={`readonly-${vt}`} style={cellStyle(310)}>\n <p style={captionStyle}>read-only / {vt}</p>\n <Select\n size={size}\n readOnly\n label=\"Label\"\n options={OPTIONS}\n placeholder=\"Value\"\n defaultValue={vt === 'Filled' ? 'btc' : undefined}\n />\n </div>\n ))}\n {valueTypes.map((vt) => (\n <div key={`disabled-${vt}`} style={cellStyle(310)}>\n <p style={captionStyle}>disabled / {vt}</p>\n <Select\n size={size}\n disabled\n label=\"Label\"\n options={OPTIONS}\n placeholder=\"Value\"\n defaultValue={vt === 'Filled' ? 'btc' : undefined}\n />\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n }",
361
+ "source": "stories",
362
+ "compilable": true
363
+ },
388
364
  "22edc8d5014aba685af83f60b94c089e387cc95677d233691190f5e2d031e262": {
389
365
  "title": "Dotted",
390
366
  "code": "<div>\n <p>Lorem ipsum dolor sit amet.</p>\n <Divider variant=\"dotted\" />\n <p>Lorem ipsum dolor sit amet.</p>\n <Divider variant=\"dotted\">Dotted</Divider>\n <p>Lorem ipsum dolor sit amet.</p>\n </div>",
@@ -547,6 +523,12 @@
547
523
  "source": "stories",
548
524
  "compilable": false
549
525
  },
526
+ "321187232dc3b48e95ce3712c00ca272ee685f253daca21db994104a5eb509d2": {
527
+ "title": "Searchable",
528
+ "code": "{\n const [basic, setBasic] = useState<string | number | undefined>('usdt');\n const [searchOnly, setSearchOnly] = useState<string | number | undefined>(undefined);\n const [searchValue, setSearchValue] = useState('');\n const [smallValue, setSmallValue] = useState<string | number | undefined>('usdt');\n\n const trimmed = searchValue.trim().toLowerCase();\n const filteredOptions = trimmed\n ? ASSET_OPTIONS.filter((option) => {\n const label = String(option.label).toLowerCase();\n const description = String(option.description ?? '').toLowerCase();\n const optionValue = String(option.value).toLowerCase();\n return (\n label.includes(trimmed) ||\n description.includes(trimmed) ||\n optionValue.includes(trimmed)\n );\n })\n : [];\n\n return (\n <div style={rowStyle}>\n <div style={cellStyle(320)}>\n <p style={captionStyle}>Default (large)</p>\n <Select\n label=\"Asset\"\n searchable\n searchPlaceholder=\"Search\"\n options={ASSET_OPTIONS}\n value={basic}\n onChange={(next) => setBasic(next as string | number | undefined)}\n />\n </div>\n <div style={cellStyle(320)}>\n <p style={captionStyle}>Small + grouped</p>\n <Select\n label=\"Asset\"\n size=\"small\"\n searchable\n searchPlaceholder=\"Search\"\n filterInputAutoFocus={false}\n options={GROUPED_ASSET_OPTIONS}\n renderOption={renderAssetOption}\n value={smallValue}\n onChange={(next) => setSmallValue(next as string | number | undefined)}\n />\n </div>\n <div style={cellStyle(320)}>\n <p style={captionStyle}>Controlled filter (search-only)</p>\n <Select\n label=\"Asset\"\n searchable\n searchPlaceholder=\"Search\"\n options={filteredOptions}\n searchValue={searchValue}\n emptyContent={trimmed ? 'No matches' : 'Type to search assets'}\n value={searchOnly}\n onSearchChange={setSearchValue}\n onChange={(next) => setSearchOnly(next as string | number | undefined)}\n />\n </div>\n </div>\n );\n }",
529
+ "source": "stories",
530
+ "compilable": true
531
+ },
550
532
  "3298cc00509da7da73ca2da525874e520a453a289a0c4985f6f11249b5768dba": {
551
533
  "title": "Full Width",
552
534
  "code": "<Tabs items={DEFAULT_ITEMS} fullWidth />",
@@ -619,9 +601,9 @@
619
601
  "source": "stories",
620
602
  "compilable": false
621
603
  },
622
- "388bcf7888091d287918f2abfe24285c3cfff0239bf53bd18a57521a4d44c8e1": {
623
- "title": "Custom",
624
- "code": "{\n const [selected, setSelected] = useState<Array<string | number>>(['btc', 'eth', 'sol']);\n const [open, setOpen] = useState(false);\n\n const toggle = (value: string | number) => {\n setSelected((prev) =>\n prev.includes(value) ? prev.filter((v) => v !== value) : [...prev, value],\n );\n };\n\n const triggerLabel = selected.length > 0\n ? `${selected.length} selected`\n : null;\n\n return (\n <div style={storyContainerStyle}>\n <Select.Custom\n label=\"Assets\"\n placeholder=\"Select assets\"\n open={open}\n onOpenChange={setOpen}\n selectedTemplate={triggerLabel}\n >\n {() => (\n <>\n <div style={customPanelHeaderStyle}>\n <span style={customPanelTitleStyle}>\n {selected.length} selected\n </span>\n <button\n type=\"button\"\n style={customClearAllStyle}\n onClick={() => setSelected([])}\n >\n <Icons name=\"cross\" size={14} color=\"currentColor\" />\n Clear all\n </button>\n </div>\n {ASSET_OPTIONS.map((option) => {\n const isSelected = selected.includes(option.value);\n return (\n <button\n key={option.value}\n type=\"button\"\n style={customRowStyle}\n onClick={() => toggle(option.value)}\n >\n <AssetMark value={option.value} />\n <span style={assetOptionLabelStyle}>{option.label}</span>\n <span style={customCheckboxStyle(isSelected)}>\n {isSelected && <Icons name=\"check\" size={14} color=\"currentColor\" />}\n </span>\n </button>\n );\n })}\n </>\n )}\n </Select.Custom>\n </div>\n );\n }",
604
+ "38c0990d0517329d8af0b08ed465ae4f70df6530837272d36afcf65edfb854bf": {
605
+ "title": "Grouped",
606
+ "code": "{\n const [basic, setBasic] = useState<string | number | undefined>('usdt');\n const [assets, setAssets] = useState<string | number | undefined>('usdt');\n\n return (\n <div style={rowStyle}>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>Plain groups</p>\n <Select\n label=\"Asset\"\n options={GROUPED_OPTIONS}\n value={basic}\n onChange={(next) => setBasic(next as string | number | undefined)}\n />\n </div>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>Groups + custom render</p>\n <Select\n label=\"Asset\"\n options={GROUPED_ASSET_OPTIONS}\n renderOption={renderAssetOption}\n value={assets}\n onChange={(next) => setAssets(next as string | number | undefined)}\n />\n </div>\n </div>\n );\n }",
625
607
  "source": "stories",
626
608
  "compilable": true
627
609
  },
@@ -685,12 +667,6 @@
685
667
  "source": "stories",
686
668
  "compilable": true
687
669
  },
688
- "41af856d1d6a822e2c95f25c337807c0d18d1e445d318d07621beba85ce3e926": {
689
- "title": "Searchable Small",
690
- "code": "{\n const [value, setValue] = useState<string | number | undefined>('usdt');\n\n return (\n <div style={storyContainerStyle}>\n <Select\n {...args}\n value={value}\n onChange={(nextValue, option) => {\n setValue(nextValue as string | number | undefined);\n args.onChange?.(nextValue, option);\n }}\n />\n </div>\n );\n }",
691
- "source": "stories",
692
- "compilable": false
693
- },
694
670
  "42725955e8eb348643a00cbbd15d1485475e1917d44f5e685f6f2a094fa6a4a5": {
695
671
  "title": "Canonical usage",
696
672
  "code": "import { Space } from '@1money/component-ui';\n// or\nimport { Space } from '@1money/component-ui/Space';\nimport { SPACE_ALIGN, SPACE_DIRECTION, SPACE_SIZE } from '@1money/component-ui/Space';",
@@ -709,12 +685,6 @@
709
685
  "source": "stories",
710
686
  "compilable": true
711
687
  },
712
- "44c4b25e35236d2eaf4d26824badf330c6495194077c815a662b000591be91be": {
713
- "title": "Multiple Collapsed",
714
- "code": "{\n const [value, setValue] = useState<Array<string | number>>([\n 'btc',\n 'eth',\n 'usdt',\n 'usdc',\n 'sol',\n 'doge',\n ]);\n\n return (\n <div style={{ width: 320 }}>\n <Select\n {...args}\n multiple\n value={value}\n onChange={(nextValue, option) => {\n setValue((nextValue as Array<string | number>) ?? []);\n args.onChange?.(nextValue, option);\n }}\n />\n </div>\n );\n }",
715
- "source": "stories",
716
- "compilable": false
717
- },
718
688
  "45540f738e1068d8a124b639401d1c1ce52ae887afdc2aec99071704644db73a": {
719
689
  "title": "Toolbar Spacing",
720
690
  "code": "<div style={DEMO_PAGE_STYLE}>\n <div style={{ ...DEMO_PANEL_STYLE, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <Space size={SPACE_SIZE.small} align={SPACE_ALIGN.center}>\n <div style={DEMO_INLINE_ITEM_STYLE}>Date Range</div>\n <div style={DEMO_INLINE_ITEM_STYLE}>Status</div>\n <div style={DEMO_INLINE_ITEM_STYLE}>Currency</div>\n </Space>\n <Space size={SPACE_SIZE.small} align={SPACE_ALIGN.center}>\n <div style={DEMO_INLINE_ITEM_STYLE}>Export</div>\n <div style={DEMO_INLINE_ITEM_STYLE}>Refresh</div>\n <div style={DEMO_INLINE_ITEM_STYLE}>Create</div>\n </Space>\n </div>\n </div>",
@@ -853,12 +823,6 @@
853
823
  "source": "readme",
854
824
  "compilable": true
855
825
  },
856
- "572f2d8e36841d6c929bf0ee4c11423ef33dc618291ed6bd10d900f09cf64d11": {
857
- "title": "Frameless",
858
- "code": "{\n const [value, setValue] = useState<string | number | undefined>('btc');\n\n return (\n <Select\n {...args}\n value={value}\n variant=\"frameless\"\n prefix={<Icons name=\"usd\" size={24} color=\"currentColor\" />}\n onChange={(nextValue, option) => {\n setValue(nextValue as string | number | undefined);\n args.onChange?.(nextValue, option);\n }}\n />\n );\n }",
859
- "source": "stories",
860
- "compilable": false
861
- },
862
826
  "57e5a7e81ccfa1d876cf40e95b6165f9d630fe343bc29dbb15c3fe546e689e62": {
863
827
  "title": "Default",
864
828
  "code": "<div style={wrapperStyle}>\n <Step {...args} />\n </div>",
@@ -973,6 +937,12 @@
973
937
  "source": "canonical",
974
938
  "compilable": true
975
939
  },
940
+ "622328c2d21bf88d74f96e2eef2801175864c2af381a438ab39a4cbccc92f623": {
941
+ "title": "Required Optional",
942
+ "code": "<div style={rowStyle}>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>Required (default)</p>\n <Select label=\"Label\" options={OPTIONS} placeholder=\"Required field\" />\n </div>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>Optional (required=false)</p>\n <Select\n label=\"Label\"\n required={false}\n options={OPTIONS}\n placeholder=\"Optional field\"\n />\n </div>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>With info</p>\n <Select\n label=\"Label\"\n info={<Icons name=\"info\" size={16} />}\n options={OPTIONS}\n placeholder=\"Value\"\n />\n </div>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>With description</p>\n <Select\n label=\"Label\"\n description=\"Helper copy below the label\"\n options={OPTIONS}\n placeholder=\"Value\"\n />\n </div>\n </div>",
943
+ "source": "stories",
944
+ "compilable": true
945
+ },
976
946
  "62b5efe615c2669f474d5e6b4b89e9548d25b067decf9570da5994151f8c3d63": {
977
947
  "title": "Import",
978
948
  "code": "import { Radio, RadioGroup } from '@1money/component-ui';\n// or tree-shakeable\nimport { Radio, RadioGroup } from '@1money/component-ui/Radio';",
@@ -1069,12 +1039,6 @@
1069
1039
  "source": "stories",
1070
1040
  "compilable": false
1071
1041
  },
1072
- "72f524de604ba1db3308d0b8f5131b0204abf6a3e411be78f4f61d0fc2081eb7": {
1073
- "title": "Render Option Content",
1074
- "code": "{\n const [value, setValue] = useState<string | number | undefined>('usdt');\n\n return (\n <div style={storyContainerStyle}>\n <Select\n {...args}\n value={value}\n renderOptionContent={renderAssetOptionContent}\n onChange={(nextValue, option) => {\n setValue(nextValue as string | number | undefined);\n args.onChange?.(nextValue, option);\n }}\n />\n </div>\n );\n }",
1075
- "source": "stories",
1076
- "compilable": false
1077
- },
1078
1042
  "7318e5e19b35c2334284717d2b44382c3f0aa456d1d61c6892e3211c2c77135d": {
1079
1043
  "title": "Canonical usage",
1080
1044
  "code": "import { Pagination, usePagination } from '@1money/component-ui';\n// or\nimport { Pagination, usePagination } from '@1money/component-ui/Pagination';",
@@ -1201,12 +1165,6 @@
1201
1165
  "source": "stories",
1202
1166
  "compilable": false
1203
1167
  },
1204
- "7f9b721c6811ebeeeda10ed23eb590ad0f0d00b3e64ce2aedb8a6e3b12179071": {
1205
- "title": "Grouped Asset Options",
1206
- "code": "{\n const [value, setValue] = useState<string | number | undefined>('usdt');\n\n return (\n <div style={storyContainerStyle}>\n <Select\n {...args}\n value={value}\n renderOption={renderAssetOption}\n onChange={(nextValue, option) => {\n setValue(nextValue as string | number | undefined);\n args.onChange?.(nextValue, option);\n }}\n />\n </div>\n );\n }",
1207
- "source": "stories",
1208
- "compilable": false
1209
- },
1210
1168
  "7fa92e052831cae87c3f0b935466ebe2f827bd696b626583810266f584e63167": {
1211
1169
  "title": "Page Loading Overlay",
1212
1170
  "code": "const PageLoader = ({ isLoading }: { isLoading: boolean }) => {\n if (!isLoading) return null;\n\n return (\n <div className=\"page-loader-overlay\">\n <Spinner size={48} />\n </div>\n );\n};",
@@ -1267,6 +1225,12 @@
1267
1225
  "source": "readme",
1268
1226
  "compilable": true
1269
1227
  },
1228
+ "8403e3e85f925998931bcd3fef7363c0d75b3598527183aa58a4c63df20f0bce": {
1229
+ "title": "Loading",
1230
+ "code": "<div style={rowStyle}>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>Large</p>\n <Select label=\"Label\" options={OPTIONS} placeholder=\"Loading…\" loading />\n </div>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>Small</p>\n <Select size=\"small\" label=\"Label\" options={OPTIONS} placeholder=\"Loading…\" loading />\n </div>\n </div>",
1231
+ "source": "stories",
1232
+ "compilable": true
1233
+ },
1270
1234
  "842244e70f89e2aaf6941718de836ab3a6e08d642a4d4bb2e80cee160158470f": {
1271
1235
  "title": "Default",
1272
1236
  "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 }",
@@ -1333,6 +1297,12 @@
1333
1297
  "source": "stories",
1334
1298
  "compilable": true
1335
1299
  },
1300
+ "891d99f659a24e8f2a9b367205466b9a0829212be5d9614e3061c90bd45f6a24": {
1301
+ "title": "Panel Actions",
1302
+ "code": "{\n const [open, setOpen] = useState(false);\n const [value, setValue] = useState<Array<string | number>>(['btc']);\n const [draftValue, setDraftValue] = useState<Array<string | number>>(['btc']);\n\n return (\n <div style={cellStyle(320)}>\n <Select\n label=\"Assets\"\n placeholder=\"Select assets\"\n options={ASSET_OPTIONS}\n size=\"small\"\n multiple\n open={open}\n value={open ? draftValue : value}\n renderOption={renderAssetOption}\n panelFooter={\n <div style={panelFooterStyle}>\n <Button\n color=\"grey\"\n size=\"small\"\n style={{ flex: 1 }}\n onClick={() => setDraftValue([])}\n >\n Reset\n </Button>\n <Button\n size=\"small\"\n style={{ flex: 1 }}\n onClick={() => {\n setValue(draftValue);\n setOpen(false);\n }}\n >\n Apply\n </Button>\n </div>\n }\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n setDraftValue(value);\n }}\n onChange={(next) => setDraftValue((next as Array<string | number>) ?? [])}\n />\n </div>\n );\n }",
1303
+ "source": "stories",
1304
+ "compilable": true
1305
+ },
1336
1306
  "89acd530e5d3ac4d2f2cdc50085c98fc8d6ee5a3f488a16486455a35460bb354": {
1337
1307
  "title": "Long Text",
1338
1308
  "code": "<div style={PREVIEW_GRID_STYLE}>\n <TooltipPreviewCard\n label=\"Long body only\"\n body={EXTRA_LONG_TEXT}\n />\n <TooltipPreviewCard\n label=\"Long title + long body\"\n title=\"This is a very long tooltip title that might wrap to multiple lines\"\n body={EXTRA_LONG_TEXT}\n />\n <TooltipPreviewCard\n label=\"Long body with placement right\"\n body={EXTRA_LONG_TEXT}\n placement=\"right\"\n />\n </div>",
@@ -1375,12 +1345,6 @@
1375
1345
  "source": "canonical",
1376
1346
  "compilable": true
1377
1347
  },
1378
- "90bea0eac958ff92526a0901cd2515a8694e96039b3d056e709ede70bd1b4678": {
1379
- "title": "Search Only Filtered",
1380
- "code": "{\n const [value, setValue] = useState<string | number | undefined>(undefined);\n const [searchValue, setSearchValue] = useState('');\n\n const trimmed = searchValue.trim().toLowerCase();\n const filteredOptions = trimmed\n ? ASSET_OPTIONS.filter((option) => {\n const label = String(option.label).toLowerCase();\n const description = String(option.description ?? '').toLowerCase();\n const optionValue = String(option.value).toLowerCase();\n return (\n label.includes(trimmed) ||\n description.includes(trimmed) ||\n optionValue.includes(trimmed)\n );\n })\n : [];\n\n return (\n <div style={storyContainerStyle}>\n <Select\n {...args}\n value={value}\n options={filteredOptions}\n searchValue={searchValue}\n emptyContent={trimmed ? 'No matches' : 'Type to search assets'}\n onSearchChange={(next) => {\n setSearchValue(next);\n args.onSearchChange?.(next);\n }}\n onChange={(nextValue, option) => {\n setValue(nextValue as string | number | undefined);\n args.onChange?.(nextValue, option);\n }}\n />\n </div>\n );\n }",
1381
- "source": "stories",
1382
- "compilable": false
1383
- },
1384
1348
  "920c6084b0c74e8e6ccd8e98e3afd2477bffb820950ef10b1e933c2597cd446f": {
1385
1349
  "title": "Canonical usage",
1386
1350
  "code": "import { Icons, IconWrapper, IconHover } from '@1money/component-ui';\n// or\nimport { Icons, IconWrapper, IconHover } from '@1money/component-ui/Icons';\n\n// Type imports\nimport type { IconName, SortIconStatus } from '@1money/component-ui';",
@@ -1399,12 +1363,6 @@
1399
1363
  "source": "readme",
1400
1364
  "compilable": true
1401
1365
  },
1402
- "9532a16e360ac90c4955a5d2fb7dbfd364a470857fe111e7c0f76c886afe2153": {
1403
- "title": "Multiple",
1404
- "code": "{\n const [value, setValue] = useState<Array<string | number>>([\n 'btc',\n 'eth',\n 'usdt',\n 'usdc',\n 'sol',\n 'doge',\n 'ada',\n 'matic',\n ]);\n\n return (\n <Select\n {...args}\n multiple\n value={value}\n onChange={(nextValue, option) => {\n setValue((nextValue as Array<string | number>) ?? []);\n args.onChange?.(nextValue, option);\n }}\n />\n );\n }",
1405
- "source": "stories",
1406
- "compilable": false
1407
- },
1408
1366
  "957f519084a4f84fd6a79517a4f2c6a85245176f268b9c5f6e090ee983e82fa8": {
1409
1367
  "title": "Single Content States",
1410
1368
  "code": "<div style={stackStyle}>\n <Alert\n {...args}\n title={multiLineTitle}\n body={undefined}\n link={undefined}\n closable={false}\n />\n <Alert\n {...args}\n title={undefined}\n body={multiLineBody}\n link={undefined}\n closable={false}\n />\n <Alert\n {...args}\n title={multiLineTitle}\n body={undefined}\n link={{ label: 'Open details', onClick: fn() }}\n closable={false}\n />\n <Alert\n\n title={multiLineTitle}\n body={undefined}\n closable={false}\n action={<Button onClick={(() => {\n console.log('Action button clicked');\n })}>Take action</Button>}\n />\n </div>",
@@ -1615,6 +1573,12 @@
1615
1573
  "source": "stories",
1616
1574
  "compilable": true
1617
1575
  },
1576
+ "abeafbd17ae622f40f4e0e684520b3147e5acb533583ea71c8b1d95fd3805540": {
1577
+ "title": "Default",
1578
+ "code": "{\n const [value, setValue] = useState<string | number | undefined>('btc');\n return (\n <div style={{ width: 310 }}>\n <Select\n {...args}\n value={value}\n onChange={(nextValue, option) => {\n setValue(nextValue as string | number | undefined);\n args.onChange?.(nextValue, option);\n }}\n />\n </div>\n );\n }",
1579
+ "source": "stories",
1580
+ "compilable": false
1581
+ },
1618
1582
  "acab0e7cc530a58ffcca4edc686eb0a0b922021deac39c66bbd80ffd9d82ab5f": {
1619
1583
  "title": "Variable Height",
1620
1584
  "code": "<div style={containerStyle}>\n <VirtualList\n data={data1000}\n height={300}\n itemHeight={30}\n itemKey=\"id\"\n >\n {(item: Item) => (\n <div style={itemStyle(item.height)}>\n <span>Item {item.id}</span>\n <span style={{ color: '#999', fontSize: 12 }}>height: {item.height}px</span>\n </div>\n )}\n </VirtualList>\n </div>",
@@ -1897,6 +1861,12 @@
1897
1861
  "source": "stories",
1898
1862
  "compilable": true
1899
1863
  },
1864
+ "c655c5bc04053a1ca3b1bdca71f5bd281e51c8df9e4f2fcd8f3e95ec7e1d5e9f": {
1865
+ "title": "Multiple",
1866
+ "code": "{\n const [basic, setBasic] = useState<Array<string | number>>([\n 'btc',\n 'eth',\n 'usdt',\n ]);\n const [collapsed, setCollapsed] = useState<Array<string | number>>([\n 'btc',\n 'eth',\n 'usdt',\n 'usdc',\n 'sol',\n 'doge',\n ]);\n\n return (\n <div style={rowStyle}>\n <div style={cellStyle(320)}>\n <p style={captionStyle}>Tags expanded</p>\n <Select\n label=\"Assets\"\n multiple\n options={OPTIONS}\n placeholder=\"Select assets\"\n value={basic}\n onChange={(next) => setBasic((next as Array<string | number>) ?? [])}\n />\n </div>\n <div style={cellStyle(320)}>\n <p style={captionStyle}>maxVisibleValues = 1 (collapsed)</p>\n <Select\n label=\"Assets\"\n multiple\n maxVisibleValues={1}\n variant=\"stroke\"\n options={ASSET_OPTIONS}\n placeholder=\"Select assets\"\n value={collapsed}\n onChange={(next) => setCollapsed((next as Array<string | number>) ?? [])}\n />\n </div>\n </div>\n );\n }",
1867
+ "source": "stories",
1868
+ "compilable": true
1869
+ },
1900
1870
  "c6c6006c18fc013fe133931a21d10e19d9263c424b639dbe5b1038884729bb32": {
1901
1871
  "title": "Horizontal",
1902
1872
  "code": "<p>Above</p>\n<Divider />\n<p>Below</p>",
@@ -1921,6 +1891,12 @@
1921
1891
  "source": "stories",
1922
1892
  "compilable": false
1923
1893
  },
1894
+ "c7eef70ce7146b555a7920611baa8f6c99f77512eae23734b54605a8647606b4": {
1895
+ "title": "Custom Render",
1896
+ "code": "{\n const [optionValue, setOptionValue] = useState<string | number | undefined>('usdt');\n const [contentValue, setContentValue] = useState<string | number | undefined>('usdt');\n\n return (\n <div style={rowStyle}>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>renderOption (full body + check)</p>\n <Select\n label=\"Asset\"\n options={ASSET_OPTIONS}\n renderOption={renderAssetOption}\n value={optionValue}\n onChange={(next) => setOptionValue(next as string | number | undefined)}\n />\n </div>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>renderOptionContent (body only)</p>\n <Select\n label=\"Asset\"\n options={ASSET_OPTIONS}\n renderOptionContent={renderAssetOptionContent}\n value={contentValue}\n onChange={(next) => setContentValue(next as string | number | undefined)}\n />\n </div>\n </div>\n );\n }",
1897
+ "source": "stories",
1898
+ "compilable": true
1899
+ },
1924
1900
  "c816f5980daf6d897749e81e8bcb52963fb9584ae3d56cc2d6d73194bb1a655a": {
1925
1901
  "title": "Import",
1926
1902
  "code": "import { Tag } from '@1money/component-ui';\n// or\nimport { Tag } from '@1money/component-ui/Tag';",
@@ -1957,6 +1933,12 @@
1957
1933
  "source": "stories",
1958
1934
  "compilable": true
1959
1935
  },
1936
+ "cab7b0339adc5ff1f6d96dd2cbef98e653af02cd0eb13266e0be2ec5f5efe4ed": {
1937
+ "title": "Variants",
1938
+ "code": "<div style={rowStyle}>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>fill</p>\n <Select label=\"Label\" variant=\"fill\" options={OPTIONS} defaultValue=\"btc\" />\n </div>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>stroke</p>\n <Select label=\"Label\" variant=\"stroke\" options={OPTIONS} defaultValue=\"btc\" />\n </div>\n <div style={cellStyle(310)}>\n <p style={captionStyle}>frameless</p>\n <Select\n variant=\"frameless\"\n options={OPTIONS}\n defaultValue=\"btc\"\n placeholder=\"Currency\"\n prefix={<Icons name=\"usd\" size={24} color=\"currentColor\" />}\n />\n </div>\n </div>",
1939
+ "source": "stories",
1940
+ "compilable": true
1941
+ },
1960
1942
  "ccaa3cb3e660ea38beaa59a26d94e5aa6bcd8ea3fb8449f82d28e13875c9c05e": {
1961
1943
  "title": "Group Disabled",
1962
1944
  "code": "<RadioGroup value=\"a\" disabled>\n <Radio value=\"a\" label=\"Option A\" />\n <Radio value=\"b\" label=\"Option B\" />\n <Radio value=\"c\" label=\"Option C\" />\n </RadioGroup>",
@@ -2167,12 +2149,6 @@
2167
2149
  "source": "readme",
2168
2150
  "compilable": true
2169
2151
  },
2170
- "e4c665e871b8546f38972172c483114d1eef73a4fc2b83e6ad929d359c408796": {
2171
- "title": "Allow Deselect",
2172
- "code": "{\n const [value, setValue] = useState<string | number | undefined>('btc');\n\n return (\n <Select\n {...args}\n allowDeselect\n value={value}\n onChange={(nextValue, option) => {\n setValue(nextValue as string | number | undefined);\n args.onChange?.(nextValue, option);\n }}\n />\n );\n }",
2173
- "source": "stories",
2174
- "compilable": false
2175
- },
2176
2152
  "e507eed4788971490bf4cdd4a72e99bbbbb78635073b89a32022fdb2055c6a3b": {
2177
2153
  "title": "Virtual Usage",
2178
2154
  "code": "<VirtualTable\n rowKey=\"id\"\n columns={columns}\n dataSource={rows}\n scroll={{ x: 1200, y: 360 }}\n/>",
@@ -2203,12 +2179,6 @@
2203
2179
  "source": "stories",
2204
2180
  "compilable": false
2205
2181
  },
2206
- "e80f4581561ee3095a2839fea6b7193b3e3a682901390a7f6147c36c9a75cc0d": {
2207
- "title": "Asset Multi Select Actions",
2208
- "code": "{\n const [open, setOpen] = useState(false);\n const [value, setValue] = useState<Array<string | number>>(['btc']);\n const [draftValue, setDraftValue] = useState<Array<string | number>>(['btc']);\n\n return (\n <div style={storyContainerStyle}>\n <Select\n {...args}\n multiple\n open={open}\n value={open ? draftValue : value}\n renderOption={renderAssetOption}\n panelFooter={(\n <div style={assetFooterActionsStyle}>\n <Button\n color=\"grey\"\n size=\"small\"\n style={{ flex: 1 }}\n onClick={() => {\n setDraftValue([]);\n }}\n >\n Reset\n </Button>\n <Button\n size=\"small\"\n style={{ flex: 1 }}\n onClick={() => {\n setValue(draftValue);\n setOpen(false);\n args.onOpenChange?.(false);\n }}\n >\n Apply\n </Button>\n </div>\n )}\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n setDraftValue(value);\n args.onOpenChange?.(nextOpen);\n }}\n onChange={(nextValue, option) => {\n setDraftValue((nextValue as Array<string | number>) ?? []);\n args.onChange?.(nextValue, option);\n }}\n />\n </div>\n );\n }",
2209
- "source": "stories",
2210
- "compilable": false
2211
- },
2212
2182
  "e95a0d0355599d90e5a8f3e2157c5f59f2ee97f9c77cde6b856ca73e439ba89d": {
2213
2183
  "title": "Usage",
2214
2184
  "code": "<ProForm\n initialValues={{ name: '' }}\n onFinish={(values) => console.log(values)}\n>\n <ProForm.Text\n name=\"name\"\n label=\"Name\"\n rules={[{ required: true, message: 'Name is required' }]}\n />\n <ProForm.Select\n name=\"currency\"\n label=\"Currency\"\n fieldProps={{ options: [{ label: 'USD', value: 'USD' }] }}\n />\n</ProForm>",
@@ -2293,6 +2263,12 @@
2293
2263
  "source": "stories",
2294
2264
  "compilable": true
2295
2265
  },
2266
+ "f2e294ad49295129f9126f2ea2b586e365c25b5d141f73d5be89c1dd861e6aa1": {
2267
+ "title": "Custom",
2268
+ "code": "{\n const [selected, setSelected] = useState<Array<string | number>>(['btc', 'eth', 'sol']);\n const [open, setOpen] = useState(false);\n\n const toggle = (value: string | number) => {\n setSelected((prev) =>\n prev.includes(value) ? prev.filter((v) => v !== value) : [...prev, value],\n );\n };\n\n const triggerLabel = selected.length > 0 ? `${selected.length} selected` : null;\n\n return (\n <div style={cellStyle(320)}>\n <Select.Custom\n label=\"Assets\"\n placeholder=\"Select assets\"\n open={open}\n onOpenChange={setOpen}\n selectedTemplate={triggerLabel}\n >\n {() => (\n <>\n <div style={customPanelHeaderStyle}>\n <span style={customPanelTitleStyle}>{selected.length} selected</span>\n <button\n type=\"button\"\n style={customClearAllStyle}\n onClick={() => setSelected([])}\n >\n <Icons name=\"cross\" size={14} color=\"currentColor\" />\n Clear all\n </button>\n </div>\n {ASSET_OPTIONS.map((option) => {\n const isSelected = selected.includes(option.value);\n return (\n <button\n key={option.value}\n type=\"button\"\n style={customRowStyle}\n onClick={() => toggle(option.value)}\n >\n <AssetMark value={option.value} />\n <span style={assetOptionLabelStyle}>{option.label}</span>\n <span style={customCheckboxStyle(isSelected)}>\n {isSelected && <Icons name=\"check\" size={14} color=\"currentColor\" />}\n </span>\n </button>\n );\n })}\n </>\n )}\n </Select.Custom>\n </div>\n );\n }",
2269
+ "source": "stories",
2270
+ "compilable": true
2271
+ },
2296
2272
  "f3a91dcc57956f6ad5d0a390fd1f02519474f3ddfd4691ac865e8f7001fa9ef5": {
2297
2273
  "title": "H5 Width Spec",
2298
2274
  "code": "<TooltipPreviewCard\n label=\"Maximum width 300px on H5\"\n title=\"Long title\"\n body={LONG_BODY}\n />",
@@ -11924,63 +11924,47 @@
11924
11924
  "source": "readme"
11925
11925
  },
11926
11926
  {
11927
- "hash": "123291e7b1b33126adc91e8204e4002c37c71a74eb5bfca67a4da71b9aec2f6a",
11927
+ "hash": "abeafbd17ae622f40f4e0e684520b3147e5acb533583ea71c8b1d95fd3805540",
11928
11928
  "source": "stories"
11929
11929
  },
11930
11930
  {
11931
- "hash": "17a413d259fae192ca2f0c09fc23af856852b5f5ca65c1efa9dcb95480776ede",
11931
+ "hash": "22db460cb1da47a1d59eeff302bd4b045cc8fa5f8597eba6047dfc4c668f58f6",
11932
11932
  "source": "stories"
11933
11933
  },
11934
11934
  {
11935
- "hash": "e4c665e871b8546f38972172c483114d1eef73a4fc2b83e6ad929d359c408796",
11935
+ "hash": "cab7b0339adc5ff1f6d96dd2cbef98e653af02cd0eb13266e0be2ec5f5efe4ed",
11936
11936
  "source": "stories"
11937
11937
  },
11938
11938
  {
11939
- "hash": "20ec463b0b6df55a2fa2c5df4836735067151eb22ca13e76ea7b7795465b3141",
11939
+ "hash": "622328c2d21bf88d74f96e2eef2801175864c2af381a438ab39a4cbccc92f623",
11940
11940
  "source": "stories"
11941
11941
  },
11942
11942
  {
11943
- "hash": "9532a16e360ac90c4955a5d2fb7dbfd364a470857fe111e7c0f76c886afe2153",
11943
+ "hash": "c655c5bc04053a1ca3b1bdca71f5bd281e51c8df9e4f2fcd8f3e95ec7e1d5e9f",
11944
11944
  "source": "stories"
11945
11945
  },
11946
11946
  {
11947
- "hash": "44c4b25e35236d2eaf4d26824badf330c6495194077c815a662b000591be91be",
11947
+ "hash": "321187232dc3b48e95ce3712c00ca272ee685f253daca21db994104a5eb509d2",
11948
11948
  "source": "stories"
11949
11949
  },
11950
11950
  {
11951
- "hash": "572f2d8e36841d6c929bf0ee4c11423ef33dc618291ed6bd10d900f09cf64d11",
11951
+ "hash": "38c0990d0517329d8af0b08ed465ae4f70df6530837272d36afcf65edfb854bf",
11952
11952
  "source": "stories"
11953
11953
  },
11954
11954
  {
11955
- "hash": "034773bdaca67ca0d5a236ca92c3d84403ca823cb8249eacea2414545523ab3d",
11955
+ "hash": "c7eef70ce7146b555a7920611baa8f6c99f77512eae23734b54605a8647606b4",
11956
11956
  "source": "stories"
11957
11957
  },
11958
11958
  {
11959
- "hash": "e80f4581561ee3095a2839fea6b7193b3e3a682901390a7f6147c36c9a75cc0d",
11959
+ "hash": "891d99f659a24e8f2a9b367205466b9a0829212be5d9614e3061c90bd45f6a24",
11960
11960
  "source": "stories"
11961
11961
  },
11962
11962
  {
11963
- "hash": "7f9b721c6811ebeeeda10ed23eb590ad0f0d00b3e64ce2aedb8a6e3b12179071",
11963
+ "hash": "f2e294ad49295129f9126f2ea2b586e365c25b5d141f73d5be89c1dd861e6aa1",
11964
11964
  "source": "stories"
11965
11965
  },
11966
11966
  {
11967
- "hash": "72f524de604ba1db3308d0b8f5131b0204abf6a3e411be78f4f61d0fc2081eb7",
11968
- "source": "stories"
11969
- },
11970
- {
11971
- "hash": "90bea0eac958ff92526a0901cd2515a8694e96039b3d056e709ede70bd1b4678",
11972
- "source": "stories"
11973
- },
11974
- {
11975
- "hash": "388bcf7888091d287918f2abfe24285c3cfff0239bf53bd18a57521a4d44c8e1",
11976
- "source": "stories"
11977
- },
11978
- {
11979
- "hash": "41af856d1d6a822e2c95f25c337807c0d18d1e445d318d07621beba85ce3e926",
11980
- "source": "stories"
11981
- },
11982
- {
11983
- "hash": "1cc244bf13712c43e79b378e25198234696ed488d0a147473327f0eb16c461bc",
11967
+ "hash": "8403e3e85f925998931bcd3fef7363c0d75b3598527183aa58a4c63df20f0bce",
11984
11968
  "source": "stories"
11985
11969
  }
11986
11970
  ]