@arbor-education/design-system.components 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/.checkov.yml +10 -0
  2. package/.github/CODEOWNERS +7 -0
  3. package/.github/workflows/chromatic.yml +52 -0
  4. package/.github/workflows/pr-checks.yml +18 -0
  5. package/.github/workflows/pr-housekeeping.yaml +16 -0
  6. package/.husky/pre-commit +2 -0
  7. package/.nvmrc +1 -0
  8. package/.pre-commit-config.yaml +28 -0
  9. package/.storybook/main.ts +21 -0
  10. package/.storybook/preview.ts +23 -0
  11. package/.storybook/vitest.setup.ts +7 -0
  12. package/.tflint.hcl +13 -0
  13. package/CODEOWNERS +5 -0
  14. package/README.md +21 -0
  15. package/bin/createComponent.sh +96 -0
  16. package/dist/components/button/Button.d.ts +10 -0
  17. package/dist/components/button/Button.d.ts.map +1 -0
  18. package/dist/components/button/Button.js +8 -0
  19. package/dist/components/button/Button.js.map +1 -0
  20. package/dist/components/card/Card.d.ts +18 -0
  21. package/dist/components/card/Card.d.ts.map +1 -0
  22. package/dist/components/card/Card.js +31 -0
  23. package/dist/components/card/Card.js.map +1 -0
  24. package/dist/components/card/Card.stories.d.ts +86 -0
  25. package/dist/components/card/Card.stories.d.ts.map +1 -0
  26. package/dist/components/card/Card.stories.js +89 -0
  27. package/dist/components/card/Card.stories.js.map +1 -0
  28. package/dist/components/heading/Heading.d.ts +393 -0
  29. package/dist/components/heading/Heading.d.ts.map +1 -0
  30. package/dist/components/heading/Heading.js +12 -0
  31. package/dist/components/heading/Heading.js.map +1 -0
  32. package/dist/components/heading/Heading.stories.d.ts +35 -0
  33. package/dist/components/heading/Heading.stories.d.ts.map +1 -0
  34. package/dist/components/heading/Heading.stories.js +50 -0
  35. package/dist/components/heading/Heading.stories.js.map +1 -0
  36. package/dist/components/heading/HeadingInnerContainer.d.ts +5 -0
  37. package/dist/components/heading/HeadingInnerContainer.d.ts.map +1 -0
  38. package/dist/components/heading/HeadingInnerContainer.js +7 -0
  39. package/dist/components/heading/HeadingInnerContainer.js.map +1 -0
  40. package/dist/components/icon/Icon.d.ts +13 -0
  41. package/dist/components/icon/Icon.d.ts.map +1 -0
  42. package/dist/components/icon/Icon.js +10 -0
  43. package/dist/components/icon/Icon.js.map +1 -0
  44. package/dist/components/icon/Icon.stories.d.ts +11 -0
  45. package/dist/components/icon/Icon.stories.d.ts.map +1 -0
  46. package/dist/components/icon/Icon.stories.js +13 -0
  47. package/dist/components/icon/Icon.stories.js.map +1 -0
  48. package/dist/components/icon/allowedIcons.d.ts +110 -0
  49. package/dist/components/icon/allowedIcons.d.ts.map +1 -0
  50. package/dist/components/icon/allowedIcons.js +117 -0
  51. package/dist/components/icon/allowedIcons.js.map +1 -0
  52. package/dist/components/icon/customIcons/AskArbor.d.ts +3 -0
  53. package/dist/components/icon/customIcons/AskArbor.d.ts.map +1 -0
  54. package/dist/components/icon/customIcons/AskArbor.js +6 -0
  55. package/dist/components/icon/customIcons/AskArbor.js.map +1 -0
  56. package/dist/components/icon/customIcons/CheckSolid.d.ts +3 -0
  57. package/dist/components/icon/customIcons/CheckSolid.d.ts.map +1 -0
  58. package/dist/components/icon/customIcons/CheckSolid.js +9 -0
  59. package/dist/components/icon/customIcons/CheckSolid.js.map +1 -0
  60. package/dist/components/icon/customIcons/Google.d.ts +3 -0
  61. package/dist/components/icon/customIcons/Google.d.ts.map +1 -0
  62. package/dist/components/icon/customIcons/Google.js +7 -0
  63. package/dist/components/icon/customIcons/Google.js.map +1 -0
  64. package/dist/components/icon/customIcons/XSolid.d.ts +3 -0
  65. package/dist/components/icon/customIcons/XSolid.d.ts.map +1 -0
  66. package/dist/components/icon/customIcons/XSolid.js +8 -0
  67. package/dist/components/icon/customIcons/XSolid.js.map +1 -0
  68. package/dist/components/icon/types.d.ts +8 -0
  69. package/dist/components/icon/types.d.ts.map +1 -0
  70. package/dist/components/icon/types.js +2 -0
  71. package/dist/components/icon/types.js.map +1 -0
  72. package/dist/components/pill/Pill.d.ts +8 -0
  73. package/dist/components/pill/Pill.d.ts.map +1 -0
  74. package/dist/components/pill/Pill.js +6 -0
  75. package/dist/components/pill/Pill.js.map +1 -0
  76. package/dist/components/pill/Pill.stories.d.ts +8 -0
  77. package/dist/components/pill/Pill.stories.d.ts.map +1 -0
  78. package/dist/components/pill/Pill.stories.js +10 -0
  79. package/dist/components/pill/Pill.stories.js.map +1 -0
  80. package/dist/index.css +1557 -0
  81. package/dist/index.css.map +1 -0
  82. package/dist/index.d.ts +7 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +7 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/utils/generateUuid.d.ts +2 -0
  87. package/dist/utils/generateUuid.d.ts.map +1 -0
  88. package/dist/utils/generateUuid.js +10 -0
  89. package/dist/utils/generateUuid.js.map +1 -0
  90. package/dist/utils/hooks/useMemoGenerateUuid.d.ts +8 -0
  91. package/dist/utils/hooks/useMemoGenerateUuid.d.ts.map +1 -0
  92. package/dist/utils/hooks/useMemoGenerateUuid.js +8 -0
  93. package/dist/utils/hooks/useMemoGenerateUuid.js.map +1 -0
  94. package/dist/utils/keyboardConstants.d.ts +13 -0
  95. package/dist/utils/keyboardConstants.d.ts.map +1 -0
  96. package/dist/utils/keyboardConstants.js +13 -0
  97. package/dist/utils/keyboardConstants.js.map +1 -0
  98. package/dist/utils/waitForElement.d.ts +2 -0
  99. package/dist/utils/waitForElement.d.ts.map +1 -0
  100. package/dist/utils/waitForElement.js +18 -0
  101. package/dist/utils/waitForElement.js.map +1 -0
  102. package/eslint.config.mts +30 -0
  103. package/package.json +76 -0
  104. package/src/components/button/Button.story.tsx +116 -0
  105. package/src/components/button/Button.test.tsx +49 -0
  106. package/src/components/button/Button.tsx +37 -0
  107. package/src/components/button/button.scss +181 -0
  108. package/src/components/card/Card.stories.tsx +99 -0
  109. package/src/components/card/Card.test.tsx +231 -0
  110. package/src/components/card/Card.tsx +96 -0
  111. package/src/components/card/card.scss +68 -0
  112. package/src/components/heading/Heading.stories.tsx +85 -0
  113. package/src/components/heading/Heading.test.tsx +29 -0
  114. package/src/components/heading/Heading.tsx +17 -0
  115. package/src/components/heading/HeadingInnerContainer.tsx +18 -0
  116. package/src/components/heading/heading.scss +48 -0
  117. package/src/components/icon/Icon.stories.tsx +16 -0
  118. package/src/components/icon/Icon.test.tsx +17 -0
  119. package/src/components/icon/Icon.tsx +27 -0
  120. package/src/components/icon/allowedIcons.tsx +208 -0
  121. package/src/components/icon/customIcons/AskArbor.tsx +28 -0
  122. package/src/components/icon/customIcons/CheckSolid.tsx +43 -0
  123. package/src/components/icon/customIcons/Google.tsx +33 -0
  124. package/src/components/icon/customIcons/XSolid.tsx +32 -0
  125. package/src/components/icon/types.ts +8 -0
  126. package/src/components/pill/Pill.stories.tsx +14 -0
  127. package/src/components/pill/Pill.test.tsx +21 -0
  128. package/src/components/pill/Pill.tsx +24 -0
  129. package/src/components/pill/pill.scss +51 -0
  130. package/src/global.scss +19 -0
  131. package/src/index.scss +7 -0
  132. package/src/index.ts +6 -0
  133. package/src/tokens.scss +1249 -0
  134. package/src/utils/generateUuid.ts +9 -0
  135. package/src/utils/hooks/useMemoGenerateUuid.ts +13 -0
  136. package/src/utils/keyboardConstants.ts +12 -0
  137. package/src/utils/waitForElement.ts +22 -0
  138. package/stylelint.config.mjs +10 -0
  139. package/tsconfig.json +49 -0
  140. package/vitest.config.ts +26 -0
  141. package/vitest.shims.d.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["../src/index.scss","../src/tokens.scss","../src/global.scss","../src/components/button/button.scss","../src/components/heading/heading.scss","../src/components/card/card.scss","../src/components/pill/pill.scss"],"names":[],"mappings":"AAMQ;ACNR;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AC/tCF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AChBF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIF;EACE;;AAGF;EACE;;AAIF;EACE;EACA;;AAKF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;;AClLJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAKF;EACE;EACA;EACA;;;AAKF;EACE;EACA;EACA;;;AAKF;EACE;EACA;EACA;;;AAKF;EACE;EACA;EACA;;;AC7CJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAIF;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAIJ;EACE;;;ACjEJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA","file":"index.css"}
