@grantcodes/ui 2.15.6 → 2.16.0

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 (300) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/custom-elements.json +476 -346
  3. package/package.json +23 -23
  4. package/src/components/accordion/accordion-item.component.js +17 -19
  5. package/src/components/accordion/accordion-item.css +40 -44
  6. package/src/components/accordion/accordion.component.js +7 -7
  7. package/src/components/accordion/accordion.css +5 -5
  8. package/src/components/accordion/accordion.js +6 -6
  9. package/src/components/accordion/accordion.react.js +6 -6
  10. package/src/components/accordion/accordion.stories.js +10 -10
  11. package/src/components/accordion/accordion.test.js +100 -100
  12. package/src/components/accordion/index.js +6 -6
  13. package/src/components/app-bar/app-bar.component.js +86 -92
  14. package/src/components/app-bar/app-bar.css +187 -203
  15. package/src/components/app-bar/app-bar.js +3 -3
  16. package/src/components/app-bar/app-bar.react.js +9 -9
  17. package/src/components/app-bar/app-bar.stories.js +20 -20
  18. package/src/components/app-bar/app-bar.test.js +190 -237
  19. package/src/components/app-bar/index.js +1 -1
  20. package/src/components/app-bar/nav-link.component.js +7 -9
  21. package/src/components/app-bar/nav-link.css +23 -28
  22. package/src/components/app-bar/nav-link.js +3 -3
  23. package/src/components/app-bar/nav-link.react.js +6 -6
  24. package/src/components/avatar/avatar.component.js +79 -68
  25. package/src/components/avatar/avatar.css +18 -18
  26. package/src/components/avatar/avatar.js +3 -3
  27. package/src/components/avatar/avatar.react.js +6 -6
  28. package/src/components/avatar/avatar.stories.js +24 -23
  29. package/src/components/avatar/avatar.test.js +128 -84
  30. package/src/components/avatar/index.js +1 -1
  31. package/src/components/badge/badge.component.js +23 -23
  32. package/src/components/badge/badge.css +39 -52
  33. package/src/components/badge/badge.js +3 -3
  34. package/src/components/badge/badge.react.js +6 -6
  35. package/src/components/badge/badge.stories.js +23 -23
  36. package/src/components/badge/badge.test.js +53 -68
  37. package/src/components/badge/index.js +1 -1
  38. package/src/components/breadcrumb/breadcrumb.component.js +95 -96
  39. package/src/components/breadcrumb/breadcrumb.css +42 -44
  40. package/src/components/breadcrumb/breadcrumb.js +6 -9
  41. package/src/components/breadcrumb/breadcrumb.react.js +9 -12
  42. package/src/components/breadcrumb/breadcrumb.stories.js +5 -5
  43. package/src/components/breadcrumb/breadcrumb.test.js +139 -151
  44. package/src/components/breadcrumb/index.js +1 -1
  45. package/src/components/button/button.component.js +101 -103
  46. package/src/components/button/button.css +90 -94
  47. package/src/components/button/button.js +3 -3
  48. package/src/components/button/button.react.js +6 -6
  49. package/src/components/button/button.stories.js +25 -25
  50. package/src/components/button/button.test.js +324 -344
  51. package/src/components/button/index.js +1 -1
  52. package/src/components/button-group/button-group.component.js +18 -18
  53. package/src/components/button-group/button-group.css +16 -16
  54. package/src/components/button-group/button-group.js +3 -3
  55. package/src/components/button-group/button-group.react.js +6 -6
  56. package/src/components/button-group/button-group.stories.js +23 -23
  57. package/src/components/button-group/button-group.test.js +54 -54
  58. package/src/components/button-group/index.js +1 -1
  59. package/src/components/card/card.component.js +31 -33
  60. package/src/components/card/card.css +85 -85
  61. package/src/components/card/card.js +4 -4
  62. package/src/components/card/card.react.js +6 -6
  63. package/src/components/card/card.stories.js +27 -26
  64. package/src/components/card/card.test.js +56 -56
  65. package/src/components/card/index.js +1 -1
  66. package/src/components/code-preview/code-preview.component.js +47 -48
  67. package/src/components/code-preview/code-preview.css +11 -11
  68. package/src/components/code-preview/code-preview.js +3 -3
  69. package/src/components/code-preview/code-preview.react.js +6 -6
  70. package/src/components/code-preview/code-preview.stories.js +29 -29
  71. package/src/components/code-preview/code-preview.test.js +112 -135
  72. package/src/components/code-preview/index.js +1 -1
  73. package/src/components/container/container.component.js +27 -27
  74. package/src/components/container/container.css +22 -22
  75. package/src/components/container/container.js +3 -3
  76. package/src/components/container/container.react.js +6 -6
  77. package/src/components/container/container.stories.js +44 -44
  78. package/src/components/container/container.test.js +54 -66
  79. package/src/components/container/index.js +1 -1
  80. package/src/components/countdown/countdown.component.js +160 -162
  81. package/src/components/countdown/countdown.css +50 -34
  82. package/src/components/countdown/countdown.js +3 -3
  83. package/src/components/countdown/countdown.react.js +6 -6
  84. package/src/components/countdown/countdown.stories.js +34 -34
  85. package/src/components/countdown/index.js +1 -1
  86. package/src/components/cta/cta.component.js +77 -81
  87. package/src/components/cta/cta.css +24 -24
  88. package/src/components/cta/cta.js +3 -3
  89. package/src/components/cta/cta.react.js +6 -6
  90. package/src/components/cta/cta.stories.js +32 -32
  91. package/src/components/cta/index.js +1 -1
  92. package/src/components/dialog/dialog.component.js +95 -58
  93. package/src/components/dialog/dialog.css +45 -50
  94. package/src/components/dialog/dialog.js +3 -3
  95. package/src/components/dialog/dialog.react.js +6 -6
  96. package/src/components/dialog/dialog.stories.js +38 -29
  97. package/src/components/dialog/dialog.test.js +188 -102
  98. package/src/components/dialog/index.js +1 -1
  99. package/src/components/dropdown/dropdown.component.js +220 -201
  100. package/src/components/dropdown/dropdown.css +60 -84
  101. package/src/components/dropdown/dropdown.js +6 -9
  102. package/src/components/dropdown/dropdown.react.js +15 -15
  103. package/src/components/dropdown/dropdown.stories.js +10 -10
  104. package/src/components/dropdown/dropdown.test.js +211 -157
  105. package/src/components/dropdown/index.js +1 -1
  106. package/src/components/dropzone/dropzone.component.js +126 -129
  107. package/src/components/dropzone/dropzone.css +35 -37
  108. package/src/components/dropzone/dropzone.js +3 -3
  109. package/src/components/dropzone/dropzone.react.js +6 -6
  110. package/src/components/dropzone/dropzone.stories.js +28 -28
  111. package/src/components/dropzone/dropzone.test.js +91 -99
  112. package/src/components/dropzone/index.js +1 -1
  113. package/src/components/feature-list/feature-list.component.js +78 -86
  114. package/src/components/feature-list/feature-list.css +37 -37
  115. package/src/components/feature-list/feature-list.js +3 -3
  116. package/src/components/feature-list/feature-list.react.js +6 -6
  117. package/src/components/feature-list/feature-list.stories.js +86 -90
  118. package/src/components/feature-list/index.js +1 -1
  119. package/src/components/footer/footer-column.component.js +7 -7
  120. package/src/components/footer/footer-column.css +22 -22
  121. package/src/components/footer/footer.component.js +19 -19
  122. package/src/components/footer/footer.css +38 -38
  123. package/src/components/footer/footer.js +8 -8
  124. package/src/components/footer/footer.react.js +9 -9
  125. package/src/components/footer/footer.stories.js +9 -9
  126. package/src/components/footer/footer.test.js +101 -111
  127. package/src/components/footer/index.js +2 -2
  128. package/src/components/form-field/form-field.component.js +167 -125
  129. package/src/components/form-field/form-field.css +24 -24
  130. package/src/components/form-field/form-field.js +3 -3
  131. package/src/components/form-field/form-field.react.js +6 -6
  132. package/src/components/form-field/form-field.stories.js +53 -44
  133. package/src/components/form-field/form-field.test.js +280 -134
  134. package/src/components/form-field/index.js +1 -1
  135. package/src/components/gallery/gallery-image.component.js +30 -30
  136. package/src/components/gallery/gallery-image.js +3 -3
  137. package/src/components/gallery/gallery-image.react.js +6 -6
  138. package/src/components/gallery/gallery.component.js +24 -17
  139. package/src/components/gallery/gallery.css +79 -72
  140. package/src/components/gallery/gallery.js +3 -3
  141. package/src/components/gallery/gallery.react.js +6 -6
  142. package/src/components/gallery/gallery.stories.js +69 -68
  143. package/src/components/gallery/gallery.test.js +95 -88
  144. package/src/components/gallery/index.js +2 -2
  145. package/src/components/hero/hero.component.js +53 -57
  146. package/src/components/hero/hero.css +27 -27
  147. package/src/components/hero/hero.js +3 -3
  148. package/src/components/hero/hero.react.js +6 -6
  149. package/src/components/hero/hero.stories.js +39 -39
  150. package/src/components/hero/index.js +1 -1
  151. package/src/components/icon/icon.component.js +10 -10
  152. package/src/components/icon/icon.css +13 -13
  153. package/src/components/icon/icon.js +4 -4
  154. package/src/components/icon/icon.react.js +6 -6
  155. package/src/components/icon/icon.stories.js +8 -9
  156. package/src/components/icon/icon.test.js +54 -55
  157. package/src/components/icon/index.js +1 -1
  158. package/src/components/loading/index.js +1 -1
  159. package/src/components/loading/loading.component.js +41 -14
  160. package/src/components/loading/loading.css +47 -30
  161. package/src/components/loading/loading.js +4 -4
  162. package/src/components/loading/loading.react.js +6 -6
  163. package/src/components/loading/loading.stories.js +19 -18
  164. package/src/components/loading/loading.test.js +77 -54
  165. package/src/components/logo-cloud/index.js +1 -1
  166. package/src/components/logo-cloud/logo-cloud.component.js +39 -43
  167. package/src/components/logo-cloud/logo-cloud.css +31 -31
  168. package/src/components/logo-cloud/logo-cloud.js +3 -3
  169. package/src/components/logo-cloud/logo-cloud.react.js +6 -6
  170. package/src/components/logo-cloud/logo-cloud.stories.js +80 -80
  171. package/src/components/map/index.js +1 -1
  172. package/src/components/map/map.component.js +103 -107
  173. package/src/components/map/map.css +22 -22
  174. package/src/components/map/map.js +3 -3
  175. package/src/components/map/map.react.js +6 -6
  176. package/src/components/map/map.stories.js +38 -38
  177. package/src/components/media-text/index.js +1 -1
  178. package/src/components/media-text/media-text.component.js +76 -70
  179. package/src/components/media-text/media-text.css +32 -32
  180. package/src/components/media-text/media-text.js +3 -3
  181. package/src/components/media-text/media-text.react.js +6 -6
  182. package/src/components/media-text/media-text.stories.js +45 -45
  183. package/src/components/media-text/media-text.test.js +72 -0
  184. package/src/components/newsletter/index.js +1 -1
  185. package/src/components/newsletter/newsletter.component.js +56 -64
  186. package/src/components/newsletter/newsletter.css +48 -48
  187. package/src/components/newsletter/newsletter.js +3 -3
  188. package/src/components/newsletter/newsletter.react.js +6 -6
  189. package/src/components/newsletter/newsletter.stories.js +35 -35
  190. package/src/components/notice/index.js +1 -1
  191. package/src/components/notice/notice.component.js +66 -55
  192. package/src/components/notice/notice.css +37 -38
  193. package/src/components/notice/notice.js +3 -3
  194. package/src/components/notice/notice.react.js +6 -6
  195. package/src/components/notice/notice.stories.js +54 -53
  196. package/src/components/notice/notice.test.js +210 -156
  197. package/src/components/pagination/index.js +1 -1
  198. package/src/components/pagination/pagination.component.js +44 -44
  199. package/src/components/pagination/pagination.css +6 -6
  200. package/src/components/pagination/pagination.js +4 -4
  201. package/src/components/pagination/pagination.react.js +6 -6
  202. package/src/components/pagination/pagination.stories.js +20 -18
  203. package/src/components/pagination/pagination.test.js +95 -102
  204. package/src/components/person/index.js +1 -1
  205. package/src/components/person/person.component.js +29 -29
  206. package/src/components/person/person.css +17 -17
  207. package/src/components/person/person.js +4 -4
  208. package/src/components/person/person.react.js +6 -6
  209. package/src/components/person/person.stories.js +34 -33
  210. package/src/components/person/person.test.js +55 -68
  211. package/src/components/pricing/index.js +1 -1
  212. package/src/components/pricing/pricing.component.js +58 -70
  213. package/src/components/pricing/pricing.css +65 -65
  214. package/src/components/pricing/pricing.js +3 -3
  215. package/src/components/pricing/pricing.react.js +6 -6
  216. package/src/components/pricing/pricing.stories.js +96 -96
  217. package/src/components/sidebar/index.js +1 -1
  218. package/src/components/sidebar/sidebar.component.js +157 -130
  219. package/src/components/sidebar/sidebar.css +118 -115
  220. package/src/components/sidebar/sidebar.js +4 -4
  221. package/src/components/sidebar/sidebar.react.js +10 -10
  222. package/src/components/sidebar/sidebar.stories.js +10 -10
  223. package/src/components/sidebar/sidebar.test.js +250 -230
  224. package/src/components/stats/index.js +1 -1
  225. package/src/components/stats/stats.component.js +42 -50
  226. package/src/components/stats/stats.css +29 -29
  227. package/src/components/stats/stats.js +3 -3
  228. package/src/components/stats/stats.react.js +6 -6
  229. package/src/components/stats/stats.stories.js +40 -40
  230. package/src/components/tabs/index.js +2 -2
  231. package/src/components/tabs/internal/tabs-button.component.js +16 -27
  232. package/src/components/tabs/internal/tabs-button.js +3 -3
  233. package/src/components/tabs/internal/tabs-button.react.js +6 -6
  234. package/src/components/tabs/internal/tabs-item.component.js +30 -30
  235. package/src/components/tabs/tab.component.js +9 -11
  236. package/src/components/tabs/tab.js +3 -3
  237. package/src/components/tabs/tab.react.js +6 -6
  238. package/src/components/tabs/tabs.component.js +107 -109
  239. package/src/components/tabs/tabs.css +50 -59
  240. package/src/components/tabs/tabs.js +4 -4
  241. package/src/components/tabs/tabs.react.js +6 -6
  242. package/src/components/tabs/tabs.stories.js +23 -22
  243. package/src/components/tabs/tabs.test.js +201 -147
  244. package/src/components/testimonials/index.js +1 -1
  245. package/src/components/testimonials/testimonials.component.js +47 -51
  246. package/src/components/testimonials/testimonials.css +31 -31
  247. package/src/components/testimonials/testimonials.js +3 -3
  248. package/src/components/testimonials/testimonials.react.js +6 -6
  249. package/src/components/testimonials/testimonials.stories.js +49 -51
  250. package/src/components/toast/index.js +1 -1
  251. package/src/components/toast/toast.component.js +217 -148
  252. package/src/components/toast/toast.css +101 -99
  253. package/src/components/toast/toast.js +6 -9
  254. package/src/components/toast/toast.react.js +12 -12
  255. package/src/components/toast/toast.stories.js +75 -49
  256. package/src/components/toast/toast.test.js +260 -221
  257. package/src/components/tooltip/index.js +1 -1
  258. package/src/components/tooltip/tooltip.component.js +56 -49
  259. package/src/components/tooltip/tooltip.css +61 -50
  260. package/src/components/tooltip/tooltip.js +4 -4
  261. package/src/components/tooltip/tooltip.react.js +6 -6
  262. package/src/components/tooltip/tooltip.stories.js +24 -23
  263. package/src/components/tooltip/tooltip.test.js +143 -155
  264. package/src/constructor.test.js +31 -0
  265. package/src/css/base.css +1 -0
  266. package/src/css/colors.stories.js +120 -122
  267. package/src/css/elements/a.css +28 -28
  268. package/src/css/elements/forms/button.css +1 -1
  269. package/src/css/elements/forms/input.css +80 -80
  270. package/src/css/elements/forms/label.css +3 -3
  271. package/src/css/elements/media/image.css +2 -2
  272. package/src/css/elements.stories.js +48 -49
  273. package/src/css/helpers.css +8 -8
  274. package/src/css/layers.stories.js +5 -5
  275. package/src/css/reset.css +102 -102
  276. package/src/css/themes/todomap.css +1 -1
  277. package/src/css/tokens.stories.js +50 -53
  278. package/src/css/typography.css +30 -32
  279. package/src/css/typography.stories.js +92 -92
  280. package/src/css/util/focus-ring.css +12 -20
  281. package/src/css/view-transitions.css +16 -0
  282. package/src/exports.test.js +89 -105
  283. package/src/icons.js +1 -1
  284. package/src/lib/generate-id.js +1 -1
  285. package/src/lib/slot-presence-controller.js +48 -0
  286. package/src/lib/styles/all.css +38 -37
  287. package/src/lib/styles/focus-ring.css +12 -20
  288. package/src/lib/view-transition.js +42 -0
  289. package/src/lib/view-transition.test.js +105 -0
  290. package/src/main.js +29 -29
  291. package/src/pages/agency.stories.js +59 -59
  292. package/src/pages/blog-post.stories.js +48 -48
  293. package/src/pages/saas-landing.stories.js +180 -180
  294. package/src/react.js +44 -44
  295. package/src/react.test.js +42 -51
  296. package/src/test-utils/assert-helpers.js +39 -58
  297. package/src/test-utils/events.js +32 -34
  298. package/src/test-utils/fixture.js +31 -31
  299. package/src/test-utils/index.js +3 -3
  300. package/src/types.d.ts +3 -3
