@peak-ai/canvas 1.4.21 → 1.4.22

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 (213) hide show
  1. package/.babelrc +14 -0
  2. package/.eslintcache +1 -0
  3. package/.eslintignore +5 -0
  4. package/.eslintrc.js +29 -0
  5. package/{GrapesjsCanvas.js → dist/GrapesjsCanvas.js} +3 -2
  6. package/dist/GrapesjsCanvas.js.map +1 -0
  7. package/dist/package.json +62 -0
  8. package/{plugins → dist/plugins}/helpers/render-components.js +1 -1
  9. package/dist/plugins/helpers/render-components.js.map +1 -0
  10. package/dist/shadcn/components/ui/error-wrapper.js +2 -0
  11. package/dist/shadcn/components/ui/error-wrapper.js.map +1 -0
  12. package/package.json +45 -7
  13. package/scripts/build.ts +120 -0
  14. package/src/GrapesjsCanvas.tsx +494 -0
  15. package/src/constants/index.ts +25 -0
  16. package/src/declaration.d.ts +1 -0
  17. package/src/helpers/compiled-table.css +2429 -0
  18. package/src/helpers/css.ts +2667 -0
  19. package/src/helpers/date-picker.ts +807 -0
  20. package/src/helpers/filter-placeholder.ts +18 -0
  21. package/src/helpers/index.ts +13 -0
  22. package/src/helpers/merge-json.ts +106 -0
  23. package/src/index.styles.ts +58 -0
  24. package/src/index.ts +9 -0
  25. package/src/plugins/grapejs-plugin.tsx +196 -0
  26. package/src/plugins/helpers/custom-modal.tsx +123 -0
  27. package/src/plugins/helpers/data-table.tsx +300 -0
  28. package/src/plugins/helpers/extra.tsx +164 -0
  29. package/src/plugins/helpers/query-cache-context.tsx +154 -0
  30. package/src/plugins/helpers/query-cache-singleton.ts +176 -0
  31. package/src/plugins/helpers/query-cache-utils.ts +226 -0
  32. package/src/plugins/helpers/query-details-modal.tsx +400 -0
  33. package/src/plugins/helpers/query-heading-formatter.ts +24 -0
  34. package/src/plugins/helpers/query-loading-modal.tsx +94 -0
  35. package/src/plugins/helpers/render-components.tsx +1450 -0
  36. package/src/plugins/helpers/styled-info-button.tsx +504 -0
  37. package/src/public/canvas.css +42 -0
  38. package/src/public/components-css/table/table-output.css +2436 -0
  39. package/src/public/components-css/table/table.css +30 -0
  40. package/src/public/output.css +2465 -0
  41. package/src/public/table.css +135 -0
  42. package/src/shadcn/components/icons/AiAvatarIcon.tsx +47 -0
  43. package/src/shadcn/components/icons/Co_driver Expanding button copy.svg +21 -0
  44. package/src/shadcn/components/icons/ai-avatar.svg +7 -0
  45. package/src/shadcn/components/icons/thinking.gif +0 -0
  46. package/src/shadcn/components/ui/button.tsx +132 -0
  47. package/src/shadcn/components/ui/card.tsx +92 -0
  48. package/src/shadcn/components/ui/chart.tsx +324 -0
  49. package/src/shadcn/components/ui/checkbox.tsx +27 -0
  50. package/src/shadcn/components/ui/component-wrapper.tsx +61 -0
  51. package/src/shadcn/components/ui/date-filter.tsx +816 -0
  52. package/src/shadcn/components/ui/error-container.tsx +125 -0
  53. package/src/shadcn/components/ui/error-wrapper.tsx +99 -0
  54. package/src/shadcn/components/ui/filter.tsx +368 -0
  55. package/src/shadcn/components/ui/hover-card.tsx +36 -0
  56. package/src/shadcn/components/ui/input.tsx +20 -0
  57. package/src/shadcn/components/ui/label.tsx +24 -0
  58. package/src/shadcn/components/ui/pagination.tsx +213 -0
  59. package/src/shadcn/components/ui/scroll-area.tsx +59 -0
  60. package/src/shadcn/components/ui/search.tsx +150 -0
  61. package/src/shadcn/components/ui/separator.tsx +26 -0
  62. package/src/shadcn/components/ui/skeleton.tsx +69 -0
  63. package/src/shadcn/components/ui/table.tsx +196 -0
  64. package/src/shadcn/components/ui/tabs.tsx +55 -0
  65. package/src/shadcn/components/ui/textarea.tsx +18 -0
  66. package/src/shadcn/components/ui/tooltip.tsx +87 -0
  67. package/src/shadcn/utils.ts +6 -0
  68. package/src/types/grapesjs-tailwind.d.ts +61 -0
  69. package/src/types/images.d.ts +1 -0
  70. package/tailwind.config.js +5 -0
  71. package/tooling/tailwind-compiler/index.js +99 -0
  72. package/tooling/tailwind-compiler/package.json +11 -0
  73. package/tooling/tailwind-compiler/yarn.lock +123 -0
  74. package/tsconfig.build.json +15 -0
  75. package/tsconfig.json +8 -0
  76. package/GrapesjsCanvas.js.map +0 -1
  77. package/plugins/helpers/render-components.js.map +0 -1
  78. package/shadcn/components/ui/error-wrapper.js +0 -2
  79. package/shadcn/components/ui/error-wrapper.js.map +0 -1
  80. /package/{GrapesjsCanvas.d.ts → dist/GrapesjsCanvas.d.ts} +0 -0
  81. /package/{constants → dist/constants}/index.d.ts +0 -0
  82. /package/{constants → dist/constants}/index.js +0 -0
  83. /package/{constants → dist/constants}/index.js.map +0 -0
  84. /package/{declaration.d.js → dist/declaration.d.js} +0 -0
  85. /package/{declaration.d.js.map → dist/declaration.d.js.map} +0 -0
  86. /package/{helpers → dist/helpers}/compiled-table.css +0 -0
  87. /package/{helpers → dist/helpers}/css.d.ts +0 -0
  88. /package/{helpers → dist/helpers}/css.js +0 -0
  89. /package/{helpers → dist/helpers}/css.js.map +0 -0
  90. /package/{helpers → dist/helpers}/date-picker.d.ts +0 -0
  91. /package/{helpers → dist/helpers}/date-picker.js +0 -0
  92. /package/{helpers → dist/helpers}/date-picker.js.map +0 -0
  93. /package/{helpers → dist/helpers}/filter-placeholder.d.ts +0 -0
  94. /package/{helpers → dist/helpers}/filter-placeholder.js +0 -0
  95. /package/{helpers → dist/helpers}/filter-placeholder.js.map +0 -0
  96. /package/{helpers → dist/helpers}/index.d.ts +0 -0
  97. /package/{helpers → dist/helpers}/index.js +0 -0
  98. /package/{helpers → dist/helpers}/index.js.map +0 -0
  99. /package/{helpers → dist/helpers}/merge-json.d.ts +0 -0
  100. /package/{helpers → dist/helpers}/merge-json.js +0 -0
  101. /package/{helpers → dist/helpers}/merge-json.js.map +0 -0
  102. /package/{index.d.ts → dist/index.d.ts} +0 -0
  103. /package/{index.js → dist/index.js} +0 -0
  104. /package/{index.js.map → dist/index.js.map} +0 -0
  105. /package/{index.styles.d.ts → dist/index.styles.d.ts} +0 -0
  106. /package/{index.styles.js → dist/index.styles.js} +0 -0
  107. /package/{index.styles.js.map → dist/index.styles.js.map} +0 -0
  108. /package/{plugins → dist/plugins}/grapejs-plugin.d.ts +0 -0
  109. /package/{plugins → dist/plugins}/grapejs-plugin.js +0 -0
  110. /package/{plugins → dist/plugins}/grapejs-plugin.js.map +0 -0
  111. /package/{plugins → dist/plugins}/helpers/custom-modal.d.ts +0 -0
  112. /package/{plugins → dist/plugins}/helpers/custom-modal.js +0 -0
  113. /package/{plugins → dist/plugins}/helpers/custom-modal.js.map +0 -0
  114. /package/{plugins → dist/plugins}/helpers/data-table.d.ts +0 -0
  115. /package/{plugins → dist/plugins}/helpers/data-table.js +0 -0
  116. /package/{plugins → dist/plugins}/helpers/data-table.js.map +0 -0
  117. /package/{plugins → dist/plugins}/helpers/extra.d.ts +0 -0
  118. /package/{plugins → dist/plugins}/helpers/extra.js +0 -0
  119. /package/{plugins → dist/plugins}/helpers/extra.js.map +0 -0
  120. /package/{plugins → dist/plugins}/helpers/query-cache-context.d.ts +0 -0
  121. /package/{plugins → dist/plugins}/helpers/query-cache-context.js +0 -0
  122. /package/{plugins → dist/plugins}/helpers/query-cache-context.js.map +0 -0
  123. /package/{plugins → dist/plugins}/helpers/query-cache-singleton.d.ts +0 -0
  124. /package/{plugins → dist/plugins}/helpers/query-cache-singleton.js +0 -0
  125. /package/{plugins → dist/plugins}/helpers/query-cache-singleton.js.map +0 -0
  126. /package/{plugins → dist/plugins}/helpers/query-cache-utils.d.ts +0 -0
  127. /package/{plugins → dist/plugins}/helpers/query-cache-utils.js +0 -0
  128. /package/{plugins → dist/plugins}/helpers/query-cache-utils.js.map +0 -0
  129. /package/{plugins → dist/plugins}/helpers/query-details-modal.d.ts +0 -0
  130. /package/{plugins → dist/plugins}/helpers/query-details-modal.js +0 -0
  131. /package/{plugins → dist/plugins}/helpers/query-details-modal.js.map +0 -0
  132. /package/{plugins → dist/plugins}/helpers/query-heading-formatter.d.ts +0 -0
  133. /package/{plugins → dist/plugins}/helpers/query-heading-formatter.js +0 -0
  134. /package/{plugins → dist/plugins}/helpers/query-heading-formatter.js.map +0 -0
  135. /package/{plugins → dist/plugins}/helpers/query-loading-modal.d.ts +0 -0
  136. /package/{plugins → dist/plugins}/helpers/query-loading-modal.js +0 -0
  137. /package/{plugins → dist/plugins}/helpers/query-loading-modal.js.map +0 -0
  138. /package/{plugins → dist/plugins}/helpers/render-components.d.ts +0 -0
  139. /package/{plugins → dist/plugins}/helpers/styled-info-button.d.ts +0 -0
  140. /package/{plugins → dist/plugins}/helpers/styled-info-button.js +0 -0
  141. /package/{plugins → dist/plugins}/helpers/styled-info-button.js.map +0 -0
  142. /package/{shadcn → dist/shadcn}/components/icons/AiAvatarIcon.d.ts +0 -0
  143. /package/{shadcn → dist/shadcn}/components/icons/AiAvatarIcon.js +0 -0
  144. /package/{shadcn → dist/shadcn}/components/icons/AiAvatarIcon.js.map +0 -0
  145. /package/{shadcn → dist/shadcn}/components/icons/thinking.gif +0 -0
  146. /package/{shadcn → dist/shadcn}/components/ui/button.d.ts +0 -0
  147. /package/{shadcn → dist/shadcn}/components/ui/button.js +0 -0
  148. /package/{shadcn → dist/shadcn}/components/ui/button.js.map +0 -0
  149. /package/{shadcn → dist/shadcn}/components/ui/card.d.ts +0 -0
  150. /package/{shadcn → dist/shadcn}/components/ui/card.js +0 -0
  151. /package/{shadcn → dist/shadcn}/components/ui/card.js.map +0 -0
  152. /package/{shadcn → dist/shadcn}/components/ui/chart.d.ts +0 -0
  153. /package/{shadcn → dist/shadcn}/components/ui/chart.js +0 -0
  154. /package/{shadcn → dist/shadcn}/components/ui/chart.js.map +0 -0
  155. /package/{shadcn → dist/shadcn}/components/ui/checkbox.d.ts +0 -0
  156. /package/{shadcn → dist/shadcn}/components/ui/checkbox.js +0 -0
  157. /package/{shadcn → dist/shadcn}/components/ui/checkbox.js.map +0 -0
  158. /package/{shadcn → dist/shadcn}/components/ui/component-wrapper.d.ts +0 -0
  159. /package/{shadcn → dist/shadcn}/components/ui/component-wrapper.js +0 -0
  160. /package/{shadcn → dist/shadcn}/components/ui/component-wrapper.js.map +0 -0
  161. /package/{shadcn → dist/shadcn}/components/ui/date-filter.d.ts +0 -0
  162. /package/{shadcn → dist/shadcn}/components/ui/date-filter.js +0 -0
  163. /package/{shadcn → dist/shadcn}/components/ui/date-filter.js.map +0 -0
  164. /package/{shadcn → dist/shadcn}/components/ui/error-container.d.ts +0 -0
  165. /package/{shadcn → dist/shadcn}/components/ui/error-container.js +0 -0
  166. /package/{shadcn → dist/shadcn}/components/ui/error-container.js.map +0 -0
  167. /package/{shadcn → dist/shadcn}/components/ui/error-wrapper.d.ts +0 -0
  168. /package/{shadcn → dist/shadcn}/components/ui/filter.d.ts +0 -0
  169. /package/{shadcn → dist/shadcn}/components/ui/filter.js +0 -0
  170. /package/{shadcn → dist/shadcn}/components/ui/filter.js.map +0 -0
  171. /package/{shadcn → dist/shadcn}/components/ui/hover-card.d.ts +0 -0
  172. /package/{shadcn → dist/shadcn}/components/ui/hover-card.js +0 -0
  173. /package/{shadcn → dist/shadcn}/components/ui/hover-card.js.map +0 -0
  174. /package/{shadcn → dist/shadcn}/components/ui/input.d.ts +0 -0
  175. /package/{shadcn → dist/shadcn}/components/ui/input.js +0 -0
  176. /package/{shadcn → dist/shadcn}/components/ui/input.js.map +0 -0
  177. /package/{shadcn → dist/shadcn}/components/ui/label.d.ts +0 -0
  178. /package/{shadcn → dist/shadcn}/components/ui/label.js +0 -0
  179. /package/{shadcn → dist/shadcn}/components/ui/label.js.map +0 -0
  180. /package/{shadcn → dist/shadcn}/components/ui/pagination.d.ts +0 -0
  181. /package/{shadcn → dist/shadcn}/components/ui/pagination.js +0 -0
  182. /package/{shadcn → dist/shadcn}/components/ui/pagination.js.map +0 -0
  183. /package/{shadcn → dist/shadcn}/components/ui/scroll-area.d.ts +0 -0
  184. /package/{shadcn → dist/shadcn}/components/ui/scroll-area.js +0 -0
  185. /package/{shadcn → dist/shadcn}/components/ui/scroll-area.js.map +0 -0
  186. /package/{shadcn → dist/shadcn}/components/ui/search.d.ts +0 -0
  187. /package/{shadcn → dist/shadcn}/components/ui/search.js +0 -0
  188. /package/{shadcn → dist/shadcn}/components/ui/search.js.map +0 -0
  189. /package/{shadcn → dist/shadcn}/components/ui/separator.d.ts +0 -0
  190. /package/{shadcn → dist/shadcn}/components/ui/separator.js +0 -0
  191. /package/{shadcn → dist/shadcn}/components/ui/separator.js.map +0 -0
  192. /package/{shadcn → dist/shadcn}/components/ui/skeleton.d.ts +0 -0
  193. /package/{shadcn → dist/shadcn}/components/ui/skeleton.js +0 -0
  194. /package/{shadcn → dist/shadcn}/components/ui/skeleton.js.map +0 -0
  195. /package/{shadcn → dist/shadcn}/components/ui/table.d.ts +0 -0
  196. /package/{shadcn → dist/shadcn}/components/ui/table.js +0 -0
  197. /package/{shadcn → dist/shadcn}/components/ui/table.js.map +0 -0
  198. /package/{shadcn → dist/shadcn}/components/ui/tabs.d.ts +0 -0
  199. /package/{shadcn → dist/shadcn}/components/ui/tabs.js +0 -0
  200. /package/{shadcn → dist/shadcn}/components/ui/tabs.js.map +0 -0
  201. /package/{shadcn → dist/shadcn}/components/ui/textarea.d.ts +0 -0
  202. /package/{shadcn → dist/shadcn}/components/ui/textarea.js +0 -0
  203. /package/{shadcn → dist/shadcn}/components/ui/textarea.js.map +0 -0
  204. /package/{shadcn → dist/shadcn}/components/ui/tooltip.d.ts +0 -0
  205. /package/{shadcn → dist/shadcn}/components/ui/tooltip.js +0 -0
  206. /package/{shadcn → dist/shadcn}/components/ui/tooltip.js.map +0 -0
  207. /package/{shadcn → dist/shadcn}/utils.d.ts +0 -0
  208. /package/{shadcn → dist/shadcn}/utils.js +0 -0
  209. /package/{shadcn → dist/shadcn}/utils.js.map +0 -0
  210. /package/{types → dist/types}/grapesjs-tailwind.d.js +0 -0
  211. /package/{types → dist/types}/grapesjs-tailwind.d.js.map +0 -0
  212. /package/{types → dist/types}/images.d.js +0 -0
  213. /package/{types → dist/types}/images.d.js.map +0 -0