@@ -0,0 +1,7 @@
1
+ export { Button } from './components/button/Button';
2
+ export { Heading } from './components/heading/Heading';
3
+ export { HeadingInnerContainer } from './components/heading/HeadingInnerContainer';
4
+ export { Icon } from './components/icon/Icon';
5
+ export { Card } from './components/card/Card';
6
+ export { Pill } from './components/pill/Pill';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { Button } from './components/button/Button';
2
+ export { Heading } from './components/heading/Heading';
3
+ export { HeadingInnerContainer } from './components/heading/HeadingInnerContainer';
4
+ export { Icon } from './components/icon/Icon';
5
+ export { Card } from './components/card/Card';
6
+ export { Pill } from './components/pill/Pill';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const generateUuid: (prefix?: string) => string;
2
+ //# sourceMappingURL=generateUuid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateUuid.d.ts","sourceRoot":"","sources":["../../src/utils/generateUuid.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,GAAI,eAAW,KAAG,MAQ1C,CAAC"}
@@ -0,0 +1,10 @@
1
+ export const generateUuid = (prefix = '') => {
2
+ if (!self?.crypto?.randomUUID) {
3
+ throw new Error('Crypto API not supported');
4
+ }
5
+ if (prefix) {
6
+ return `${prefix}-${self.crypto.randomUUID()}`;
7
+ }
8
+ return self.crypto.randomUUID();
9
+ };
10
+ //# sourceMappingURL=generateUuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateUuid.js","sourceRoot":"","sources":["../../src/utils/generateUuid.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,GAAG,EAAE,EAAU,EAAE;IAClD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;AAClC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type DependencyList } from 'react';
2
+ type Args = {
3
+ deps?: DependencyList;
4
+ prefix?: string;
5
+ };
6
+ export declare const useMemoGenerateUuid: ({ deps, prefix }: Args) => string;
7
+ export {};
8
+ //# sourceMappingURL=useMemoGenerateUuid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMemoGenerateUuid.d.ts","sourceRoot":"","sources":["../../../src/utils/hooks/useMemoGenerateUuid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAGrD,KAAK,IAAI,GAAG;IACV,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,kBAAuB,IAAI,WAI9D,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { useMemo } from 'react';
2
+ import { generateUuid } from '../generateUuid';
3
+ export const useMemoGenerateUuid = ({ deps = [], prefix }) => {
4
+ return useMemo(() => {
5
+ return generateUuid(prefix);
6
+ }, deps);
7
+ };
8
+ //# sourceMappingURL=useMemoGenerateUuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMemoGenerateUuid.js","sourceRoot":"","sources":["../../../src/utils/hooks/useMemoGenerateUuid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAO/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAQ,EAAE,EAAE;IACjE,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC,EAAE,IAAI,CAAC,CAAC;AACX,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare const BACKSPACE_KEY = "Backspace";
2
+ export declare const TAB_KEY = "Tab";
3
+ export declare const ENTER_KEY = "Enter";
4
+ export declare const ESCAPE_KEY = "Escape";
5
+ export declare const SPACE_KEY = " ";
6
+ export declare const ARROW_LEFT_KEY = "ArrowLeft";
7
+ export declare const ARROW_UP_KEY = "ArrowUp";
8
+ export declare const ARROW_RIGHT_KEY = "ArrowRight";
9
+ export declare const ARROW_DOWN_KEY = "ArrowDown";
10
+ export declare const DELETE_KEY = "Delete";
11
+ export declare const Z_KEY = "z";
12
+ export declare const A_KEY = "a";
13
+ //# sourceMappingURL=keyboardConstants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboardConstants.d.ts","sourceRoot":"","sources":["../../src/utils/keyboardConstants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,cAAc,CAAC;AACzC,eAAO,MAAM,OAAO,QAAQ,CAAC;AAC7B,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,UAAU,WAAW,CAAC;AACnC,eAAO,MAAM,SAAS,MAAM,CAAC;AAC7B,eAAO,MAAM,cAAc,cAAc,CAAC;AAC1C,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,eAAO,MAAM,cAAc,cAAc,CAAC;AAC1C,eAAO,MAAM,UAAU,WAAW,CAAC;AACnC,eAAO,MAAM,KAAK,MAAM,CAAC;AACzB,eAAO,MAAM,KAAK,MAAM,CAAC"}
@@ -0,0 +1,13 @@
1
+ export const BACKSPACE_KEY = 'Backspace';
2
+ export const TAB_KEY = 'Tab';
3
+ export const ENTER_KEY = 'Enter';
4
+ export const ESCAPE_KEY = 'Escape';
5
+ export const SPACE_KEY = ' ';
6
+ export const ARROW_LEFT_KEY = 'ArrowLeft';
7
+ export const ARROW_UP_KEY = 'ArrowUp';
8
+ export const ARROW_RIGHT_KEY = 'ArrowRight';
9
+ export const ARROW_DOWN_KEY = 'ArrowDown';
10
+ export const DELETE_KEY = 'Delete';
11
+ export const Z_KEY = 'z';
12
+ export const A_KEY = 'a';
13
+ //# sourceMappingURL=keyboardConstants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboardConstants.js","sourceRoot":"","sources":["../../src/utils/keyboardConstants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC;AAC7B,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;AACjC,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AACnC,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAC7B,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC;AACtC,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;AAC1C,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AACnC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC;AACzB,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const waitForElement: (selector: string, callback: (element: Element) => void) => void;
2
+ //# sourceMappingURL=waitForElement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitForElement.d.ts","sourceRoot":"","sources":["../../src/utils/waitForElement.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,GACzB,UAAU,MAAM,EAChB,UAAU,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,SAmBrC,CAAC"}
@@ -0,0 +1,18 @@
1
+ export const waitForElement = (selector, callback) => {
2
+ const timeout = setTimeout(() => {
3
+ console.error('Element not found:', selector);
4
+ }, 1000);
5
+ const observer = new MutationObserver((mutations, mutObs) => {
6
+ const element = document.querySelector(selector);
7
+ if (element) {
8
+ mutObs.disconnect();
9
+ callback(element);
10
+ clearTimeout(timeout);
11
+ }
12
+ });
13
+ observer.observe(document.body, {
14
+ childList: true,
15
+ subtree: true,
16
+ });
17
+ };
18
+ //# sourceMappingURL=waitForElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitForElement.js","sourceRoot":"","sources":["../../src/utils/waitForElement.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,QAAgB,EAChB,QAAoC,EACpC,EAAE;IACF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;QAC9B,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;QAC1D,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,UAAU,EAAE,CAAC;YACpB,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClB,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;QAC9B,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import js from '@eslint/js';
2
+ import globals from 'globals';
3
+ import tseslint from 'typescript-eslint';
4
+ import pluginReact from 'eslint-plugin-react';
5
+ import { defineConfig } from 'eslint/config';
6
+ import stylistic from '@stylistic/eslint-plugin';
7
+
8
+ export default defineConfig([
9
+ {
10
+ files: ['**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
11
+ plugins: { js },
12
+ extends: ['js/recommended'],
13
+ languageOptions: { globals: globals.browser },
14
+ },
15
+ tseslint.configs.recommended,
16
+ pluginReact.configs.flat.recommended!,
17
+ stylistic.configs.customize({
18
+ semi: true,
19
+ commaDangle: 'always-multiline',
20
+ pluginName: '@stylistic',
21
+ }),
22
+ {
23
+ rules: {
24
+ 'react/react-in-jsx-scope': 'off',
25
+ 'react/jsx-uses-react': 'off',
26
+ 'react/no-unescaped-entities': 'off',
27
+ '@stylistic/quotes': ['error', 'single', { avoidEscape: true }],
28
+ },
29
+ },
30
+ ]);
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@arbor-education/design-system.components",
3
+ "version": "0.0.1",
4
+ "description": "The component library for the design system (the baby)",
5
+ "main": "dist/index.js",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+ssh://git@github.com/arbor-education/design-system.components.git"
9
+ },
10
+ "author": "AmeeMorris <amee@live.co.uk>",
11
+ "license": "MIT",
12
+ "dependencies": {
13
+ "@types/react": "^19.1.10",
14
+ "classnames": "^2.5.1",
15
+ "lucide-react": "^0.544.0",
16
+ "react": "^18.2.0",
17
+ "react-dom": "^18.2.0",
18
+ "sass": "^1.90.0",
19
+ "typescript": "^5.9.2"
20
+ },
21
+ "devDependencies": {
22
+ "@chromatic-com/storybook": "^4.1.0",
23
+ "@eslint/js": "^9.33.0",
24
+ "@storybook/addon-a11y": "^9.1.8",
25
+ "@storybook/addon-docs": "^9.1.8",
26
+ "@storybook/addon-onboarding": "^9.1.8",
27
+ "@storybook/addon-vitest": "^9.1.8",
28
+ "@storybook/react-vite": "^9.1.8",
29
+ "@storybook/test": "^8.6.14",
30
+ "@stylistic/eslint-plugin": "^5.4.0",
31
+ "@testing-library/dom": "^10.4.1",
32
+ "@testing-library/jest-dom": "^6.7.0",
33
+ "@testing-library/react": "^16.3.0",
34
+ "@vitejs/plugin-react": "^5.0.1",
35
+ "@vitest/browser": "3.2.4",
36
+ "@vitest/coverage-v8": "3.2.4",
37
+ "chromatic": "^13.1.4",
38
+ "eslint": "^9.33.0",
39
+ "eslint-plugin-react": "^7.37.5",
40
+ "eslint-plugin-storybook": "^9.1.2",
41
+ "global-jsdom": "^26.0.0",
42
+ "globals": "^16.3.0",
43
+ "husky": "^9.1.7",
44
+ "jiti": "^2.5.1",
45
+ "jsdom": "^26.1.0",
46
+ "lint-staged": "^16.2.3",
47
+ "playwright": "^1.55.0",
48
+ "storybook": "^9.1.8",
49
+ "stylelint": "^16.25.0",
50
+ "stylelint-config-standard-scss": "^16.0.0",
51
+ "tsc-watch": "^7.1.1",
52
+ "typescript-eslint": "^8.40.0",
53
+ "vite": "^7.1.3",
54
+ "vitest": "^3.2.4"
55
+ },
56
+ "lint-staged": {
57
+ "*.[t|j]s?(x)": "eslint",
58
+ "*.scss": "stylelint"
59
+ },
60
+ "scripts": {
61
+ "tsc": "tsc",
62
+ "storybook": "storybook dev -p 6006",
63
+ "build-storybook": "storybook build",
64
+ "build": "tsc && sass src/index.scss dist/index.css",
65
+ "watch": "sass --watch src/index.scss dist/index.css & tsc-watch --onSuccess \"yalc push --private --sig\"",
66
+ "test": "vitest",
67
+ "create-component": "./bin/createComponent.sh",
68
+ "prepare": "husky",
69
+ "prepublishOnly": "yarn build"
70
+ },
71
+ "types": "./dist/index.d.ts",
72
+ "bugs": {
73
+ "url": "https://github.com/arbor-education/design-system.components/issues"
74
+ },
75
+ "homepage": "https://github.com/arbor-education/design-system.components#readme"
76
+ }
@@ -0,0 +1,116 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { Button } from './Button';
3
+
4
+ const meta = {
5
+ title: 'Components/Button',
6
+ component: Button,
7
+ parameters: {
8
+ layout: 'centered',
9
+ },
10
+ tags: ['autodocs'],
11
+ argTypes: {
12
+ type: {
13
+ control: 'select',
14
+ options: [
15
+ 'primary',
16
+ 'secondary',
17
+ 'tertiary',
18
+ 'primary-destructive',
19
+ 'secondary-destructive',
20
+ 'text-link',
21
+ ],
22
+ description: 'Button type/variant',
23
+ },
24
+ size: {
25
+ control: 'select',
26
+ options: ['M', 'S'],
27
+ description: 'Button size',
28
+ },
29
+ disabled: {
30
+ control: 'boolean',
31
+ description: 'Disable the button',
32
+ },
33
+ children: {
34
+ control: 'text',
35
+ description: 'Button text',
36
+ },
37
+ onClick: {
38
+ action: 'clicked',
39
+ },
40
+ },
41
+ } satisfies Meta<typeof Button>;
42
+
43
+ export default meta;
44
+ type Story = StoryObj<typeof meta>;
45
+
46
+ // Primary button
47
+ export const Primary: Story = {
48
+ args: {
49
+ type: 'primary',
50
+ children: 'Button Text',
51
+ size: 'M',
52
+ },
53
+ };
54
+
55
+ // Secondary button
56
+ export const Secondary: Story = {
57
+ args: {
58
+ ...Primary.args,
59
+ type: 'secondary',
60
+ },
61
+ };
62
+
63
+ // Tertiary button
64
+ export const Tertiary: Story = {
65
+ args: {
66
+ ...Primary.args,
67
+ type: 'tertiary',
68
+ },
69
+ };
70
+
71
+ // Primary destructive button
72
+ export const PrimaryDestructive: Story = {
73
+ args: {
74
+ ...Primary.args,
75
+ type: 'primary-destructive',
76
+ },
77
+ };
78
+
79
+ // Secondary destructive button
80
+ export const SecondaryDestructive: Story = {
81
+ args: {
82
+ ...Primary.args,
83
+ type: 'secondary-destructive',
84
+ },
85
+ };
86
+
87
+ // Text link button
88
+ export const TextLink: Story = {
89
+ args: {
90
+ ...Primary.args,
91
+ type: 'text-link',
92
+ },
93
+ };
94
+
95
+ // Small buttons
96
+ export const SmallPrimary: Story = {
97
+ args: {
98
+ ...Primary.args,
99
+ size: 'S',
100
+ },
101
+ };
102
+
103
+ export const SmallSecondary: Story = {
104
+ args: {
105
+ ...Secondary.args,
106
+ size: 'S',
107
+ },
108
+ };
109
+
110
+ // Disabled button
111
+ export const Disabled: Story = {
112
+ args: {
113
+ ...Primary.args,
114
+ disabled: true,
115
+ },
116
+ };
@@ -0,0 +1,49 @@
1
+ import { expect, test, describe, vi } from 'vitest';
2
+ import { Button } from './Button';
3
+ import { render, screen, fireEvent } from '@testing-library/react';
4
+ import '@testing-library/jest-dom/vitest';
5
+
6
+ describe('Button component', () => {
7
+ test('renders button with text', () => {
8
+ render(<Button>Button Text</Button>);
9
+ expect(screen.getByText('Button Text')).toBeInTheDocument();
10
+ });
11
+
12
+ test('applies primary style by default', () => {
13
+ render(<Button>Button Text</Button>);
14
+ const button = screen.getByText('Button Text').closest('button');
15
+ expect(button).toHaveClass('ds-button--primary');
16
+ });
17
+
18
+ test('applies correct type class when specified', () => {
19
+ render(<Button type="secondary">Button Text</Button>);
20
+ const button = screen.getByText('Button Text').closest('button');
21
+ expect(button).toHaveClass('ds-button--secondary');
22
+ });
23
+
24
+ test('applies correct size class', () => {
25
+ render(<Button size="S">Small Button</Button>);
26
+ const button = screen.getByText('Small Button').closest('button');
27
+ expect(button).toHaveClass('ds-button--S');
28
+ });
29
+
30
+ test('handles click events', () => {
31
+ const handleClick = vi.fn();
32
+ render(<Button onClick={handleClick}>Click Me</Button>);
33
+ fireEvent.click(screen.getByText('Click Me'));
34
+ expect(handleClick).toHaveBeenCalledTimes(1);
35
+ });
36
+
37
+ test('does not call onClick when disabled', () => {
38
+ const handleClick = vi.fn();
39
+ render(<Button onClick={handleClick} disabled>Disabled Button</Button>);
40
+ fireEvent.click(screen.getByText('Disabled Button'));
41
+ expect(handleClick).not.toHaveBeenCalled();
42
+ });
43
+
44
+ test('applies additional className', () => {
45
+ render(<Button className="custom-class">Button Text</Button>);
46
+ const button = screen.getByText('Button Text').closest('button');
47
+ expect(button).toHaveClass('custom-class');
48
+ });
49
+ });
@@ -0,0 +1,37 @@
1
+ import classNames from 'classnames';
2
+ import React, { type ButtonHTMLAttributes } from 'react';
3
+
4
+ export type ButtonProps = {
5
+ type?: 'primary' | 'secondary' | 'tertiary' | 'primary-destructive' | 'secondary-destructive' | 'text-link';
6
+ size?: 'M' | 'S';
7
+ children?: React.ReactNode;
8
+ className?: string;
9
+ [key: string]: unknown;
10
+ } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type'>;
11
+
12
+ export const Button = (props: ButtonProps) => {
13
+ const {
14
+ type = 'primary',
15
+ size = 'M',
16
+ children,
17
+ onClick,
18
+ disabled = false,
19
+ className = '',
20
+ ...rest
21
+ } = props;
22
+
23
+ return (
24
+ <button
25
+ className={classNames('ds-button',
26
+ `ds-button--${type}`,
27
+ `ds-button--${size}`,
28
+ className,
29
+ )}
30
+ onClick={onClick}
31
+ disabled={disabled}
32
+ {...rest}
33
+ >
34
+ {children}
35
+ </button>
36
+ );
37
+ };
@@ -0,0 +1,181 @@
1
+ // Base button styles
2
+ .ds-button {
3
+ display: flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ gap: var(--button-medium-spacing-gap-y);
7
+ border-radius: var(--button-medium-radius);
8
+ font-family: var(--font-family-standard);
9
+ font-weight: var(--font-weight-regular);
10
+ padding: var(--button-medium-spacing-y) var(--button-medium-spacing-x);
11
+ border: none;
12
+ cursor: pointer;
13
+ transition: background-color 0.2s, color 0.2s, border-color 0.2s, box-shadow 0.2s;
14
+ position: relative;
15
+ text-decoration: none;
16
+
17
+ &:focus {
18
+ outline: none;
19
+ }
20
+
21
+ // Button sizes
22
+ &--M {
23
+ font-size: var(--font-size-3-14);
24
+ }
25
+
26
+ &--S {
27
+ font-size: var(--font-size-2-13);
28
+ }
29
+
30
+ // Button text
31
+ &__text {
32
+ display: inline-block;
33
+ white-space: nowrap;
34
+ }
35
+
36
+
37
+ // Primary Button
38
+ &--primary {
39
+ background-color: var(--button-medium-primary-default-color-background);
40
+ color: var(--button-medium-primary-default-color-text);
41
+ border: 1px solid var(--button-medium-primary-default-color-border);
42
+
43
+ &:focus {
44
+ background-color: var(--button-medium-primary-focus-color-background);
45
+ color: var(--button-medium-primary-focus-color-text);
46
+ outline: 2px solid var(--button-medium-primary-focus-color-focus);
47
+ }
48
+
49
+ &:hover {
50
+ background-color: var(--button-medium-primary-hover-color-background);
51
+ color: var(--button-medium-primary-hover-color-text);
52
+ }
53
+
54
+ &:active {
55
+ background-color: var(--button-medium-primary-pressed-color-background);
56
+ color: var(--button-medium-primary-pressed-color-text);
57
+ }
58
+ }
59
+
60
+ // Secondary Button
61
+ &--secondary {
62
+ background-color: var(--button-medium-secondary-default-color-background);
63
+ color: var(--button-medium-secondary-default-color-text);
64
+ border: 1px solid var(--button-medium-secondary-default-color-border);
65
+
66
+ &:focus {
67
+ background-color: var(--button-medium-secondary-focus-color-background);
68
+ color: var(--button-medium-secondary-focus-color-text);
69
+ outline: 2px solid var(--button-medium-secondary-focus-color-focus);
70
+ }
71
+
72
+ &:hover {
73
+ background-color: var(--button-medium-secondary-hover-color-background);
74
+ color: var(--button-medium-secondary-hover-color-text);
75
+ }
76
+
77
+ &:active {
78
+ background-color: var(--button-medium-secondary-pressed-color-background);
79
+ color: var(--button-medium-secondary-pressed-color-text);
80
+ }
81
+ }
82
+
83
+ // Tertiary Button
84
+ &--tertiary {
85
+ background-color: var(--button-medium-tertiary-default-color-background);
86
+ color: var(--button-medium-tertiary-default-color-text);
87
+ border: 1px solid var(--button-medium-tertiary-default-color-border);
88
+
89
+ &:focus {
90
+ background-color: var(--button-medium-tertiary-focus-color-background);
91
+ color: var(--button-medium-tertiary-focus-color-text);
92
+ outline: 2px solid var(--button-medium-tertiary-focus-color-focus);
93
+ }
94
+
95
+ &:hover {
96
+ background-color: var(--button-medium-tertiary-hover-color-background);
97
+ color: var(--button-medium-tertiary-hover-color-text);
98
+ }
99
+
100
+ &:active {
101
+ background-color: var(--button-medium-tertiary-pressed-color-background);
102
+ color: var(--button-medium-tertiary-pressed-color-text);
103
+ }
104
+ }
105
+
106
+ // Primary Destructive Button
107
+ &--primary-destructive {
108
+ background-color: var(--button-medium-primary-destructive-default-color-background);
109
+ color: var(--button-medium-primary-destructive-default-color-text);
110
+ border: 1px solid var(--button-medium-primary-destructive-default-color-border);
111
+
112
+ &:focus {
113
+ background-color: var(--button-medium-primary-destructive-focus-color-background);
114
+ color: var(--button-medium-primary-destructive-focus-color-text);
115
+ outline: 2px solid var(--button-medium-primary-destructive-focus-color-focus);
116
+ }
117
+
118
+ &:hover {
119
+ background-color: var(--button-medium-primary-destructive-hover-color-background);
120
+ color: var(--button-medium-primary-destructive-hover-color-text);
121
+ }
122
+
123
+ &:active {
124
+ background-color: var(--button-medium-primary-destructive-pressed-color-background);
125
+ color: var(--button-medium-primary-destructive-pressed-color-text);
126
+ }
127
+ }
128
+
129
+ // Secondary Destructive Button
130
+ &--secondary-destructive {
131
+ background-color: var(--button-medium-secondary-destructive-default-color-background);
132
+ color: var(--button-medium-secondary-destructive-default-color-text);
133
+ border: 1px solid var(--button-medium-secondary-destructive-default-color-border);
134
+
135
+ &:focus {
136
+ background-color: var(--button-medium-secondary-destructive-focus-color-background);
137
+ color: var(--button-medium-secondary-destructive-focus-color-text);
138
+ outline: 2px solid var(--button-medium-secondary-destructive-focus-color-focus);
139
+ }
140
+
141
+ &:hover {
142
+ background-color: var(--button-medium-secondary-destructive-hover-color-background);
143
+ color: var(--button-medium-secondary-destructive-hover-color-text);
144
+ }
145
+
146
+ &:active{
147
+ background-color: var(--button-medium-secondary-destructive-pressed-color-background);
148
+ color: var(--button-medium-secondary-destructive-pressed-color-text);
149
+ }
150
+ }
151
+
152
+ // Text Link Button
153
+ &--text-link {
154
+ background-color: var(--button-medium-text-link-default-color-background);
155
+ color: var(--button-medium-text-link-default-color-text);
156
+ border: 1px solid var(--button-medium-text-link-default-color-border);
157
+
158
+ &:focus {
159
+ background-color: var(--button-medium-text-link-focus-color-background);
160
+ color: var(--button-medium-text-link-focus-color-text);
161
+ outline: 2px solid var(--button-medium-text-link-focus-color-focus);
162
+ }
163
+
164
+ &:hover {
165
+ background-color: var(--button-medium-text-link-hover-color-background);
166
+ color: var(--button-medium-text-link-hover-color-text);
167
+ }
168
+
169
+ &:active{
170
+ background-color: var(--button-medium-text-link-pressed-color-background);
171
+ color: var(--button-medium-text-link-pressed-color-text);
172
+ }
173
+ }
174
+
175
+ // Disabled state
176
+ &:disabled {
177
+ opacity: 0.5;
178
+ cursor: not-allowed;
179
+ pointer-events: none;
180
+ }
181
+ }