@@ -1,21 +1,21 @@
1
- import { html } from "lit";
2
- import "../components/app-bar/app-bar.js";
3
- import "../components/app-bar/nav-link.js";
4
- import "../components/button/button.js";
5
- import "../components/hero/hero.js";
6
- import "../components/logo-cloud/logo-cloud.js";
7
- import "../components/feature-list/feature-list.js";
8
- import "../components/stats/stats.js";
9
- import "../components/testimonials/testimonials.js";
10
- import "../components/pricing/pricing.js";
11
- import "../components/newsletter/newsletter.js";
12
- import "../components/footer/footer.js";
1
+ import { html } from 'lit';
2
+ import '../components/app-bar/app-bar.js';
3
+ import '../components/app-bar/nav-link.js';
4
+ import '../components/button/button.js';
5
+ import '../components/hero/hero.js';
6
+ import '../components/logo-cloud/logo-cloud.js';
7
+ import '../components/feature-list/feature-list.js';
8
+ import '../components/stats/stats.js';
9
+ import '../components/testimonials/testimonials.js';
10
+ import '../components/pricing/pricing.js';
11
+ import '../components/newsletter/newsletter.js';
12
+ import '../components/footer/footer.js';
13
13
 
14
14
  const meta = {
15
- title: "Pages/SaaS Landing",
16
- parameters: {
17
- layout: "fullscreen",
18
- },
15
+ title: 'Pages/SaaS Landing',
16
+ parameters: {
17
+ layout: 'fullscreen',
18
+ },
19
19
  };
