@grantcodes/ui 2.5.1 → 2.7.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 (56) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/custom-elements.json +617 -19
  3. package/package.json +4 -4
  4. package/src/components/accordion/accordion.component.js +4 -1
  5. package/src/components/accordion/accordion.css +26 -18
  6. package/src/components/app-bar/app-bar.component.js +45 -9
  7. package/src/components/app-bar/app-bar.css +119 -88
  8. package/src/components/app-bar/app-bar.stories.js +75 -37
  9. package/src/components/app-bar/app-bar.test.js +7 -1
  10. package/src/components/app-bar/nav-link.component.js +15 -0
  11. package/src/components/app-bar/nav-link.css +58 -0
  12. package/src/components/app-bar/nav-link.js +6 -0
  13. package/src/components/app-bar/nav-link.react.js +9 -0
  14. package/src/components/code-preview/code-preview.css +5 -0
  15. package/src/components/container/container.css +6 -0
  16. package/src/components/countdown/countdown.component.js +180 -0
  17. package/src/components/countdown/countdown.css +62 -0
  18. package/src/components/countdown/countdown.js +6 -0
  19. package/src/components/countdown/countdown.react.js +9 -0
  20. package/src/components/countdown/countdown.stories.js +65 -0
  21. package/src/components/countdown/index.js +1 -0
  22. package/src/components/cta/cta.css +6 -0
  23. package/src/components/dialog/dialog.css +5 -0
  24. package/src/components/feature-list/feature-list.css +6 -0
  25. package/src/components/footer/footer.css +3 -1
  26. package/src/components/form-field/form-field.css +6 -0
  27. package/src/components/gallery/gallery.css +5 -0
  28. package/src/components/hero/hero.component.js +7 -0
  29. package/src/components/hero/hero.css +18 -1
  30. package/src/components/hero/hero.stories.js +30 -0
  31. package/src/components/icon/icon.css +6 -0
  32. package/src/components/loading/loading.css +5 -0
  33. package/src/components/logo-cloud/logo-cloud.css +6 -0
  34. package/src/components/map/index.js +1 -0
  35. package/src/components/map/map.component.js +135 -0
  36. package/src/components/map/map.css +41 -0
  37. package/src/components/map/map.js +6 -0
  38. package/src/components/map/map.react.js +9 -0
  39. package/src/components/map/map.stories.js +68 -0
  40. package/src/components/media-text/media-text.css +6 -0
  41. package/src/components/newsletter/newsletter.css +6 -0
  42. package/src/components/notice/notice.css +5 -0
  43. package/src/components/pagination/pagination.css +5 -0
  44. package/src/components/pricing/pricing.css +6 -0
  45. package/src/components/stats/stats.css +6 -0
  46. package/src/components/testimonials/testimonials.css +6 -0
  47. package/src/components/tooltip/tooltip.css +5 -0
  48. package/src/css/all.css +3 -1
  49. package/src/css/base.css +6 -247
  50. package/src/css/elements/a.css +8 -8
  51. package/src/css/reset.css +246 -0
  52. package/src/lib/styles/all.css +2 -0
  53. package/src/main.js +2 -0
  54. package/src/pages/blog-post.stories.js +7 -19
  55. package/src/react.js +3 -0
  56. package/src/types.d.ts +18 -0
