create-portfoliable 1.0.3
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/bin/create-portfoliable.mjs +425 -0
- package/cli/portfoliable.mjs +836 -0
- package/index.html +18 -0
- package/package.json +102 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.png +0 -0
- package/scripts/check-updates.mjs +31 -0
- package/scripts/ensure-valence-index-css.mjs +245 -0
- package/scripts/generate-password-hash.mjs +25 -0
- package/scripts/release-orchestrator.mjs +363 -0
- package/scripts/scaffold-case.mjs +460 -0
- package/scripts/scaffold-consumer.mjs +87 -0
- package/scripts/smoke-homeview.mjs +133 -0
- package/scripts/smoke-initializer.mjs +129 -0
- package/scripts/smoke-packed.mjs +184 -0
- package/scripts/switch-valence-source.mjs +162 -0
- package/scripts/sync-template-shared.mjs +136 -0
- package/scripts/terminal-ui.mjs +274 -0
- package/scripts/verify-integration.mjs +72 -0
- package/src/App.js +10015 -0
- package/src/header-visibility.contract.js +31 -0
- package/src/header-visibility.contract.test.js +41 -0
- package/src/main.js +12 -0
- package/src/parser/markdown.js +855 -0
- package/src/style.css +88 -0
- package/templates/README.md +242 -0
- package/templates/configs/i18n/i18n.config.js +230 -0
- package/templates/configs/i18n/i18n.labels.js +188 -0
- package/templates/configs/portfoliable.a11y.config.js +262 -0
- package/templates/configs/portfoliable.design.config.js +651 -0
- package/templates/gitignore +9 -0
- package/templates/index.html +20 -0
- package/templates/public/api/.htaccess +4 -0
- package/templates/public/api/README.md +27 -0
- package/templates/public/api/password.config.example.json +16 -0
- package/templates/public/api/password.config.json +16 -0
- package/templates/public/api/unlock-case.php +56 -0
- package/templates/public/favicon.ico +0 -0
- package/templates/public/favicon.png +0 -0
- package/templates/public/portfoliable-logo.svg +3 -0
- package/templates/scripts/add-language.mjs +253 -0
- package/templates/scripts/convert-video-to-mp4.mjs +207 -0
- package/templates/scripts/convert-wav-to-mp3.mjs +184 -0
- package/templates/scripts/delete-case.mjs +320 -0
- package/templates/scripts/delete-language.mjs +195 -0
- package/templates/scripts/generate-password-hash.mjs +98 -0
- package/templates/scripts/i18n-config-utils.mjs +123 -0
- package/templates/scripts/scaffold-case.mjs +444 -0
- package/templates/scripts/sync-locales.mjs +1048 -0
- package/templates/scripts/validate-content.mjs +257 -0
- package/templates/scripts/validate-protection.mjs +187 -0
- package/templates/src/cases/index.js +188 -0
- package/templates/src/content/about/ABOUTME.md +202 -0
- package/templates/src/content/cases/template-case/case.md +479 -0
- package/templates/src/content/cases/template-case/cover.png +0 -0
- package/templates/src/content/cases/template-case/he-cover.png +0 -0
- package/templates/src/content/cases/template-case/template-audio.mp3 +0 -0
- package/templates/src/content/cases/template-case/template-video.mp4 +0 -0
- package/templates/src/content/thumbnail-options.generated.json +1044 -0
- package/templates/src/main.js +23 -0
- package/templates/src/parser/markdown.js +805 -0
- package/vite.config.js +111 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
<!-- about-config
|
|
2
|
+
{
|
|
3
|
+
// Identity
|
|
4
|
+
"slugByLocale": {
|
|
5
|
+
"en": "about",
|
|
6
|
+
"he": "about"
|
|
7
|
+
},
|
|
8
|
+
"socialImage": {
|
|
9
|
+
"en": "",
|
|
10
|
+
"pt": ""
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
// Localized Content
|
|
14
|
+
"title": {
|
|
15
|
+
"show": true,
|
|
16
|
+
"en": "About Portfoliable",
|
|
17
|
+
"he": "אודות Portfoliable"
|
|
18
|
+
},
|
|
19
|
+
"subtitle": {
|
|
20
|
+
"show": true,
|
|
21
|
+
"en": "A short introduction to the Portfoliable project",
|
|
22
|
+
"he": "היכרות קצרה עם פרויקט Portfoliable"
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
// Visibility
|
|
26
|
+
"visibility": {
|
|
27
|
+
"web": true,
|
|
28
|
+
"crawlers": true,
|
|
29
|
+
"ai": true,
|
|
30
|
+
"locales": {}
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
// Social
|
|
34
|
+
"social": {
|
|
35
|
+
"share": {
|
|
36
|
+
"enabled": false,
|
|
37
|
+
"icon": "share",
|
|
38
|
+
"icon-variant": "outline",
|
|
39
|
+
"tooltip": {
|
|
40
|
+
"en": "Share this about page",
|
|
41
|
+
"he": "שיתוף דף האודות"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"linkedin": {
|
|
45
|
+
"enabled": false,
|
|
46
|
+
"icon": "linkedin",
|
|
47
|
+
"icon-variant": "outline",
|
|
48
|
+
"tooltip": {
|
|
49
|
+
"en": "Share on LinkedIn",
|
|
50
|
+
"he": "שיתוף בלינקדאין"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"x": {
|
|
54
|
+
"enabled": false,
|
|
55
|
+
"icon": "x",
|
|
56
|
+
"icon-variant": "outline",
|
|
57
|
+
"tooltip": {
|
|
58
|
+
"en": "Share on X",
|
|
59
|
+
"he": "שיתוף ב-X"
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"facebook": {
|
|
63
|
+
"enabled": false,
|
|
64
|
+
"icon": "facebook",
|
|
65
|
+
"icon-variant": "outline",
|
|
66
|
+
"tooltip": {
|
|
67
|
+
"en": "Share on Facebook",
|
|
68
|
+
"he": "שיתוף בפייסבוק"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"links": {
|
|
72
|
+
"linkedin": "",
|
|
73
|
+
"x": "",
|
|
74
|
+
"facebook": ""
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
-->
|
|
79
|
+
|
|
80
|
+
<!-- lang:en -->
|
|
81
|
+
# About Portfoliable
|
|
82
|
+
|
|
83
|
+
Portfoliable is a markdown-first portfolio builder that helps creators publish clear, fast, and polished case studies.
|
|
84
|
+
|
|
85
|
+
It keeps the focus on content, not configuration.
|
|
86
|
+
|
|
87
|
+
## What Portfoliable is
|
|
88
|
+
|
|
89
|
+
> Portfoliable treats a portfolio like a product: structured, maintainable, and easy to evolve.
|
|
90
|
+
|
|
91
|
+
It combines `markdown`, design-system components, and practical defaults so a project can stay lightweight without feeling limited.
|
|
92
|
+
|
|
93
|
+
### What it includes
|
|
94
|
+
|
|
95
|
+
- case pages with summaries, navigation, and reader controls
|
|
96
|
+
- localized content with reusable metadata
|
|
97
|
+
- accessibility-friendly defaults for contrast, motion, and reading comfort
|
|
98
|
+
- a workflow that stays close to the source files
|
|
99
|
+
|
|
100
|
+
### Why it matters
|
|
101
|
+
|
|
102
|
+
1. It reduces setup time.
|
|
103
|
+
2. It keeps the story readable.
|
|
104
|
+
3. It makes iteration predictable.
|
|
105
|
+
|
|
106
|
+
| Feature | Value | Example |
|
|
107
|
+
| --- | --- | --- |
|
|
108
|
+
| Markdown | Easy editing | `# Heading` |
|
|
109
|
+
| Lists | Clear structure | ordered and unordered |
|
|
110
|
+
| Tables | Compact comparisons | decisions at a glance |
|
|
111
|
+
| Footnotes | Extra nuance | explanatory notes[^1] |
|
|
112
|
+
|
|
113
|
+
## A small example
|
|
114
|
+
|
|
115
|
+
```md
|
|
116
|
+
# About Portfoliable
|
|
117
|
+
|
|
118
|
+
Portfoliable is a project about making portfolio publishing feel simple.
|
|
119
|
+
|
|
120
|
+
> It stays out of the way so the work can speak.
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Notes
|
|
124
|
+
|
|
125
|
+
Portfoliable is not trying to be everything. It is trying to be *useful*, **predictable**, and ~~bloated~~ practical.
|
|
126
|
+
|
|
127
|
+
Term
|
|
128
|
+
: A compact way to publish work.
|
|
129
|
+
|
|
130
|
+
Keep:
|
|
131
|
+
- the title short
|
|
132
|
+
- the summary focused
|
|
133
|
+
- the body easy to scan
|
|
134
|
+
|
|
135
|
+
Remove:
|
|
136
|
+
- anything that does not help the story
|
|
137
|
+
|
|
138
|
+
Read more at [Portfoliable](https://www.portfoliable.js.org/).
|
|
139
|
+
|
|
140
|
+
[^1]: Markdown footnotes help add detail without breaking the flow.
|
|
141
|
+
|
|
142
|
+
<!-- lang:he -->
|
|
143
|
+
# אודות Portfoliable
|
|
144
|
+
|
|
145
|
+
Portfoliable הוא בונה פורטפוליו מבוסס Markdown שמסייע ליוצרים לפרסם קייסים ברורים, מהירים ומלוטשים.
|
|
146
|
+
|
|
147
|
+
הוא שומר את הפוקוס על התוכן, לא על הקונפיגורציה.
|
|
148
|
+
|
|
149
|
+
## מה זה Portfoliable
|
|
150
|
+
|
|
151
|
+
> Portfoliable מתייחס לפורטפוליו כמו למוצר: מובנה, קל לתחזוקה וקל לשיפור.
|
|
152
|
+
|
|
153
|
+
הוא משלב `markdown`, רכיבי מערכת עיצוב וברירות מחדל פרקטיות כדי שהפרויקט יישאר קליל בלי להרגיש מוגבל.
|
|
154
|
+
|
|
155
|
+
### מה הוא כולל
|
|
156
|
+
|
|
157
|
+
- דפי קייס עם תקצירים, ניווט ובקרי קריאה
|
|
158
|
+
- תוכן מקומי עם מטא-דאטה לשימוש חוזר
|
|
159
|
+
- ברירות מחדל ידידותיות לנגישות עבור ניגודיות, תנועה ונוחות קריאה
|
|
160
|
+
- תהליך עבודה שנשאר קרוב לקובצי המקור
|
|
161
|
+
|
|
162
|
+
### למה זה חשוב
|
|
163
|
+
|
|
164
|
+
1. זה מקצר את זמן ההקמה.
|
|
165
|
+
2. זה שומר על סיפור קריא.
|
|
166
|
+
3. זה הופך את האיטרציה לצפויה.
|
|
167
|
+
|
|
168
|
+
| תכונה | ערך | דוגמה |
|
|
169
|
+
| --- | --- | --- |
|
|
170
|
+
| Markdown | עריכה קלה | `# כותרת` |
|
|
171
|
+
| רשימות | מבנה ברור | ממוספרות ותבליטים |
|
|
172
|
+
| טבלאות | השוואה קצרה | החלטות במבט אחד |
|
|
173
|
+
| הערות שוליים | ניואנס נוסף | הערות מסבירות[^1] |
|
|
174
|
+
|
|
175
|
+
## דוגמה קצרה
|
|
176
|
+
|
|
177
|
+
```md
|
|
178
|
+
# אודות Portfoliable
|
|
179
|
+
|
|
180
|
+
Portfoliable הוא פרויקט שנועד להפוך פרסום פורטפוליו לפשוט.
|
|
181
|
+
|
|
182
|
+
> הוא נשאר ברקע כדי שהעבודה תוכל לדבר.
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## הערות
|
|
186
|
+
|
|
187
|
+
Portfoliable לא מנסה להיות הכול. הוא מנסה להיות *שימושי*, **צפוי** ו~~מנופח~~ פרקטי.
|
|
188
|
+
|
|
189
|
+
מונח
|
|
190
|
+
: דרך קצרה לפרסם עבודה.
|
|
191
|
+
|
|
192
|
+
להשאיר:
|
|
193
|
+
- כותרת קצרה
|
|
194
|
+
- תקציר ממוקד
|
|
195
|
+
- גוף שנוח לסריקה
|
|
196
|
+
|
|
197
|
+
להסיר:
|
|
198
|
+
- כל דבר שלא משרת את הסיפור
|
|
199
|
+
|
|
200
|
+
קראו עוד ב-[Portfoliable](https://www.portfoliable.js.org/).
|
|
201
|
+
|
|
202
|
+
[^1]: הערות שוליים ב-Markdown עוזרות להוסיף פרטים בלי לשבור את הזרימה.
|
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
<!-- config
|
|
2
|
+
{
|
|
3
|
+
// Identity
|
|
4
|
+
"id": "template-case",
|
|
5
|
+
"caseOrder": 100,
|
|
6
|
+
"slugByLocale": {
|
|
7
|
+
"en": "template-case",
|
|
8
|
+
"he": "template-case"
|
|
9
|
+
},
|
|
10
|
+
"socialImage": {
|
|
11
|
+
"en": "https://images.unsplash.com/photo-1518770660439-4636190af475?q=80&w=1200&h=675&auto=format&fit=contain&bg=111111",
|
|
12
|
+
"he": "https://images.unsplash.com/photo-1518770660439-4636190af475?q=80&w=1200&h=675&auto=format&fit=contain&bg=111111"
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
// Localized Metadata
|
|
16
|
+
"title": {
|
|
17
|
+
"show": true,
|
|
18
|
+
"en": "Making Portfoliable",
|
|
19
|
+
"he": "בונים את Portfoliable"
|
|
20
|
+
},
|
|
21
|
+
"shortDesc": {
|
|
22
|
+
"show": true,
|
|
23
|
+
"en": "A little behind-the-scenes look of the open-source project.",
|
|
24
|
+
"he": "מבט קצר מאחורי הקלעים של פרויקט הקוד הפתוח."
|
|
25
|
+
},
|
|
26
|
+
"readTime": {
|
|
27
|
+
"en": "1 min",
|
|
28
|
+
"he": "דקה"
|
|
29
|
+
},
|
|
30
|
+
"kicker": {
|
|
31
|
+
"en": "2026",
|
|
32
|
+
"he": "2026"
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
// Thumbnail and Cover
|
|
36
|
+
"thumbSrc": {
|
|
37
|
+
"en": "src/content/cases/template-case/cover.png",
|
|
38
|
+
"he": "src/content/cases/template-case/he-cover.png"
|
|
39
|
+
},
|
|
40
|
+
"thumbCategory": "desktop",
|
|
41
|
+
"thumbBrand": "apple",
|
|
42
|
+
"thumbModel": "Apple MacBook Air M5",
|
|
43
|
+
"thumbColor": "Apple iMac 24 Silver",
|
|
44
|
+
"showCover": true,
|
|
45
|
+
|
|
46
|
+
// Summary Experience (config-driven)
|
|
47
|
+
"showSummary": true,
|
|
48
|
+
"summary": {
|
|
49
|
+
"en": "Add an executive summary for this case.",
|
|
50
|
+
"he": "הוסיפו תקציר מנהלים עבור הקייס הזה."
|
|
51
|
+
},
|
|
52
|
+
"summaryProps": {
|
|
53
|
+
"text": {
|
|
54
|
+
"en": "Add concise impact details, launch scope, and operational confidence outcomes.",
|
|
55
|
+
"he": "הוסיפו פרטי השפעה תמציתיים, היקף השקה ותוצאות של ביטחון תפעולי."
|
|
56
|
+
},
|
|
57
|
+
"active": true,
|
|
58
|
+
"labelHeader": {
|
|
59
|
+
"en": "Case Snapshot",
|
|
60
|
+
"he": "תמונת מצב"
|
|
61
|
+
},
|
|
62
|
+
"showMetrics": true,
|
|
63
|
+
"ariaLabel": {
|
|
64
|
+
"en": "Case summary with key metrics",
|
|
65
|
+
"he": "תקציר קייס עם מדדי מפתח"
|
|
66
|
+
},
|
|
67
|
+
"metrics": [
|
|
68
|
+
{
|
|
69
|
+
"value": "4",
|
|
70
|
+
"label": {
|
|
71
|
+
"en": "Core principles",
|
|
72
|
+
"he": "עקרונות ליבה"
|
|
73
|
+
},
|
|
74
|
+
"variant": "default",
|
|
75
|
+
"ariaLabel": {
|
|
76
|
+
"en": "Four core principles",
|
|
77
|
+
"he": "ארבעה עקרונות ליבה"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"value": "1",
|
|
82
|
+
"label": {
|
|
83
|
+
"en": "CLI command",
|
|
84
|
+
"he": "פקודת CLI"
|
|
85
|
+
},
|
|
86
|
+
"variant": "default",
|
|
87
|
+
"ariaLabel": {
|
|
88
|
+
"en": "One command to scaffold a case",
|
|
89
|
+
"he": "פקודה אחת ליצירת תבנית לקייס"
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"value": "3",
|
|
94
|
+
"label": {
|
|
95
|
+
"en": "Built-in views",
|
|
96
|
+
"he": "תצוגות מובנות"
|
|
97
|
+
},
|
|
98
|
+
"variant": "default",
|
|
99
|
+
"ariaLabel": {
|
|
100
|
+
"en": "Three built-in views",
|
|
101
|
+
"he": "שלוש תצוגות מובנות"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"value": "100%",
|
|
106
|
+
"label": {
|
|
107
|
+
"en": "Markdown-driven",
|
|
108
|
+
"he": "מונע Markdown"
|
|
109
|
+
},
|
|
110
|
+
"variant": "default",
|
|
111
|
+
"ariaLabel": {
|
|
112
|
+
"en": "Content authored in markdown",
|
|
113
|
+
"he": "תוכן שנכתב ב-Markdown"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
// Reader Experience
|
|
120
|
+
"showReader": true,
|
|
121
|
+
"showToc": true,
|
|
122
|
+
"showNavigator": true,
|
|
123
|
+
|
|
124
|
+
// Audio Experience
|
|
125
|
+
"audioLabel": {
|
|
126
|
+
"en": "Case Audio Summary",
|
|
127
|
+
"he": "תקציר שמע לקייס"
|
|
128
|
+
},
|
|
129
|
+
"audioSrc": {
|
|
130
|
+
"en": "src/content/cases/template-case/template-audio.mp3",
|
|
131
|
+
"he": ""
|
|
132
|
+
},
|
|
133
|
+
"showPlayer": true,
|
|
134
|
+
|
|
135
|
+
// Visibility and Protection
|
|
136
|
+
"visibility": {
|
|
137
|
+
"web": true,
|
|
138
|
+
"crawlers": true,
|
|
139
|
+
"ai": true,
|
|
140
|
+
"locales": {}
|
|
141
|
+
},
|
|
142
|
+
"isProtected": false,
|
|
143
|
+
"isUnlocked": false,
|
|
144
|
+
|
|
145
|
+
// Social
|
|
146
|
+
"social": {
|
|
147
|
+
"share": {
|
|
148
|
+
"enabled": true,
|
|
149
|
+
"icon": "share",
|
|
150
|
+
"icon-variant": "outline",
|
|
151
|
+
"tooltip": {
|
|
152
|
+
"en": "Share this case link",
|
|
153
|
+
"he": "שיתוף קישור לקייס הזה"
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
"linkedin": {
|
|
157
|
+
"enabled": true,
|
|
158
|
+
"icon": "linkedin",
|
|
159
|
+
"icon-variant": "outline",
|
|
160
|
+
"tooltip": {
|
|
161
|
+
"en": "Share on LinkedIn",
|
|
162
|
+
"he": "שיתוף בלינקדאין"
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
"x": {
|
|
166
|
+
"enabled": true,
|
|
167
|
+
"icon": "x",
|
|
168
|
+
"icon-variant": "outline",
|
|
169
|
+
"tooltip": {
|
|
170
|
+
"en": "Share on X",
|
|
171
|
+
"he": "שיתוף ב-X"
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
"facebook": {
|
|
175
|
+
"enabled": true,
|
|
176
|
+
"icon": "facebook",
|
|
177
|
+
"icon-variant": "outline",
|
|
178
|
+
"tooltip": {
|
|
179
|
+
"en": "Share on Facebook",
|
|
180
|
+
"he": "שיתוף בפייסבוק"
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
"links": {
|
|
184
|
+
"linkedin": "",
|
|
185
|
+
"x": "",
|
|
186
|
+
"facebook": ""
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
// Actions
|
|
191
|
+
"actions": {
|
|
192
|
+
"primary": {
|
|
193
|
+
"enabled": true,
|
|
194
|
+
"variant": "primary",
|
|
195
|
+
"icon": "",
|
|
196
|
+
"icon-variant": "",
|
|
197
|
+
"label": {
|
|
198
|
+
"en": "Watch presentation",
|
|
199
|
+
"he": "צפייה במצגת"
|
|
200
|
+
},
|
|
201
|
+
"tooltip": {
|
|
202
|
+
"en": "Open walkthrough video",
|
|
203
|
+
"he": "פתיחת סרטון walkthrough"
|
|
204
|
+
},
|
|
205
|
+
"url": {
|
|
206
|
+
"en": "",
|
|
207
|
+
"he": ""
|
|
208
|
+
},
|
|
209
|
+
"videoSrc": {
|
|
210
|
+
"en": "src/content/cases/template-case/template-video.mp4",
|
|
211
|
+
"he": ""
|
|
212
|
+
},
|
|
213
|
+
"vttSrc": {
|
|
214
|
+
"en": "",
|
|
215
|
+
"he": ""
|
|
216
|
+
},
|
|
217
|
+
"imageAlt": {
|
|
218
|
+
"en": "",
|
|
219
|
+
"he": ""
|
|
220
|
+
},
|
|
221
|
+
"ariaLabel": {
|
|
222
|
+
"en": "",
|
|
223
|
+
"he": ""
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
"secondary": {
|
|
227
|
+
"enabled": true,
|
|
228
|
+
"variant": "secondary",
|
|
229
|
+
"icon": "",
|
|
230
|
+
"icon-variant": "",
|
|
231
|
+
"label": {
|
|
232
|
+
"en": "Repository",
|
|
233
|
+
"he": "מאגר"
|
|
234
|
+
},
|
|
235
|
+
"tooltip": {
|
|
236
|
+
"en": "Open repo on GitHub",
|
|
237
|
+
"he": "פתיחת המאגר ב-GitHub"
|
|
238
|
+
},
|
|
239
|
+
"url": {
|
|
240
|
+
"en": "https://github.com/portfoliablejs/portfoliable",
|
|
241
|
+
"he": "https://github.com/portfoliablejs/portfoliable"
|
|
242
|
+
},
|
|
243
|
+
"imageAlt": {
|
|
244
|
+
"en": "",
|
|
245
|
+
"he": ""
|
|
246
|
+
},
|
|
247
|
+
"ariaLabel": {
|
|
248
|
+
"en": "",
|
|
249
|
+
"he": ""
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
"tertiary": {
|
|
253
|
+
"enabled": true,
|
|
254
|
+
"variant": "tertiary",
|
|
255
|
+
"label": {
|
|
256
|
+
"en": "Visit website",
|
|
257
|
+
"he": "ביקור באתר"
|
|
258
|
+
},
|
|
259
|
+
"tooltip": {
|
|
260
|
+
"en": "Get to know this project",
|
|
261
|
+
"he": "להכיר את הפרויקט הזה"
|
|
262
|
+
},
|
|
263
|
+
"url": {
|
|
264
|
+
"en": "https://www.portfoliable.js.org/",
|
|
265
|
+
"he": "https://www.portfoliable.js.org/"
|
|
266
|
+
},
|
|
267
|
+
"has-image": false,
|
|
268
|
+
"image-src": "",
|
|
269
|
+
"image-alt": "",
|
|
270
|
+
"imageAlt": {
|
|
271
|
+
"en": "",
|
|
272
|
+
"he": ""
|
|
273
|
+
},
|
|
274
|
+
"ariaLabel": {
|
|
275
|
+
"en": "",
|
|
276
|
+
"he": ""
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
// Custom Buttons
|
|
282
|
+
"customButtons": [],
|
|
283
|
+
}
|
|
284
|
+
-->
|
|
285
|
+
|
|
286
|
+
<!-- lang:en -->
|
|
287
|
+
# Making Portfoliable
|
|
288
|
+
Portfoliable started from a simple belief: brilliant work deserves a **clear, fast, and elegant** way to be presented online.[^next-1]
|
|
289
|
+
|
|
290
|
+
Instead of spending weeks wiring layouts, routing, and content structure, you can focus on narrative, outcomes, and craft. This template is a practical behind-the-scenes case that explains the project and demonstrates markdown capabilities in one place.
|
|
291
|
+
|
|
292
|
+
## The problem we saw
|
|
293
|
+
Designers, developers, researchers, and teams often face the same friction:
|
|
294
|
+
|
|
295
|
+
1. Building a portfolio from scratch takes too long.
|
|
296
|
+
2. Generic templates hide the story behind the work.
|
|
297
|
+
3. Content gets fragmented across tools and file formats.
|
|
298
|
+
4. Accessibility and multilingual support are usually afterthoughts.
|
|
299
|
+
|
|
300
|
+
> Portfolios should be authored like products: intentional, reusable, and maintainable.
|
|
301
|
+
|
|
302
|
+
## The solution
|
|
303
|
+
Portfoliable is an open-source portfolio builder with a structured case system, reusable UI primitives, and a markdown-first authoring workflow. [^next-2]
|
|
304
|
+
|
|
305
|
+
### Core principles
|
|
306
|
+
- **Author first:** write once, publish confidently.
|
|
307
|
+
- **Design-system driven:** render through Valence components.
|
|
308
|
+
- **Content as source of truth:** your cases live in versioned files.
|
|
309
|
+
- **Accessible by default:** motion, contrast, and reading controls are built in.
|
|
310
|
+
|
|
311
|
+
### What this gives you
|
|
312
|
+
- Fast project setup with opinionated defaults.
|
|
313
|
+
- Flexible case pages with TOC, summary, media, and navigation.
|
|
314
|
+
- Localizable content with language-aware metadata.
|
|
315
|
+
- Repeatable CLI workflows for teams.
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## CLI workflow
|
|
320
|
+
Create a new case in seconds:
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
npm run portfoliable-create-case -- --name "Checkout Revamp"
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
Then iterate in your editor:
|
|
327
|
+
|
|
328
|
+
- update metadata in the config block
|
|
329
|
+
- write your story in markdown
|
|
330
|
+
- preview with the app runtime
|
|
331
|
+
|
|
332
|
+
## Example config snippet
|
|
333
|
+
```json
|
|
334
|
+
{
|
|
335
|
+
"id": "checkout-revamp",
|
|
336
|
+
"title": { "en": "Checkout Revamp" },
|
|
337
|
+
"showToc": true,
|
|
338
|
+
"showSummary": true
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## Markdown features used in this template
|
|
343
|
+
The table below maps common content patterns used in real case studies:
|
|
344
|
+
|
|
345
|
+
| Feature | Why it matters | Example |
|
|
346
|
+
| --- | --- | --- |
|
|
347
|
+
| Headings | Scannable narrative structure | `## Context` |
|
|
348
|
+
| Emphasis | Highlight key decisions | `**impact**`, `*tradeoff*` |
|
|
349
|
+
| Code blocks | Explain implementation details | fenced code with language |
|
|
350
|
+
| Tables | Compare options and outcomes | decision matrix |
|
|
351
|
+
| Lists | Communicate steps and priorities | ordered + unordered |
|
|
352
|
+
| Footnotes | Add nuance without noise | references and caveats |
|
|
353
|
+
|
|
354
|
+
## Decision log
|
|
355
|
+
Term
|
|
356
|
+
: A product-quality portfolio experience
|
|
357
|
+
|
|
358
|
+
Constraint
|
|
359
|
+
: Keep authoring simple enough for non-developers
|
|
360
|
+
|
|
361
|
+
Tradeoff
|
|
362
|
+
: Favor conventions over unlimited customization
|
|
363
|
+
|
|
364
|
+
## Delivery checklist
|
|
365
|
+
- [x] Case schema with localized fields
|
|
366
|
+
- [x] Reader + summary + navigator composition
|
|
367
|
+
- [x] Markdown-based storytelling
|
|
368
|
+
- [ ] Publish-ready production content for every locale
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
## Notes
|
|
372
|
+
You can start minimal and scale up later. ~~Perfect~~ practical documentation beats waiting for ideal conditions.
|
|
373
|
+
|
|
374
|
+
Learn more:
|
|
375
|
+
- [Portfoliable Website](https://www.portfoliable.js.org/)
|
|
376
|
+
- [Portfoliable Repository](https://github.com/portfoliablejs/portfoliable)
|
|
377
|
+
|
|
378
|
+
This case is intentionally concise, but extensible.[^next-3]
|
|
379
|
+
|
|
380
|
+
[^next-1]: Add sections for context, constraints, explorations, outcomes, metrics, and retrospective when adapting this template for production.
|
|
381
|
+
[^next-2]: Add sections for context, constraints, explorations, outcomes, metrics, and retrospective when adapting this template for production.
|
|
382
|
+
[^next-3]: Add sections for context, constraints, explorations, outcomes, metrics, and retrospective when adapting this template for production.
|
|
383
|
+
|
|
384
|
+
<!-- lang:he -->
|
|
385
|
+
# בונים את Portfoliable
|
|
386
|
+
Portfoliable נולד מתוך אמונה פשוטה: עבודה מעולה ראויה להצגה ברורה, מהירה ואלגנטית ברשת.[^next-he-1]
|
|
387
|
+
|
|
388
|
+
במקום להשקיע שבועות בחיבור תבניות, ניתוב ומבנה תוכן, אפשר להתמקד בסיפור, בתוצאות ובאיכות הביצוע. התבנית הזו היא קייס קצר מאחורי הקלעים שמסביר את הפרויקט ומדגים יכולות Markdown במקום אחד.
|
|
389
|
+
|
|
390
|
+
## הבעיה שזיהינו
|
|
391
|
+
מעצבים, מפתחים, חוקרים וצוותים מתמודדים שוב ושוב עם אותם חסמים:
|
|
392
|
+
|
|
393
|
+
1. בניית פורטפוליו מאפס לוקחת יותר מדי זמן.
|
|
394
|
+
2. תבניות כלליות מסתירות את הסיפור שמאחורי העבודה.
|
|
395
|
+
3. התוכן מתפזר בין כלים וקבצים שונים.
|
|
396
|
+
4. נגישות ורב-לשוניות בדרך כלל מגיעות מאוחר מדי.
|
|
397
|
+
|
|
398
|
+
> פורטפוליו צריך להיכתב כמו מוצר: בכוונה, לשימוש חוזר ועם תחזוקה לאורך זמן.
|
|
399
|
+
|
|
400
|
+
## הפתרון
|
|
401
|
+
Portfoliable הוא בונה פורטפוליו בקוד פתוח עם מערכת קייסים מובנית, רכיבי UI לשימוש חוזר וזרימת כתיבה מבוססת Markdown.[^next-he-2]
|
|
402
|
+
|
|
403
|
+
### עקרונות ליבה
|
|
404
|
+
- **הכותב במרכז:** כותבים פעם אחת ומפרסמים בביטחון.
|
|
405
|
+
- **מבוסס מערכת עיצוב:** רינדור דרך רכיבי Valence.
|
|
406
|
+
- **התוכן כמקור אמת:** הקייסים נשמרים בקבצים מנוהלי גרסאות.
|
|
407
|
+
- **נגיש כברירת מחדל:** שליטה בתנועה, ניגודיות וחוויית קריאה מובנית מראש.
|
|
408
|
+
|
|
409
|
+
### מה זה נותן לכם
|
|
410
|
+
- הקמה מהירה עם ברירות מחדל מכוונות.
|
|
411
|
+
- דפי קייס גמישים עם תוכן עניינים, תקציר, מדיה וניווט.
|
|
412
|
+
- תוכן מקומי לפי שפה עם מטא-דאטה מותאם.
|
|
413
|
+
- תהליכי CLI עקביים לצוותים.
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
## תהליך CLI
|
|
418
|
+
יוצרים קייס חדש תוך שניות:
|
|
419
|
+
|
|
420
|
+
```bash
|
|
421
|
+
npm run portfoliable-create-case -- --name "Checkout Revamp"
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
ואז ממשיכים לערוך בעורך:
|
|
425
|
+
|
|
426
|
+
- עדכון המטא-דאטה בבלוק הקונפיג
|
|
427
|
+
- כתיבת הסיפור ב-Markdown
|
|
428
|
+
- תצוגה מקדימה דרך סביבת האפליקציה
|
|
429
|
+
|
|
430
|
+
## דוגמת קונפיג קצרה
|
|
431
|
+
```json
|
|
432
|
+
{
|
|
433
|
+
"id": "checkout-revamp",
|
|
434
|
+
"title": { "en": "Checkout Revamp" },
|
|
435
|
+
"showToc": true,
|
|
436
|
+
"showSummary": true
|
|
437
|
+
}
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
## יכולות Markdown שמופעלות בתבנית הזו
|
|
441
|
+
הטבלה הבאה ממפה דפוסים נפוצים שנמצאים בקייסים אמיתיים:
|
|
442
|
+
|
|
443
|
+
| יכולת | למה זה חשוב | דוגמה |
|
|
444
|
+
| --- | --- | --- |
|
|
445
|
+
| כותרות | מבנה סיפורי שקל לסרוק | `## Context` |
|
|
446
|
+
| הדגשות | הדגשת החלטות מרכזיות | `**impact**`, `*tradeoff*` |
|
|
447
|
+
| בלוקי קוד | הסבר פרטי יישום | fenced code עם שפה |
|
|
448
|
+
| טבלאות | השוואת אפשרויות ותוצאות | מטריצת החלטות |
|
|
449
|
+
| רשימות | העברת שלבים ועדיפויות | ממוספרת + תבליטים |
|
|
450
|
+
| הערות שוליים | הוספת ניואנס בלי עומס | הפניות והסתייגויות |
|
|
451
|
+
|
|
452
|
+
## יומן החלטות
|
|
453
|
+
מונח
|
|
454
|
+
: חוויית פורטפוליו באיכות מוצר
|
|
455
|
+
|
|
456
|
+
מגבלה
|
|
457
|
+
: לשמור את הכתיבה פשוטה גם למי שלא מפתחים
|
|
458
|
+
|
|
459
|
+
פשרה
|
|
460
|
+
: להעדיף מוסכמות על פני התאמה בלתי מוגבלת
|
|
461
|
+
|
|
462
|
+
## רשימת מסירה
|
|
463
|
+
- [x] סכמת קייס עם שדות מקומיים
|
|
464
|
+
- [x] קומפוזיציה של Reader + Summary + Navigator
|
|
465
|
+
- [x] סיפור מבוסס Markdown
|
|
466
|
+
- [ ] תוכן פרודקשן מוכן לפרסום בכל לוקאל
|
|
467
|
+
|
|
468
|
+
## הערות
|
|
469
|
+
אפשר להתחיל בקטן ולהרחיב בהמשך. תיעוד פרקטי עדיף על המתנה לתנאים מושלמים.
|
|
470
|
+
|
|
471
|
+
למידע נוסף:
|
|
472
|
+
- [אתר Portfoliable](https://www.portfoliable.js.org/)
|
|
473
|
+
- [מאגר Portfoliable](https://github.com/portfoliablejs/portfoliable)
|
|
474
|
+
|
|
475
|
+
הקייס הזה קצר בכוונה, אבל ניתן להרחבה.[^next-he-3]
|
|
476
|
+
|
|
477
|
+
[^next-he-1]: הוסיפו לקייס אמיתי גם הקשר, מגבלות, חלופות, תוצאות, מדדים ורטרוספקטיבה.
|
|
478
|
+
[^next-he-2]: אפשר להתאים את המבנה הזה לזרימות מוצר, מחקר או Design System.
|
|
479
|
+
[^next-he-3]: זה בסיס מהיר לבדיקה, ואפשר לפתח אותו למסמך פרויקט מלא.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|