20
20
 
21
21
  export default meta;
@@ -70,7 +70,7 @@ const footerContent = html`
70
70
  * feature-list, stats, testimonials, pricing, newsletter, and footer.
71
71
  */
72
72
  export const Default = {
73
- render: () => html`
73
+ render: () => html`
74
74
  <grantcodes-app-bar sticky>
75
75
  <a slot="logo" href="/" style="font-weight: 700; font-size: 1.25rem; text-decoration: none; color: inherit;">
76
76
  Flowbase
@@ -95,37 +95,37 @@ export const Default = {
95
95
  <grantcodes-logo-cloud
96
96
  title="Trusted by teams at"
97
97
  logos=${JSON.stringify([
98
- {
99
- name: "Vercel",
100
- src: "https://placehold.co/120x40?text=Vercel",
101
- alt: "Vercel",
102
- },
103
- {
104
- name: "Linear",
105
- src: "https://placehold.co/120x40?text=Linear",
106
- alt: "Linear",
107
- },
108
- {
109
- name: "Stripe",
110
- src: "https://placehold.co/120x40?text=Stripe",
111
- alt: "Stripe",
112
- },
113
- {
114
- name: "Notion",
115
- src: "https://placehold.co/120x40?text=Notion",
116
- alt: "Notion",
117
- },
118
- {
119
- name: "Figma",
120
- src: "https://placehold.co/120x40?text=Figma",
121
- alt: "Figma",
122
- },
123
- {
124
- name: "Loom",
125
- src: "https://placehold.co/120x40?text=Loom",
126
- alt: "Loom",
127
- },
128
- ])}
98
+ {
99
+ name: 'Vercel',
100
+ src: 'https://placehold.co/120x40?text=Vercel',
101
+ alt: 'Vercel',
102
+ },
103
+ {
104
+ name: 'Linear',
105
+ src: 'https://placehold.co/120x40?text=Linear',
106
+ alt: 'Linear',
107
+ },
108
+ {
109
+ name: 'Stripe',
110
+ src: 'https://placehold.co/120x40?text=Stripe',
111
+ alt: 'Stripe',
112
+ },
113
+ {
114
+ name: 'Notion',
115
+ src: 'https://placehold.co/120x40?text=Notion',
116
+ alt: 'Notion',
117
+ },
118
+ {
119
+ name: 'Figma',
120
+ src: 'https://placehold.co/120x40?text=Figma',
121
+ alt: 'Figma',
122
+ },
123
+ {
124
+ name: 'Loom',
125
+ src: 'https://placehold.co/120x40?text=Loom',
126
+ alt: 'Loom',
127
+ },
128
+ ])}
129
129
  ></grantcodes-logo-cloud>
130
130
 
131
131
  <grantcodes-feature-list
@@ -133,156 +133,156 @@ export const Default = {
133
133
  subtitle="Flowbase combines the tools you already love into a single, cohesive experience — so your team stays in flow."
134
134
  columns="3"
135
135
  items=${JSON.stringify([
136
- {
137
- title: "Task management",
138
- description:
139
- "Create, assign, and track work across your entire team with a simple, powerful interface.",
140
- icon: "check-square",
141
- },
142
- {
143
- title: "Real-time docs",
144
- description:
145
- "Write collaboratively without conflicts. Docs live next to the tasks they belong to.",
146
- icon: "file-text",
147
- },
148
- {
149
- title: "CI/CD pipelines",
150
- description:
151
- "Trigger builds, run tests, and deploy to production without leaving your workspace.",
152
- icon: "git-branch",
153
- },
154
- {
155
- title: "Team inbox",
156
- description:
157
- "Pull in Slack, email, and GitHub notifications into one shared inbox your team can triage together.",
158
- icon: "inbox",
159
- },
160
- {
161
- title: "Analytics",
162
- description:
163
- "Understand velocity, cycle time, and deployment frequency with built-in engineering metrics.",
164
- icon: "bar-chart-2",
165
- },
166
- {
167
- title: "Access controls",
168
- description:
169
- "Fine-grained roles and SSO keep your data secure without slowing your team down.",
170
- icon: "shield",
171
- },
172
- ])}
136
+ {
137
+ title: 'Task management',
138
+ description:
139
+ 'Create, assign, and track work across your entire team with a simple, powerful interface.',
140
+ icon: 'check-square',
141
+ },
142
+ {
143
+ title: 'Real-time docs',
144
+ description:
145
+ 'Write collaboratively without conflicts. Docs live next to the tasks they belong to.',
146
+ icon: 'file-text',
147
+ },
148
+ {
149
+ title: 'CI/CD pipelines',
150
+ description:
151
+ 'Trigger builds, run tests, and deploy to production without leaving your workspace.',
152
+ icon: 'git-branch',
153
+ },
154
+ {
155
+ title: 'Team inbox',
156
+ description:
157
+ 'Pull in Slack, email, and GitHub notifications into one shared inbox your team can triage together.',
158
+ icon: 'inbox',
159
+ },
160
+ {
161
+ title: 'Analytics',
162
+ description:
163
+ 'Understand velocity, cycle time, and deployment frequency with built-in engineering metrics.',
164
+ icon: 'bar-chart-2',
165
+ },
166
+ {
167
+ title: 'Access controls',
168
+ description:
169
+ 'Fine-grained roles and SSO keep your data secure without slowing your team down.',
170
+ icon: 'shield',
171
+ },
172
+ ])}
173
173
  ></grantcodes-feature-list>
174
174
 
175
175
  <grantcodes-stats
176
176
  title="Built for teams that care about output"
177
177
  columns="4"
178
178
  items=${JSON.stringify([
179
- {
180
- value: "12×",
181
- label: "Faster shipping",
182
- context: "compared to teams using 4+ separate tools",
183
- },
184
- {
185
- value: "98%",
186
- label: "Uptime SLA",
187
- context: "backed by our enterprise plan",
188
- },
189
- {
190
- value: "50k+",
191
- label: "Active teams",
192
- context: "across 80 countries",
193
- },
194
- {
195
- value: "4.9 / 5",
196
- label: "Customer rating",
197
- context: "across G2, Capterra, and Product Hunt",
198
- },
199
- ])}
179
+ {
180
+ value: '12×',
181
+ label: 'Faster shipping',
182
+ context: 'compared to teams using 4+ separate tools',
183
+ },
184
+ {
185
+ value: '98%',
186
+ label: 'Uptime SLA',
187
+ context: 'backed by our enterprise plan',
188
+ },
189
+ {
190
+ value: '50k+',
191
+ label: 'Active teams',
192
+ context: 'across 80 countries',
193
+ },
194
+ {
195
+ value: '4.9 / 5',
196
+ label: 'Customer rating',
197
+ context: 'across G2, Capterra, and Product Hunt',
198
+ },
199
+ ])}
200
200
  ></grantcodes-stats>
201
201
 
202
202
  <grantcodes-testimonials
203
203
  title="What teams are saying"
204
204
  layout="cards"
205
205
  items=${JSON.stringify([
206
- {
207
- quote:
208
- "We cut our weekly planning meeting from 90 minutes to 15. Flowbase just… makes it obvious what needs to happen next.",
209
- name: "Maya Okafor",
210
- role: "Engineering Lead",
211
- company: "Pulse Labs",
212
- avatar: "https://i.pravatar.cc/80?img=47",
213
- },
214
- {
215
- quote:
216
- "I've tried every project tool out there. Flowbase is the first one that didn't need a dedicated Ops person to keep it clean.",
217
- name: "Sam Torres",
218
- role: "CTO",
219
- company: "Stackform",
220
- avatar: "https://i.pravatar.cc/80?img=12",
221
- },
222
- {
223
- quote:
224
- "The CI integration alone saved us four hours a week. The rest is just a bonus at this point.",
225
- name: "Priya Nair",
226
- role: "Senior Developer",
227
- company: "Mintcode",
228
- avatar: "https://i.pravatar.cc/80?img=32",
229
- },
230
- ])}
206
+ {
207
+ quote:
208
+ 'We cut our weekly planning meeting from 90 minutes to 15. Flowbase just… makes it obvious what needs to happen next.',
209
+ name: 'Maya Okafor',
210
+ role: 'Engineering Lead',
211
+ company: 'Pulse Labs',
212
+ avatar: 'https://i.pravatar.cc/80?img=47',
213
+ },
214
+ {
215
+ quote:
216
+ "I've tried every project tool out there. Flowbase is the first one that didn't need a dedicated Ops person to keep it clean.",
217
+ name: 'Sam Torres',
218
+ role: 'CTO',
219
+ company: 'Stackform',
220
+ avatar: 'https://i.pravatar.cc/80?img=12',
221
+ },
222
+ {
223
+ quote:
224
+ 'The CI integration alone saved us four hours a week. The rest is just a bonus at this point.',
225
+ name: 'Priya Nair',
226
+ role: 'Senior Developer',
227
+ company: 'Mintcode',
228
+ avatar: 'https://i.pravatar.cc/80?img=32',
229
+ },
230
+ ])}
231
231
  ></grantcodes-testimonials>
232
232
 
233
233
  <grantcodes-pricing
234
234
  title="Simple, honest pricing"
235
235
  subtitle="No per-seat surprises. No feature gating. Pick the plan that fits your team size."
236
236
  tiers=${JSON.stringify([
237
- {
238
- name: "Starter",
239
- price: "Free",
240
- period: "",
241
- description: "For solo developers and small side projects.",
242
- features: [
243
- { text: "Up to 3 team members", included: true },
244
- { text: "Unlimited tasks", included: true },
245
- { text: "5 GB storage", included: true },
246
- { text: "CI/CD pipelines", included: false },
247
- { text: "SSO", included: false },
248
- { text: "Priority support", included: false },
249
- ],
250
- cta: { label: "Get started free", href: "/signup" },
251
- highlighted: false,
252
- },
253
- {
254
- name: "Team",
255
- price: "$49",
256
- period: "month",
257
- description: "For growing teams that need to move fast.",
258
- features: [
259
- { text: "Up to 20 team members", included: true },
260
- { text: "Unlimited tasks", included: true },
261
- { text: "50 GB storage", included: true },
262
- { text: "CI/CD pipelines", included: true },
263
- { text: "SSO", included: false },
264
- { text: "Priority support", included: false },
265
- ],
266
- cta: { label: "Start free trial", href: "/signup?plan=team" },
267
- highlighted: true,
268
- },
269
- {
270
- name: "Enterprise",
271
- price: "$149",
272
- period: "month",
273
- description: "For large teams with advanced security needs.",
274
- features: [
275
- { text: "Unlimited team members", included: true },
276
- { text: "Unlimited tasks", included: true },
277
- { text: "500 GB storage", included: true },
278
- { text: "CI/CD pipelines", included: true },
279
- { text: "SSO", included: true },
280
- { text: "Priority support", included: true },
281
- ],
282
- cta: { label: "Contact sales", href: "/contact" },
283
- highlighted: false,
284
- },
285
- ])}
237
+ {
238
+ name: 'Starter',
239
+ price: 'Free',
240
+ period: '',
241
+ description: 'For solo developers and small side projects.',
242
+ features: [
243
+ { text: 'Up to 3 team members', included: true },
244
+ { text: 'Unlimited tasks', included: true },
245
+ { text: '5 GB storage', included: true },
246
+ { text: 'CI/CD pipelines', included: false },
247
+ { text: 'SSO', included: false },
248
+ { text: 'Priority support', included: false },
249
+ ],
250
+ cta: { label: 'Get started free', href: '/signup' },
251
+ highlighted: false,
252
+ },
253
+ {
254
+ name: 'Team',
255
+ price: '$49',
256
+ period: 'month',
257
+ description: 'For growing teams that need to move fast.',
258
+ features: [
259
+ { text: 'Up to 20 team members', included: true },
260
+ { text: 'Unlimited tasks', included: true },
261
+ { text: '50 GB storage', included: true },
262
+ { text: 'CI/CD pipelines', included: true },
263
+ { text: 'SSO', included: false },
264
+ { text: 'Priority support', included: false },
265
+ ],
266
+ cta: { label: 'Start free trial', href: '/signup?plan=team' },
267
+ highlighted: true,
268
+ },
269
+ {
270
+ name: 'Enterprise',
271
+ price: '$149',
272
+ period: 'month',
273
+ description: 'For large teams with advanced security needs.',
274
+ features: [
275
+ { text: 'Unlimited team members', included: true },
276
+ { text: 'Unlimited tasks', included: true },
277
+ { text: '500 GB storage', included: true },
278
+ { text: 'CI/CD pipelines', included: true },
279
+ { text: 'SSO', included: true },
280
+ { text: 'Priority support', included: true },
281
+ ],
282
+ cta: { label: 'Contact sales', href: '/contact' },
283
+ highlighted: false,
284
+ },
285
+ ])}
286
286
  ></grantcodes-pricing>
287
287
 
288
288
  <grantcodes-newsletter
package/src/react.js CHANGED
@@ -1,46 +1,46 @@
1
- export { Accordion } from "./components/accordion/accordion.react.js";
2
- export { AppBar } from "./components/app-bar/app-bar.react.js";
3
- export { NavLink } from "./components/app-bar/nav-link.react.js";
4
- export { Avatar } from "./components/avatar/avatar.react.js";
5
- export { Badge } from "./components/badge/badge.react.js";
1
+ export { Accordion } from './components/accordion/accordion.react.js';
2
+ export { AppBar } from './components/app-bar/app-bar.react.js';
3
+ export { NavLink } from './components/app-bar/nav-link.react.js';
4
+ export { Avatar } from './components/avatar/avatar.react.js';
5
+ export { Badge } from './components/badge/badge.react.js';
6
6
  export {
7
- Breadcrumb,
8
- BreadcrumbItem,
9
- } from "./components/breadcrumb/breadcrumb.react.js";
10
- export { Button } from "./components/button/button.react.js";
11
- export { ButtonGroup } from "./components/button-group/button-group.react.js";
12
- export { Card } from "./components/card/card.react.js";
13
- export { CodePreview } from "./components/code-preview/code-preview.react.js";
14
- export { Container } from "./components/container/container.react.js";
15
- export { Countdown } from "./components/countdown/countdown.react.js";
16
- export { Cta } from "./components/cta/cta.react.js";
17
- export { Dialog } from "./components/dialog/dialog.react.js";
7
+ Breadcrumb,
8
+ BreadcrumbItem,
9
+ } from './components/breadcrumb/breadcrumb.react.js';
10
+ export { Button } from './components/button/button.react.js';
11
+ export { ButtonGroup } from './components/button-group/button-group.react.js';
12
+ export { Card } from './components/card/card.react.js';
13
+ export { CodePreview } from './components/code-preview/code-preview.react.js';
14
+ export { Container } from './components/container/container.react.js';
15
+ export { Countdown } from './components/countdown/countdown.react.js';
16
+ export { Cta } from './components/cta/cta.react.js';
17
+ export { Dialog } from './components/dialog/dialog.react.js';
18
18
  export {
19
- Dropdown,
20
- DropdownItem,
21
- } from "./components/dropdown/dropdown.react.js";
22
- export { Dropzone } from "./components/dropzone/dropzone.react.js";
23
- export { FeatureList } from "./components/feature-list/feature-list.react.js";
24
- export { Footer, FooterColumn } from "./components/footer/footer.react.js";
25
- export { FormField } from "./components/form-field/form-field.react.js";
26
- export { Gallery } from "./components/gallery/gallery.react.js";
27
- export { GalleryImage } from "./components/gallery/gallery-image.react.js";
28
- export { Hero } from "./components/hero/hero.react.js";
29
- export { Icon } from "./components/icon/icon.react.js";
30
- export { Loading } from "./components/loading/loading.react.js";
31
- export { LogoCloud } from "./components/logo-cloud/logo-cloud.react.js";
32
- export { MapEmbed } from "./components/map/map.react.js";
33
- export { MediaText } from "./components/media-text/media-text.react.js";
34
- export { Newsletter } from "./components/newsletter/newsletter.react.js";
35
- export { Notice } from "./components/notice/notice.react.js";
36
- export { Pagination } from "./components/pagination/pagination.react.js";
37
- export { Person } from "./components/person/person.react.js";
38
- export { Pricing } from "./components/pricing/pricing.react.js";
39
- export { Sidebar } from "./components/sidebar/sidebar.react.js";
40
- export { Stats } from "./components/stats/stats.react.js";
41
- export { Tab } from "./components/tabs/tab.react.js";
42
- export { Tabs } from "./components/tabs/tabs.react.js";
43
- export { TabsButton } from "./components/tabs/internal/tabs-button.react.js";
44
- export { Testimonials } from "./components/testimonials/testimonials.react.js";
45
- export { Toast, ToastContainer } from "./components/toast/toast.react.js";
46
- export { Tooltip } from "./components/tooltip/tooltip.react.js";
19
+ Dropdown,
20
+ DropdownItem,
21
+ } from './components/dropdown/dropdown.react.js';
22
+ export { Dropzone } from './components/dropzone/dropzone.react.js';
23
+ export { FeatureList } from './components/feature-list/feature-list.react.js';
24
+ export { Footer, FooterColumn } from './components/footer/footer.react.js';
25
+ export { FormField } from './components/form-field/form-field.react.js';
26
+ export { Gallery } from './components/gallery/gallery.react.js';
27
+ export { GalleryImage } from './components/gallery/gallery-image.react.js';
28
+ export { Hero } from './components/hero/hero.react.js';
29
+ export { Icon } from './components/icon/icon.react.js';
30
+ export { Loading } from './components/loading/loading.react.js';
31
+ export { LogoCloud } from './components/logo-cloud/logo-cloud.react.js';
32
+ export { MapEmbed } from './components/map/map.react.js';
33
+ export { MediaText } from './components/media-text/media-text.react.js';
34
+ export { Newsletter } from './components/newsletter/newsletter.react.js';
35
+ export { Notice } from './components/notice/notice.react.js';
36
+ export { Pagination } from './components/pagination/pagination.react.js';
37
+ export { Person } from './components/person/person.react.js';
38
+ export { Pricing } from './components/pricing/pricing.react.js';
39
+ export { Sidebar } from './components/sidebar/sidebar.react.js';
40
+ export { Stats } from './components/stats/stats.react.js';
41
+ export { TabsButton } from './components/tabs/internal/tabs-button.react.js';
42
+ export { Tab } from './components/tabs/tab.react.js';
43
+ export { Tabs } from './components/tabs/tabs.react.js';
44
+ export { Testimonials } from './components/testimonials/testimonials.react.js';
45
+ export { Toast, ToastContainer } from './components/toast/toast.react.js';
46
+ export { Tooltip } from './components/tooltip/tooltip.react.js';
package/src/react.test.js CHANGED
@@ -1,56 +1,47 @@
1
- import { describe, it } from "node:test";
2
- import { strict as assert } from "node:assert";
1
+ import { strict as assert } from 'node:assert';
2
+ import { describe, it } from 'node:test';
3
3
 
4
- describe("React Wrappers", () => {
5
- it("should export all component wrappers", async () => {
6
- const react = await import("./react.js");
7
- assert.ok(react.Button, "Button wrapper should be exported");
8
- assert.ok(react.Card, "Card wrapper should be exported");
9
- assert.ok(react.Dialog, "Dialog wrapper should be exported");
10
- assert.ok(react.Accordion, "Accordion wrapper should be exported");
11
- assert.ok(react.Tooltip, "Tooltip wrapper should be exported");
12
- assert.ok(react.Hero, "Hero wrapper should be exported");
13
- assert.ok(react.Container, "Container wrapper should be exported");
14
- assert.ok(react.Icon, "Icon wrapper should be exported");
15
- assert.ok(react.Loading, "Loading wrapper should be exported");
16
- assert.ok(react.Notice, "Notice wrapper should be exported");
17
- });
4
+ describe('React Wrappers', () => {
5
+ it('should export all component wrappers', async () => {
6
+ const react = await import('./react.js');
7
+ assert.ok(react.Button, 'Button wrapper should be exported');
8
+ assert.ok(react.Card, 'Card wrapper should be exported');
9
+ assert.ok(react.Dialog, 'Dialog wrapper should be exported');
10
+ assert.ok(react.Accordion, 'Accordion wrapper should be exported');
11
+ assert.ok(react.Tooltip, 'Tooltip wrapper should be exported');
12
+ assert.ok(react.Hero, 'Hero wrapper should be exported');
13
+ assert.ok(react.Container, 'Container wrapper should be exported');
14
+ assert.ok(react.Icon, 'Icon wrapper should be exported');
15
+ assert.ok(react.Loading, 'Loading wrapper should be exported');
16
+ assert.ok(react.Notice, 'Notice wrapper should be exported');
17
+ });
18
18
 
19
- it("should export at least 35 component wrappers", async () => {
20
- const react = await import("./react.js");
21
- const exportCount = Object.keys(react).length;
22
- assert.ok(
23
- exportCount >= 35,
24
- `Expected at least 35 exports, got ${exportCount}`,
25
- );
26
- });
19
+ it('should export at least 35 component wrappers', async () => {
20
+ const react = await import('./react.js');
21
+ const exportCount = Object.keys(react).length;
22
+ assert.ok(exportCount >= 35, `Expected at least 35 exports, got ${exportCount}`);
23
+ });
27
24
 
28
- it("should export event-mapped components", async () => {
29
- const react = await import("./react.js");
30
- assert.ok(react.AppBar, "AppBar wrapper should be exported");
31
- assert.ok(react.Dropdown, "Dropdown wrapper should be exported");
32
- assert.ok(react.DropdownItem, "DropdownItem wrapper should be exported");
33
- assert.ok(react.Sidebar, "Sidebar wrapper should be exported");
34
- assert.ok(react.Toast, "Toast wrapper should be exported");
35
- });
25
+ it('should export event-mapped components', async () => {
26
+ const react = await import('./react.js');
27
+ assert.ok(react.AppBar, 'AppBar wrapper should be exported');
28
+ assert.ok(react.Dropdown, 'Dropdown wrapper should be exported');
29
+ assert.ok(react.DropdownItem, 'DropdownItem wrapper should be exported');
30
+ assert.ok(react.Sidebar, 'Sidebar wrapper should be exported');
31
+ assert.ok(react.Toast, 'Toast wrapper should be exported');
32
+ });
36
33
 
37
- it("should export compound component wrappers", async () => {
38
- const react = await import("./react.js");
39
- assert.ok(react.Breadcrumb, "Breadcrumb wrapper should be exported");
40
- assert.ok(
41
- react.BreadcrumbItem,
42
- "BreadcrumbItem wrapper should be exported",
43
- );
44
- assert.ok(react.Footer, "Footer wrapper should be exported");
45
- assert.ok(react.FooterColumn, "FooterColumn wrapper should be exported");
46
- assert.ok(react.Gallery, "Gallery wrapper should be exported");
47
- assert.ok(react.GalleryImage, "GalleryImage wrapper should be exported");
48
- assert.ok(react.Tabs, "Tabs wrapper should be exported");
49
- assert.ok(react.Tab, "Tab wrapper should be exported");
50
- assert.ok(react.TabsButton, "TabsButton wrapper should be exported");
51
- assert.ok(
52
- react.ToastContainer,
53
- "ToastContainer wrapper should be exported",
54
- );
55
- });
34
+ it('should export compound component wrappers', async () => {
35
+ const react = await import('./react.js');
36
+ assert.ok(react.Breadcrumb, 'Breadcrumb wrapper should be exported');
37
+ assert.ok(react.BreadcrumbItem, 'BreadcrumbItem wrapper should be exported');
38
+ assert.ok(react.Footer, 'Footer wrapper should be exported');
39
+ assert.ok(react.FooterColumn, 'FooterColumn wrapper should be exported');
40
+ assert.ok(react.Gallery, 'Gallery wrapper should be exported');
41
+ assert.ok(react.GalleryImage, 'GalleryImage wrapper should be exported');
42
+ assert.ok(react.Tabs, 'Tabs wrapper should be exported');
43
+ assert.ok(react.Tab, 'Tab wrapper should be exported');
44
+ assert.ok(react.TabsButton, 'TabsButton wrapper should be exported');
45
+ assert.ok(react.ToastContainer, 'ToastContainer wrapper should be exported');
46
+ });
56
47
  });