@@ -0,0 +1,246 @@
1
+ /* CSS reset — inspired by sanitize.css (https://csstools.github.io/sanitize.css/)
2
+ Inlined to avoid broken relative node_modules paths when installed externally. */
3
+
4
+ /* Box sizing and background */
5
+ *,
6
+ ::before,
7
+ ::after {
8
+ box-sizing: border-box;
9
+ background-repeat: no-repeat;
10
+ }
11
+
12
+ ::before,
13
+ ::after {
14
+ text-decoration: inherit;
15
+ vertical-align: inherit;
16
+ }
17
+
18
+ /* Root defaults */
19
+ :where(:root) {
20
+ font: var(--g-theme-typography-body);
21
+ cursor: default;
22
+ line-height: 1.5;
23
+ overflow-wrap: break-word;
24
+ -moz-tab-size: 4;
25
+ tab-size: 4;
26
+ -webkit-tap-highlight-color: transparent;
27
+ -webkit-text-size-adjust: 100%;
28
+ }
29
+
30
+ :where(:root, body) {
31
+ padding: 0;
32
+ margin: 0;
33
+ }
34
+
35
+ code,
36
+ kbd,
37
+ samp,
38
+ pre {
39
+ font-family:
40
+ ui-monospace,
41
+ "Menlo",
42
+ "Consolas",
43
+ "Roboto Mono",
44
+ "Ubuntu Monospace",
45
+ "Noto Mono",
46
+ "Oxygen Mono",
47
+ "Liberation Mono",
48
+ monospace,
49
+ "Apple Color Emoji",
50
+ "Segoe UI Emoji",
51
+ "Segoe UI Symbol",
52
+ "Noto Color Emoji";
53
+ }
54
+
55
+
56
+ /* Grouping */
57
+ :where(dl, ol, ul) :where(dl, ol, ul) {
58
+ margin: 0;
59
+ }
60
+
61
+ :where(hr) {
62
+ color: inherit;
63
+ height: 0;
64
+ }
65
+
66
+ :where(nav) :where(ol, ul) {
67
+ list-style-type: none;
68
+ padding: 0;
69
+ }
70
+
71
+ /* Prevent VoiceOver from ignoring list semantics in Safari */
72
+ :where(nav li)::before {
73
+ content: "\200B";
74
+ float: left;
75
+ }
76
+
77
+ :where(pre) {
78
+ font-size: 1em;
79
+ overflow: auto;
80
+ }
81
+
82
+ /* Text-level semantics */
83
+ :where(abbr[title]) {
84
+ text-decoration: underline dotted;
85
+ }
86
+
87
+ :where(b, strong) {
88
+ font-weight: bolder;
89
+ }
90
+
91
+ :where(code, kbd, samp) {
92
+ font-size: 1em;
93
+ }
94
+
95
+ :where(small) {
96
+ font-size: 80%;
97
+ }
98
+
99
+ /* Embedded content */
100
+ :where(audio, canvas, iframe, img, svg, video) {
101
+ vertical-align: middle;
102
+ }
103
+
104
+ :where(iframe) {
105
+ border-style: none;
106
+ }
107
+
108
+ :where(svg:not([fill])) {
109
+ fill: currentColor;
110
+ }
111
+
112
+ /* Tabular data */
113
+ :where(table) {
114
+ border-collapse: collapse;
115
+ border-color: inherit;
116
+ text-indent: 0;
117
+ }
118
+
119
+ /* Forms — baseline normalisation */
120
+ :where(button, input, select) {
121
+ margin: 0;
122
+ }
123
+
124
+ :where(button, [type="button" i], [type="reset" i], [type="submit" i]) {
125
+ -webkit-appearance: button;
126
+ }
127
+
128
+ :where(fieldset) {
129
+ border: 1px solid #a0a0a0;
130
+ }
131
+
132
+ :where(progress) {
133
+ vertical-align: baseline;
134
+ }
135
+
136
+ :where(textarea) {
137
+ margin: 0;
138
+ resize: vertical;
139
+ }
140
+
141
+ :where([type="search" i]) {
142
+ -webkit-appearance: textfield;
143
+ outline-offset: -2px;
144
+ }
145
+
146
+ ::-webkit-inner-spin-button,
147
+ ::-webkit-outer-spin-button {
148
+ height: auto;
149
+ }
150
+
151
+ ::-webkit-input-placeholder {
152
+ color: inherit;
153
+ opacity: 0.54;
154
+ }
155
+
156
+ ::-webkit-search-decoration {
157
+ -webkit-appearance: none;
158
+ }
159
+
160
+ ::-webkit-file-upload-button {
161
+ -webkit-appearance: button;
162
+ font: inherit;
163
+ }
164
+
165
+ /* Forms — typography and colour inheritance */
166
+ :where(button, input, select, textarea) {
167
+ background-color: transparent;
168
+ border: 1px solid WindowFrame;
169
+ color: inherit;
170
+ font: inherit;
171
+ letter-spacing: inherit;
172
+ padding: 0.25em 0.375em;
173
+ }
174
+
175
+ :where([type="color" i], [type="range" i]) {
176
+ border-width: 0;
177
+ padding: 0;
178
+ }
179
+
180
+ /* Interactive */
181
+ :where(details > summary:first-of-type) {
182
+ display: list-item;
183
+ }
184
+
185
+ /* Accessibility */
186
+ :where([aria-busy="true" i]) {
187
+ cursor: progress;
188
+ }
189
+
190
+ :where([aria-controls]) {
191
+ cursor: pointer;
192
+ }
193
+
194
+ :where([aria-disabled="true" i], [disabled]) {
195
+ cursor: not-allowed;
196
+ }
197
+
198
+ :where([aria-hidden="false" i][hidden]) {
199
+ display: initial;
200
+ }
201
+
202
+ :where([aria-hidden="false" i][hidden]:not(:focus)) {
203
+ clip: rect(0, 0, 0, 0);
204
+ position: absolute;
205
+ }
206
+
207
+ /* Reduced motion — !important is required here to override any animation/transition regardless of specificity */
208
+ @media (prefers-reduced-motion: reduce) {
209
+ *,
210
+ ::before,
211
+ ::after {
212
+ animation-delay: -1ms !important;
213
+ animation-duration: 1ms !important;
214
+ animation-iteration-count: 1 !important;
215
+ background-attachment: initial !important;
216
+ scroll-behavior: auto !important;
217
+ transition-delay: 0s !important;
218
+ transition-duration: 0s !important;
219
+ }
220
+ }
221
+
222
+ /* Design tokens are provided by @grantcodes/style-dictionary and applied to :root */
223
+ :root {
224
+ color-scheme: light dark;
225
+ --grantcodes-ui-theme: "none";
226
+ background-color: var(--g-theme-color-background-default);
227
+ color: var(--g-theme-color-content-default);
228
+ fill: currentColor;
229
+ }
230
+
231
+ /* Allow transitioning auto */
232
+ :root {
233
+ @supports (interpolate-size: allow-keywords) {
234
+ interpolate-size: allow-keywords;
235
+ }
236
+ }
237
+
238
+ ::selection {
239
+ background-color: var(--g-theme-color-background-brand);
240
+ }
241
+
242
+ /* Default backdrop styles */
243
+ ::backdrop {
244
+ background-color: rgba(0, 0, 0, 0.4);
245
+ backdrop-filter: blur(6px);
246
+ }
@@ -10,6 +10,7 @@
10
10
  @import "../../components/card/card.css";
