@ttdk-design-system/library-react 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/AI_GUIDE.md +6518 -0
  2. package/README.md +106 -2
  3. package/llms.txt +6518 -0
  4. package/package.json +1099 -4
  5. package/src/core/index.ts +2 -0
  6. package/src/core/tailwind-preset.cjs +62 -0
  7. package/src/core/tailwind-preset.ts +85 -0
  8. package/src/core/theme/tokens.css +663 -0
  9. package/src/core/types.ts +836 -0
  10. package/src/index.ts +17 -0
  11. package/src/tailwind-preset.cjs +62 -0
  12. package/src/tailwind-preset.ts +85 -0
  13. package/src/types.ts +1 -0
  14. package/src/web/accordion/AI_GUIDE.md +149 -0
  15. package/src/web/accordion/accordion.css +1 -0
  16. package/src/web/accordion/accordion.tsx +430 -0
  17. package/src/web/accordion/index.ts +3 -0
  18. package/src/web/accordion/manifest.json +351 -0
  19. package/src/web/alert/AI_GUIDE.md +139 -0
  20. package/src/web/alert/alert.css +1 -0
  21. package/src/web/alert/alert.tsx +318 -0
  22. package/src/web/alert/index.ts +3 -0
  23. package/src/web/alert/manifest.json +240 -0
  24. package/src/web/avatar/AI_GUIDE.md +118 -0
  25. package/src/web/avatar/avatar.css +1 -0
  26. package/src/web/avatar/avatar.tsx +233 -0
  27. package/src/web/avatar/index.ts +3 -0
  28. package/src/web/avatar/manifest.json +195 -0
  29. package/src/web/badge/AI_GUIDE.md +94 -0
  30. package/src/web/badge/badge.css +1 -0
  31. package/src/web/badge/badge.tsx +140 -0
  32. package/src/web/badge/index.ts +2 -0
  33. package/src/web/badge/manifest.json +141 -0
  34. package/src/web/banner/AI_GUIDE.md +130 -0
  35. package/src/web/banner/banner.css +1 -0
  36. package/src/web/banner/banner.tsx +334 -0
  37. package/src/web/banner/index.ts +3 -0
  38. package/src/web/banner/manifest.json +240 -0
  39. package/src/web/breadcrumb/AI_GUIDE.md +120 -0
  40. package/src/web/breadcrumb/breadcrumb.css +1 -0
  41. package/src/web/breadcrumb/breadcrumb.tsx +306 -0
  42. package/src/web/breadcrumb/index.ts +3 -0
  43. package/src/web/breadcrumb/manifest.json +225 -0
  44. package/src/web/button/AI_GUIDE.md +121 -0
  45. package/src/web/button/button.css +1 -0
  46. package/src/web/button/button.tsx +287 -0
  47. package/src/web/button/index.ts +2 -0
  48. package/src/web/button/manifest.json +177 -0
  49. package/src/web/calendar/AI_GUIDE.md +151 -0
  50. package/src/web/calendar/calendar.css +1 -0
  51. package/src/web/calendar/calendar.tsx +1611 -0
  52. package/src/web/calendar/index.ts +3 -0
  53. package/src/web/calendar/manifest.json +470 -0
  54. package/src/web/card/AI_GUIDE.md +133 -0
  55. package/src/web/card/card.css +1 -0
  56. package/src/web/card/card.tsx +408 -0
  57. package/src/web/card/index.ts +4 -0
  58. package/src/web/card/manifest.json +357 -0
  59. package/src/web/checkbox/AI_GUIDE.md +146 -0
  60. package/src/web/checkbox/checkbox.css +1 -0
  61. package/src/web/checkbox/checkbox.tsx +307 -0
  62. package/src/web/checkbox/index.ts +2 -0
  63. package/src/web/checkbox/manifest.json +294 -0
  64. package/src/web/chip/AI_GUIDE.md +186 -0
  65. package/src/web/chip/chip.css +1 -0
  66. package/src/web/chip/chip.tsx +230 -0
  67. package/src/web/chip/index.ts +2 -0
  68. package/src/web/chip/manifest.json +186 -0
  69. package/src/web/dropdown/AI_GUIDE.md +167 -0
  70. package/src/web/dropdown/dropdown.css +1 -0
  71. package/src/web/dropdown/dropdown.tsx +1274 -0
  72. package/src/web/dropdown/index.ts +3 -0
  73. package/src/web/dropdown/manifest.json +576 -0
  74. package/src/web/flex/AI_GUIDE.md +113 -0
  75. package/src/web/flex/flex-item.tsx +97 -0
  76. package/src/web/flex/flex.css +1 -0
  77. package/src/web/flex/flex.tsx +108 -0
  78. package/src/web/flex/index.ts +5 -0
  79. package/src/web/flex/manifest.json +162 -0
  80. package/src/web/form/index.ts +7 -0
  81. package/src/web/grid/AI_GUIDE.md +112 -0
  82. package/src/web/grid/grid-item.tsx +112 -0
  83. package/src/web/grid/grid.css +1 -0
  84. package/src/web/grid/grid.tsx +99 -0
  85. package/src/web/grid/index.ts +5 -0
  86. package/src/web/grid/manifest.json +153 -0
  87. package/src/web/index.ts +86 -0
  88. package/src/web/input/AI_GUIDE.md +159 -0
  89. package/src/web/input/index.ts +3 -0
  90. package/src/web/input/input.css +1 -0
  91. package/src/web/input/input.tsx +537 -0
  92. package/src/web/input/manifest.json +465 -0
  93. package/src/web/input-number/AI_GUIDE.md +164 -0
  94. package/src/web/input-number/index.ts +3 -0
  95. package/src/web/input-number/input-number.css +1 -0
  96. package/src/web/input-number/input-number.tsx +1193 -0
  97. package/src/web/input-number/manifest.json +575 -0
  98. package/src/web/modal/AI_GUIDE.md +171 -0
  99. package/src/web/modal/index.ts +3 -0
  100. package/src/web/modal/manifest.json +375 -0
  101. package/src/web/modal/modal.css +1 -0
  102. package/src/web/modal/modal.tsx +571 -0
  103. package/src/web/pagination/AI_GUIDE.md +148 -0
  104. package/src/web/pagination/index.ts +21 -0
  105. package/src/web/pagination/manifest.json +432 -0
  106. package/src/web/pagination/pagination-content.tsx +45 -0
  107. package/src/web/pagination/pagination-ellipsis.tsx +54 -0
  108. package/src/web/pagination/pagination-first.tsx +155 -0
  109. package/src/web/pagination/pagination-item.tsx +45 -0
  110. package/src/web/pagination/pagination-last.tsx +155 -0
  111. package/src/web/pagination/pagination-link.tsx +121 -0
  112. package/src/web/pagination/pagination-next.tsx +158 -0
  113. package/src/web/pagination/pagination-previous.tsx +158 -0
  114. package/src/web/pagination/pagination.css +1 -0
  115. package/src/web/pagination/pagination.tsx +687 -0
  116. package/src/web/popover/AI_GUIDE.md +163 -0
  117. package/src/web/popover/index.ts +3 -0
  118. package/src/web/popover/manifest.json +396 -0
  119. package/src/web/popover/popover.css +1 -0
  120. package/src/web/popover/popover.tsx +702 -0
  121. package/src/web/radio/AI_GUIDE.md +155 -0
  122. package/src/web/radio/index.ts +2 -0
  123. package/src/web/radio/manifest.json +294 -0
  124. package/src/web/radio/radio.css +1 -0
  125. package/src/web/radio/radio.tsx +290 -0
  126. package/src/web/selectbox/AI_GUIDE.md +216 -0
  127. package/src/web/selectbox/index.ts +3 -0
  128. package/src/web/selectbox/manifest.json +477 -0
  129. package/src/web/selectbox/selectbox.css +1 -0
  130. package/src/web/selectbox/selectbox.tsx +1048 -0
  131. package/src/web/sonner/AI_GUIDE.md +98 -0
  132. package/src/web/sonner/index.ts +114 -0
  133. package/src/web/sonner/manifest.json +132 -0
  134. package/src/web/sonner/sonner.css +1 -0
  135. package/src/web/sonner/sonner.tsx +177 -0
  136. package/src/web/table/AI_GUIDE.md +145 -0
  137. package/src/web/table/index.ts +35 -0
  138. package/src/web/table/manifest.json +168 -0
  139. package/src/web/table/table-body.tsx +45 -0
  140. package/src/web/table/table-caption.tsx +45 -0
  141. package/src/web/table/table-cell.tsx +74 -0
  142. package/src/web/table/table-empty.tsx +108 -0
  143. package/src/web/table/table-footer.tsx +45 -0
  144. package/src/web/table/table-head.tsx +80 -0
  145. package/src/web/table/table-header.tsx +45 -0
  146. package/src/web/table/table-row.tsx +69 -0
  147. package/src/web/table/table.css +1 -0
  148. package/src/web/table/table.tsx +305 -0
  149. package/src/web/tabs/AI_GUIDE.md +150 -0
  150. package/src/web/tabs/index.ts +3 -0
  151. package/src/web/tabs/manifest.json +315 -0
  152. package/src/web/tabs/tabs.css +1 -0
  153. package/src/web/tabs/tabs.tsx +332 -0
  154. package/src/web/text/AI_GUIDE.md +129 -0
  155. package/src/web/text/index.ts +3 -0
  156. package/src/web/text/manifest.json +195 -0
  157. package/src/web/text/text.css +1 -0
  158. package/src/web/text/text.tsx +689 -0
  159. package/src/web/textarea/AI_GUIDE.md +141 -0
  160. package/src/web/textarea/index.ts +3 -0
  161. package/src/web/textarea/manifest.json +438 -0
  162. package/src/web/textarea/textarea.css +1 -0
  163. package/src/web/textarea/textarea.tsx +467 -0
  164. package/src/web/tooltip/AI_GUIDE.md +110 -0
  165. package/src/web/tooltip/index.ts +3 -0
  166. package/src/web/tooltip/manifest.json +222 -0
  167. package/src/web/tooltip/tooltip.css +1 -0
  168. package/src/web/tooltip/tooltip.tsx +423 -0
  169. package/src/webview/bottomsheet/AI_GUIDE.md +141 -0
  170. package/src/webview/bottomsheet/bottomsheet.css +1 -0
  171. package/src/webview/bottomsheet/bottomsheet.tsx +603 -0
  172. package/src/webview/bottomsheet/index.ts +4 -0
  173. package/src/webview/bottomsheet/manifest.json +377 -0
  174. package/src/webview/button/AI_GUIDE.md +79 -0
  175. package/src/webview/button/button-ios.css +1 -0
  176. package/src/webview/button/button-ios.tsx +138 -0
  177. package/src/webview/button/button-material.css +1 -0
  178. package/src/webview/button/button-material.tsx +138 -0
  179. package/src/webview/button/index.ts +7 -0
  180. package/src/webview/button/manifest.json +148 -0
  181. package/src/webview/index.ts +7 -0
  182. package/tailwind-preset.cjs +62 -0
  183. package/tailwind-preset.js +62 -0
  184. package/ttdk-manifest.json +10188 -0
