@ippon-ui/ui 0.0.2
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/.agents/agents/component-library-create-from-pattern-library.agent.md +37 -0
- package/.agents/agents/patten-library-create-component.agent.md +30 -0
- package/.agents/skills/component-library/SKILL.md +169 -0
- package/.agents/skills/pattern-library/SKILL.md +277 -0
- package/.github/workflows/build.yml +34 -0
- package/.gitlab-ci.yml +12 -0
- package/.prettierignore +6 -0
- package/AGENTS.md +50 -0
- package/LICENSE +202 -0
- package/ci/build.yml +15 -0
- package/ci/common.yml +42 -0
- package/ci/deploy.yml +20 -0
- package/icons/LICENCE +202 -0
- package/icons/index.ts +69 -0
- package/icons/package.json +25 -0
- package/icons/tsconfig.json +11 -0
- package/lefthook.yml +10 -0
- package/mise.toml +55 -0
- package/package.json +26 -0
- package/pnpm-workspace.yaml +9 -0
- package/prettier.config.mts +8 -0
- package/react/LICENCE +202 -0
- package/react/README.md +75 -0
- package/react/eslint.config.js +22 -0
- package/react/package.json +63 -0
- package/react/src/CAP.ts +14 -0
- package/react/src/Card.ts +2 -0
- package/react/src/DataSelectable.ts +7 -0
- package/react/src/Grid.ts +33 -0
- package/react/src/IpponBadge.tsx +62 -0
- package/react/src/IpponButton.tsx +93 -0
- package/react/src/IpponButtonCard.tsx +34 -0
- package/react/src/IpponCard.tsx +30 -0
- package/react/src/IpponContainer.tsx +15 -0
- package/react/src/IpponGrid.tsx +56 -0
- package/react/src/IpponHSpace.tsx +56 -0
- package/react/src/IpponIcon.tsx +15 -0
- package/react/src/IpponImportFile.tsx +128 -0
- package/react/src/IpponIon.tsx +45 -0
- package/react/src/IpponMeter.tsx +43 -0
- package/react/src/IpponProgress.tsx +45 -0
- package/react/src/IpponText.tsx +56 -0
- package/react/src/IpponTitle.tsx +45 -0
- package/react/src/IpponVSpace.tsx +43 -0
- package/react/src/Optional.ts +177 -0
- package/react/src/Tokens.ts +36 -0
- package/react/src/index.ts +16 -0
- package/react/test/File.fixture.ts +13 -0
- package/react/test/IpponBadge.spec.tsx +245 -0
- package/react/test/IpponButton.spec.tsx +666 -0
- package/react/test/IpponButtonCard.spec.tsx +162 -0
- package/react/test/IpponCard.spec.tsx +133 -0
- package/react/test/IpponContainer.spec.tsx +56 -0
- package/react/test/IpponGrid.spec.tsx +140 -0
- package/react/test/IpponHSpace.spec.tsx +107 -0
- package/react/test/IpponIcon.spec.tsx +37 -0
- package/react/test/IpponImportFile.spec.tsx +431 -0
- package/react/test/IpponIon.spec.tsx +52 -0
- package/react/test/IpponMeter.spec.tsx +59 -0
- package/react/test/IpponProgress.spec.tsx +68 -0
- package/react/test/IpponText.spec.tsx +149 -0
- package/react/test/IpponTitle.spec.tsx +242 -0
- package/react/test/IpponVSpace.spec.tsx +91 -0
- package/react/tsconfig.app.json +24 -0
- package/react/tsconfig.json +4 -0
- package/react/tsconfig.node.json +23 -0
- package/react/vite.config.ts +30 -0
- package/react/vitest.config.ts +21 -0
- package/styles/.editorconfig +12 -0
- package/styles/.stylelintrc.json +75 -0
- package/styles/LICENCE +202 -0
- package/styles/README.md +107 -0
- package/styles/logo.svg +26 -0
- package/styles/package.json +67 -0
- package/styles/src/atom/_atom.scss +9 -0
- package/styles/src/atom/atom.pug +34 -0
- package/styles/src/atom/badge/_badge.scss +108 -0
- package/styles/src/atom/badge/badge.code.pug +29 -0
- package/styles/src/atom/badge/badge.md +1 -0
- package/styles/src/atom/badge/badge.mixin.pug +24 -0
- package/styles/src/atom/badge/badge.render.pug +7 -0
- package/styles/src/atom/button/_button.scss +242 -0
- package/styles/src/atom/button/button.code.pug +38 -0
- package/styles/src/atom/button/button.md +31 -0
- package/styles/src/atom/button/button.mixin.pug +30 -0
- package/styles/src/atom/button/button.render.pug +13 -0
- package/styles/src/atom/icon/_icon.scss +8 -0
- package/styles/src/atom/icon/icon.code.pug +5 -0
- package/styles/src/atom/icon/icon.md +11 -0
- package/styles/src/atom/icon/icon.mixin.pug +8 -0
- package/styles/src/atom/icon/icon.render.pug +7 -0
- package/styles/src/atom/ion/ion.code.pug +8 -0
- package/styles/src/atom/ion/ion.md +11 -0
- package/styles/src/atom/ion/ion.mixin.pug +8 -0
- package/styles/src/atom/ion/ion.render.pug +7 -0
- package/styles/src/atom/meter/_meter.scss +23 -0
- package/styles/src/atom/meter/meter.code.pug +8 -0
- package/styles/src/atom/meter/meter.md +7 -0
- package/styles/src/atom/meter/meter.mixin.pug +12 -0
- package/styles/src/atom/meter/meter.render.pug +5 -0
- package/styles/src/atom/progress/_progress.scss +23 -0
- package/styles/src/atom/progress/progress.code.pug +8 -0
- package/styles/src/atom/progress/progress.md +7 -0
- package/styles/src/atom/progress/progress.mixin.pug +14 -0
- package/styles/src/atom/progress/progress.render.pug +5 -0
- package/styles/src/atom/tab/_tab.scss +48 -0
- package/styles/src/atom/tab/tab.code.pug +5 -0
- package/styles/src/atom/tab/tab.md +1 -0
- package/styles/src/atom/tab/tab.mixin.pug +14 -0
- package/styles/src/atom/tab/tab.render.pug +4 -0
- package/styles/src/atom/text/_text.scss +74 -0
- package/styles/src/atom/text/text.code.pug +19 -0
- package/styles/src/atom/text/text.md +5 -0
- package/styles/src/atom/text/text.mixin.pug +12 -0
- package/styles/src/atom/text/text.render.pug +7 -0
- package/styles/src/atom/title/_title.scss +68 -0
- package/styles/src/atom/title/title.code.pug +25 -0
- package/styles/src/atom/title/title.md +9 -0
- package/styles/src/atom/title/title.mixin.pug +12 -0
- package/styles/src/atom/title/title.render.pug +5 -0
- package/styles/src/atom/title-display/_title-display.scss +26 -0
- package/styles/src/atom/title-display/title-display.code.pug +9 -0
- package/styles/src/atom/title-display/title-display.md +5 -0
- package/styles/src/atom/title-display/title-display.mixin.pug +6 -0
- package/styles/src/atom/title-display/title-display.render.pug +4 -0
- package/styles/src/doc.scss +2 -0
- package/styles/src/favicon.ico +0 -0
- package/styles/src/function/_conversion.scss +9 -0
- package/styles/src/index.pug +59 -0
- package/styles/src/layout-documentation.pug +14 -0
- package/styles/src/layout.pug +17 -0
- package/styles/src/molecule/_molecule.scss +2 -0
- package/styles/src/molecule/import-file/_import-file.scss +38 -0
- package/styles/src/molecule/import-file/import-file.code.pug +4 -0
- package/styles/src/molecule/import-file/import-file.md +1 -0
- package/styles/src/molecule/import-file/import-file.mixin.pug +15 -0
- package/styles/src/molecule/import-file/import-file.render.pug +5 -0
- package/styles/src/molecule/molecule.pug +20 -0
- package/styles/src/molecule/tabs/_tabs.scss +4 -0
- package/styles/src/molecule/tabs/tabs.code.pug +9 -0
- package/styles/src/molecule/tabs/tabs.md +1 -0
- package/styles/src/molecule/tabs/tabs.mixin.pug +4 -0
- package/styles/src/molecule/tabs/tabs.render.pug +4 -0
- package/styles/src/molecule/toggle/_toggle.scss +68 -0
- package/styles/src/molecule/toggle/toggle.code.pug +26 -0
- package/styles/src/molecule/toggle/toggle.md +1 -0
- package/styles/src/molecule/toggle/toggle.mixin.pug +36 -0
- package/styles/src/molecule/toggle/toggle.render.pug +5 -0
- package/styles/src/organism/_abstract-card.scss +36 -0
- package/styles/src/organism/_docorganism.scss +1 -0
- package/styles/src/organism/_organism.scss +8 -0
- package/styles/src/organism/button-card/_button-card.scss +22 -0
- package/styles/src/organism/button-card/button-card.code.pug +31 -0
- package/styles/src/organism/button-card/button-card.md +28 -0
- package/styles/src/organism/button-card/button-card.mixin.pug +8 -0
- package/styles/src/organism/button-card/button-card.render.pug +7 -0
- package/styles/src/organism/card/_card.scss +6 -0
- package/styles/src/organism/card/card.code.pug +9 -0
- package/styles/src/organism/card/card.md +23 -0
- package/styles/src/organism/card/card.mixin.pug +7 -0
- package/styles/src/organism/card/card.render.pug +7 -0
- package/styles/src/organism/container/_container.scss +3 -0
- package/styles/src/organism/container/container.code.pug +13 -0
- package/styles/src/organism/container/container.md +5 -0
- package/styles/src/organism/container/container.mixin.pug +3 -0
- package/styles/src/organism/container/container.render.pug +4 -0
- package/styles/src/organism/grid/_docgrid.scss +11 -0
- package/styles/src/organism/grid/_grid.scss +84 -0
- package/styles/src/organism/grid/grid.code.pug +25 -0
- package/styles/src/organism/grid/grid.md +1 -0
- package/styles/src/organism/grid/grid.mixin.pug +7 -0
- package/styles/src/organism/grid/grid.render.pug +5 -0
- package/styles/src/organism/h-space/_h-space.scss +49 -0
- package/styles/src/organism/h-space/h-space.code.pug +56 -0
- package/styles/src/organism/h-space/h-space.md +22 -0
- package/styles/src/organism/h-space/h-space.mixin.pug +14 -0
- package/styles/src/organism/h-space/h-space.render.pug +5 -0
- package/styles/src/organism/header/_header.scss +8 -0
- package/styles/src/organism/header/header.code.pug +14 -0
- package/styles/src/organism/header/header.md +1 -0
- package/styles/src/organism/header/header.mixin.pug +7 -0
- package/styles/src/organism/header/header.render.pug +4 -0
- package/styles/src/organism/modal/_modal.scss +58 -0
- package/styles/src/organism/modal/modal.code.pug +68 -0
- package/styles/src/organism/modal/modal.md +1 -0
- package/styles/src/organism/modal/modal.mixin.pug +25 -0
- package/styles/src/organism/modal/modal.render.pug +4 -0
- package/styles/src/organism/organism.pug +30 -0
- package/styles/src/organism/v-space/_v-space.scss +45 -0
- package/styles/src/organism/v-space/v-space.code.pug +41 -0
- package/styles/src/organism/v-space/v-space.md +20 -0
- package/styles/src/organism/v-space/v-space.mixin.pug +7 -0
- package/styles/src/organism/v-space/v-space.render.pug +5 -0
- package/styles/src/quark/_breakpoint.scss +12 -0
- package/styles/src/quark/_font.scss +38 -0
- package/styles/src/quark/_gap.scss +34 -0
- package/styles/src/quark/_placeholder.scss +27 -0
- package/styles/src/quark/_shadow.scss +13 -0
- package/styles/src/quark/_typography.scss +146 -0
- package/styles/src/template/_template.scss +1 -0
- package/styles/src/template/layout/_layout.scss +20 -0
- package/styles/src/template/layout/layout.code.pug +11 -0
- package/styles/src/template/layout/layout.md +1 -0
- package/styles/src/template/layout/layout.mixin.pug +11 -0
- package/styles/src/template/layout/layout.render.pug +4 -0
- package/styles/src/template/template.pug +16 -0
- package/styles/src/tikui.scss +5 -0
- package/styles/src/token/_doctable.scss +14 -0
- package/styles/src/token/_doctoken.scss +1 -0
- package/styles/src/token/_size.scss +9 -0
- package/styles/src/token/_token.scss +5 -0
- package/styles/src/token/color/_color.scss +9 -0
- package/styles/src/token/color/color/_base.scss +65 -0
- package/styles/src/token/color/color/_brand.scss +13 -0
- package/styles/src/token/color/color/_error.scss +13 -0
- package/styles/src/token/color/color/_information-2.scss +13 -0
- package/styles/src/token/color/color/_information.scss +13 -0
- package/styles/src/token/color/color/_neutral.scss +20 -0
- package/styles/src/token/color/color/_semantic.scss +69 -0
- package/styles/src/token/color/color/_success.scss +13 -0
- package/styles/src/token/color/color/_warning.scss +13 -0
- package/styles/src/token/color/color.js +31 -0
- package/styles/src/token/color/color.mixin.pug +19 -0
- package/styles/src/token/color/color.pug +9 -0
- package/styles/src/token/color/color.render.pug +13 -0
- package/styles/src/token/radius/_radius.scss +8 -0
- package/styles/src/token/radius/radius.js +54 -0
- package/styles/src/token/radius/radius.mixin.pug +14 -0
- package/styles/src/token/radius/radius.pug +9 -0
- package/styles/src/token/radius/radius.render.pug +11 -0
- package/styles/src/token/shadow/_shadow.scss +22 -0
- package/styles/src/token/shadow/shadow.js +45 -0
- package/styles/src/token/shadow/shadow.mixin.pug +13 -0
- package/styles/src/token/shadow/shadow.pug +9 -0
- package/styles/src/token/shadow/shadow.render.pug +9 -0
- package/styles/src/token/token.js +38 -0
- package/styles/src/token/token.pug +25 -0
- package/styles/src/token/typography/_typography.scss +103 -0
- package/styles/src/token/typography/typography.js +32 -0
- package/styles/src/token/typography/typography.mixin.pug +17 -0
- package/styles/src/token/typography/typography.pug +9 -0
- package/styles/src/token/typography/typography.render.pug +19 -0
- package/styles/test/function/conversion.test.scss +20 -0
- package/styles/test/function/sass.spec.ts +6 -0
- package/styles/tikuiconfig.json +14 -0
- package/styles/tsconfig.json +10 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach, vi } from 'vitest';
|
|
2
|
+
import { render, screen, configure, cleanup } from '@testing-library/react';
|
|
3
|
+
import '@testing-library/jest-dom/vitest';
|
|
4
|
+
import { IpponButtonCard } from '../src';
|
|
5
|
+
|
|
6
|
+
configure({
|
|
7
|
+
testIdAttribute: 'data-selector',
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
describe('IpponButtonCard', () => {
|
|
11
|
+
afterEach(cleanup);
|
|
12
|
+
|
|
13
|
+
it('should be like pattern library', () => {
|
|
14
|
+
render(<IpponButtonCard dataSelector="ippon-button-card">Content</IpponButtonCard>);
|
|
15
|
+
|
|
16
|
+
const buttonCard = screen.getByTestId('ippon-button-card');
|
|
17
|
+
|
|
18
|
+
expect(buttonCard).toHaveClass('ippon-button-card');
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('should click', () => {
|
|
22
|
+
const onClick = vi.fn();
|
|
23
|
+
|
|
24
|
+
render(
|
|
25
|
+
<IpponButtonCard onClick={onClick} dataSelector="ippon-button-card">
|
|
26
|
+
Content
|
|
27
|
+
</IpponButtonCard>,
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
const buttonCard = screen.getByTestId('ippon-button-card');
|
|
31
|
+
buttonCard.click();
|
|
32
|
+
|
|
33
|
+
expect(onClick).toHaveBeenCalled();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe('Shadow', () => {
|
|
37
|
+
it.each([
|
|
38
|
+
{
|
|
39
|
+
level: 'l1',
|
|
40
|
+
className: '-shadow-l1',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
level: 'l2',
|
|
44
|
+
className: '-shadow-l2',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
level: 'l3',
|
|
48
|
+
className: '-shadow-l3',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
level: 'l4',
|
|
52
|
+
className: '-shadow-l4',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
level: 'l5',
|
|
56
|
+
className: '-shadow-l5',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
level: 'l6',
|
|
60
|
+
className: '-shadow-l6',
|
|
61
|
+
},
|
|
62
|
+
] as const)('should have $className for $level', ({ level, className }) => {
|
|
63
|
+
render(
|
|
64
|
+
<IpponButtonCard shadow={level} dataSelector="ippon-button-card">
|
|
65
|
+
Content
|
|
66
|
+
</IpponButtonCard>,
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const card = screen.getByTestId('ippon-button-card');
|
|
70
|
+
|
|
71
|
+
expect(card).toHaveClass(className);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('Border', () => {
|
|
76
|
+
it('should not have -border class by default', () => {
|
|
77
|
+
render(<IpponButtonCard dataSelector="ippon-button-card">Content</IpponButtonCard>);
|
|
78
|
+
|
|
79
|
+
const card = screen.getByTestId('ippon-button-card');
|
|
80
|
+
|
|
81
|
+
expect(card).not.toHaveClass('-border');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('should have -border class when border is present', () => {
|
|
85
|
+
render(
|
|
86
|
+
<IpponButtonCard border={true} dataSelector="ippon-button-card">
|
|
87
|
+
Content
|
|
88
|
+
</IpponButtonCard>,
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const card = screen.getByTestId('ippon-button-card');
|
|
92
|
+
|
|
93
|
+
expect(card).toHaveClass('-border');
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('should not have -border class when border is not present', () => {
|
|
97
|
+
render(
|
|
98
|
+
<IpponButtonCard border={false} dataSelector="ippon-button-card">
|
|
99
|
+
Content
|
|
100
|
+
</IpponButtonCard>,
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
const card = screen.getByTestId('ippon-button-card');
|
|
104
|
+
|
|
105
|
+
expect(card).not.toHaveClass('-border');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe('Full width', () => {
|
|
110
|
+
it('should not have -full-width class by default', () => {
|
|
111
|
+
render(<IpponButtonCard dataSelector="ippon-button-card">Content</IpponButtonCard>);
|
|
112
|
+
|
|
113
|
+
const card = screen.getByTestId('ippon-button-card');
|
|
114
|
+
|
|
115
|
+
expect(card).not.toHaveClass('-full-width');
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('should have -full-width class when fullWidth is present', () => {
|
|
119
|
+
render(
|
|
120
|
+
<IpponButtonCard fullWidth={true} dataSelector="ippon-button-card">
|
|
121
|
+
Content
|
|
122
|
+
</IpponButtonCard>,
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
const card = screen.getByTestId('ippon-button-card');
|
|
126
|
+
|
|
127
|
+
expect(card).toHaveClass('-full-width');
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe('Size', () => {
|
|
132
|
+
it('should not have size class by default', () => {
|
|
133
|
+
render(<IpponButtonCard dataSelector="ippon-button-card">Content</IpponButtonCard>);
|
|
134
|
+
|
|
135
|
+
const card = screen.getByTestId('ippon-button-card');
|
|
136
|
+
|
|
137
|
+
expect(card).not.toHaveClass('-small');
|
|
138
|
+
expect(card).not.toHaveClass('-large');
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it.each([
|
|
142
|
+
{
|
|
143
|
+
size: 'small',
|
|
144
|
+
className: '-small',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
size: 'large',
|
|
148
|
+
className: '-large',
|
|
149
|
+
},
|
|
150
|
+
] as const)('should have $className for size $size', ({ size, className }) => {
|
|
151
|
+
render(
|
|
152
|
+
<IpponButtonCard size={size} dataSelector="ippon-button-card">
|
|
153
|
+
Content
|
|
154
|
+
</IpponButtonCard>,
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
const card = screen.getByTestId('ippon-button-card');
|
|
158
|
+
|
|
159
|
+
expect(card).toHaveClass(className);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
});
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
+
import { render, screen, configure, cleanup } from '@testing-library/react';
|
|
3
|
+
import '@testing-library/jest-dom/vitest';
|
|
4
|
+
import { IpponCard } from '../src';
|
|
5
|
+
|
|
6
|
+
configure({
|
|
7
|
+
testIdAttribute: 'data-selector',
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
describe('IpponCard', () => {
|
|
11
|
+
afterEach(cleanup);
|
|
12
|
+
|
|
13
|
+
it('should be like pattern library', () => {
|
|
14
|
+
render(<IpponCard dataSelector="ippon-card">Content</IpponCard>);
|
|
15
|
+
|
|
16
|
+
const card = screen.getByTestId('ippon-card');
|
|
17
|
+
|
|
18
|
+
expect(card).toHaveClass('ippon-card');
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('should render children', () => {
|
|
22
|
+
render(<IpponCard dataSelector="ippon-card">Card Content</IpponCard>);
|
|
23
|
+
|
|
24
|
+
const card = screen.getByTestId('ippon-card');
|
|
25
|
+
|
|
26
|
+
expect(card).toHaveTextContent('Card Content');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('Shadow', () => {
|
|
30
|
+
it.each([
|
|
31
|
+
{
|
|
32
|
+
level: 'l1',
|
|
33
|
+
className: '-shadow-l1',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
level: 'l2',
|
|
37
|
+
className: '-shadow-l2',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
level: 'l3',
|
|
41
|
+
className: '-shadow-l3',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
level: 'l4',
|
|
45
|
+
className: '-shadow-l4',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
level: 'l5',
|
|
49
|
+
className: '-shadow-l5',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
level: 'l6',
|
|
53
|
+
className: '-shadow-l6',
|
|
54
|
+
},
|
|
55
|
+
] as const)('should have $className for $level', ({ level, className }) => {
|
|
56
|
+
render(
|
|
57
|
+
<IpponCard shadow={level} dataSelector="ippon-card">
|
|
58
|
+
Content
|
|
59
|
+
</IpponCard>,
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const card = screen.getByTestId('ippon-card');
|
|
63
|
+
|
|
64
|
+
expect(card).toHaveClass(className);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe('Border', () => {
|
|
69
|
+
it('should not have border class by default', () => {
|
|
70
|
+
render(<IpponCard dataSelector="ippon-card">Content</IpponCard>);
|
|
71
|
+
|
|
72
|
+
const card = screen.getByTestId('ippon-card');
|
|
73
|
+
|
|
74
|
+
expect(card).not.toHaveClass('-border');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('should have border class when border is true', () => {
|
|
78
|
+
render(
|
|
79
|
+
<IpponCard border={true} dataSelector="ippon-card">
|
|
80
|
+
Content
|
|
81
|
+
</IpponCard>,
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
const card = screen.getByTestId('ippon-card');
|
|
85
|
+
|
|
86
|
+
expect(card).toHaveClass('-border');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('should not have border class when border is false', () => {
|
|
90
|
+
render(
|
|
91
|
+
<IpponCard border={false} dataSelector="ippon-card">
|
|
92
|
+
Content
|
|
93
|
+
</IpponCard>,
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
const card = screen.getByTestId('ippon-card');
|
|
97
|
+
|
|
98
|
+
expect(card).not.toHaveClass('-border');
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
describe('Size', () => {
|
|
103
|
+
it('should not have size class by default', () => {
|
|
104
|
+
render(<IpponCard dataSelector="ippon-card">Content</IpponCard>);
|
|
105
|
+
|
|
106
|
+
const card = screen.getByTestId('ippon-card');
|
|
107
|
+
|
|
108
|
+
expect(card).not.toHaveClass('-small');
|
|
109
|
+
expect(card).not.toHaveClass('-large');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it.each([
|
|
113
|
+
{
|
|
114
|
+
size: 'small',
|
|
115
|
+
className: '-small',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
size: 'large',
|
|
119
|
+
className: '-large',
|
|
120
|
+
},
|
|
121
|
+
] as const)('should have $className for size $size', ({ size, className }) => {
|
|
122
|
+
render(
|
|
123
|
+
<IpponCard size={size} dataSelector="ippon-card">
|
|
124
|
+
Content
|
|
125
|
+
</IpponCard>,
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
const card = screen.getByTestId('ippon-card');
|
|
129
|
+
|
|
130
|
+
expect(card).toHaveClass(className);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { cleanup, configure, render, screen } from '@testing-library/react';
|
|
2
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
3
|
+
import '@testing-library/jest-dom/vitest';
|
|
4
|
+
import { IpponContainer } from '../src';
|
|
5
|
+
|
|
6
|
+
configure({
|
|
7
|
+
testIdAttribute: 'data-selector',
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
describe('IpponContainer', () => {
|
|
11
|
+
afterEach(cleanup);
|
|
12
|
+
|
|
13
|
+
it('should be like pattern library', () => {
|
|
14
|
+
render(<IpponContainer dataSelector="ippon-container" />);
|
|
15
|
+
|
|
16
|
+
const ipponContainer = screen.getByTestId('ippon-container');
|
|
17
|
+
|
|
18
|
+
expect(ipponContainer).toHaveClass('ippon-container');
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('should render children', () => {
|
|
22
|
+
render(
|
|
23
|
+
<IpponContainer dataSelector="ippon-container">
|
|
24
|
+
<p>Test content</p>
|
|
25
|
+
</IpponContainer>,
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const content = screen.getByText('Test content');
|
|
29
|
+
|
|
30
|
+
expect(content).toBeInTheDocument();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should render with default div tag', () => {
|
|
34
|
+
render(<IpponContainer dataSelector="ippon-container" />);
|
|
35
|
+
|
|
36
|
+
const element = screen.getByTestId('ippon-container');
|
|
37
|
+
|
|
38
|
+
expect(element.tagName).toBe('DIV');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should render with custom tag', () => {
|
|
42
|
+
render(<IpponContainer tag="section" dataSelector="ippon-container" />);
|
|
43
|
+
|
|
44
|
+
const element = screen.getByTestId('ippon-container');
|
|
45
|
+
|
|
46
|
+
expect(element.tagName).toBe('SECTION');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('should render with article tag', () => {
|
|
50
|
+
render(<IpponContainer tag="article" dataSelector="ippon-container" />);
|
|
51
|
+
|
|
52
|
+
const element = screen.getByTestId('ippon-container');
|
|
53
|
+
|
|
54
|
+
expect(element.tagName).toBe('ARTICLE');
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { cleanup, configure, render, screen } from '@testing-library/react';
|
|
2
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
3
|
+
import '@testing-library/jest-dom/vitest';
|
|
4
|
+
import { IpponGrid, IpponGridSlot } from '../src';
|
|
5
|
+
|
|
6
|
+
configure({
|
|
7
|
+
testIdAttribute: 'data-selector',
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
describe('IpponGrid', () => {
|
|
11
|
+
afterEach(cleanup);
|
|
12
|
+
|
|
13
|
+
it('should be like pattern library', () => {
|
|
14
|
+
render(<IpponGrid dataSelector="ippon-grid">Content</IpponGrid>);
|
|
15
|
+
|
|
16
|
+
const grid = screen.getByTestId('ippon-grid');
|
|
17
|
+
|
|
18
|
+
expect(grid).toHaveClass('ippon-grid');
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('should render children', () => {
|
|
22
|
+
render(<IpponGrid dataSelector="ippon-grid">Grid content</IpponGrid>);
|
|
23
|
+
|
|
24
|
+
const grid = screen.getByTestId('ippon-grid');
|
|
25
|
+
|
|
26
|
+
expect(grid).toHaveTextContent('Grid content');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('Media layout', () => {
|
|
30
|
+
it('should have single media columns', () => {
|
|
31
|
+
render(<IpponGrid media={4} dataSelector="ippon-grid" />);
|
|
32
|
+
|
|
33
|
+
const grid = screen.getByTestId('ippon-grid');
|
|
34
|
+
|
|
35
|
+
expect(grid).toHaveClass('-media-4');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should have responsive media columns', () => {
|
|
39
|
+
render(<IpponGrid media={[4, 'desktop-m-12']} dataSelector="ippon-grid" />);
|
|
40
|
+
|
|
41
|
+
const grid = screen.getByTestId('ippon-grid');
|
|
42
|
+
|
|
43
|
+
expect(grid).toHaveClass('-media-4');
|
|
44
|
+
expect(grid).toHaveClass('-media-desktop-m-12');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('Container layout', () => {
|
|
49
|
+
it('should have single container columns', () => {
|
|
50
|
+
render(<IpponGrid container={4} dataSelector="ippon-grid" />);
|
|
51
|
+
|
|
52
|
+
const grid = screen.getByTestId('ippon-grid');
|
|
53
|
+
|
|
54
|
+
expect(grid).toHaveClass('-container-4');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should have responsive container columns', () => {
|
|
58
|
+
render(<IpponGrid container={[4, 'm-12']} dataSelector="ippon-grid" />);
|
|
59
|
+
|
|
60
|
+
const grid = screen.getByTestId('ippon-grid');
|
|
61
|
+
|
|
62
|
+
expect(grid).toHaveClass('-container-4');
|
|
63
|
+
expect(grid).toHaveClass('-container-m-12');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
describe('Gap', () => {
|
|
68
|
+
it('should have single gap', () => {
|
|
69
|
+
render(<IpponGrid gap={24} dataSelector="ippon-grid" />);
|
|
70
|
+
|
|
71
|
+
const grid = screen.getByTestId('ippon-grid');
|
|
72
|
+
|
|
73
|
+
expect(grid).toHaveClass('-gap-24');
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('should have responsive gap', () => {
|
|
77
|
+
render(<IpponGrid gap={[16, 'm-12']} dataSelector="ippon-grid" />);
|
|
78
|
+
|
|
79
|
+
const grid = screen.getByTestId('ippon-grid');
|
|
80
|
+
|
|
81
|
+
expect(grid).toHaveClass('-gap-16');
|
|
82
|
+
expect(grid).toHaveClass('-gap-m-12');
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
describe('Slot', () => {
|
|
87
|
+
it('should be like pattern library', () => {
|
|
88
|
+
render(
|
|
89
|
+
<IpponGrid>
|
|
90
|
+
<IpponGridSlot dataSelector="ippon-grid-slot">Slot</IpponGridSlot>
|
|
91
|
+
</IpponGrid>,
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
const slot = screen.getByTestId('ippon-grid-slot');
|
|
95
|
+
|
|
96
|
+
expect(slot).toHaveClass('ippon-grid--slot');
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('should render children', () => {
|
|
100
|
+
render(
|
|
101
|
+
<IpponGrid>
|
|
102
|
+
<IpponGridSlot dataSelector="ippon-grid-slot">Slot content</IpponGridSlot>
|
|
103
|
+
</IpponGrid>,
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
const slot = screen.getByTestId('ippon-grid-slot');
|
|
107
|
+
|
|
108
|
+
expect(slot).toHaveTextContent('Slot content');
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('should have single col span', () => {
|
|
112
|
+
render(
|
|
113
|
+
<IpponGrid>
|
|
114
|
+
<IpponGridSlot col={4} dataSelector="ippon-grid-slot">
|
|
115
|
+
Slot
|
|
116
|
+
</IpponGridSlot>
|
|
117
|
+
</IpponGrid>,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
const slot = screen.getByTestId('ippon-grid-slot');
|
|
121
|
+
|
|
122
|
+
expect(slot).toHaveClass('-col-4');
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('should have responsive col span', () => {
|
|
126
|
+
render(
|
|
127
|
+
<IpponGrid>
|
|
128
|
+
<IpponGridSlot col={[4, 'desktop-m-8']} dataSelector="ippon-grid-slot">
|
|
129
|
+
Slot
|
|
130
|
+
</IpponGridSlot>
|
|
131
|
+
</IpponGrid>,
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
const slot = screen.getByTestId('ippon-grid-slot');
|
|
135
|
+
|
|
136
|
+
expect(slot).toHaveClass('-col-4');
|
|
137
|
+
expect(slot).toHaveClass('-col-desktop-m-8');
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { cleanup, configure, render, screen } from '@testing-library/react';
|
|
2
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
3
|
+
import '@testing-library/jest-dom/vitest';
|
|
4
|
+
import { IpponHSpace, IpponHSpaceSlot } from '../src';
|
|
5
|
+
|
|
6
|
+
configure({
|
|
7
|
+
testIdAttribute: 'data-selector',
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
describe('IpponHSpace', () => {
|
|
11
|
+
afterEach(cleanup);
|
|
12
|
+
|
|
13
|
+
it('should be like pattern library', () => {
|
|
14
|
+
render(<IpponHSpace dataSelector="ippon-h-space" />);
|
|
15
|
+
|
|
16
|
+
const ipponHSpace = screen.getByTestId('ippon-h-space');
|
|
17
|
+
|
|
18
|
+
expect(ipponHSpace).toHaveClass('ippon-h-space');
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it.each([2, 16, 32] as const)('should have gap %s', (gap) => {
|
|
22
|
+
render(<IpponHSpace gap={gap} dataSelector="ippon-h-space" />);
|
|
23
|
+
|
|
24
|
+
const ipponHSpace = screen.getByTestId('ippon-h-space');
|
|
25
|
+
|
|
26
|
+
expect(ipponHSpace).toHaveClass(`-gap-${gap}`);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it.each(['left', 'right', 'middle', 'bottom'] as const)(
|
|
30
|
+
'should have alignment %s',
|
|
31
|
+
(alignment) => {
|
|
32
|
+
render(<IpponHSpace align={alignment} dataSelector="ippon-h-space" />);
|
|
33
|
+
|
|
34
|
+
const ipponHSpace = screen.getByTestId('ippon-h-space');
|
|
35
|
+
|
|
36
|
+
expect(ipponHSpace).toHaveClass(`-${alignment}`);
|
|
37
|
+
},
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
it('should mix alignments', () => {
|
|
41
|
+
render(<IpponHSpace align={['left', 'bottom']} dataSelector="ippon-h-space" />);
|
|
42
|
+
|
|
43
|
+
const ipponHSpace = screen.getByTestId('ippon-h-space');
|
|
44
|
+
|
|
45
|
+
expect(ipponHSpace).toHaveClass('-left', '-bottom');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should render with default div tag', () => {
|
|
49
|
+
render(<IpponHSpace dataSelector="ippon-h-space">Content</IpponHSpace>);
|
|
50
|
+
|
|
51
|
+
const ipponHSpace = screen.getByTestId('ippon-h-space');
|
|
52
|
+
|
|
53
|
+
expect(ipponHSpace.tagName).toBe('DIV');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should render with custom tag', () => {
|
|
57
|
+
render(
|
|
58
|
+
<IpponHSpace tag="section" dataSelector="ippon-h-space">
|
|
59
|
+
Content
|
|
60
|
+
</IpponHSpace>,
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
const ipponHSpace = screen.getByTestId('ippon-h-space');
|
|
64
|
+
|
|
65
|
+
expect(ipponHSpace.tagName).toBe('SECTION');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('should wrap', () => {
|
|
69
|
+
render(
|
|
70
|
+
<IpponHSpace wrap dataSelector="ippon-h-space">
|
|
71
|
+
Content
|
|
72
|
+
</IpponHSpace>,
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
const ipponHSpace = screen.getByTestId('ippon-h-space');
|
|
76
|
+
|
|
77
|
+
expect(ipponHSpace).toHaveClass('-wrap');
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe('Slot', () => {
|
|
81
|
+
it('shouldbe minimal', () => {
|
|
82
|
+
render(
|
|
83
|
+
<IpponHSpace>
|
|
84
|
+
<IpponHSpaceSlot dataSelector="ippon-h-space-slot">Slot</IpponHSpaceSlot>
|
|
85
|
+
</IpponHSpace>,
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
const ipponHSpaceSlot = screen.getByTestId('ippon-h-space-slot');
|
|
89
|
+
|
|
90
|
+
expect(ipponHSpaceSlot).toHaveClass('ippon-h-space--slot');
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('should expand', () => {
|
|
94
|
+
render(
|
|
95
|
+
<IpponHSpace>
|
|
96
|
+
<IpponHSpaceSlot expand dataSelector="ippon-h-space-slot">
|
|
97
|
+
Slot
|
|
98
|
+
</IpponHSpaceSlot>
|
|
99
|
+
</IpponHSpace>,
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const ipponHSpaceSlot = screen.getByTestId('ippon-h-space-slot');
|
|
103
|
+
|
|
104
|
+
expect(ipponHSpaceSlot).toHaveClass('ippon-h-space--slot', '-expand');
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
+
import { cleanup, configure, render, screen } from '@testing-library/react';
|
|
3
|
+
import '@testing-library/jest-dom/vitest';
|
|
4
|
+
import { IpponIcon } from '../src';
|
|
5
|
+
|
|
6
|
+
configure({
|
|
7
|
+
testIdAttribute: 'data-selector',
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
describe('IpponIcon', () => {
|
|
11
|
+
beforeEach(cleanup);
|
|
12
|
+
|
|
13
|
+
it('should be minimal', () => {
|
|
14
|
+
render(<IpponIcon name="paper-plane" dataSelector="ippon-icon" />);
|
|
15
|
+
|
|
16
|
+
const ipponIcon = screen.getByTestId('ippon-icon');
|
|
17
|
+
|
|
18
|
+
expect(ipponIcon).toHaveClass('ippon-icon', 'ippon-ion-paper-plane');
|
|
19
|
+
expect(ipponIcon).toHaveRole('presentation');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('should have a size', () => {
|
|
23
|
+
render(<IpponIcon name="paper-plane" size={32} dataSelector="ippon-icon" />);
|
|
24
|
+
|
|
25
|
+
const ipponIcon = screen.getByTestId('ippon-icon');
|
|
26
|
+
|
|
27
|
+
expect(ipponIcon).toHaveClass('-size-32');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('should have a color', () => {
|
|
31
|
+
render(<IpponIcon name="paper-plane" color="brand-primary" dataSelector="ippon-icon" />);
|
|
32
|
+
|
|
33
|
+
const ipponIcon = screen.getByTestId('ippon-icon');
|
|
34
|
+
|
|
35
|
+
expect(ipponIcon).toHaveClass('-color-brand-primary');
|
|
36
|
+
});
|
|
37
|
+
});
|