11
11
  @import "../../components/code-preview/code-preview.css";
12
12
  @import "../../components/container/container.css";
13
+ @import "../../components/countdown/countdown.css";
13
14
  @import "../../components/cta/cta.css";
14
15
  @import "../../components/dialog/dialog.css";
15
16
  @import "../../components/dropdown/dropdown.css";
@@ -23,6 +24,7 @@
23
24
  @import "../../components/icon/icon.css";
24
25
  @import "../../components/loading/loading.css";
25
26
  @import "../../components/logo-cloud/logo-cloud.css";
27
+ @import "../../components/map/map.css";
26
28
  @import "../../components/media-text/media-text.css";
27
29
  @import "../../components/newsletter/newsletter.css";
28
30
  @import "../../components/notice/notice.css";
package/src/main.js CHANGED
@@ -5,6 +5,7 @@ export * from "./components/button-group/index.js";
5
5
  export * from "./components/card/index.js";
6
6
  export * from "./components/code-preview/index.js";
7
7
  export * from "./components/container/index.js";
8
+ export * from "./components/countdown/index.js";
8
9
  export * from "./components/cta/index.js";
9
10
  export * from "./components/dialog/index.js";
10
11
  export * from "./components/dropzone/index.js";
@@ -15,6 +16,7 @@ export * from "./components/hero/index.js";
15
16
  export * from "./components/icon/index.js";
16
17
  export * from "./components/loading/index.js";
17
18
  export * from "./components/logo-cloud/index.js";
19
+ export * from "./components/map/index.js";
18
20
  export * from "./components/media-text/index.js";
19
21
  export * from "./components/newsletter/index.js";
20
22
  export * from "./components/notice/index.js";
@@ -1,5 +1,6 @@
1
1
  import { html } from "lit";
2
2
  import "../components/app-bar/app-bar.js";
3
+ import "../components/app-bar/nav-link.js";
3
4
  import "../components/button/button.js";
4
5
  import "../components/breadcrumb/breadcrumb.js";
5
6
  import "../components/container/container.js";