@@ -0,0 +1,97 @@
1
+ import * as React from "react";
2
+
3
+ export interface FlexItemBreakpointProps {
4
+ /**
5
+ * Urutan tampilan elemen di dalam container flex (order).
6
+ */
7
+ order?: number | string;
8
+
9
+ /**
10
+ * Kemampuan elemen untuk tumbuh mengisi sisa ruang (flex-grow).
11
+ * True bernilai 1, False bernilai 0, atau angka kustom.
12
+ */
13
+ grow?: number | boolean;
14
+
15
+ /**
16
+ * Kemampuan elemen untuk menyusut jika ruang tidak mencukupi (flex-shrink).
17
+ * True bernilai 1, False bernilai 0, atau angka kustom.
18
+ */
19
+ shrink?: number | boolean;
20
+
21
+ /**
22
+ * Ukuran dasar awal elemen sebelum ruang dibagi (flex-basis).
23
+ * (misal: "200px", "50%", 0, "auto").
24
+ */
25
+ basis?: string | number;
26
+
27
+ /**
28
+ * Perataan individu elemen pada sumbu silang (align-self).
29
+ */
30
+ alignSelf?: "auto" | "start" | "center" | "end" | "stretch";
31
+ }
32
+ export interface FlexItemProps extends FlexItemBreakpointProps {
33
+ /**
34
+ * Override pada breakpoint sm (min-width: 640px).
35
+ */
36
+ sm?: FlexItemBreakpointProps;
37
+
38
+ /**
39
+ * Override pada breakpoint md (min-width: 768px).
40
+ */
41
+ md?: FlexItemBreakpointProps;
42
+
43
+ /**
44
+ * Override pada breakpoint lg (min-width: 1024px).
45
+ */
46
+ lg?: FlexItemBreakpointProps;
47
+
48
+ /**
49
+ * Override pada breakpoint xl (min-width: 1280px).
50
+ */
51
+ xl?: FlexItemBreakpointProps;
52
+
53
+ /**
54
+ * Override pada breakpoint xxl / 2xl (min-width: 1536px).
55
+ */
56
+ xxl?: FlexItemBreakpointProps;
57
+
58
+ /**
59
+ * Kustomisasi visual granular root kontainer (UiProps).
60
+ */
61
+ ui?: UiProps;
62
+
63
+ /**
64
+ * Class CSS kustom.
65
+ */
66
+ className?: string;
67
+
68
+ /**
69
+ * Style kustom inline.
70
+ */
71
+ style?: React.CSSProperties;
72
+
73
+ /**
74
+ * Konten di dalam FlexItem.
75
+ */
76
+ children?: any;
77
+ }
78
+
79
+ import { buildFlexItemVars, buildUiVars, UiProps } from "../../core/types";
80
+
81
+ function FlexItem(props: FlexItemProps) {
82
+ return (
83
+ <div
84
+ className={`ttdk-flex-item ${props.className || ""}`.trim()}
85
+ style={{
86
+ ...buildFlexItemVars(props),
87
+ ...buildUiVars(props.ui),
88
+ ...((props as any)["style"] || {}),
89
+ ...props.style,
90
+ }}
91
+ >
92
+ <>{props.children}</>
93
+ </div>
94
+ );
95
+ }
96
+
97
+ export default FlexItem;
@@ -0,0 +1 @@
1
+ .ttdk-flex{box-sizing:border-box;flex-direction:var(--ttdk-flex-direction,row);justify-content:var(--ttdk-flex-justify-content,flex-start);align-items:var(--ttdk-flex-align-items,stretch);gap:var(--ttdk-flex-gap,0);flex-wrap:var(--ttdk-flex-wrap,nowrap);display:flex}.ttdk-flex[data-inline=true]{display:inline-flex}.ttdk-flex-item{box-sizing:border-box;order:var(--ttdk-flex-item-order,0);flex-grow:var(--ttdk-flex-item-grow,0);flex-shrink:var(--ttdk-flex-item-shrink,1);flex-basis:var(--ttdk-flex-item-basis,auto);align-self:var(--ttdk-flex-item-align-self,auto)}@media (width>=640px){.ttdk-flex{flex-direction:var(--ttdk-flex-direction-sm,var(--ttdk-flex-direction,row));justify-content:var(--ttdk-flex-justify-content-sm,var(--ttdk-flex-justify-content,flex-start));align-items:var(--ttdk-flex-align-items-sm,var(--ttdk-flex-align-items,stretch));gap:var(--ttdk-flex-gap-sm,var(--ttdk-flex-gap,0));flex-wrap:var(--ttdk-flex-wrap-sm,var(--ttdk-flex-wrap,nowrap))}.ttdk-flex-item{order:var(--ttdk-flex-item-order-sm,var(--ttdk-flex-item-order,0));flex-grow:var(--ttdk-flex-item-grow-sm,var(--ttdk-flex-item-grow,0));flex-shrink:var(--ttdk-flex-item-shrink-sm,var(--ttdk-flex-item-shrink,1));flex-basis:var(--ttdk-flex-item-basis-sm,var(--ttdk-flex-item-basis,auto));align-self:var(--ttdk-flex-item-align-self-sm,var(--ttdk-flex-item-align-self,auto))}}@media (width>=768px){.ttdk-flex{flex-direction:var(--ttdk-flex-direction-md,var(--ttdk-flex-direction-sm,var(--ttdk-flex-direction,row)));justify-content:var(--ttdk-flex-justify-content-md,var(--ttdk-flex-justify-content-sm,var(--ttdk-flex-justify-content,flex-start)));align-items:var(--ttdk-flex-align-items-md,var(--ttdk-flex-align-items-sm,var(--ttdk-flex-align-items,stretch)));gap:var(--ttdk-flex-gap-md,var(--ttdk-flex-gap-sm,var(--ttdk-flex-gap,0)));flex-wrap:var(--ttdk-flex-wrap-md,var(--ttdk-flex-wrap-sm,var(--ttdk-flex-wrap,nowrap)))}.ttdk-flex-item{order:var(--ttdk-flex-item-order-md,var(--ttdk-flex-item-order-sm,var(--ttdk-flex-item-order,0)));flex-grow:var(--ttdk-flex-item-grow-md,var(--ttdk-flex-item-grow-sm,var(--ttdk-flex-item-grow,0)));flex-shrink:var(--ttdk-flex-item-shrink-md,var(--ttdk-flex-item-shrink-sm,var(--ttdk-flex-item-shrink,1)));flex-basis:var(--ttdk-flex-item-basis-md,var(--ttdk-flex-item-basis-sm,var(--ttdk-flex-item-basis,auto)));align-self:var(--ttdk-flex-item-align-self-md,var(--ttdk-flex-item-align-self-sm,var(--ttdk-flex-item-align-self,auto)))}}@media (width>=1024px){.ttdk-flex{flex-direction:var(--ttdk-flex-direction-lg,var(--ttdk-flex-direction-md,var(--ttdk-flex-direction-sm,var(--ttdk-flex-direction,row))));justify-content:var(--ttdk-flex-justify-content-lg,var(--ttdk-flex-justify-content-md,var(--ttdk-flex-justify-content-sm,var(--ttdk-flex-justify-content,flex-start))));align-items:var(--ttdk-flex-align-items-lg,var(--ttdk-flex-align-items-md,var(--ttdk-flex-align-items-sm,var(--ttdk-flex-align-items,stretch))));gap:var(--ttdk-flex-gap-lg,var(--ttdk-flex-gap-md,var(--ttdk-flex-gap-sm,var(--ttdk-flex-gap,0))));flex-wrap:var(--ttdk-flex-wrap-lg,var(--ttdk-flex-wrap-md,var(--ttdk-flex-wrap-sm,var(--ttdk-flex-wrap,nowrap))))}.ttdk-flex-item{order:var(--ttdk-flex-item-order-lg,var(--ttdk-flex-item-order-md,var(--ttdk-flex-item-order-sm,var(--ttdk-flex-item-order,0))));flex-grow:var(--ttdk-flex-item-grow-lg,var(--ttdk-flex-item-grow-md,var(--ttdk-flex-item-grow-sm,var(--ttdk-flex-item-grow,0))));flex-shrink:var(--ttdk-flex-item-shrink-lg,var(--ttdk-flex-item-shrink-md,var(--ttdk-flex-item-shrink-sm,var(--ttdk-flex-item-shrink,1))));flex-basis:var(--ttdk-flex-item-basis-lg,var(--ttdk-flex-item-basis-md,var(--ttdk-flex-item-basis-sm,var(--ttdk-flex-item-basis,auto))));align-self:var(--ttdk-flex-item-align-self-lg,var(--ttdk-flex-item-align-self-md,var(--ttdk-flex-item-align-self-sm,var(--ttdk-flex-item-align-self,auto))))}}@media (width>=1280px){.ttdk-flex{flex-direction:var(--ttdk-flex-direction-xl,var(--ttdk-flex-direction-lg,var(--ttdk-flex-direction-md,var(--ttdk-flex-direction-sm,var(--ttdk-flex-direction,row)))));justify-content:var(--ttdk-flex-justify-content-xl,var(--ttdk-flex-justify-content-lg,var(--ttdk-flex-justify-content-md,var(--ttdk-flex-justify-content-sm,var(--ttdk-flex-justify-content,flex-start)))));align-items:var(--ttdk-flex-align-items-xl,var(--ttdk-flex-align-items-lg,var(--ttdk-flex-align-items-md,var(--ttdk-flex-align-items-sm,var(--ttdk-flex-align-items,stretch)))));gap:var(--ttdk-flex-gap-xl,var(--ttdk-flex-gap-lg,var(--ttdk-flex-gap-md,var(--ttdk-flex-gap-sm,var(--ttdk-flex-gap,0)))));flex-wrap:var(--ttdk-flex-wrap-xl,var(--ttdk-flex-wrap-lg,var(--ttdk-flex-wrap-md,var(--ttdk-flex-wrap-sm,var(--ttdk-flex-wrap,nowrap)))))}.ttdk-flex-item{order:var(--ttdk-flex-item-order-xl,var(--ttdk-flex-item-order-lg,var(--ttdk-flex-item-order-md,var(--ttdk-flex-item-order-sm,var(--ttdk-flex-item-order,0)))));flex-grow:var(--ttdk-flex-item-grow-xl,var(--ttdk-flex-item-grow-lg,var(--ttdk-flex-item-grow-md,var(--ttdk-flex-item-grow-sm,var(--ttdk-flex-item-grow,0)))));flex-shrink:var(--ttdk-flex-item-shrink-xl,var(--ttdk-flex-item-shrink-lg,var(--ttdk-flex-item-shrink-md,var(--ttdk-flex-item-shrink-sm,var(--ttdk-flex-item-shrink,1)))));flex-basis:var(--ttdk-flex-item-basis-xl,var(--ttdk-flex-item-basis-lg,var(--ttdk-flex-item-basis-md,var(--ttdk-flex-item-basis-sm,var(--ttdk-flex-item-basis,auto)))));align-self:var(--ttdk-flex-item-align-self-xl,var(--ttdk-flex-item-align-self-lg,var(--ttdk-flex-item-align-self-md,var(--ttdk-flex-item-align-self-sm,var(--ttdk-flex-item-align-self,auto)))))}}@media (width>=1536px){.ttdk-flex{flex-direction:var(--ttdk-flex-direction-2xl,var(--ttdk-flex-direction-xl,var(--ttdk-flex-direction-lg,var(--ttdk-flex-direction-md,var(--ttdk-flex-direction-sm,var(--ttdk-flex-direction,row))))));justify-content:var(--ttdk-flex-justify-content-2xl,var(--ttdk-flex-justify-content-xl,var(--ttdk-flex-justify-content-lg,var(--ttdk-flex-justify-content-md,var(--ttdk-flex-justify-content-sm,var(--ttdk-flex-justify-content,flex-start))))));align-items:var(--ttdk-flex-align-items-2xl,var(--ttdk-flex-align-items-xl,var(--ttdk-flex-align-items-lg,var(--ttdk-flex-align-items-md,var(--ttdk-flex-align-items-sm,var(--ttdk-flex-align-items,stretch))))));gap:var(--ttdk-flex-gap-2xl,var(--ttdk-flex-gap-xl,var(--ttdk-flex-gap-lg,var(--ttdk-flex-gap-md,var(--ttdk-flex-gap-sm,var(--ttdk-flex-gap,0))))));flex-wrap:var(--ttdk-flex-wrap-2xl,var(--ttdk-flex-wrap-xl,var(--ttdk-flex-wrap-lg,var(--ttdk-flex-wrap-md,var(--ttdk-flex-wrap-sm,var(--ttdk-flex-wrap,nowrap))))))}.ttdk-flex-item{order:var(--ttdk-flex-item-order-2xl,var(--ttdk-flex-item-order-xl,var(--ttdk-flex-item-order-lg,var(--ttdk-flex-item-order-md,var(--ttdk-flex-item-order-sm,var(--ttdk-flex-item-order,0))))));flex-grow:var(--ttdk-flex-item-grow-2xl,var(--ttdk-flex-item-grow-xl,var(--ttdk-flex-item-grow-lg,var(--ttdk-flex-item-grow-md,var(--ttdk-flex-item-grow-sm,var(--ttdk-flex-item-grow,0))))));flex-shrink:var(--ttdk-flex-item-shrink-2xl,var(--ttdk-flex-item-shrink-xl,var(--ttdk-flex-item-shrink-lg,var(--ttdk-flex-item-shrink-md,var(--ttdk-flex-item-shrink-sm,var(--ttdk-flex-item-shrink,1))))));flex-basis:var(--ttdk-flex-item-basis-2xl,var(--ttdk-flex-item-basis-xl,var(--ttdk-flex-item-basis-lg,var(--ttdk-flex-item-basis-md,var(--ttdk-flex-item-basis-sm,var(--ttdk-flex-item-basis,auto))))));align-self:var(--ttdk-flex-item-align-self-2xl,var(--ttdk-flex-item-align-self-xl,var(--ttdk-flex-item-align-self-lg,var(--ttdk-flex-item-align-self-md,var(--ttdk-flex-item-align-self-sm,var(--ttdk-flex-item-align-self,auto))))))}}
@@ -0,0 +1,108 @@
1
+ import * as React from "react";
2
+
3
+ export interface FlexBreakpointProps {
4
+ /**
5
+ * Arah susunan elemen anak (flex-direction).
6
+ * @default 'row'
7
+ */
8
+ direction?: "row" | "column" | "row-reverse" | "column-reverse";
9
+
10
+ /**
11
+ * Distribusi ruang antar elemen anak pada sumbu utama (justify-content).
12
+ * @default 'start'
13
+ */
14
+ justifyContent?: "start" | "center" | "end" | "around" | "between" | "evenly";
15
+
16
+ /**
17
+ * Perataan elemen anak pada sumbu silang (align-items).
18
+ * @default 'stretch'
19
+ */
20
+ alignItems?: "start" | "center" | "end" | "stretch";
21
+
22
+ /**
23
+ * Jarak celah antar elemen anak (gap).
24
+ * Nilai dapat berupa angka pixel atau string unit CSS (misal: 12, "16px", "var(--ttdk-spacing-16)").
25
+ */
26
+ gap?: string | number;
27
+
28
+ /**
29
+ * Membungkus elemen anak jika melebihi lebar kontainer (flex-wrap).
30
+ * @default 'nowrap'
31
+ */
32
+ wrap?: "nowrap" | "wrap" | "wrap-reverse";
33
+ }
34
+ export interface FlexProps extends FlexBreakpointProps {
35
+ /**
36
+ * Menggunakan display 'inline-flex' daripada 'flex'.
37
+ * @default false
38
+ */
39
+ inline?: boolean;
40
+
41
+ /**
42
+ * Override pada breakpoint sm (min-width: 640px).
43
+ */
44
+ sm?: FlexBreakpointProps;
45
+
46
+ /**
47
+ * Override pada breakpoint md (min-width: 768px).
48
+ */
49
+ md?: FlexBreakpointProps;
50
+
51
+ /**
52
+ * Override pada breakpoint lg (min-width: 1024px).
53
+ */
54
+ lg?: FlexBreakpointProps;
55
+
56
+ /**
57
+ * Override pada breakpoint xl (min-width: 1280px).
58
+ */
59
+ xl?: FlexBreakpointProps;
60
+
61
+ /**
62
+ * Override pada breakpoint xxl / 2xl (min-width: 1536px).
63
+ */
64
+ xxl?: FlexBreakpointProps;
65
+
66
+ /**
67
+ * Kustomisasi visual granular root kontainer (UiProps).
68
+ */
69
+ ui?: UiProps;
70
+
71
+ /**
72
+ * Class CSS kustom.
73
+ */
74
+ className?: string;
75
+
76
+ /**
77
+ * Style kustom inline.
78
+ */
79
+ style?: React.CSSProperties;
80
+
81
+ /**
82
+ * Konten anak di dalam Flex.
83
+ */
84
+ children?: any;
85
+ }
86
+
87
+ import { buildFlexVars, buildUiVars, UiProps } from "../../core/types";
88
+
89
+ function Flex(props: FlexProps) {
90
+ return (
91
+ <div
92
+ className={`ttdk-flex ${props.className || ""}`.trim()}
93
+ data-inline={props.inline ? "true" : "false"}
94
+ style={{
95
+ ...buildFlexVars(props),
96
+ ...buildUiVars(props.ui),
97
+ ...((props as any)["style"] || {}),
98
+ ...props.style,
99
+ }}
100
+ >
101
+ <>{props.children}</>
102
+ </div>
103
+ );
104
+ }
105
+
106
+ export default Flex;
107
+
108
+ export { Flex };
@@ -0,0 +1,5 @@
1
+ export { default } from './flex';
2
+ export { default as Flex } from './flex';
3
+ export type { FlexProps, FlexBreakpointProps } from './flex';
4
+ export { default as FlexItem } from './flex-item';
5
+ export type { FlexItemProps, FlexItemBreakpointProps } from './flex-item'
@@ -0,0 +1,162 @@
1
+ {
2
+ "name": "@ttdk-design-system/flex",
3
+ "component": "Flex",
4
+ "folder": "flex",
5
+ "description": "TTDK Flex component with multi-theme support.",
6
+ "stylesheets": [
7
+ {
8
+ "theme": "common",
9
+ "file": "flex.css",
10
+ "importPath": "web/flex/flex.css"
11
+ }
12
+ ],
13
+ "props": {
14
+ "inline": {
15
+ "name": "inline",
16
+ "type": "boolean",
17
+ "optional": true,
18
+ "default": "false",
19
+ "description": "Menggunakan display 'inline-flex' daripada 'flex'.",
20
+ "example": null,
21
+ "param": null
22
+ },
23
+ "sm": {
24
+ "name": "sm",
25
+ "type": "FlexBreakpointProps",
26
+ "optional": true,
27
+ "default": null,
28
+ "description": "Override pada breakpoint sm (min-width: 640px).",
29
+ "example": null,
30
+ "param": null
31
+ },
32
+ "md": {
33
+ "name": "md",
34
+ "type": "FlexBreakpointProps",
35
+ "optional": true,
36
+ "default": null,
37
+ "description": "Override pada breakpoint md (min-width: 768px).",
38
+ "example": null,
39
+ "param": null
40
+ },
41
+ "lg": {
42
+ "name": "lg",
43
+ "type": "FlexBreakpointProps",
44
+ "optional": true,
45
+ "default": null,
46
+ "description": "Override pada breakpoint lg (min-width: 1024px).",
47
+ "example": null,
48
+ "param": null
49
+ },
50
+ "xl": {
51
+ "name": "xl",
52
+ "type": "FlexBreakpointProps",
53
+ "optional": true,
54
+ "default": null,
55
+ "description": "Override pada breakpoint xl (min-width: 1280px).",
56
+ "example": null,
57
+ "param": null
58
+ },
59
+ "xxl": {
60
+ "name": "xxl",
61
+ "type": "FlexBreakpointProps",
62
+ "optional": true,
63
+ "default": null,
64
+ "description": "Override pada breakpoint xxl / 2xl (min-width: 1536px).",
65
+ "example": null,
66
+ "param": null
67
+ },
68
+ "ui": {
69
+ "name": "ui",
70
+ "type": "UiProps",
71
+ "optional": true,
72
+ "default": null,
73
+ "description": "Kustomisasi visual granular root kontainer (UiProps).",
74
+ "example": null,
75
+ "param": null
76
+ },
77
+ "className": {
78
+ "name": "className",
79
+ "type": "string",
80
+ "optional": true,
81
+ "default": null,
82
+ "description": "Class CSS kustom.",
83
+ "example": null,
84
+ "param": null
85
+ },
86
+ "style": {
87
+ "name": "style",
88
+ "type": "any",
89
+ "optional": true,
90
+ "default": null,
91
+ "description": "Style kustom inline.",
92
+ "example": null,
93
+ "param": null
94
+ },
95
+ "children": {
96
+ "name": "children",
97
+ "type": "any",
98
+ "optional": true,
99
+ "default": null,
100
+ "description": "Konten anak di dalam Flex.",
101
+ "example": null,
102
+ "param": null
103
+ }
104
+ },
105
+ "subInterfaces": {
106
+ "FlexBreakpointProps": {
107
+ "direction": {
108
+ "name": "direction",
109
+ "type": "'row' | 'column' | 'row-reverse' | 'column-reverse'",
110
+ "optional": true,
111
+ "default": "row",
112
+ "description": "Arah susunan elemen anak (flex-direction).",
113
+ "example": null,
114
+ "param": null
115
+ },
116
+ "justifyContent": {
117
+ "name": "justifyContent",
118
+ "type": "'start' | 'center' | 'end' | 'around' | 'between' | 'evenly'",
119
+ "optional": true,
120
+ "default": "start",
121
+ "description": "Distribusi ruang antar elemen anak pada sumbu utama (justify-content).",
122
+ "example": null,
123
+ "param": null
124
+ },
125
+ "alignItems": {
126
+ "name": "alignItems",
127
+ "type": "'start' | 'center' | 'end' | 'stretch'",
128
+ "optional": true,
129
+ "default": "stretch",
130
+ "description": "Perataan elemen anak pada sumbu silang (align-items).",
131
+ "example": null,
132
+ "param": null
133
+ },
134
+ "gap": {
135
+ "name": "gap",
136
+ "type": "string | number",
137
+ "optional": true,
138
+ "default": null,
139
+ "description": "Jarak celah antar elemen anak (gap). Nilai dapat berupa angka pixel atau string unit CSS (misal: 12, \"16px\", \"var(--ttdk-spacing-16)\").",
140
+ "example": null,
141
+ "param": null
142
+ },
143
+ "wrap": {
144
+ "name": "wrap",
145
+ "type": "'nowrap' | 'wrap' | 'wrap-reverse'",
146
+ "optional": true,
147
+ "default": "nowrap",
148
+ "description": "Membungkus elemen anak jika melebihi lebar kontainer (flex-wrap).",
149
+ "example": null,
150
+ "param": null
151
+ }
152
+ }
153
+ },
154
+ "supportedFrameworks": [
155
+ "react",
156
+ "vue",
157
+ "svelte"
158
+ ],
159
+ "themes": [
160
+ "tw"
161
+ ]
162
+ }
@@ -0,0 +1,7 @@
1
+ // Re-export TanStack Form (REACT)
2
+ export {
3
+ useForm,
4
+ createFormFactory,
5
+ useField,
6
+ } from '@tanstack/react-form';
7
+ export * from '@tanstack/react-form';
@@ -0,0 +1,112 @@
1
+ # <Grid /> — TTDK Component Reference
2
+
3
+ TTDK Grid component with multi-theme support.
4
+
5
+ ## 1. Stylesheets & Theming (Pure CSS)
6
+ Import the corresponding stylesheet for the theme you wish to use:
7
+ - **COMMON Theme**: `import "@ttdk-design-system/library-<react|vue|svelte>/web/grid/grid.css";`
8
+
9
+ ## 2. Subpath Component Import
10
+ ```ts
11
+ // React
12
+ import Grid from "@ttdk-design-system/library-react/web/grid";
13
+
14
+ // Vue 3
15
+ import Grid from "@ttdk-design-system/library-vue/web/grid";
16
+
17
+ // Svelte
18
+ import Grid from "@ttdk-design-system/library-svelte/web/grid";
19
+ ```
20
+
21
+ ## 3. Props & API Reference
22
+
23
+ | Prop | Type | Default | Description |
24
+ | :--- | :--- | :--- | :--- |
25
+ | `sm?` | `GridBreakpointProps` | `-` | Override pada breakpoint sm (min-width: 640px). |
26
+ | `md?` | `GridBreakpointProps` | `-` | Override pada breakpoint md (min-width: 768px). |
27
+ | `lg?` | `GridBreakpointProps` | `-` | Override pada breakpoint lg (min-width: 1024px). |
28
+ | `xl?` | `GridBreakpointProps` | `-` | Override pada breakpoint xl (min-width: 1280px). |
29
+ | `xxl?` | `GridBreakpointProps` | `-` | Override pada breakpoint xxl / 2xl (min-width: 1536px). |
30
+ | `ui?` | `UiProps` | `-` | Kustomisasi visual granular root kontainer (UiProps). |
31
+ | `className?` | `string` | `-` | Class CSS kustom. |
32
+ | `style?` | `any` | `-` | Style kustom inline. |
33
+ | `children?` | `any` | `-` | Konten anak di dalam Grid (<GridItem>). |
34
+
35
+ ### Sub-interface: `GridBreakpointProps`
36
+
37
+ | Field | Type | Default | Description |
38
+ | :--- | :--- | :--- | :--- |
39
+ | `templateColumns?` | `string | number` | `-` | Jumlah atau pola template kolom pada grid (grid-template-columns). Nilai angka (misal: 3 atau 12) otomatis dikonversi ke repeat(N, minmax(0, 1fr)). Nilai string (misal: "200px 1fr 2fr", "repeat(4, 1fr)"). |
40
+ | `templateRows?` | `string | number` | `-` | Jumlah atau pola template baris pada grid (grid-template-rows). |
41
+ | `gap?` | `string | number` | `-` | Jarak celah antar baris dan kolom (gap). Nilai angka (misal: 16) atau string (misal: "16px", "1rem", "var(--ttdk-spacing-16)"). |
42
+ | `justifyContent?` | `'start' | 'center' | 'end' | 'around' | 'between' | 'evenly'` | `-` | Distribusi horizontal keseluruhan grid container (justify-content). |
43
+ | `alignContent?` | `'evenly' | 'around' | 'between' | 'center' | 'start' | 'end'` | `-` | Distribusi vertikal baris di dalam grid container (align-content). |
44
+
45
+ ## 4. Usage Examples
46
+
47
+ ### React Example
48
+ ```tsx
49
+ import { Grid, GridItem } from "@ttdk-design-system/library-react/grid";
50
+ import "@ttdk-design-system/library-react/grid/grid.css";
51
+
52
+ export function Example() {
53
+ return (
54
+ <Grid
55
+ templateColumns={1}
56
+ gap="16px"
57
+ md={{ templateColumns: 12 }}
58
+ >
59
+ <GridItem col={12} md={{ col: 8 }}>
60
+ <div style={{ background: '#f4f4f5', padding: '16px' }}>Area Utama (8 Kolom)</div>
61
+ </GridItem>
62
+ <GridItem col={12} md={{ col: 4 }}>
63
+ <div style={{ background: '#e4e4e7', padding: '16px' }}>Sidebar (4 Kolom)</div>
64
+ </GridItem>
65
+ </Grid>
66
+ );
67
+ }
68
+ ```
69
+
70
+ ### Vue 3 Example
71
+ ```vue
72
+ <script setup lang="ts">
73
+ import { Grid, GridItem } from "@ttdk-design-system/library-vue/grid";
74
+ import "@ttdk-design-system/library-vue/grid/grid.css";
75
+ </script>
76
+
77
+ <template>
78
+ <Grid
79
+ :templateColumns="1"
80
+ gap="16px"
81
+ :md="{ templateColumns: 12 }"
82
+ >
83
+ <GridItem :col="12" :md="{ col: 8 }">
84
+ <div style="background: #f4f4f5; padding: 16px;">Area Utama (8 Kolom)</div>
85
+ </GridItem>
86
+ <GridItem :col="12" :md="{ col: 4 }">
87
+ <div style="background: #e4e4e7; padding: 16px;">Sidebar (4 Kolom)</div>
88
+ </GridItem>
89
+ </Grid>
90
+ </template>
91
+ ```
92
+
93
+ ### Svelte Example
94
+ ```svelte
95
+ <script lang="ts">
96
+ import { Grid, GridItem } from "@ttdk-design-system/library-svelte/grid";
97
+ import "@ttdk-design-system/library-svelte/grid/grid.css";
98
+ </script>
99
+
100
+ <Grid
101
+ templateColumns={1}
102
+ gap="16px"
103
+ md={{ templateColumns: 12 }}
104
+ >
105
+ <GridItem col={12} md={{ col: 8 }}>
106
+ <div style="background: #f4f4f5; padding: 16px;">Area Utama (8 Kolom)</div>
107
+ </GridItem>
108
+ <GridItem col={12} md={{ col: 4 }}>
109
+ <div style="background: #e4e4e7; padding: 16px;">Sidebar (4 Kolom)</div>
110
+ </GridItem>
111
+ </Grid>
112
+ ```
@@ -0,0 +1,112 @@
1
+ import * as React from "react";
2
+
3
+ export interface GridItemBreakpointProps {
4
+ /**
5
+ * Jumlah kolom yang ditempati item ini (grid-column).
6
+ * Nilai angka N (misal: 6 atau 12) otomatis dikonversi ke 'span N / span N'.
7
+ * Nilai string (misal: "span 4", "1 / -1", "auto").
8
+ */
9
+ col?: number | string;
10
+
11
+ /**
12
+ * Posisi awal garis kolom (grid-column-start).
13
+ */
14
+ colStart?: number | string;
15
+
16
+ /**
17
+ * Posisi akhir garis kolom (grid-column-end).
18
+ */
19
+ colEnd?: number | string;
20
+
21
+ /**
22
+ * Jumlah baris yang ditempati item ini (grid-row).
23
+ * Nilai angka N otomatis dikonversi ke 'span N / span N'.
24
+ */
25
+ row?: number | string;
26
+
27
+ /**
28
+ * Posisi awal garis baris (grid-row-start).
29
+ */
30
+ rowStart?: number | string;
31
+
32
+ /**
33
+ * Posisi akhir garis baris (grid-row-end).
34
+ */
35
+ rowEnd?: number | string;
36
+
37
+ /**
38
+ * Perataan horizontal item di dalam sel grid (justify-self).
39
+ */
40
+ justifySelf?: "auto" | "start" | "center" | "end" | "stretch";
41
+
42
+ /**
43
+ * Urutan tampilan item di dalam grid (order).
44
+ */
45
+ order?: number | string;
46
+ }
47
+ export interface GridItemProps extends GridItemBreakpointProps {
48
+ /**
49
+ * Override pada breakpoint sm (min-width: 640px).
50
+ */
51
+ sm?: GridItemBreakpointProps;
52
+
53
+ /**
54
+ * Override pada breakpoint md (min-width: 768px).
55
+ */
56
+ md?: GridItemBreakpointProps;
57
+
58
+ /**
59
+ * Override pada breakpoint lg (min-width: 1024px).
60
+ */
61
+ lg?: GridItemBreakpointProps;
62
+
63
+ /**
64
+ * Override pada breakpoint xl (min-width: 1280px).
65
+ */
66
+ xl?: GridItemBreakpointProps;
67
+
68
+ /**
69
+ * Override pada breakpoint xxl / 2xl (min-width: 1536px).
70
+ */
71
+ xxl?: GridItemBreakpointProps;
72
+
73
+ /**
74
+ * Kustomisasi visual granular root kontainer (UiProps).
75
+ */
76
+ ui?: UiProps;
77
+
78
+ /**
79
+ * Class CSS kustom.
80
+ */
81
+ className?: string;
82
+
83
+ /**
84
+ * Style kustom inline.
85
+ */
86
+ style?: React.CSSProperties;
87
+
88
+ /**
89
+ * Konten di dalam item grid.
90
+ */
91
+ children?: any;
92
+ }
93
+
94
+ import { buildGridItemVars, buildUiVars, UiProps } from "../../core/types";
95
+
96
+ function GridItem(props: GridItemProps) {
97
+ return (
98
+ <div
99
+ className={`ttdk-grid-item ${props.className || ""}`.trim()}
100
+ style={{
101
+ ...buildGridItemVars(props),
102
+ ...buildUiVars(props.ui),
103
+ ...((props as any)["style"] || {}),
104
+ ...props.style,
105
+ }}
106
+ >
107
+ <>{props.children}</>
108
+ </div>
109
+ );
110
+ }
111
+
112
+ export default GridItem;
@@ -0,0 +1 @@
1
+ .ttdk-grid{box-sizing:border-box;grid-template-columns:var(--ttdk-grid-template-columns,repeat(1, minmax(0, 1fr)));grid-template-rows:var(--ttdk-grid-template-rows,auto);gap:var(--ttdk-grid-gap,0);justify-content:var(--ttdk-grid-justify-content,normal);align-content:var(--ttdk-grid-align-content,normal);display:grid}.ttdk-grid-item{box-sizing:border-box;grid-column:var(--ttdk-grid-item-col,auto);grid-row:var(--ttdk-grid-item-row,auto);justify-self:var(--ttdk-grid-item-justify-self,auto);order:var(--ttdk-grid-item-order,0);min-width:0}@media (width>=640px){.ttdk-grid{grid-template-columns:var(--ttdk-grid-template-columns-sm,var(--ttdk-grid-template-columns,repeat(1, minmax(0, 1fr))));grid-template-rows:var(--ttdk-grid-template-rows-sm,var(--ttdk-grid-template-rows,auto));gap:var(--ttdk-grid-gap-sm,var(--ttdk-grid-gap,0));justify-content:var(--ttdk-grid-justify-content-sm,var(--ttdk-grid-justify-content,normal));align-content:var(--ttdk-grid-align-content-sm,var(--ttdk-grid-align-content,normal))}.ttdk-grid-item{grid-column:var(--ttdk-grid-item-col-sm,var(--ttdk-grid-item-col,auto));grid-row:var(--ttdk-grid-item-row-sm,var(--ttdk-grid-item-row,auto));justify-self:var(--ttdk-grid-item-justify-self-sm,var(--ttdk-grid-item-justify-self,auto));order:var(--ttdk-grid-item-order-sm,var(--ttdk-grid-item-order,0))}}@media (width>=768px){.ttdk-grid{grid-template-columns:var(--ttdk-grid-template-columns-md,var(--ttdk-grid-template-columns-sm,var(--ttdk-grid-template-columns,repeat(1, minmax(0, 1fr)))));grid-template-rows:var(--ttdk-grid-template-rows-md,var(--ttdk-grid-template-rows-sm,var(--ttdk-grid-template-rows,auto)));gap:var(--ttdk-grid-gap-md,var(--ttdk-grid-gap-sm,var(--ttdk-grid-gap,0)));justify-content:var(--ttdk-grid-justify-content-md,var(--ttdk-grid-justify-content-sm,var(--ttdk-grid-justify-content,normal)));align-content:var(--ttdk-grid-align-content-md,var(--ttdk-grid-align-content-sm,var(--ttdk-grid-align-content,normal)))}.ttdk-grid-item{grid-column:var(--ttdk-grid-item-col-md,var(--ttdk-grid-item-col-sm,var(--ttdk-grid-item-col,auto)));grid-row:var(--ttdk-grid-item-row-md,var(--ttdk-grid-item-row-sm,var(--ttdk-grid-item-row,auto)));justify-self:var(--ttdk-grid-item-justify-self-md,var(--ttdk-grid-item-justify-self-sm,var(--ttdk-grid-item-justify-self,auto)));order:var(--ttdk-grid-item-order-md,var(--ttdk-grid-item-order-sm,var(--ttdk-grid-item-order,0)))}}@media (width>=1024px){.ttdk-grid{grid-template-columns:var(--ttdk-grid-template-columns-lg,var(--ttdk-grid-template-columns-md,var(--ttdk-grid-template-columns-sm,var(--ttdk-grid-template-columns,repeat(1, minmax(0, 1fr))))));grid-template-rows:var(--ttdk-grid-template-rows-lg,var(--ttdk-grid-template-rows-md,var(--ttdk-grid-template-rows-sm,var(--ttdk-grid-template-rows,auto))));gap:var(--ttdk-grid-gap-lg,var(--ttdk-grid-gap-md,var(--ttdk-grid-gap-sm,var(--ttdk-grid-gap,0))));justify-content:var(--ttdk-grid-justify-content-lg,var(--ttdk-grid-justify-content-md,var(--ttdk-grid-justify-content-sm,var(--ttdk-grid-justify-content,normal))));align-content:var(--ttdk-grid-align-content-lg,var(--ttdk-grid-align-content-md,var(--ttdk-grid-align-content-sm,var(--ttdk-grid-align-content,normal))))}.ttdk-grid-item{grid-column:var(--ttdk-grid-item-col-lg,var(--ttdk-grid-item-col-md,var(--ttdk-grid-item-col-sm,var(--ttdk-grid-item-col,auto))));grid-row:var(--ttdk-grid-item-row-lg,var(--ttdk-grid-item-row-md,var(--ttdk-grid-item-row-sm,var(--ttdk-grid-item-row,auto))));justify-self:var(--ttdk-grid-item-justify-self-lg,var(--ttdk-grid-item-justify-self-md,var(--ttdk-grid-item-justify-self-sm,var(--ttdk-grid-item-justify-self,auto))));order:var(--ttdk-grid-item-order-lg,var(--ttdk-grid-item-order-md,var(--ttdk-grid-item-order-sm,var(--ttdk-grid-item-order,0))))}}@media (width>=1280px){.ttdk-grid{grid-template-columns:var(--ttdk-grid-template-columns-xl,var(--ttdk-grid-template-columns-lg,var(--ttdk-grid-template-columns-md,var(--ttdk-grid-template-columns-sm,var(--ttdk-grid-template-columns,repeat(1, minmax(0, 1fr)))))));grid-template-rows:var(--ttdk-grid-template-rows-xl,var(--ttdk-grid-template-rows-lg,var(--ttdk-grid-template-rows-md,var(--ttdk-grid-template-rows-sm,var(--ttdk-grid-template-rows,auto)))));gap:var(--ttdk-grid-gap-xl,var(--ttdk-grid-gap-lg,var(--ttdk-grid-gap-md,var(--ttdk-grid-gap-sm,var(--ttdk-grid-gap,0)))));justify-content:var(--ttdk-grid-justify-content-xl,var(--ttdk-grid-justify-content-lg,var(--ttdk-grid-justify-content-md,var(--ttdk-grid-justify-content-sm,var(--ttdk-grid-justify-content,normal)))));align-content:var(--ttdk-grid-align-content-xl,var(--ttdk-grid-align-content-lg,var(--ttdk-grid-align-content-md,var(--ttdk-grid-align-content-sm,var(--ttdk-grid-align-content,normal)))))}.ttdk-grid-item{grid-column:var(--ttdk-grid-item-col-xl,var(--ttdk-grid-item-col-lg,var(--ttdk-grid-item-col-md,var(--ttdk-grid-item-col-sm,var(--ttdk-grid-item-col,auto)))));grid-row:var(--ttdk-grid-item-row-xl,var(--ttdk-grid-item-row-lg,var(--ttdk-grid-item-row-md,var(--ttdk-grid-item-row-sm,var(--ttdk-grid-item-row,auto)))));justify-self:var(--ttdk-grid-item-justify-self-xl,var(--ttdk-grid-item-justify-self-lg,var(--ttdk-grid-item-justify-self-md,var(--ttdk-grid-item-justify-self-sm,var(--ttdk-grid-item-justify-self,auto)))));order:var(--ttdk-grid-item-order-xl,var(--ttdk-grid-item-order-lg,var(--ttdk-grid-item-order-md,var(--ttdk-grid-item-order-sm,var(--ttdk-grid-item-order,0)))))}}@media (width>=1536px){.ttdk-grid{grid-template-columns:var(--ttdk-grid-template-columns-2xl,var(--ttdk-grid-template-columns-xl,var(--ttdk-grid-template-columns-lg,var(--ttdk-grid-template-columns-md,var(--ttdk-grid-template-columns-sm,var(--ttdk-grid-template-columns,repeat(1, minmax(0, 1fr))))))));grid-template-rows:var(--ttdk-grid-template-rows-2xl,var(--ttdk-grid-template-rows-xl,var(--ttdk-grid-template-rows-lg,var(--ttdk-grid-template-rows-md,var(--ttdk-grid-template-rows-sm,var(--ttdk-grid-template-rows,auto))))));gap:var(--ttdk-grid-gap-2xl,var(--ttdk-grid-gap-xl,var(--ttdk-grid-gap-lg,var(--ttdk-grid-gap-md,var(--ttdk-grid-gap-sm,var(--ttdk-grid-gap,0))))));justify-content:var(--ttdk-grid-justify-content-2xl,var(--ttdk-grid-justify-content-xl,var(--ttdk-grid-justify-content-lg,var(--ttdk-grid-justify-content-md,var(--ttdk-grid-justify-content-sm,var(--ttdk-grid-justify-content,normal))))));align-content:var(--ttdk-grid-align-content-2xl,var(--ttdk-grid-align-content-xl,var(--ttdk-grid-align-content-lg,var(--ttdk-grid-align-content-md,var(--ttdk-grid-align-content-sm,var(--ttdk-grid-align-content,normal))))))}.ttdk-grid-item{grid-column:var(--ttdk-grid-item-col-2xl,var(--ttdk-grid-item-col-xl,var(--ttdk-grid-item-col-lg,var(--ttdk-grid-item-col-md,var(--ttdk-grid-item-col-sm,var(--ttdk-grid-item-col,auto))))));grid-row:var(--ttdk-grid-item-row-2xl,var(--ttdk-grid-item-row-xl,var(--ttdk-grid-item-row-lg,var(--ttdk-grid-item-row-md,var(--ttdk-grid-item-row-sm,var(--ttdk-grid-item-row,auto))))));justify-self:var(--ttdk-grid-item-justify-self-2xl,var(--ttdk-grid-item-justify-self-xl,var(--ttdk-grid-item-justify-self-lg,var(--ttdk-grid-item-justify-self-md,var(--ttdk-grid-item-justify-self-sm,var(--ttdk-grid-item-justify-self,auto))))));order:var(--ttdk-grid-item-order-2xl,var(--ttdk-grid-item-order-xl,var(--ttdk-grid-item-order-lg,var(--ttdk-grid-item-order-md,var(--ttdk-grid-item-order-sm,var(--ttdk-grid-item-order,0))))))}}