@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.
- package/.checkov.yml +10 -0
- package/.github/CODEOWNERS +7 -0
- package/.github/workflows/chromatic.yml +52 -0
- package/.github/workflows/pr-checks.yml +18 -0
- package/.github/workflows/pr-housekeeping.yaml +16 -0
- package/.husky/pre-commit +2 -0
- package/.nvmrc +1 -0
- package/.pre-commit-config.yaml +28 -0
- package/.storybook/main.ts +21 -0
- package/.storybook/preview.ts +23 -0
- package/.storybook/vitest.setup.ts +7 -0
- package/.tflint.hcl +13 -0
- package/CODEOWNERS +5 -0
- package/README.md +21 -0
- package/bin/createComponent.sh +96 -0
- package/dist/components/button/Button.d.ts +10 -0
- package/dist/components/button/Button.d.ts.map +1 -0
- package/dist/components/button/Button.js +8 -0
- package/dist/components/button/Button.js.map +1 -0
- package/dist/components/card/Card.d.ts +18 -0
- package/dist/components/card/Card.d.ts.map +1 -0
- package/dist/components/card/Card.js +31 -0
- package/dist/components/card/Card.js.map +1 -0
- package/dist/components/card/Card.stories.d.ts +86 -0
- package/dist/components/card/Card.stories.d.ts.map +1 -0
- package/dist/components/card/Card.stories.js +89 -0
- package/dist/components/card/Card.stories.js.map +1 -0
- package/dist/components/heading/Heading.d.ts +393 -0
- package/dist/components/heading/Heading.d.ts.map +1 -0
- package/dist/components/heading/Heading.js +12 -0
- package/dist/components/heading/Heading.js.map +1 -0
- package/dist/components/heading/Heading.stories.d.ts +35 -0
- package/dist/components/heading/Heading.stories.d.ts.map +1 -0
- package/dist/components/heading/Heading.stories.js +50 -0
- package/dist/components/heading/Heading.stories.js.map +1 -0
- package/dist/components/heading/HeadingInnerContainer.d.ts +5 -0
- package/dist/components/heading/HeadingInnerContainer.d.ts.map +1 -0
- package/dist/components/heading/HeadingInnerContainer.js +7 -0
- package/dist/components/heading/HeadingInnerContainer.js.map +1 -0
- package/dist/components/icon/Icon.d.ts +13 -0
- package/dist/components/icon/Icon.d.ts.map +1 -0
- package/dist/components/icon/Icon.js +10 -0
- package/dist/components/icon/Icon.js.map +1 -0
- package/dist/components/icon/Icon.stories.d.ts +11 -0
- package/dist/components/icon/Icon.stories.d.ts.map +1 -0
- package/dist/components/icon/Icon.stories.js +13 -0
- package/dist/components/icon/Icon.stories.js.map +1 -0
- package/dist/components/icon/allowedIcons.d.ts +110 -0
- package/dist/components/icon/allowedIcons.d.ts.map +1 -0
- package/dist/components/icon/allowedIcons.js +117 -0
- package/dist/components/icon/allowedIcons.js.map +1 -0
- package/dist/components/icon/customIcons/AskArbor.d.ts +3 -0
- package/dist/components/icon/customIcons/AskArbor.d.ts.map +1 -0
- package/dist/components/icon/customIcons/AskArbor.js +6 -0
- package/dist/components/icon/customIcons/AskArbor.js.map +1 -0
- package/dist/components/icon/customIcons/CheckSolid.d.ts +3 -0
- package/dist/components/icon/customIcons/CheckSolid.d.ts.map +1 -0
- package/dist/components/icon/customIcons/CheckSolid.js +9 -0
- package/dist/components/icon/customIcons/CheckSolid.js.map +1 -0
- package/dist/components/icon/customIcons/Google.d.ts +3 -0
- package/dist/components/icon/customIcons/Google.d.ts.map +1 -0
- package/dist/components/icon/customIcons/Google.js +7 -0
- package/dist/components/icon/customIcons/Google.js.map +1 -0
- package/dist/components/icon/customIcons/XSolid.d.ts +3 -0
- package/dist/components/icon/customIcons/XSolid.d.ts.map +1 -0
- package/dist/components/icon/customIcons/XSolid.js +8 -0
- package/dist/components/icon/customIcons/XSolid.js.map +1 -0
- package/dist/components/icon/types.d.ts +8 -0
- package/dist/components/icon/types.d.ts.map +1 -0
- package/dist/components/icon/types.js +2 -0
- package/dist/components/icon/types.js.map +1 -0
- package/dist/components/pill/Pill.d.ts +8 -0
- package/dist/components/pill/Pill.d.ts.map +1 -0
- package/dist/components/pill/Pill.js +6 -0
- package/dist/components/pill/Pill.js.map +1 -0
- package/dist/components/pill/Pill.stories.d.ts +8 -0
- package/dist/components/pill/Pill.stories.d.ts.map +1 -0
- package/dist/components/pill/Pill.stories.js +10 -0
- package/dist/components/pill/Pill.stories.js.map +1 -0
- package/dist/index.css +1557 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/generateUuid.d.ts +2 -0
- package/dist/utils/generateUuid.d.ts.map +1 -0
- package/dist/utils/generateUuid.js +10 -0
- package/dist/utils/generateUuid.js.map +1 -0
- package/dist/utils/hooks/useMemoGenerateUuid.d.ts +8 -0
- package/dist/utils/hooks/useMemoGenerateUuid.d.ts.map +1 -0
- package/dist/utils/hooks/useMemoGenerateUuid.js +8 -0
- package/dist/utils/hooks/useMemoGenerateUuid.js.map +1 -0
- package/dist/utils/keyboardConstants.d.ts +13 -0
- package/dist/utils/keyboardConstants.d.ts.map +1 -0
- package/dist/utils/keyboardConstants.js +13 -0
- package/dist/utils/keyboardConstants.js.map +1 -0
- package/dist/utils/waitForElement.d.ts +2 -0
- package/dist/utils/waitForElement.d.ts.map +1 -0
- package/dist/utils/waitForElement.js +18 -0
- package/dist/utils/waitForElement.js.map +1 -0
- package/eslint.config.mts +30 -0
- package/package.json +76 -0
- package/src/components/button/Button.story.tsx +116 -0
- package/src/components/button/Button.test.tsx +49 -0
- package/src/components/button/Button.tsx +37 -0
- package/src/components/button/button.scss +181 -0
- package/src/components/card/Card.stories.tsx +99 -0
- package/src/components/card/Card.test.tsx +231 -0
- package/src/components/card/Card.tsx +96 -0
- package/src/components/card/card.scss +68 -0
- package/src/components/heading/Heading.stories.tsx +85 -0
- package/src/components/heading/Heading.test.tsx +29 -0
- package/src/components/heading/Heading.tsx +17 -0
- package/src/components/heading/HeadingInnerContainer.tsx +18 -0
- package/src/components/heading/heading.scss +48 -0
- package/src/components/icon/Icon.stories.tsx +16 -0
- package/src/components/icon/Icon.test.tsx +17 -0
- package/src/components/icon/Icon.tsx +27 -0
- package/src/components/icon/allowedIcons.tsx +208 -0
- package/src/components/icon/customIcons/AskArbor.tsx +28 -0
- package/src/components/icon/customIcons/CheckSolid.tsx +43 -0
- package/src/components/icon/customIcons/Google.tsx +33 -0
- package/src/components/icon/customIcons/XSolid.tsx +32 -0
- package/src/components/icon/types.ts +8 -0
- package/src/components/pill/Pill.stories.tsx +14 -0
- package/src/components/pill/Pill.test.tsx +21 -0
- package/src/components/pill/Pill.tsx +24 -0
- package/src/components/pill/pill.scss +51 -0
- package/src/global.scss +19 -0
- package/src/index.scss +7 -0
- package/src/index.ts +6 -0
- package/src/tokens.scss +1249 -0
- package/src/utils/generateUuid.ts +9 -0
- package/src/utils/hooks/useMemoGenerateUuid.ts +13 -0
- package/src/utils/keyboardConstants.ts +12 -0
- package/src/utils/waitForElement.ts +22 -0
- package/stylelint.config.mjs +10 -0
- package/tsconfig.json +49 -0
- package/vitest.config.ts +26 -0
- 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"}
|
package/dist/index.d.ts
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.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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
+
}
|