@@ -93,10 +94,10 @@ export const Default = {
93
94
  Flowbase
94
95
  </a>
95
96
  <div slot="nav" style="display: flex; gap: 0.5rem;">
96
- <a href="/">Home</a>
97
- <a href="/features">Features</a>
98
- <a href="/blog">Blog</a>
99
- <a href="/pricing">Pricing</a>
97
+ <grantcodes-nav-link><a href="/">Home</a></grantcodes-nav-link>
98
+ <grantcodes-nav-link><a href="/features">Features</a></grantcodes-nav-link>
99
+ <grantcodes-nav-link><a href="/blog">Blog</a></grantcodes-nav-link>
100
+ <grantcodes-nav-link><a href="/pricing">Pricing</a></grantcodes-nav-link>
100
101
  </div>
101
102
  <div slot="actions" style="display: flex; gap: 0.5rem;">
102
103
  <grantcodes-button variant="ghost">Sign in</grantcodes-button>
@@ -287,7 +288,7 @@ export const Default = {
287
288
 
288
289
  <!-- Related posts -->
289
290
  <div
290
- style="background: var(--g-theme-color-background-subtle); padding-block: var(--g-theme-spacing-2xl);"
291
+ style="padding-block: var(--g-theme-spacing-2xl);"
291
292
  >
292
293
  <grantcodes-container>
293
294
  <h2
@@ -352,20 +353,7 @@ export const Default = {
352
353
  </grantcodes-container>
353
354
  </div>
354
355
 
355
- <grantcodes-cta
356
- eyebrow="Ready to try it?"
357
- title="See how Flowbase keeps your team in flow"
358
- text="Join thousands of teams who've replaced their meeting-heavy workflows with a calmer, more productive way of working."
359
- primary-action=${JSON.stringify({
360
- label: "Start for free",
361
- href: "/signup",
362
- })}
363
- secondary-action=${JSON.stringify({
364
- label: "See all features",
365
- href: "/features",
366
- })}
367
- align="center"
368
- ></grantcodes-cta>
356
+
369
357
 
370
358
  <grantcodes-footer columns="3">
371
359
  ${footerContent}
package/src/react.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { Accordion } from "./components/accordion/accordion.react.js"
2
2
  export { AppBar } from "./components/app-bar/app-bar.react.js"
3
+ export { NavLink } from "./components/app-bar/nav-link.react.js"
3
4
  export { Avatar } from "./components/avatar/avatar.react.js"
4
5
  export { Badge } from "./components/badge/badge.react.js"
5
6
  export { Breadcrumb, BreadcrumbItem } from "./components/breadcrumb/breadcrumb.react.js"
@@ -8,6 +9,7 @@ export { ButtonGroup } from "./components/button-group/button-group.react.js"
8
9
  export { Card } from "./components/card/card.react.js"
9
10
  export { CodePreview } from "./components/code-preview/code-preview.react.js"
10
11
  export { Container } from "./components/container/container.react.js"
12
+ export { Countdown } from "./components/countdown/countdown.react.js"
11
13
  export { Cta } from "./components/cta/cta.react.js"
12
14
  export { Dialog } from "./components/dialog/dialog.react.js"
13
15
  export { Dropdown, DropdownItem } from "./components/dropdown/dropdown.react.js"
@@ -21,6 +23,7 @@ export { Hero } from "./components/hero/hero.react.js"
21
23
  export { Icon } from "./components/icon/icon.react.js"
22
24
  export { Loading } from "./components/loading/loading.react.js"
23
25
  export { LogoCloud } from "./components/logo-cloud/logo-cloud.react.js"
26
+ export { MapEmbed } from "./components/map/map.react.js"
24
27
  export { MediaText } from "./components/media-text/media-text.react.js"
25
28
  export { Newsletter } from "./components/newsletter/newsletter.react.js"
26
29
  export { Notice } from "./components/notice/notice.react.js"
package/src/types.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Ambient module declarations for @grantcodes/ui.
3
+ *
4
+ * Usage: Add to your tsconfig.json:
5
+ * { "compilerOptions": { "types": ["@grantcodes/ui"] } }
6
+ *
7
+ * Or reference directly:
8
+ * /// <reference types="@grantcodes/ui" />
9
+ */
10
+
11
+ // Component deep imports
12
+ declare module "@grantcodes/ui/components/*";
13
+
14
+ // Style imports
15
+ declare module "@grantcodes/ui/styles/*";
16
+
17
+ // Font imports
18
+ declare module "@grantcodes/ui/fonts/*";