@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,36 @@
1
+ include /atom/ion/ion.mixin.pug
2
+ include /atom/button/button.mixin.pug
3
+
4
+ mixin ippon-toggle--title
5
+ .ippon-toggle--title
6
+ block
7
+
8
+ mixin ippon-toggle--button(options)
9
+ - const { id, open } = options || {};
10
+ - const expanded = open ? 'true' : 'false';
11
+ button.ippon-toggle--button(class=openClass, id=id, aria-expanded=expanded)
12
+ +ippon-ion({ name: 'chevron-forward', additionalClass: 'ippon-toggle--icon' })
13
+ block
14
+
15
+ mixin ippon-toggle--actions
16
+ .ippon-toggle--actions
17
+ block
18
+
19
+ mixin ippon-toggle--header
20
+ .ippon-toggle--header
21
+ block
22
+
23
+ mixin ippon-toggle--body(options)
24
+ - const { labelledBy } = options || {};
25
+ .ippon-toggle--body(role='region', aria-labelledby=labelledBy)
26
+ block
27
+
28
+ mixin ippon-toggle--content
29
+ .ippon-toggle--content
30
+ block
31
+
32
+ mixin ippon-toggle(options)
33
+ - const { open } = options || {};
34
+ - const openClass = open ? '-open' : null;
35
+ .ippon-toggle(class=openClass)
36
+ block
@@ -0,0 +1,5 @@
1
+ extends /layout
2
+
3
+ block body
4
+ div(style='display: flex; flex-direction: column; gap: 1rem')
5
+ include toggle.code.pug
@@ -0,0 +1,36 @@
1
+ @use '../quark/shadow';
2
+
3
+ %ippon-card {
4
+ --_border-width: 0px;
5
+ --_padding-v: var(--ippon-size-16);
6
+ --_padding--inner-v: calc(var(--_padding-v) - var(--_border-width));
7
+ --_padding-h: var(--ippon-size-16);
8
+ --_padding--inner-h: calc(var(--_padding-h) - var(--_border-width));
9
+
10
+ box-sizing: border-box;
11
+ border: var(--_border-width) solid var(--ippon-color-neutral-border);
12
+ border-radius: var(--ippon-radius-l);
13
+ background-color: var(--ippon-color-neutral-surface-primary);
14
+ padding: var(--_padding-v) var(--_padding-h);
15
+ color: var(--ippon-color-neutral-text-icon-on-primary);
16
+
17
+ @include shadow.shadows;
18
+
19
+ &.-border {
20
+ --_border-width: 1px;
21
+ }
22
+
23
+ &.-small {
24
+ --_padding-h: var(--ippon-size-8);
25
+ --_padding-v: var(--ippon-size-8);
26
+ }
27
+
28
+ &.-large {
29
+ --_padding-v: var(--ippon-size-20);
30
+ --_padding-h: var(--ippon-size-24);
31
+ }
32
+ }
33
+
34
+ @mixin ippon-card {
35
+ @extend %ippon-card;
36
+ }
@@ -0,0 +1 @@
1
+ @use 'grid/docgrid';
@@ -0,0 +1,8 @@
1
+ @use 'button-card/button-card';
2
+ @use 'card/card';
3
+ @use 'container/container';
4
+ @use 'grid/grid';
5
+ @use 'header/header';
6
+ @use 'h-space/h-space';
7
+ @use 'modal/modal';
8
+ @use 'v-space/v-space';
@@ -0,0 +1,22 @@
1
+ @use '../abstract-card';
2
+ @use '../../quark/shadow';
3
+
4
+ .ippon-button-card {
5
+ @include abstract-card.ippon-card;
6
+
7
+ display: inline-block;
8
+ cursor: pointer;
9
+
10
+ &:hover {
11
+ background-color: var(--ippon-color-neutral-surface-primary-hover);
12
+ }
13
+
14
+ &:active {
15
+ background-color: var(--ippon-color-neutral-surface-primary-active);
16
+ }
17
+
18
+ &.-full-width {
19
+ display: block;
20
+ width: 100%;
21
+ }
22
+ }
@@ -0,0 +1,31 @@
1
+ include /atom/text/text.mixin.pug
2
+ include /atom/icon/icon.mixin.pug
3
+ include /organism/h-space/h-space.mixin.pug
4
+ include /organism/v-space/v-space.mixin.pug
5
+
6
+ include button-card.mixin.pug
7
+
8
+ mixin ippon-button-card-example(options)
9
+ +ippon-button-card(options)
10
+ +ippon-h-space({ gap: 16, align: 'middle' })
11
+ +ippon-icon({ name: 'hardware-chip', variant: 'sharp', size: 24, color: 'brand-primary' })
12
+ +ippon-v-space({ gap: 4, align: 'left' })
13
+ +ippon-text({ variant: 'body', color: 'neutral-tertiary-inversed' }) Some key
14
+ +ippon-text({ variant: 'label', size: 'large' }) Description value
15
+ +ippon-icon({ name: 'chevron-forward', size: 24 })
16
+
17
+ +ippon-button-card-example({ shadow: 'l1', size: 'small' })
18
+
19
+ +ippon-button-card-example({ shadow: 'l2' })
20
+
21
+ +ippon-button-card-example({ shadow: 'l3', size: 'large' })
22
+
23
+ +ippon-button-card-example({ shadow: 'l4' })
24
+
25
+ +ippon-button-card-example({ shadow: 'l5' })
26
+
27
+ +ippon-button-card-example({ border: true })
28
+
29
+ +ippon-button-card-example({ border: true, shadow: 'l5' })
30
+
31
+ +ippon-button-card-example({ border: true, fullWidth: true })
@@ -0,0 +1,28 @@
1
+ ## Button card
2
+
3
+ A clickable card component that acts as an interactive surface. It extends the base card styles with cursor pointer and hover/active states, making it suitable for navigation or selection purposes.
4
+
5
+ **Sizes:**
6
+
7
+ - Small `-small`
8
+ - Medium (Default)
9
+ - Large `-large`
10
+
11
+ **Shadows:**
12
+
13
+ - No shadow (default)
14
+ - Shadow level 1 `-shadow-l1`
15
+ - Shadow level 2 `-shadow-l2`
16
+ - Shadow level 3 `-shadow-l3`
17
+ - Shadow level 4 `-shadow-l4`
18
+ - Shadow level 5 `-shadow-l5`
19
+
20
+ **Border:**
21
+
22
+ - No border (default)
23
+ - Border `-border`
24
+
25
+ **Width:**
26
+
27
+ - Inline (default)
28
+ - Full width `-full-width`
@@ -0,0 +1,8 @@
1
+ mixin ippon-button-card(options)
2
+ - const { shadow, border, size, fullWidth } = options || {};
3
+ - const shadowClass = shadow ? `-shadow-${shadow}` : null;
4
+ - const borderClass = border ? '-border' : null;
5
+ - const sizeClass = size ? `-${size}` : null;
6
+ - const fullWidthClass = fullWidth ? '-full-width' : null;
7
+ button.ippon-button-card(class=[shadowClass, borderClass, sizeClass, fullWidthClass])
8
+ block
@@ -0,0 +1,7 @@
1
+ extends /layout
2
+
3
+ block body
4
+ div(
5
+ style='display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr)); justify-items: left; align-items: center'
6
+ )
7
+ include button-card.code.pug
@@ -0,0 +1,6 @@
1
+ @use '../abstract-card';
2
+ @use '../../quark/shadow';
3
+
4
+ .ippon-card {
5
+ @include abstract-card.ippon-card;
6
+ }
@@ -0,0 +1,9 @@
1
+ include card.mixin.pug
2
+
3
+ +ippon-card({ shadow: 'l1', size: 'small' }) Card level 1 small
4
+ +ippon-card({ shadow: 'l2' }) Card level 2
5
+ +ippon-card({ shadow: 'l3', size: 'large' }) Card level 3 large
6
+ +ippon-card({ shadow: 'l4' }) Card level 4
7
+ +ippon-card({ shadow: 'l5' }) Card level 5
8
+ +ippon-card({ border: true }) Card with border
9
+ +ippon-card({ shadow: 'l3', border: true, size: 'small' }) Card combination
@@ -0,0 +1,23 @@
1
+ ## Card
2
+
3
+ A basic card component that serves as a container for content. It provides a consistent surface with rounded corners, padding, and optional shadow and border styling.
4
+
5
+ **Sizes:**
6
+
7
+ - Small `-small`
8
+ - Medium (Default)
9
+ - Large `-large`
10
+
11
+ **Shadows:**
12
+
13
+ - No shadow (default)
14
+ - Shadow level 1 `-shadow-l1`
15
+ - Shadow level 2 `-shadow-l2`
16
+ - Shadow level 3 `-shadow-l3`
17
+ - Shadow level 4 `-shadow-l4`
18
+ - Shadow level 5 `-shadow-l5`
19
+
20
+ **Border:**
21
+
22
+ - No border (default)
23
+ - Border `-border`
@@ -0,0 +1,7 @@
1
+ mixin ippon-card(options)
2
+ - const { shadow, border, size } = options || {};
3
+ - const shadowClass = shadow ? `-shadow-${shadow}` : null;
4
+ - const borderClass = border ? '-border' : null;
5
+ - const sizeClass = size ? `-${size}` : null;
6
+ .ippon-card(class=[shadowClass, borderClass, sizeClass])
7
+ block
@@ -0,0 +1,7 @@
1
+ extends /layout
2
+
3
+ block body
4
+ div(
5
+ style='display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr)); align-items: center'
6
+ )
7
+ include card.code.pug
@@ -0,0 +1,3 @@
1
+ .ippon-container {
2
+ container-type: inline-size;
3
+ }
@@ -0,0 +1,13 @@
1
+ include container.mixin.pug
2
+ include ../grid/grid.mixin.pug
3
+
4
+ +ippon-container
5
+ p Default container (inline-size)
6
+
7
+ hr
8
+ +ippon-container
9
+ +ippon-grid('-container-4 -container-m-12 -gap-16 -gap-l-32')
10
+ +ippon-grid--slot Slot 1
11
+ +ippon-grid--slot Slot 2
12
+ +ippon-grid--slot Slot 3
13
+ +ippon-grid--slot Slot 4
@@ -0,0 +1,5 @@
1
+ ## Container
2
+
3
+ A container component that establishes a container query context. It allows child elements to use container queries to respond to the container's dimensions rather than the viewport size.
4
+
5
+ The container uses `container-type: inline-size` to enable queries based on the container's inline (width) dimension.
@@ -0,0 +1,3 @@
1
+ mixin ippon-container
2
+ .ippon-container
3
+ block
@@ -0,0 +1,4 @@
1
+ extends /layout
2
+
3
+ block body
4
+ include container.code.pug
@@ -0,0 +1,11 @@
1
+ .ipp-doc-container {
2
+ container-type: inline-size;
3
+ }
4
+
5
+ .ipp-doc-slot {
6
+ box-sizing: border-box;
7
+ border: var(--ippon-size-4) solid var(--ippon-color-brand-border);
8
+ background-color: var(--ippon-color-brand-surface-primary);
9
+ padding: var(--ippon-size-16);
10
+ color: var(--ippon-color-brand-text-icon-on-primary);
11
+ }
@@ -0,0 +1,84 @@
1
+ @use '../../quark/breakpoint';
2
+ @use '../../quark/gap';
3
+ @use 'sass:math';
4
+
5
+ $ippon-grid-columns: 4, 12;
6
+ $ippon-grid-max-columns: math.max($ippon-grid-columns...);
7
+
8
+ @mixin ippon-grid-layout-column($layout, $columns) {
9
+ &.-#{$layout}-#{$columns} {
10
+ grid-template-columns: repeat(#{$columns}, 1fr);
11
+ }
12
+ }
13
+
14
+ @mixin ippon-grid-layout($layout) {
15
+ @each $columns in $ippon-grid-columns {
16
+ @include ippon-grid-layout-column($layout, $columns);
17
+ }
18
+ }
19
+
20
+ @mixin ippon-grid-layout-breakpoint-column($layout, $breakpoint, $columns) {
21
+ &.-#{$layout}-#{$breakpoint}-#{$columns} {
22
+ grid-template-columns: repeat(#{$columns}, 1fr);
23
+ }
24
+ }
25
+
26
+ @mixin ippon-grid-layout-breakpoint($layout, $breakpoint) {
27
+ @each $columns in $ippon-grid-columns {
28
+ @include ippon-grid-layout-breakpoint-column($layout, $breakpoint, $columns);
29
+ }
30
+ }
31
+
32
+ @mixin ippon-grid-slot-column {
33
+ @for $column from 1 through $ippon-grid-max-columns {
34
+ &.-col-#{$column} {
35
+ grid-column: span #{$column};
36
+ }
37
+ }
38
+ }
39
+
40
+ @mixin ippon-grid-slot-breakpoint-column($breakpoint) {
41
+ @for $column from 1 through $ippon-grid-max-columns {
42
+ &.-col-#{$breakpoint}-#{$column} {
43
+ grid-column: span #{$column};
44
+ }
45
+ }
46
+ }
47
+
48
+ .ippon-grid {
49
+ display: grid;
50
+
51
+ @include gap.gaps;
52
+ @include gap.media-gaps;
53
+ @include gap.container-gaps;
54
+ @include ippon-grid-layout('media');
55
+ @include ippon-grid-layout('container');
56
+
57
+ &--slot {
58
+ @include ippon-grid-slot-column;
59
+ }
60
+
61
+ @each $breakpoint, $breakpoint-value in breakpoint.$media-breakpoints {
62
+ &--slot {
63
+ @media (min-width: $breakpoint-value) {
64
+ @include ippon-grid-slot-breakpoint-column($breakpoint);
65
+ }
66
+ }
67
+
68
+ @media (min-width: $breakpoint-value) {
69
+ @include ippon-grid-layout-breakpoint('media', $breakpoint);
70
+ }
71
+ }
72
+
73
+ @each $breakpoint, $container-value in breakpoint.$container-breakpoints {
74
+ &--slot {
75
+ @container (min-width: #{$container-value}) {
76
+ @include ippon-grid-slot-breakpoint-column($breakpoint);
77
+ }
78
+ }
79
+
80
+ @container (min-width: #{$container-value}) {
81
+ @include ippon-grid-layout-breakpoint('container', $breakpoint);
82
+ }
83
+ }
84
+ }
@@ -0,0 +1,25 @@
1
+ include grid.mixin.pug
2
+
3
+ mixin ippon-grid--slot-example(classes)
4
+ .ippon-grid--slot(class=classes)
5
+ .ipp-doc-slot= `Slot (${classes})`
6
+
7
+ +ippon-grid('-media-4 -media-tab-12 -gap-16 -gap-desktop-s-32')
8
+ +ippon-grid--slot-example('-col-2 -col-tab-4')
9
+ +ippon-grid--slot-example('-col-2 -col-tab-4')
10
+ +ippon-grid--slot-example('-col-4 -col-tab-4')
11
+ +ippon-grid--slot-example('-col-4 -col-tab-6')
12
+ +ippon-grid--slot-example('-col-4 -col-tab-6')
13
+ +ippon-grid--slot-example('-col-1 -col-tab-2')
14
+ +ippon-grid--slot-example('-col-3 -col-tab-10')
15
+
16
+ hr
17
+
18
+ +ippon-grid('-container-4 -container-m-12 -gap-16 -gap-l-32')
19
+ +ippon-grid--slot-example('-col-2 -col-m-4')
20
+ +ippon-grid--slot-example('-col-2 -col-m-4')
21
+ +ippon-grid--slot-example('-col-4 -col-m-4')
22
+ +ippon-grid--slot-example('-col-4 -col-m-6')
23
+ +ippon-grid--slot-example('-col-4 -col-m-6')
24
+ +ippon-grid--slot-example('-col-1 -col-m-2')
25
+ +ippon-grid--slot-example('-col-3 -col-m-10')
@@ -0,0 +1 @@
1
+ ## Grid
@@ -0,0 +1,7 @@
1
+ mixin ippon-grid(classes)
2
+ .ippon-grid(class=classes)
3
+ block
4
+
5
+ mixin ippon-grid--slot(classes)
6
+ .ippon-grid--slot(class=classes)
7
+ block
@@ -0,0 +1,5 @@
1
+ extends /layout
2
+
3
+ block body
4
+ .ipp-doc-container
5
+ include grid.code.pug
@@ -0,0 +1,49 @@
1
+ @use '../../quark/gap';
2
+
3
+ .ippon-h-space {
4
+ display: flex;
5
+ flex-direction: row;
6
+ margin: 0;
7
+ padding: 0;
8
+ list-style: none;
9
+
10
+ @include gap.gaps;
11
+
12
+ &.-wrap {
13
+ flex-wrap: wrap;
14
+ }
15
+
16
+ &.-space-between {
17
+ justify-content: space-between;
18
+ }
19
+
20
+ &.-top {
21
+ align-items: flex-start;
22
+ }
23
+
24
+ &.-middle {
25
+ align-items: center;
26
+ }
27
+
28
+ &.-bottom {
29
+ align-items: flex-end;
30
+ }
31
+
32
+ &.-left {
33
+ justify-content: flex-start;
34
+ }
35
+
36
+ &.-center {
37
+ justify-content: center;
38
+ }
39
+
40
+ &.-right {
41
+ justify-content: flex-end;
42
+ }
43
+
44
+ &--slot {
45
+ &.-expand {
46
+ flex: 1;
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,56 @@
1
+ include h-space.mixin.pug
2
+
3
+ mixin ippon-h-space-rectangle(height = 32)
4
+ div(
5
+ style=`width: var(--ippon-size-32); height: var(--ippon-size-${height}); background-color: var(--ippon-color-brand-surface-primary); border-radius: var(--ippon-radius-m)`
6
+ )
7
+
8
+ mixin ippon-h-space-equal-rectangles(options)
9
+ +ippon-h-space-rectangle(options)
10
+ +ippon-h-space-rectangle(options)
11
+ +ippon-h-space-rectangle(options)
12
+
13
+ mixin ippon-h-space-mixed-rectangles
14
+ +ippon-h-space-rectangle(16)
15
+ +ippon-h-space-rectangle(8)
16
+ +ippon-h-space-rectangle(32)
17
+
18
+ +ippon-h-space
19
+ +ippon-h-space-equal-rectangles
20
+
21
+ +ippon-h-space({ gap: 8 })
22
+ +ippon-h-space-equal-rectangles
23
+
24
+ +ippon-h-space({ gap: 32, align: 'middle' })
25
+ +ippon-h-space-mixed-rectangles
26
+
27
+ +ippon-h-space({ gap: 16, align: 'top' })
28
+ +ippon-h-space-mixed-rectangles
29
+
30
+ +ippon-h-space({ gap: 20, align: 'bottom' })
31
+ +ippon-h-space-mixed-rectangles
32
+
33
+ +ippon-h-space({ gap: 32, align: 'left' })
34
+ +ippon-h-space-equal-rectangles
35
+
36
+ +ippon-h-space({ gap: 16, align: 'center' })
37
+ +ippon-h-space-equal-rectangles
38
+
39
+ +ippon-h-space({ gap: 20, align: 'right' })
40
+ +ippon-h-space-equal-rectangles
41
+
42
+ +ippon-h-space({ gap: 20, align: 'space-between' })
43
+ +ippon-h-space-equal-rectangles
44
+
45
+ +ippon-h-space({ gap: 16, align: 'stretch' })
46
+ +ippon-h-space-rectangle
47
+ +ippon-h-space--slot({ expand: true })
48
+ +ippon-h-space-rectangle
49
+ +ippon-h-space-rectangle
50
+
51
+ +ippon-h-space({ gap: 16, wrap: true })
52
+ each i in Array(40).fill()
53
+ +ippon-h-space-rectangle
54
+
55
+ +ippon-h-space({ gap: 16, tag: 'section' })
56
+ +ippon-h-space-equal-rectangles
@@ -0,0 +1,22 @@
1
+ ## Horizontal space (h-space)
2
+
3
+ The `h-space` organism represents horizontal spaces between elements.
4
+
5
+ **Gap**
6
+
7
+ The `-gap-{size}` alternative specifies the gap between child elements.
8
+
9
+ **Tag**
10
+
11
+ The `tag` property allows specifying a custom HTML element (e.g., `div`, `section`, `article`). Defaults to `div`.
12
+
13
+ **Vertical Alignment**
14
+
15
+ The following alternatives control the vertical alignment of child elements:
16
+
17
+ - `-top`: Vertically align items to the top
18
+ - `-middle`: Vertically align items to the middle
19
+ - `-bottom`: Vertically align items to the bottom
20
+ - `-left`: Horizontally align items to the left
21
+ - `-center`: Horizontally align items to the center
22
+ - `-right`: Horizontally align items to the right
@@ -0,0 +1,14 @@
1
+ mixin ippon-h-space(options)
2
+ - const { gap, align, wrap, tag } = options || {};
3
+ - const gapClass = gap ? `-gap-${gap}` : null;
4
+ - const alignClass = align ? `-${align}` : null;
5
+ - const wrapClass = wrap ? '-wrap' : null;
6
+
7
+ #{tag || 'div'}.ippon-h-space(class=[gapClass, alignClass, wrapClass])
8
+ block
9
+
10
+ mixin ippon-h-space--slot(options)
11
+ - const { expand } = options || {};
12
+ - const expandClass = expand ? '-expand' : null;
13
+ .ippon-h-space--slot(class=expandClass)
14
+ block
@@ -0,0 +1,5 @@
1
+ extends /layout
2
+
3
+ block body
4
+ div(style='display: flex; flex-direction: column; gap: 2rem')
5
+ include h-space.code.pug
@@ -0,0 +1,8 @@
1
+ .ippon-header {
2
+ display: flex;
3
+ gap: var(--ippon-size-32);
4
+ align-items: center;
5
+ border-bottom: 1px solid var(--ippon-color-neutral-border);
6
+ background-color: var(--ippon-color-neutral-surface-primary);
7
+ padding: var(--ippon-size-32) var(--ippon-size-48);
8
+ }
@@ -0,0 +1,14 @@
1
+ include /molecule/tabs/tabs.mixin.pug
2
+ include /atom/tab/tab.mixin.pug
3
+
4
+ include header.mixin.pug
5
+
6
+ +ippon-header
7
+ +ippon-header--slot Logo
8
+ +ippon-header--slot
9
+ +ippon-tabs({ id: 'main-navigation' })
10
+ +ippon-tab({ id: 'tab-1', controls: 'main-navigation' }) Tab 1
11
+ +ippon-tab({ id: 'tab-2', controls: 'main-navigation', selected: true }) Tab 2
12
+ +ippon-tab({ id: 'tab-3', controls: 'main-navigation', href: '#tab3' }) Tab 3
13
+ +ippon-tab({ id: 'tab-4', controls: 'main-navigation' }) Tab 4
14
+ +ippon-tab({ id: 'tab-5', controls: 'main-navigation' }) Tab 5
@@ -0,0 +1 @@
1
+ ## Header
@@ -0,0 +1,7 @@
1
+ mixin ippon-header
2
+ .ippon-header
3
+ block
4
+
5
+ mixin ippon-header--slot
6
+ .ippon-header--slot
7
+ block
@@ -0,0 +1,4 @@
1
+ extends /layout
2
+
3
+ block body
4
+ include header.code.pug