@@ -0,0 +1,196 @@
1
+ import * as React from 'react';
2
+ import { ArrowUp, ArrowDown } from 'lucide-react';
3
+
4
+ import { cn } from '../../utils';
5
+
6
+ function Table({ className, ...props }: React.ComponentProps<'table'>) {
7
+ return (
8
+ <table
9
+ data-slot="table"
10
+ className={cn('w-[640px] caption-bottom text-[0.8rem] leading-4', className)}
11
+ {...props}
12
+ />
13
+ );
14
+ }
15
+
16
+ function TableHeader({ className, ...props }: React.ComponentProps<'thead'>) {
17
+ return (
18
+ <thead
19
+ data-slot="table-header"
20
+ className={cn('[&_tr]:border-b font-bold bg-slate-100', className)}
21
+ {...props}
22
+ />
23
+ );
24
+ }
25
+
26
+ function TableBody({ className, ...props }: React.ComponentProps<'tbody'>) {
27
+ return (
28
+ <tbody
29
+ data-slot="table-body"
30
+ className={cn('[&_tr:last-child]:border-0', className)}
31
+ {...props}
32
+ />
33
+ );
34
+ }
35
+
36
+ function TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>) {
37
+ return (
38
+ <tfoot
39
+ data-slot="table-footer"
40
+ className={cn('bg-muted/50 border-t font-medium [&>tr]:last:border-b-0', className)}
41
+ {...props}
42
+ />
43
+ );
44
+ }
45
+
46
+ function TableRow({ className, ...props }: React.ComponentProps<'tr'>) {
47
+ return (
48
+ <tr
49
+ data-slot="table-row"
50
+ className={cn(
51
+ 'hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors',
52
+ className,
53
+ )}
54
+ {...props}
55
+ />
56
+ );
57
+ }
58
+
59
+ function TableHead({ className, ...props }: React.ComponentProps<'th'>) {
60
+ return (
61
+ <th
62
+ data-slot="table-head"
63
+ className={cn(
64
+ 'text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',
65
+ className,
66
+ )}
67
+ {...props}
68
+ />
69
+ );
70
+ }
71
+
72
+ export type SortDirection = 'asc' | 'desc' | null;
73
+
74
+ type TableHeadSortableProps = React.ComponentProps<'th'> & {
75
+ sortDirection?: SortDirection;
76
+ onSort?: (direction: SortDirection) => void;
77
+ sortable?: boolean;
78
+ isActive?: boolean;
79
+ isEditable?: boolean;
80
+ } & {
81
+ 'data-slot'?: string;
82
+ };
83
+
84
+ function TableHeadSortable({
85
+ className,
86
+ children,
87
+ sortDirection = 'asc',
88
+ onSort,
89
+ sortable = true,
90
+ isActive = false,
91
+ isEditable = false,
92
+ 'data-slot': dataSlot,
93
+ ...props
94
+ }: TableHeadSortableProps) {
95
+ const [isHovered, setIsHovered] = React.useState(false);
96
+
97
+ function getSortIcon() {
98
+ if (!sortable || (!isActive && !isHovered)) {
99
+ return null;
100
+ }
101
+
102
+ return sortDirection === 'desc' ? (
103
+ <ArrowDown className="h-4 w-4" />
104
+ ) : (
105
+ <ArrowUp className="h-4 w-4" />
106
+ );
107
+ }
108
+
109
+ function handleSort() {
110
+ if (!sortable) {
111
+ return;
112
+ }
113
+
114
+ let newDirection: SortDirection = 'asc';
115
+
116
+ if (sortDirection === 'asc') {
117
+ newDirection = 'desc';
118
+ } else if (sortDirection === 'desc') {
119
+ newDirection = 'asc';
120
+ }
121
+
122
+ if (onSort) {
123
+ onSort(newDirection);
124
+ }
125
+ }
126
+
127
+ const shouldApplyHeaderInteraction = sortable && !isEditable;
128
+
129
+ return (
130
+ <th
131
+ data-slot={!isEditable ? dataSlot : undefined}
132
+ className={cn(
133
+ 'text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',
134
+ shouldApplyHeaderInteraction && 'cursor-pointer hover:bg-muted/50 select-none',
135
+ className,
136
+ )}
137
+ onClick={shouldApplyHeaderInteraction ? handleSort : undefined}
138
+ onMouseEnter={shouldApplyHeaderInteraction ? () => setIsHovered(true) : undefined}
139
+ onMouseLeave={shouldApplyHeaderInteraction ? () => setIsHovered(false) : undefined}
140
+ {...props}
141
+ >
142
+ <div className="flex items-center">
143
+ <span
144
+ contentEditable={isEditable}
145
+ className={isEditable ? 'outline-none focus:bg-blue-50 px-1 rounded' : ''}
146
+ suppressContentEditableWarning={true}
147
+ onClick={isEditable ? (e) => e.stopPropagation() : undefined}
148
+ data-slot={isEditable ? dataSlot : undefined}
149
+ >
150
+ {children}
151
+ </span>
152
+ {sortable && (
153
+ <div
154
+ className={cn(
155
+ "ml-1 flex-shrink-0 w-4",
156
+ isEditable && "cursor-pointer hover:bg-muted/30 rounded p-0.5 -m-0.5"
157
+ )}
158
+ onClick={isEditable ? (e) => {
159
+ e.stopPropagation();
160
+ handleSort();
161
+ } : undefined}
162
+ onMouseEnter={isEditable ? () => setIsHovered(true) : undefined}
163
+ onMouseLeave={isEditable ? () => setIsHovered(false) : undefined}
164
+ >
165
+ {getSortIcon()}
166
+ </div>
167
+ )}
168
+ </div>
169
+ </th>
170
+ );
171
+ }
172
+
173
+ function TableCell({ className, ...props }: React.ComponentProps<'td'>) {
174
+ return (
175
+ <td
176
+ data-slot="table-cell"
177
+ className={cn(
178
+ 'p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',
179
+ className,
180
+ )}
181
+ {...props}
182
+ />
183
+ );
184
+ }
185
+
186
+ function TableCaption({ className, ...props }: React.ComponentProps<'caption'>) {
187
+ return (
188
+ <caption
189
+ data-slot="table-caption"
190
+ className={cn('text-muted-foreground mt-4 text-sm', className)}
191
+ {...props}
192
+ />
193
+ );
194
+ }
195
+
196
+ export { Table, TableHeader, TableBody, TableFooter, TableHead, TableHeadSortable, TableRow, TableCell, TableCaption };
@@ -0,0 +1,55 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
5
+
6
+ import { cn } from '../../utils';
7
+
8
+ const Tabs = TabsPrimitive.Root;
9
+
10
+ const TabsList = React.forwardRef<
11
+ React.ElementRef<typeof TabsPrimitive.List>,
12
+ React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>
13
+ >(({ className, ...props }, ref) => (
14
+ <TabsPrimitive.List
15
+ ref={ref}
16
+ className={cn(
17
+ 'inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground',
18
+ className
19
+ )}
20
+ {...props}
21
+ />
22
+ ));
23
+ TabsList.displayName = TabsPrimitive.List.displayName;
24
+
25
+ const TabsTrigger = React.forwardRef<
26
+ React.ElementRef<typeof TabsPrimitive.Trigger>,
27
+ React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>
28
+ >(({ className, ...props }, ref) => (
29
+ <TabsPrimitive.Trigger
30
+ ref={ref}
31
+ className={cn(
32
+ 'inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow',
33
+ className
34
+ )}
35
+ {...props}
36
+ />
37
+ ));
38
+ TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
39
+
40
+ const TabsContent = React.forwardRef<
41
+ React.ElementRef<typeof TabsPrimitive.Content>,
42
+ React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>
43
+ >(({ className, ...props }, ref) => (
44
+ <TabsPrimitive.Content
45
+ ref={ref}
46
+ className={cn(
47
+ 'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
48
+ className
49
+ )}
50
+ {...props}
51
+ />
52
+ ));
53
+ TabsContent.displayName = TabsPrimitive.Content.displayName;
54
+
55
+ export { Tabs, TabsList, TabsTrigger, TabsContent };
@@ -0,0 +1,18 @@
1
+ import * as React from 'react';
2
+
3
+ import { cn } from '../../utils';
4
+
5
+ function Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {
6
+ return (
7
+ <textarea
8
+ data-slot="textarea"
9
+ className={cn(
10
+ 'border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
11
+ className,
12
+ )}
13
+ {...props}
14
+ />
15
+ );
16
+ }
17
+
18
+ export { Textarea };
@@ -0,0 +1,87 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { useEffect, useState } from 'react';
3
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
4
+
5
+ import { cn } from '../../utils';
6
+
7
+ function TooltipProvider({
8
+ delayDuration = 0,
9
+ ...props
10
+ }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
11
+ return (
12
+ <TooltipPrimitive.Provider
13
+ data-slot="tooltip-provider"
14
+ delayDuration={delayDuration}
15
+ {...props}
16
+ />
17
+ );
18
+ }
19
+
20
+ function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {
21
+ return (
22
+ <TooltipProvider>
23
+ <TooltipPrimitive.Root data-slot="tooltip" {...props} />
24
+ </TooltipProvider>
25
+ );
26
+ }
27
+
28
+ function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
29
+ return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />;
30
+ }
31
+
32
+ function TooltipContent({
33
+ className,
34
+ sideOffset = 0,
35
+ children,
36
+ ...props
37
+ }: React.ComponentProps<typeof TooltipPrimitive.Content>) {
38
+ const [container, setContainer] = useState(null);
39
+
40
+ useEffect(() => {
41
+ let timeout: null | NodeJS.Timeout = null;
42
+
43
+ function waitForElement() {
44
+ const iframe = document.querySelector('.gjs-frame');
45
+ const iframeDoc =
46
+ (iframe as any)?.contentDocument || (iframe as any)?.contentWindow?.document;
47
+ const dashboardRoot = iframeDoc.body;
48
+
49
+ if (!dashboardRoot) {
50
+ timeout = setTimeout(waitForElement, 100);
51
+ } else {
52
+ setContainer(dashboardRoot);
53
+ }
54
+ }
55
+
56
+ waitForElement();
57
+
58
+ return () => {
59
+ if (timeout) {
60
+ clearTimeout(timeout);
61
+ }
62
+ };
63
+ }, []);
64
+
65
+ if (!container) {
66
+ return null;
67
+ }
68
+
69
+ return (
70
+ <TooltipPrimitive.Portal container={container}>
71
+ <TooltipPrimitive.Content
72
+ data-slot="tooltip-content"
73
+ sideOffset={sideOffset}
74
+ className={cn(
75
+ 'bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-[var(--radix-tooltip-content-transform-origin)] rounded-md px-3 py-1.5 text-xs',
76
+ className,
77
+ )}
78
+ {...props}
79
+ >
80
+ {children}
81
+ <TooltipPrimitive.Arrow className="fill-primary z-50 size-2.5 -translate-y-[2px] rounded-[2px]" />
82
+ </TooltipPrimitive.Content>
83
+ </TooltipPrimitive.Portal>
84
+ );
85
+ }
86
+
87
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
@@ -0,0 +1,6 @@
1
+ import { clsx, ClassValue } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs));
6
+ }
@@ -0,0 +1,61 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ declare module 'grapesjs-tailwind' {
3
+ import { Plugin } from 'grapesjs';
4
+
5
+ export type GrapesjsTailwindOptions = {
6
+ blocks?: boolean;
7
+ categories?: boolean;
8
+ classesViewerOptions?: {
9
+ appendTo?: string | HTMLElement;
10
+ open?: boolean;
11
+ showEmpty?: boolean;
12
+ };
13
+ config?: {
14
+ plugins?: any[];
15
+ presets?: any[];
16
+ theme?: Record<string, any>;
17
+ variants?: Record<string, any>;
18
+ };
19
+ customClasses?: string[];
20
+ customTailwindViewerCSS?: string;
21
+ gridDevicesPanel?: boolean;
22
+ importTailwind?: boolean;
23
+ includeLib?: boolean;
24
+ purgeCss?: boolean;
25
+ tailwindConfig?: string;
26
+ tailwindCssPath?: string;
27
+ tailwindExtendUi?: boolean;
28
+ };
29
+
30
+ // eslint-disable-next-line init-declarations
31
+ declare const grapesjsTailwind: Plugin<GrapesjsTailwindOptions>;
32
+ export default grapesjsTailwind;
33
+ }
34
+
35
+ declare module 'sherlockjs' {
36
+ type ParseResult = {
37
+ endDate?: Date;
38
+ eventTitle?: string;
39
+ isAllDay?: boolean;
40
+ startDate?: Date;
41
+ }
42
+
43
+ type Sherlock = {
44
+ parse(text: string): ParseResult;
45
+ }
46
+
47
+ // eslint-disable-next-line init-declarations
48
+ const sherlock: Sherlock;
49
+ export default sherlock;
50
+ }
51
+
52
+ declare module 'recharts/lib' {
53
+ export * from 'recharts';
54
+ }
55
+
56
+ declare module 'recharts/lib/util/DOMUtils' {
57
+ export function getOffset(el: HTMLElement): {
58
+ top: number;
59
+ left: number;
60
+ };
61
+ }
@@ -0,0 +1 @@
1
+ declare module '*.gif';
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ plugins: [
3
+ require("tailwindcss-animate"),
4
+ ],
5
+ }
@@ -0,0 +1,99 @@
1
+ /*
2
+ THE SCRIPT NEEDS ATLEAST NODE 18.
3
+
4
+ This script is meant to compile the tailwind CSS for Canvas and store it in a CSS
5
+ file so that it can be used with GrapeJS.
6
+
7
+ To get a compiled CSS, do the following
8
+ - Add all the components/tailing CSS classes in your code.
9
+ - Once done, run the following command from packages/canvas to generate an output.css
10
+ DEBUG=true npx @tailwindcss/cli -i src/public/canvas.css -o src/public/output.css
11
+
12
+ For component level CSS, update the input and output path accordingly.
13
+ - Once output.css is ready, run this script to replace the compiled CSS in the `css.ts` file.
14
+ Remember to run yarn from the script directory to install all dependencies
15
+ node tooling/tailwind-compiler [--component=<component-name>]
16
+ This should be run from the root of the repository.
17
+ - Once done, commit both the files - output.css and css.ts, and you are done!
18
+ - If you want to generate a component specific CSS, use the --component flag.
19
+ For example, to generate table CSS, run:
20
+ node tooling/tailwind-compiler --component=table
21
+ This will read the input from `src/public/components-css/table/table-output.css`
22
+ and write the output to `src/helpers/table-css.ts`.
23
+ */
24
+
25
+ const fs = require('fs');
26
+ const postcss = require('postcss');
27
+ const autoprefixer = require('autoprefixer');
28
+ const postcssCustomProperties = require('postcss-custom-properties');
29
+
30
+ const argv = process.argv.slice(2);
31
+
32
+ const args = {};
33
+ for (let i = 0; i < argv.length; i++) {
34
+ if (argv[i].startsWith('--')) {
35
+ // Handle both --key=value and --key value formats
36
+ const arg = argv[i].replace(/^--/, '');
37
+ if (arg.includes('=')) {
38
+ const [key, value] = arg.split('=');
39
+ args[key] = value;
40
+ } else {
41
+ const key = arg;
42
+ const value = argv[i + 1] && !argv[i + 1].startsWith('--') ? argv[++i] : true;
43
+ args[key] = value;
44
+ }
45
+ }
46
+ }
47
+
48
+ const PRESETS = {
49
+ generic: {
50
+ input: 'src/public/output.css',
51
+ output: 'src/helpers/css.ts',
52
+ },
53
+ table: {
54
+ input: 'src/public/components-css/table/table-output.css',
55
+ output: 'src/helpers/compiled-table.css',
56
+ },
57
+ };
58
+
59
+ const presetName = (args.component || 'generic').toLowerCase();
60
+ const preset = PRESETS[presetName];
61
+
62
+ // Read your raw CSS input
63
+ const input = fs.readFileSync(preset.input, 'utf8');
64
+
65
+ // Run PostCSS
66
+ postcss([
67
+ {
68
+ postcssPlugin: 'remove-layer-components',
69
+ AtRule(atRule) {
70
+ console.log('IN');
71
+ if (atRule.name === 'layer' || atRule.name === 'media') {
72
+ let nodes = atRule.nodes;
73
+ if (!nodes) {
74
+ nodes = [];
75
+ }
76
+ atRule.replaceWith(nodes);
77
+ }
78
+ },
79
+ },
80
+ postcssCustomProperties({ preserver: false }),
81
+ autoprefixer,
82
+ ])
83
+ .process(input)
84
+ .then((result) => {
85
+ const css = presetName === 'table' ? result.css : result.css.replaceAll('\\', '\\\\')
86
+
87
+ const exportVarName =
88
+ presetName === 'generic'
89
+ ? 'tailwindCompiledCss'
90
+ : `tailwindCompiled${presetName.charAt(0).toUpperCase()}${presetName.slice(1)}Css`;
91
+
92
+ const fileContent = presetName === 'table' ? css : `export const ${exportVarName} = \`${css}\``;
93
+
94
+ fs.writeFileSync(preset.output, fileContent);
95
+ console.log('✅ CSS compiled to ' + preset.output);
96
+ })
97
+ .catch((error) => {
98
+ console.error('❌ Error compiling CSS:', error);
99
+ });
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "canvas-tailwind-compiler",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "license": "MIT",
6
+ "devDependencies": {
7
+ "autoprefixer": "^10.4.21",
8
+ "postcss": "^8.5.3",
9
+ "postcss-custom-properties": "^14.0.4"
10
+ }
11
+ }
@@ -0,0 +1,123 @@
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ "@csstools/cascade-layer-name-parser@^2.0.4":
6
+ version "2.0.4"
7
+ resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz#64d128529397aa1e1c986f685713363b262b81b1"
8
+ integrity sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==
9
+
10
+ "@csstools/css-parser-algorithms@^3.0.4":
11
+ version "3.0.4"
12
+ resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz#74426e93bd1c4dcab3e441f5cc7ba4fb35d94356"
13
+ integrity sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==
14
+
15
+ "@csstools/css-tokenizer@^3.0.3":
16
+ version "3.0.3"
17
+ resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz#a5502c8539265fecbd873c1e395a890339f119c2"
18
+ integrity sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==
19
+
20
+ "@csstools/utilities@^2.0.0":
21
+ version "2.0.0"
22
+ resolved "https://registry.yarnpkg.com/@csstools/utilities/-/utilities-2.0.0.tgz#f7ff0fee38c9ffb5646d47b6906e0bc8868bde60"
23
+ integrity sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==
24
+
25
+ autoprefixer@^10.4.21:
26
+ version "10.4.21"
27
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.21.tgz#77189468e7a8ad1d9a37fbc08efc9f480cf0a95d"
28
+ integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==
29
+ dependencies:
30
+ browserslist "^4.24.4"
31
+ caniuse-lite "^1.0.30001702"
32
+ fraction.js "^4.3.7"
33
+ normalize-range "^0.1.2"
34
+ picocolors "^1.1.1"
35
+ postcss-value-parser "^4.2.0"
36
+
37
+ browserslist@^4.24.4:
38
+ version "4.24.5"
39
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.5.tgz#aa0f5b8560fe81fde84c6dcb38f759bafba0e11b"
40
+ integrity sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==
41
+ dependencies:
42
+ caniuse-lite "^1.0.30001716"
43
+ electron-to-chromium "^1.5.149"
44
+ node-releases "^2.0.19"
45
+ update-browserslist-db "^1.1.3"
46
+
47
+ caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001716:
48
+ version "1.0.30001718"
49
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz#dae13a9c80d517c30c6197515a96131c194d8f82"
50
+ integrity sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==
51
+
52
+ electron-to-chromium@^1.5.149:
53
+ version "1.5.155"
54
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz#809dd0ae9ae1db87c358e0c0c17c09a2ffc432d1"
55
+ integrity sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==
56
+
57
+ escalade@^3.2.0:
58
+ version "3.2.0"
59
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
60
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
61
+
62
+ fraction.js@^4.3.7:
63
+ version "4.3.7"
64
+ resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
65
+ integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
66
+
67
+ nanoid@^3.3.8:
68
+ version "3.3.11"
69
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
70
+ integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
71
+
72
+ node-releases@^2.0.19:
73
+ version "2.0.19"
74
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314"
75
+ integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==
76
+
77
+ normalize-range@^0.1.2:
78
+ version "0.1.2"
79
+ resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
80
+ integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==
81
+
82
+ picocolors@^1.1.1:
83
+ version "1.1.1"
84
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
85
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
86
+
87
+ postcss-custom-properties@^14.0.4:
88
+ version "14.0.4"
89
+ resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz#de9c663285a98833a946d7003a34369d3ce373a9"
90
+ integrity sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==
91
+ dependencies:
92
+ "@csstools/cascade-layer-name-parser" "^2.0.4"
93
+ "@csstools/css-parser-algorithms" "^3.0.4"
94
+ "@csstools/css-tokenizer" "^3.0.3"
95
+ "@csstools/utilities" "^2.0.0"
96
+ postcss-value-parser "^4.2.0"
97
+
98
+ postcss-value-parser@^4.2.0:
99
+ version "4.2.0"
100
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
101
+ integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
102
+
103
+ postcss@^8.5.3:
104
+ version "8.5.3"
105
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb"
106
+ integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==
107
+ dependencies:
108
+ nanoid "^3.3.8"
109
+ picocolors "^1.1.1"
110
+ source-map-js "^1.2.1"
111
+
112
+ source-map-js@^1.2.1:
113
+ version "1.2.1"
114
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
115
+ integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
116
+
117
+ update-browserslist-db@^1.1.3:
118
+ version "1.1.3"
119
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420"
120
+ integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==
121
+ dependencies:
122
+ escalade "^3.2.0"
123
+ picocolors "^1.1.1"
@@ -0,0 +1,15 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "noEmit": false,
5
+ "emitDeclarationOnly": true
6
+ },
7
+ "exclude": [
8
+ "node_modules",
9
+ "**/*.stories.tsx",
10
+ "**/__tests__/*",
11
+ "**/*.test.ts",
12
+ "**/*.test.tsx",
13
+ "scripts"
14
+ ]
15
+ }