@codecavepro/brand 2.3.0 → 2.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/src/common/ArticlePreview.vue +2 -2
- package/dist/src/common/BrandNav.vue +1 -1
- package/dist/src/common/Button.vue +1 -1
- package/dist/src/common/Radio.vue +14 -10
- package/dist/src/footer/FooterCta.vue +26 -0
- package/dist/src/homepage/technology-card.vue +17 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -97,7 +97,7 @@ Get the cuts from [Fontshare](https://www.fontshare.com/fonts/satoshi) — 300,
|
|
|
97
97
|
700 and 900, each upright and italic, which is the ten faces these stylesheets declare.
|
|
98
98
|
Bind each with a real `font-weight` descriptor rather than letting the browser
|
|
99
99
|
synthesize; the design system documents why in
|
|
100
|
-
[DESIGN.md §10.3](https://github.com/CodeCavePro/brand/blob/development/
|
|
100
|
+
[DESIGN.md §10.3](https://github.com/CodeCavePro/brand/blob/development/DESIGN.md#103-synthesized-vs-real-font-weights).
|
|
101
101
|
|
|
102
102
|
**Do not use the `stylesheet.css` that comes in the Fontshare download.** It declares
|
|
103
103
|
Bold and Black _both_ as `font-weight: bold`, and their italics likewise, so four cuts
|
|
@@ -155,7 +155,7 @@ Two things to know about it:
|
|
|
155
155
|
|
|
156
156
|
## The components
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
21 components and 13 icons — the buttons, the form controls and the forms
|
|
159
159
|
themselves, the nav bar, the footer link group, the article and technology
|
|
160
160
|
cards, the review card and the typing effect codecave.pro renders — ship as
|
|
161
161
|
**source**, byte-for-byte the files the site builds from. Not a reimplementation
|
|
@@ -308,7 +308,7 @@ the rules, the reasoning, the anti-patterns — is documented separately:
|
|
|
308
308
|
|
|
309
309
|
- **[brand.codecave.pro](https://brand.codecave.pro/)** — the published design system:
|
|
310
310
|
brand kit, foundation specimens, and a storybook of real components.
|
|
311
|
-
- **[DESIGN.md](https://github.com/CodeCavePro/brand/blob/development/
|
|
311
|
+
- **[DESIGN.md](https://github.com/CodeCavePro/brand/blob/development/DESIGN.md)** —
|
|
312
312
|
the rules in full: the 26-step ramp, components, motion, anti-patterns, known
|
|
313
313
|
divergences from what the site ships today.
|
|
314
314
|
- **[CodeCavePro/brand](https://github.com/CodeCavePro/brand)** — the repository.
|
|
@@ -32,12 +32,12 @@ const imageUrl = (url: string) => props.resolveImage?.(url) ?? url
|
|
|
32
32
|
|
|
33
33
|
<template>
|
|
34
34
|
<a :href="`${basePath ?? ''}${article.slug}/`" :class="`mx-1 lg:mx-2 w-full h-full self-start sm:self-auto p-6 flex flex-col gap-5 sm:gap-8
|
|
35
|
-
rounded-[2.25rem] bg-surface-secondary hover:bg-surface-
|
|
35
|
+
rounded-[2.25rem] bg-surface-secondary hover:bg-surface-tertiary transition-colors cursor-pointer border-surface-tertiary border
|
|
36
36
|
${className ?? ''}`">
|
|
37
37
|
<div class="flex flex-col sm:flex-row gap-5 sm:gap-8 h-fit">
|
|
38
38
|
<img loading="lazy" class="sm:w-[132px] sm:h-[132px] rounded-xl object-cover"
|
|
39
39
|
:src="imageUrl(article.cover.url)"
|
|
40
|
-
:alt="article.
|
|
40
|
+
:alt="article.title"
|
|
41
41
|
:width="100"
|
|
42
42
|
:height="100"/>
|
|
43
43
|
<div class="space-y-2 sm:space-y-3">
|
|
@@ -229,7 +229,7 @@ withDefaults(defineProps<{
|
|
|
229
229
|
visibility: hidden;
|
|
230
230
|
border-radius: 1rem;
|
|
231
231
|
padding: 1.25rem;
|
|
232
|
-
background: var(--color-surface-primary
|
|
232
|
+
background: var(--color-surface-primary);
|
|
233
233
|
-webkit-backdrop-filter: blur(24px);
|
|
234
234
|
backdrop-filter: blur(24px);
|
|
235
235
|
transition: opacity 0.2s ease, visibility 0.2s;
|
|
@@ -29,7 +29,7 @@ const variantClass = computed(() => {
|
|
|
29
29
|
case 'link':
|
|
30
30
|
return `${linkBaseClass} text-hovered underline`
|
|
31
31
|
default:
|
|
32
|
-
return `${buttonBaseClass} bg-primary-500 hover:bg-primary-700 active:bg-primary-900`
|
|
32
|
+
return `${buttonBaseClass} px-6 py-1 bg-primary-500 hover:bg-primary-700 active:bg-primary-900`
|
|
33
33
|
}
|
|
34
34
|
})
|
|
35
35
|
</script>
|
|
@@ -5,21 +5,25 @@ const props = defineProps<{
|
|
|
5
5
|
id: string
|
|
6
6
|
label: string
|
|
7
7
|
name: string
|
|
8
|
-
isChecked?: boolean
|
|
9
8
|
modelValue?: string
|
|
10
9
|
variant?: 'primary' | 'secondary'
|
|
11
10
|
}>()
|
|
11
|
+
|
|
12
|
+
const emit = defineEmits<{'update:modelValue': [value: string]}>()
|
|
13
|
+
|
|
12
14
|
const baseLabelClass = 'w-fit flex items-center cursor-pointer text-body-primary transition-colors'
|
|
15
|
+
|
|
13
16
|
const labelClass = computed(() => {
|
|
14
17
|
switch (props.variant) {
|
|
15
18
|
case 'secondary':
|
|
16
|
-
return `${baseLabelClass} gap-3 p-3 pr-4 bg-surface-primary-transparent rounded-custom border-2 border-surface-quaternary
|
|
19
|
+
return `${baseLabelClass} gap-3 p-3 pr-4 bg-surface-primary-transparent rounded-custom border-2 border-surface-quaternary hover:bg-surface-tertiary`
|
|
17
20
|
default:
|
|
18
21
|
return `${baseLabelClass} gap-2 py-2 px-3 bg-surface-secondary rounded-lg`
|
|
19
22
|
}
|
|
20
23
|
})
|
|
21
24
|
|
|
22
|
-
|
|
25
|
+
const value = computed(() => props.id)
|
|
26
|
+
const isChecked = computed(() => props.modelValue === value.value)
|
|
23
27
|
</script>
|
|
24
28
|
|
|
25
29
|
<template>
|
|
@@ -28,13 +32,13 @@ defineEmits(['update:modelValue'])
|
|
|
28
32
|
:class="[labelClass]"
|
|
29
33
|
>
|
|
30
34
|
<input
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
:id="id"
|
|
36
|
+
type="radio"
|
|
37
|
+
:name="name"
|
|
38
|
+
:value="value"
|
|
39
|
+
class="bg-transparent border-[2px] border-surface-quaternary checked:border-action rounded-full hover:border-action"
|
|
40
|
+
:checked="isChecked"
|
|
41
|
+
@change="emit('update:modelValue', value)"
|
|
38
42
|
/>
|
|
39
43
|
<span class="text-xs whitespace-nowrap">
|
|
40
44
|
{{ label }}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import Button from "../common/Button.vue";
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<template>
|
|
6
|
+
<section
|
|
7
|
+
class="p-8 md:p-10 flex flex-col md:flex-row items-center justify-between gap-12 md:gap-7 rounded-3xl bg-primary-800"
|
|
8
|
+
>
|
|
9
|
+
<div class="flex-1">
|
|
10
|
+
<h3 class="text-heading font-bold text-[32px]">
|
|
11
|
+
Grab our AI trends research!
|
|
12
|
+
</h3>
|
|
13
|
+
|
|
14
|
+
<p class="md:mt-1 mt-4 text-body-secondary-lighter text-pretty">
|
|
15
|
+
We’ve researched current state of the AI in 3 industries so you don’t have to.
|
|
16
|
+
<br>
|
|
17
|
+
Check what we’ve found about yours.
|
|
18
|
+
</p>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<Button
|
|
22
|
+
title="Grab Research"
|
|
23
|
+
class="px-6"
|
|
24
|
+
/>
|
|
25
|
+
</section>
|
|
26
|
+
</template>
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import Button from "../common/Button.vue";
|
|
3
|
+
import { computed } from 'vue'
|
|
3
4
|
|
|
4
|
-
defineProps<{
|
|
5
|
+
const props = defineProps<{
|
|
5
6
|
active: boolean
|
|
6
7
|
name: string
|
|
7
|
-
/* Where "Explore service" goes. The card used to switch on `name` over this
|
|
8
|
-
* site's six service routes; that map is now @helpers/service-links.ts and
|
|
9
|
-
* the caller passes the result, so the card reaches no route table. An empty
|
|
10
|
-
* string renders the button inert, exactly as the switch's default did. */
|
|
11
8
|
href?: string
|
|
12
9
|
className?: string
|
|
13
10
|
index?: number
|
|
@@ -30,11 +27,24 @@ const translate = [
|
|
|
30
27
|
'xl:-translate-y-1/2',
|
|
31
28
|
'xl:-translate-y-1/2',
|
|
32
29
|
]
|
|
30
|
+
|
|
31
|
+
const cardClass = computed(() => [
|
|
32
|
+
'rounded-3xl',
|
|
33
|
+
'card-wrapper',
|
|
34
|
+
'cursor-pointer',
|
|
35
|
+
'select-none',
|
|
36
|
+
'absolute',
|
|
37
|
+
'transform',
|
|
38
|
+
'transition-transform',
|
|
39
|
+
'duration-500',
|
|
40
|
+
props.index !== undefined ? rotate[props.index] : '',
|
|
41
|
+
props.index !== undefined && props.active ? translate[props.index] : '',
|
|
42
|
+
props.className,
|
|
43
|
+
])
|
|
33
44
|
</script>
|
|
34
45
|
|
|
35
46
|
<template>
|
|
36
|
-
<div :class="
|
|
37
|
-
${rotate[index]} ${active ? `${translate[index]}` : ''} ${className || ''}`">
|
|
47
|
+
<div :class="cardClass">
|
|
38
48
|
<div class="card flex flex-col items-center justify-around">
|
|
39
49
|
<h3 class="max-w-[8rem] text-center text-xl font-bold text-heading text-balance">
|
|
40
50
|
{{ name }}
|
package/package.json
CHANGED