@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.
Files changed (246) hide show
  1. package/.agents/agents/component-library-create-from-pattern-library.agent.md +37 -0
  2. package/.agents/agents/patten-library-create-component.agent.md +30 -0
  3. package/.agents/skills/component-library/SKILL.md +169 -0
  4. package/.agents/skills/pattern-library/SKILL.md +277 -0
  5. package/.github/workflows/build.yml +34 -0
  6. package/.gitlab-ci.yml +12 -0
  7. package/.prettierignore +6 -0
  8. package/AGENTS.md +50 -0
  9. package/LICENSE +202 -0
  10. package/ci/build.yml +15 -0
  11. package/ci/common.yml +42 -0
  12. package/ci/deploy.yml +20 -0
  13. package/icons/LICENCE +202 -0
  14. package/icons/index.ts +69 -0
  15. package/icons/package.json +25 -0
  16. package/icons/tsconfig.json +11 -0
  17. package/lefthook.yml +10 -0
  18. package/mise.toml +55 -0
  19. package/package.json +26 -0
  20. package/pnpm-workspace.yaml +9 -0
  21. package/prettier.config.mts +8 -0
  22. package/react/LICENCE +202 -0
  23. package/react/README.md +75 -0
  24. package/react/eslint.config.js +22 -0
  25. package/react/package.json +63 -0
  26. package/react/src/CAP.ts +14 -0
  27. package/react/src/Card.ts +2 -0
  28. package/react/src/DataSelectable.ts +7 -0
  29. package/react/src/Grid.ts +33 -0
  30. package/react/src/IpponBadge.tsx +62 -0
  31. package/react/src/IpponButton.tsx +93 -0
  32. package/react/src/IpponButtonCard.tsx +34 -0
  33. package/react/src/IpponCard.tsx +30 -0
  34. package/react/src/IpponContainer.tsx +15 -0
  35. package/react/src/IpponGrid.tsx +56 -0
  36. package/react/src/IpponHSpace.tsx +56 -0
  37. package/react/src/IpponIcon.tsx +15 -0
  38. package/react/src/IpponImportFile.tsx +128 -0
  39. package/react/src/IpponIon.tsx +45 -0
  40. package/react/src/IpponMeter.tsx +43 -0
  41. package/react/src/IpponProgress.tsx +45 -0
  42. package/react/src/IpponText.tsx +56 -0
  43. package/react/src/IpponTitle.tsx +45 -0
  44. package/react/src/IpponVSpace.tsx +43 -0
  45. package/react/src/Optional.ts +177 -0
  46. package/react/src/Tokens.ts +36 -0
  47. package/react/src/index.ts +16 -0
  48. package/react/test/File.fixture.ts +13 -0
  49. package/react/test/IpponBadge.spec.tsx +245 -0
  50. package/react/test/IpponButton.spec.tsx +666 -0
  51. package/react/test/IpponButtonCard.spec.tsx +162 -0
  52. package/react/test/IpponCard.spec.tsx +133 -0
  53. package/react/test/IpponContainer.spec.tsx +56 -0
  54. package/react/test/IpponGrid.spec.tsx +140 -0
  55. package/react/test/IpponHSpace.spec.tsx +107 -0
  56. package/react/test/IpponIcon.spec.tsx +37 -0
  57. package/react/test/IpponImportFile.spec.tsx +431 -0
  58. package/react/test/IpponIon.spec.tsx +52 -0
  59. package/react/test/IpponMeter.spec.tsx +59 -0
  60. package/react/test/IpponProgress.spec.tsx +68 -0
  61. package/react/test/IpponText.spec.tsx +149 -0
  62. package/react/test/IpponTitle.spec.tsx +242 -0
  63. package/react/test/IpponVSpace.spec.tsx +91 -0
  64. package/react/tsconfig.app.json +24 -0
  65. package/react/tsconfig.json +4 -0
  66. package/react/tsconfig.node.json +23 -0
  67. package/react/vite.config.ts +30 -0
  68. package/react/vitest.config.ts +21 -0
  69. package/styles/.editorconfig +12 -0
  70. package/styles/.stylelintrc.json +75 -0
  71. package/styles/LICENCE +202 -0
  72. package/styles/README.md +107 -0
  73. package/styles/logo.svg +26 -0
  74. package/styles/package.json +67 -0
  75. package/styles/src/atom/_atom.scss +9 -0
  76. package/styles/src/atom/atom.pug +34 -0
  77. package/styles/src/atom/badge/_badge.scss +108 -0
  78. package/styles/src/atom/badge/badge.code.pug +29 -0
  79. package/styles/src/atom/badge/badge.md +1 -0
  80. package/styles/src/atom/badge/badge.mixin.pug +24 -0
  81. package/styles/src/atom/badge/badge.render.pug +7 -0
  82. package/styles/src/atom/button/_button.scss +242 -0
  83. package/styles/src/atom/button/button.code.pug +38 -0
  84. package/styles/src/atom/button/button.md +31 -0
  85. package/styles/src/atom/button/button.mixin.pug +30 -0
  86. package/styles/src/atom/button/button.render.pug +13 -0
  87. package/styles/src/atom/icon/_icon.scss +8 -0
  88. package/styles/src/atom/icon/icon.code.pug +5 -0
  89. package/styles/src/atom/icon/icon.md +11 -0
  90. package/styles/src/atom/icon/icon.mixin.pug +8 -0
  91. package/styles/src/atom/icon/icon.render.pug +7 -0
  92. package/styles/src/atom/ion/ion.code.pug +8 -0
  93. package/styles/src/atom/ion/ion.md +11 -0
  94. package/styles/src/atom/ion/ion.mixin.pug +8 -0
  95. package/styles/src/atom/ion/ion.render.pug +7 -0
  96. package/styles/src/atom/meter/_meter.scss +23 -0
  97. package/styles/src/atom/meter/meter.code.pug +8 -0
  98. package/styles/src/atom/meter/meter.md +7 -0
  99. package/styles/src/atom/meter/meter.mixin.pug +12 -0
  100. package/styles/src/atom/meter/meter.render.pug +5 -0
  101. package/styles/src/atom/progress/_progress.scss +23 -0
  102. package/styles/src/atom/progress/progress.code.pug +8 -0
  103. package/styles/src/atom/progress/progress.md +7 -0
  104. package/styles/src/atom/progress/progress.mixin.pug +14 -0
  105. package/styles/src/atom/progress/progress.render.pug +5 -0
  106. package/styles/src/atom/tab/_tab.scss +48 -0
  107. package/styles/src/atom/tab/tab.code.pug +5 -0
  108. package/styles/src/atom/tab/tab.md +1 -0
  109. package/styles/src/atom/tab/tab.mixin.pug +14 -0
  110. package/styles/src/atom/tab/tab.render.pug +4 -0
  111. package/styles/src/atom/text/_text.scss +74 -0
  112. package/styles/src/atom/text/text.code.pug +19 -0
  113. package/styles/src/atom/text/text.md +5 -0
  114. package/styles/src/atom/text/text.mixin.pug +12 -0
  115. package/styles/src/atom/text/text.render.pug +7 -0
  116. package/styles/src/atom/title/_title.scss +68 -0
  117. package/styles/src/atom/title/title.code.pug +25 -0
  118. package/styles/src/atom/title/title.md +9 -0
  119. package/styles/src/atom/title/title.mixin.pug +12 -0
  120. package/styles/src/atom/title/title.render.pug +5 -0
  121. package/styles/src/atom/title-display/_title-display.scss +26 -0
  122. package/styles/src/atom/title-display/title-display.code.pug +9 -0
  123. package/styles/src/atom/title-display/title-display.md +5 -0
  124. package/styles/src/atom/title-display/title-display.mixin.pug +6 -0
  125. package/styles/src/atom/title-display/title-display.render.pug +4 -0
  126. package/styles/src/doc.scss +2 -0
  127. package/styles/src/favicon.ico +0 -0
  128. package/styles/src/function/_conversion.scss +9 -0
  129. package/styles/src/index.pug +59 -0
  130. package/styles/src/layout-documentation.pug +14 -0
  131. package/styles/src/layout.pug +17 -0
  132. package/styles/src/molecule/_molecule.scss +2 -0
  133. package/styles/src/molecule/import-file/_import-file.scss +38 -0
  134. package/styles/src/molecule/import-file/import-file.code.pug +4 -0
  135. package/styles/src/molecule/import-file/import-file.md +1 -0
  136. package/styles/src/molecule/import-file/import-file.mixin.pug +15 -0
  137. package/styles/src/molecule/import-file/import-file.render.pug +5 -0
  138. package/styles/src/molecule/molecule.pug +20 -0
  139. package/styles/src/molecule/tabs/_tabs.scss +4 -0
  140. package/styles/src/molecule/tabs/tabs.code.pug +9 -0
  141. package/styles/src/molecule/tabs/tabs.md +1 -0
  142. package/styles/src/molecule/tabs/tabs.mixin.pug +4 -0
  143. package/styles/src/molecule/tabs/tabs.render.pug +4 -0
  144. package/styles/src/molecule/toggle/_toggle.scss +68 -0
  145. package/styles/src/molecule/toggle/toggle.code.pug +26 -0
  146. package/styles/src/molecule/toggle/toggle.md +1 -0
  147. package/styles/src/molecule/toggle/toggle.mixin.pug +36 -0
  148. package/styles/src/molecule/toggle/toggle.render.pug +5 -0
  149. package/styles/src/organism/_abstract-card.scss +36 -0
  150. package/styles/src/organism/_docorganism.scss +1 -0
  151. package/styles/src/organism/_organism.scss +8 -0
  152. package/styles/src/organism/button-card/_button-card.scss +22 -0
  153. package/styles/src/organism/button-card/button-card.code.pug +31 -0
  154. package/styles/src/organism/button-card/button-card.md +28 -0
  155. package/styles/src/organism/button-card/button-card.mixin.pug +8 -0
  156. package/styles/src/organism/button-card/button-card.render.pug +7 -0
  157. package/styles/src/organism/card/_card.scss +6 -0
  158. package/styles/src/organism/card/card.code.pug +9 -0
  159. package/styles/src/organism/card/card.md +23 -0
  160. package/styles/src/organism/card/card.mixin.pug +7 -0
  161. package/styles/src/organism/card/card.render.pug +7 -0
  162. package/styles/src/organism/container/_container.scss +3 -0
  163. package/styles/src/organism/container/container.code.pug +13 -0
  164. package/styles/src/organism/container/container.md +5 -0
  165. package/styles/src/organism/container/container.mixin.pug +3 -0
  166. package/styles/src/organism/container/container.render.pug +4 -0
  167. package/styles/src/organism/grid/_docgrid.scss +11 -0
  168. package/styles/src/organism/grid/_grid.scss +84 -0
  169. package/styles/src/organism/grid/grid.code.pug +25 -0
  170. package/styles/src/organism/grid/grid.md +1 -0
  171. package/styles/src/organism/grid/grid.mixin.pug +7 -0
  172. package/styles/src/organism/grid/grid.render.pug +5 -0
  173. package/styles/src/organism/h-space/_h-space.scss +49 -0
  174. package/styles/src/organism/h-space/h-space.code.pug +56 -0
  175. package/styles/src/organism/h-space/h-space.md +22 -0
  176. package/styles/src/organism/h-space/h-space.mixin.pug +14 -0
  177. package/styles/src/organism/h-space/h-space.render.pug +5 -0
  178. package/styles/src/organism/header/_header.scss +8 -0
  179. package/styles/src/organism/header/header.code.pug +14 -0
  180. package/styles/src/organism/header/header.md +1 -0
  181. package/styles/src/organism/header/header.mixin.pug +7 -0
  182. package/styles/src/organism/header/header.render.pug +4 -0
  183. package/styles/src/organism/modal/_modal.scss +58 -0
  184. package/styles/src/organism/modal/modal.code.pug +68 -0
  185. package/styles/src/organism/modal/modal.md +1 -0
  186. package/styles/src/organism/modal/modal.mixin.pug +25 -0
  187. package/styles/src/organism/modal/modal.render.pug +4 -0
  188. package/styles/src/organism/organism.pug +30 -0
  189. package/styles/src/organism/v-space/_v-space.scss +45 -0
  190. package/styles/src/organism/v-space/v-space.code.pug +41 -0
  191. package/styles/src/organism/v-space/v-space.md +20 -0
  192. package/styles/src/organism/v-space/v-space.mixin.pug +7 -0
  193. package/styles/src/organism/v-space/v-space.render.pug +5 -0
  194. package/styles/src/quark/_breakpoint.scss +12 -0
  195. package/styles/src/quark/_font.scss +38 -0
  196. package/styles/src/quark/_gap.scss +34 -0
  197. package/styles/src/quark/_placeholder.scss +27 -0
  198. package/styles/src/quark/_shadow.scss +13 -0
  199. package/styles/src/quark/_typography.scss +146 -0
  200. package/styles/src/template/_template.scss +1 -0
  201. package/styles/src/template/layout/_layout.scss +20 -0
  202. package/styles/src/template/layout/layout.code.pug +11 -0
  203. package/styles/src/template/layout/layout.md +1 -0
  204. package/styles/src/template/layout/layout.mixin.pug +11 -0
  205. package/styles/src/template/layout/layout.render.pug +4 -0
  206. package/styles/src/template/template.pug +16 -0
  207. package/styles/src/tikui.scss +5 -0
  208. package/styles/src/token/_doctable.scss +14 -0
  209. package/styles/src/token/_doctoken.scss +1 -0
  210. package/styles/src/token/_size.scss +9 -0
  211. package/styles/src/token/_token.scss +5 -0
  212. package/styles/src/token/color/_color.scss +9 -0
  213. package/styles/src/token/color/color/_base.scss +65 -0
  214. package/styles/src/token/color/color/_brand.scss +13 -0
  215. package/styles/src/token/color/color/_error.scss +13 -0
  216. package/styles/src/token/color/color/_information-2.scss +13 -0
  217. package/styles/src/token/color/color/_information.scss +13 -0
  218. package/styles/src/token/color/color/_neutral.scss +20 -0
  219. package/styles/src/token/color/color/_semantic.scss +69 -0
  220. package/styles/src/token/color/color/_success.scss +13 -0
  221. package/styles/src/token/color/color/_warning.scss +13 -0
  222. package/styles/src/token/color/color.js +31 -0
  223. package/styles/src/token/color/color.mixin.pug +19 -0
  224. package/styles/src/token/color/color.pug +9 -0
  225. package/styles/src/token/color/color.render.pug +13 -0
  226. package/styles/src/token/radius/_radius.scss +8 -0
  227. package/styles/src/token/radius/radius.js +54 -0
  228. package/styles/src/token/radius/radius.mixin.pug +14 -0
  229. package/styles/src/token/radius/radius.pug +9 -0
  230. package/styles/src/token/radius/radius.render.pug +11 -0
  231. package/styles/src/token/shadow/_shadow.scss +22 -0
  232. package/styles/src/token/shadow/shadow.js +45 -0
  233. package/styles/src/token/shadow/shadow.mixin.pug +13 -0
  234. package/styles/src/token/shadow/shadow.pug +9 -0
  235. package/styles/src/token/shadow/shadow.render.pug +9 -0
  236. package/styles/src/token/token.js +38 -0
  237. package/styles/src/token/token.pug +25 -0
  238. package/styles/src/token/typography/_typography.scss +103 -0
  239. package/styles/src/token/typography/typography.js +32 -0
  240. package/styles/src/token/typography/typography.mixin.pug +17 -0
  241. package/styles/src/token/typography/typography.pug +9 -0
  242. package/styles/src/token/typography/typography.render.pug +19 -0
  243. package/styles/test/function/conversion.test.scss +20 -0
  244. package/styles/test/function/sass.spec.ts +6 -0
  245. package/styles/tikuiconfig.json +14 -0
  246. 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
+ });