ReactUi.tsx 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import { arrowIcon, layersIcon, starIcon, userIcon } from '@cds/core/icon';
  2. import { NotificationService } from '@vendure/admin-ui/core';
  3. import {
  4. ActionBar,
  5. Card,
  6. CdsIcon,
  7. FormField,
  8. Link,
  9. PageBlock,
  10. PageDetailLayout,
  11. useInjector,
  12. usePageMetadata,
  13. } from '@vendure/admin-ui/react';
  14. import { RichTextEditor } from '@vendure/admin-ui/react';
  15. import React, { PropsWithChildren, useState } from 'react';
  16. export function ReactUi() {
  17. const notificationService = useInjector(NotificationService);
  18. const { setTitle } = usePageMetadata();
  19. const [titleModified, setTitleModified] = useState(false);
  20. const [titleValue, setTitleValue] = useState('React UI');
  21. function updateTitle() {
  22. setTitle(titleValue);
  23. setTitleModified(false);
  24. notificationService.success(`Updated title to "${titleValue}"`);
  25. }
  26. return (
  27. <>
  28. <PageBlock>
  29. <ActionBar leftContent={<div>Action bar left contents</div>}>
  30. <button className="button primary" onClick={updateTitle} disabled={!titleModified}>
  31. Update page title
  32. </button>
  33. </ActionBar>
  34. </PageBlock>
  35. <PageDetailLayout
  36. sidebar={
  37. <div>
  38. <Card>Sidebar content</Card>
  39. </div>
  40. }
  41. >
  42. <PageBlock>
  43. <Card title="Card">
  44. This is a card. On a detail page, content should usually be placed inside a card.
  45. </Card>
  46. <Card title="Form inputs">
  47. <div className="form-grid">
  48. <FormField label="Page title">
  49. <input
  50. value={titleValue}
  51. onInput={e => {
  52. setTitleValue((e.target as any).value);
  53. setTitleModified(true);
  54. }}
  55. />
  56. </FormField>
  57. <FormField label="Select input">
  58. <select>
  59. <option>Option 1</option>
  60. <option>Option 2</option>
  61. </select>
  62. </FormField>
  63. <FormField label="Checkbox input">
  64. <input type="checkbox" />
  65. </FormField>
  66. <FormField label="Textarea input">
  67. <textarea></textarea>
  68. </FormField>
  69. <FormField label="With tooltip" tooltip="This is a tooltip for the form input">
  70. <input type="text" />
  71. </FormField>
  72. <FormField label="Invalid with error" invalid={true}>
  73. <input type="text" />
  74. </FormField>
  75. <RichTextEditor className="form-grid-span" label="Description" readOnly={false} />
  76. </div>
  77. </Card>
  78. <Card title="Icons">
  79. <DemoBlock label="Sizes">
  80. <CdsIcon icon={starIcon} size={'xs'}></CdsIcon>
  81. <CdsIcon icon={starIcon} size={'sm'}></CdsIcon>
  82. <CdsIcon icon={starIcon} size={'md'}></CdsIcon>
  83. <CdsIcon icon={starIcon} size={'lg'}></CdsIcon>
  84. <CdsIcon icon={starIcon} size={'xl'}></CdsIcon>
  85. <CdsIcon icon={starIcon} size={'xxl'}></CdsIcon>
  86. </DemoBlock>
  87. <DemoBlock label="Badges">
  88. <CdsIcon icon={userIcon} badge={'success'}></CdsIcon>
  89. <CdsIcon icon={userIcon} badge={'info'}></CdsIcon>
  90. <CdsIcon icon={userIcon} badge={'warning'}></CdsIcon>
  91. <CdsIcon icon={userIcon} badge={'danger'}></CdsIcon>
  92. </DemoBlock>
  93. <DemoBlock label="Status colors">
  94. <CdsIcon icon={userIcon} status={'success'}></CdsIcon>
  95. <CdsIcon icon={userIcon} status={'info'}></CdsIcon>
  96. <CdsIcon icon={userIcon} status={'warning'}></CdsIcon>
  97. <CdsIcon icon={userIcon} status={'danger'}></CdsIcon>
  98. </DemoBlock>
  99. </Card>
  100. <Card title={'Buttons'}>
  101. <DemoBlock label="Regular">
  102. <button className="button primary">Primary</button>
  103. <button className="button secondary">Secondary</button>
  104. <button className="button success">Success</button>
  105. <button className="button warning">Warning</button>
  106. <button className="button danger">Danger</button>
  107. </DemoBlock>
  108. <DemoBlock label="Ghost">
  109. <button className="button-ghost">Ghost</button>
  110. <Link className="button-ghost" href="/extensions/ui-library/react-ui">
  111. <CdsIcon icon={arrowIcon} direction="right" />
  112. John Smith
  113. </Link>
  114. </DemoBlock>
  115. <DemoBlock label="Small">
  116. <button className="button-small">Small</button>
  117. <button className="button-small">
  118. <CdsIcon icon={layersIcon} />
  119. Assign to channel
  120. </button>
  121. </DemoBlock>
  122. </Card>
  123. </PageBlock>
  124. </PageDetailLayout>
  125. </>
  126. );
  127. }
  128. function DemoBlock(props: PropsWithChildren<{ label: string }>) {
  129. return (
  130. <div className="mb-4">
  131. <label>{props.label}</label>
  132. <div className="mt-1 flex" style={{ gap: '12px' }}>
  133. {props.children}
  134. </div>
  135. </div>
  136. );
  137. }