Design system.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

154 lines
4.7 KiB

  1. import * as React from 'react';
  2. import { NextPage } from 'next';
  3. import { getFormValues } from '@theoryofnekomata/formxtra';
  4. import * as Freeform from '@tesseract-design/web-freeform-react';
  5. import * as Formatted from '@tesseract-design/web-formatted-react';
  6. import * as Action from '@tesseract-design/web-action-react';
  7. import {Refractor} from '@modal-sh/react-refractor';
  8. const RegistrationFormPage: NextPage = () => {
  9. const [values, setValues] = React.useState({} as Record<string, unknown>);
  10. const handleSubmit: React.FormEventHandler<HTMLFormElement> = (e) => {
  11. e.preventDefault();
  12. const newValues = getFormValues(e.currentTarget);
  13. setValues(newValues);
  14. };
  15. const handleChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {
  16. e.preventDefault();
  17. const form = e.currentTarget.form;
  18. if (!form) {
  19. return;
  20. }
  21. const newValues = getFormValues(form);
  22. setValues(newValues);
  23. };
  24. return (
  25. <main className="my-16 md:my-32">
  26. <div className="container mx-auto px-4">
  27. <h1>
  28. Registration Form
  29. </h1>
  30. <p>
  31. Input your data in order to gain access to the functions of this service.
  32. </p>
  33. <form onSubmit={handleSubmit}>
  34. <fieldset className="contents">
  35. <legend className="sr-only">
  36. Register
  37. </legend>
  38. <div className="grid sm:grid-cols-6 gap-4">
  39. <div className="sm:col-span-2">
  40. <Freeform.TextInput
  41. block
  42. border
  43. label="First Name"
  44. name="firstName"
  45. onChange={handleChange}
  46. />
  47. </div>
  48. <div className="sm:col-span-2">
  49. <Freeform.TextInput
  50. block
  51. border
  52. label="Middle Name"
  53. name="middleName"
  54. onChange={handleChange}
  55. />
  56. </div>
  57. <div className="sm:col-span-2">
  58. <Freeform.TextInput
  59. block
  60. border
  61. label="Last Name"
  62. name="lastName"
  63. onChange={handleChange}
  64. />
  65. </div>
  66. <div className="sm:col-span-3">
  67. <Formatted.EmailInput
  68. block
  69. border
  70. label="Email"
  71. name="email"
  72. onChange={handleChange}
  73. />
  74. </div>
  75. <div className="sm:col-span-3">
  76. <Formatted.UrlInput
  77. block
  78. border
  79. label="Website"
  80. name="website"
  81. onChange={handleChange}
  82. />
  83. </div>
  84. <div className="sm:col-span-2">
  85. <Formatted.PhoneNumberInput
  86. block
  87. border
  88. label="Phone"
  89. name="phone"
  90. onChange={handleChange}
  91. enhanced
  92. />
  93. </div>
  94. <div className="sm:col-span-2">
  95. <Freeform.MaskedTextInput
  96. block
  97. border
  98. label="Password"
  99. name="password"
  100. onChange={handleChange}
  101. enhanced
  102. />
  103. </div>
  104. <div className="sm:col-span-2">
  105. <Freeform.MaskedTextInput
  106. block
  107. border
  108. label="Confirm Password"
  109. name="confirmPassword"
  110. onChange={handleChange}
  111. enhanced
  112. />
  113. </div>
  114. <div className="sm:col-span-6 text-center">
  115. <div
  116. className="sm:flex items-center justify-end space-y-4 sm:space-y-0 sm:space-x-4"
  117. >
  118. <small>
  119. By registering, you agree to the <a href="#">Terms</a> of this service.
  120. </small>
  121. {' '}
  122. <div>
  123. <Action.ActionButton
  124. variant="filled"
  125. block
  126. type="submit"
  127. menuItem
  128. subtext="Registration requires activation"
  129. >
  130. Submit
  131. </Action.ActionButton>
  132. </div>
  133. </div>
  134. </div>
  135. </div>
  136. </fieldset>
  137. </form>
  138. <div className="mt-4">
  139. <Refractor
  140. language="json"
  141. code={JSON.stringify(values, null, 2)}
  142. />
  143. </div>
  144. </div>
  145. </main>
  146. )
  147. }
  148. export default RegistrationFormPage;