@vettvangur/design-system 0.0.1

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 (37) hide show
  1. package/LICENSE +11 -0
  2. package/README.md +18 -0
  3. package/dist/generate-astro-AcegHzWG.js +476 -0
  4. package/dist/generate-astro-B225JTMY.js +534 -0
  5. package/dist/generate-astro-Btr2jiyr.js +389 -0
  6. package/dist/generate-astro-CpNCOn_3.js +475 -0
  7. package/dist/generate-astro-CqXZcTfi.js +820 -0
  8. package/dist/generate-astro-D-FcwrAx.js +819 -0
  9. package/dist/generate-astro-DfaWTEF_.js +539 -0
  10. package/dist/generate-astro-DwBkft4p.js +820 -0
  11. package/dist/generate-razor--hJCWG13.js +454 -0
  12. package/dist/generate-razor-B0Pid10L.js +441 -0
  13. package/dist/generate-razor-B0n9FUR8.js +441 -0
  14. package/dist/generate-razor-B3a_-uDf.js +441 -0
  15. package/dist/generate-razor-BLNML3CC.js +441 -0
  16. package/dist/generate-razor-CABSDQok.js +454 -0
  17. package/dist/generate-razor-CGhqwpRL.js +413 -0
  18. package/dist/generate-razor-DcAkNKya.js +9 -0
  19. package/dist/generate-razor-DwXDvSTP.js +332 -0
  20. package/dist/generate-razor-IGs8o9fx.js +441 -0
  21. package/dist/generate-razor-nGTa0EVW.js +335 -0
  22. package/dist/generate-tailwind-16Mayr2z.js +1050 -0
  23. package/dist/generate-tailwind-BR1-fpNI.js +1056 -0
  24. package/dist/generate-tailwind-BVpI-hUx.js +1057 -0
  25. package/dist/generate-tailwind-Bd3ltCQR.js +1084 -0
  26. package/dist/generate-tailwind-BljcUYMa.js +1051 -0
  27. package/dist/generate-tailwind-BqZCEvj5.js +1049 -0
  28. package/dist/generate-tailwind-CGwQarzK.js +1059 -0
  29. package/dist/generate-tailwind-Cpb8YNNz.js +1050 -0
  30. package/dist/generate-tailwind-CtUsHnBd.js +1060 -0
  31. package/dist/generate-tailwind-DL0GEqR6.js +1050 -0
  32. package/dist/generate-tailwind-Dr3KLBMD.js +1045 -0
  33. package/dist/generate-tailwind-KzRHwyMG.js +1049 -0
  34. package/dist/generate-tailwind-VnkcDTZP.js +1049 -0
  35. package/dist/index.esm.js +58 -0
  36. package/dist/inputs-CQVgm9Do.js +439 -0
  37. package/package.json +35 -0
@@ -0,0 +1,441 @@
1
+ #!/usr/bin/env node
2
+ import { promises } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { p as parseColors, a as parseTypography, b as parseButtons, i as inputsSpec } from './inputs-CQVgm9Do.js';
5
+ import 'node:url';
6
+ import 'node:process';
7
+
8
+ // core/razor/generate-razor.mjs
9
+ const CWD = process.cwd();
10
+ const OUT_DIR = path.resolve(CWD, '../Vettvangur.Site/Views/Partials/Styleguide');
11
+ const FILE_COLORS = path.join(OUT_DIR, 'StyleguideColors.cshtml');
12
+ const FILE_TYPO = path.join(OUT_DIR, 'StyleguideTypography.cshtml');
13
+ const FILE_BUTTONS = path.join(OUT_DIR, 'StyleguideButtons.cshtml');
14
+ const FILE_INPUTS = path.join(OUT_DIR, 'StyleguideInputs.cshtml');
15
+ const FILE_RICHTEXT = path.join(OUT_DIR, 'StyleguideRichtext.cshtml');
16
+ const FILE_Table = path.join(OUT_DIR, 'StyleguideTables.cshtml');
17
+
18
+ // default export now takes a namespace (e.g. 'Cerebrum', 'MMS')
19
+ async function generateRazor(ns = 'UmbracoStarter') {
20
+ // helpers to build partial paths with the namespace
21
+ const P = p => `${ns}/Components/${p}`; // e.g. "Cerebrum/Components/Headline"
22
+ const HeadlinePartial = P('Headline');
23
+ const ButtonPartial = P('Button');
24
+ const InputPartial = P('Inputs/Input');
25
+ const SelectPartial = P('Inputs/Select');
26
+ const SelectionPartial = P('Inputs/Selection');
27
+ const TextareaPartial = P('Inputs/Textarea');
28
+ await promises.mkdir(OUT_DIR, {
29
+ recursive: true
30
+ });
31
+ const [colors, typography, buttons] = await Promise.all([parseColors(), parseTypography(), parseButtons()]);
32
+
33
+ // Colors
34
+ if (colors?.length) {
35
+ await promises.writeFile(FILE_COLORS, renderColors(colors, HeadlinePartial), 'utf8');
36
+ log(FILE_COLORS, colors.length);
37
+ }
38
+
39
+ // Typography (one file)
40
+ if ((typography?.headlines?.length ?? 0) + (typography?.bodies?.length ?? 0) > 0) {
41
+ await promises.writeFile(FILE_TYPO, renderTypography(typography, HeadlinePartial), 'utf8');
42
+ log(FILE_TYPO, (typography.headlines?.length ?? 0) + (typography.bodies?.length ?? 0));
43
+ }
44
+
45
+ // Buttons
46
+ if (buttons?.length) {
47
+ await promises.writeFile(FILE_BUTTONS, renderButtons(buttons, HeadlinePartial, ButtonPartial), 'utf8');
48
+ log(FILE_BUTTONS, buttons.length);
49
+ }
50
+
51
+ // Inputs
52
+ const hasAnyInputs = Object.values(inputsSpec).some(v => Array.isArray(v) && v.length);
53
+ if (hasAnyInputs) {
54
+ await promises.writeFile(FILE_INPUTS, renderInputs(inputsSpec, HeadlinePartial, {
55
+ InputPartial,
56
+ SelectPartial,
57
+ SelectionPartial,
58
+ TextareaPartial
59
+ }), 'utf8');
60
+ log(FILE_INPUTS, countInputs(inputsSpec));
61
+ }
62
+
63
+ // Richtext & Tables (static demos)
64
+ await promises.writeFile(FILE_RICHTEXT, renderRichtext(HeadlinePartial), 'utf8');
65
+ log(FILE_RICHTEXT, 1);
66
+ await promises.writeFile(FILE_Table, renderRichtextTables(HeadlinePartial), 'utf8');
67
+ log(FILE_Table, 1);
68
+ }
69
+
70
+ /* -------------------- RENDERERS -------------------- */
71
+
72
+ function renderColors(colors, HeadlinePartial) {
73
+ const items = colors.map(({
74
+ title,
75
+ color
76
+ }) => `
77
+ <div class="styleguide-color">
78
+ <span class="styleguide-color__label label">${h(title)}</span>
79
+ <div class="styleguide-color__swatch" style="background: ${a(color)};"></div>
80
+ <div class="styleguide-color__info">
81
+ <span class="styleguide-color__info-hex label">${h(color)}</span>
82
+ </div>
83
+ </div>`).join('\n');
84
+ return `@* Auto-generated — do not edit by hand *@
85
+ <section class="styleguide-colors styleguide-spacing">
86
+ <div class="container">
87
+ <partial name="${HeadlinePartial}" view-data="@(new ViewDataDictionary(ViewData)
88
+ {{ "headlineData", new Headline {
89
+ Identifier = "styleguide__headline",
90
+ Modifier = "headline1",
91
+ Text = "Colors"
92
+ }}})" />
93
+
94
+ <div class="styleguide-colors-grid grid grid--gap">
95
+ ${items}
96
+ </div>
97
+ </div>
98
+ </section>
99
+ `;
100
+ }
101
+ function renderTypography({
102
+ headlines = [],
103
+ bodies = []
104
+ }, HeadlinePartial) {
105
+ const headlineItems = headlines.map(hItem => {
106
+ const mod = classToModifier(hItem.class, 'headline');
107
+ const info = infoBlocks(hItem);
108
+ return `
109
+ <div class="styleguide-typography__item grid grid--gap">
110
+ <span class="styleguide-typography__item-name">${hItem.title}</span>
111
+
112
+ <partial name="${HeadlinePartial}" view-data="@(new ViewDataDictionary(ViewData)
113
+ {{ "headlineData", new Headline {
114
+ Identifier = "styleguide-typography__item-example",
115
+ Modifier = "${a(mod)}",
116
+ Text = "${a(hItem.title)}"
117
+ }}})" />
118
+
119
+ ${info ? renderInfo(info) : ''}
120
+ </div>`;
121
+ }).join('\n');
122
+ const bodyItems = bodies.map(b => {
123
+ const info = infoBlocks(b);
124
+ return `
125
+ <div class="styleguide-typography__item grid grid--gap">
126
+ <span class="styleguide-typography__item-name">${h(b.title)}</span>
127
+ <p class="${a(b.class)} styleguide-typography__item-example">
128
+ The quick brown fox jumps over the lazy dog.
129
+ </p>
130
+ ${info ? renderInfo(info) : ''}
131
+ </div>`;
132
+ }).join('\n');
133
+ return `@* Auto-generated — do not edit by hand *@
134
+ <section class="styleguide-typography styleguide-spacing">
135
+ <div class="container">
136
+ <partial name="${HeadlinePartial}" view-data="@(new ViewDataDictionary(ViewData)
137
+ {{ "headlineData", new Headline {
138
+ Identifier = "styleguide__headline",
139
+ Modifier = "headline1",
140
+ Text = "Typography"
141
+ }}})" />
142
+ ${headlineItems}
143
+ ${bodyItems}
144
+ </div>
145
+ </section>
146
+ `;
147
+ }
148
+ function renderInfo(info) {
149
+ const {
150
+ base,
151
+ desktop,
152
+ mobile
153
+ } = info;
154
+ return `
155
+ <div class="styleguide-typography__info">
156
+ ${base ? `
157
+ <div class="styleguide-typography__info-item">
158
+ <span>Base</span>
159
+ <span><strong>${h(base)}</strong></span>
160
+ </div>` : ''}
161
+ ${desktop ? `
162
+ <div class="styleguide-typography__info-item">
163
+ <span>Desktop</span>
164
+ <span><strong>${h(desktop)}</strong></span>
165
+ </div>` : ''}
166
+ ${mobile ? `
167
+ <div class="styleguide-typography__info-item">
168
+ <span>Mobile</span>
169
+ <span><strong>${h(mobile)}</strong></span>
170
+ </div>` : ''}
171
+ </div>`;
172
+ }
173
+ function renderButtons(buttons, HeadlinePartial, ButtonPartial) {
174
+ const items = buttons.map(b => `
175
+ <div class="styleguide__button-wrap">
176
+ <partial name="${ButtonPartial}" view-data="@(new ViewDataDictionary(ViewData)
177
+ {{ "buttonData", new Button {
178
+ Modifier = "${a(b.class)}",
179
+ Type = ButtonType.Button,
180
+ Text = "${a(b.text || b.title)}"
181
+ }}})" />
182
+ </div>`).join('\n');
183
+ return `@* Auto-generated — do not edit by hand *@
184
+ <section class="styleguide-buttons styleguide-spacing">
185
+ <div class="container">
186
+ <partial name="${HeadlinePartial}" view-data="@(new ViewDataDictionary(ViewData)
187
+ {{ "headlineData", new Headline {
188
+ Identifier = "styleguide__headline",
189
+ Modifier = "headline1",
190
+ Text = "Buttons"
191
+ }}})" />
192
+
193
+ <div class="grid grid--gap">
194
+ ${items}
195
+ </div>
196
+ </div>
197
+ </section>
198
+ `;
199
+ }
200
+ function renderInputs(spec, HeadlinePartial, parts) {
201
+ const {
202
+ InputPartial,
203
+ SelectPartial,
204
+ SelectionPartial,
205
+ TextareaPartial
206
+ } = parts;
207
+ const {
208
+ inputs = [],
209
+ selects = [],
210
+ checkboxes = [],
211
+ radios = [],
212
+ textareas = []
213
+ } = spec;
214
+ const inputsPartials = inputs.map(i => `
215
+ <partial name="${InputPartial}" view-data="@(new ViewDataDictionary(ViewData)
216
+ {{ "inputData", new HTMLInput {
217
+ Id = "${a(i.id || '')}",
218
+ Label = "${a(i.Label ?? i.label ?? 'Input')}",
219
+ Placeholder = "${a(i.placeholder ?? 'Input placeholder')}",
220
+ IsDisabled = ${bool(i.isDisabled)},
221
+ IsReadOnly = ${bool(i.isReadOnly)},
222
+ IsError = ${bool(i.isError)}
223
+ }}})" />`).join('\n');
224
+ const selectsPartials = selects.map(s => `
225
+ <partial name="${SelectPartial}" view-data="@(new ViewDataDictionary(ViewData)
226
+ {{ "selectData", new Select {
227
+ Id = "${a(s.id || '')}",
228
+ Label = "${a(s.Label ?? 'Select')}",
229
+ Options = selectOptions,
230
+ IsDisabled = ${bool(s.isDisabled)},
231
+ IsReadOnly = ${bool(s.isReadOnly)},
232
+ IsError = ${bool(s.isError)}
233
+ }}})" />`).join('\n');
234
+ const checkboxRows = checkboxes.map(c => `
235
+ <div class="input-group">
236
+ <partial name="${SelectionPartial}" view-data="@(new ViewDataDictionary(ViewData)
237
+ {{ "selectionData", new Selection {
238
+ Id = "${a(c.id || '')}",
239
+ Label = "${a(c.Label ?? c.label ?? 'Checkbox')}",
240
+ Type = InputType.Checkbox,
241
+ IsDisabled = ${bool(c.isDisabled)},
242
+ IsError = ${bool(c.isError)}
243
+ }}})" />
244
+ </div>`).join('\n');
245
+ const radioRows = radios.map(r => `
246
+ <div class="input-group">
247
+ <partial name="${SelectionPartial}" view-data="@(new ViewDataDictionary(ViewData)
248
+ {{ "selectionData", new Selection {
249
+ Id = "${a(r.id || '')}",
250
+ Type = InputType.Radio,
251
+ Name = "${a(r.Name ?? r.name ?? 'prettyradio')}",
252
+ Label = "${a(r.Label ?? r.label ?? 'Radio')}",
253
+ IsDisabled = ${bool(r.isDisabled)},
254
+ IsError = ${bool(r.isError)}
255
+ }}})" />
256
+ </div>`).join('\n');
257
+ const textareasPartials = textareas.map(t => `
258
+ <partial name="${TextareaPartial}" view-data="@(new ViewDataDictionary(ViewData)
259
+ {{ "textareaData", new Textarea {
260
+ Id = "${a(t.id || '')}",
261
+ Label = "${a(t.Label ?? 'Textarea')}",
262
+ Placeholder = "${a(t.placeholder ?? 'Textarea placeholder')}",
263
+ IsDisabled = ${bool(t.isDisabled)},
264
+ IsReadOnly = ${bool(t.isReadOnly)},
265
+ IsError = ${bool(t.isError)}
266
+ }}})" />`).join('\n');
267
+ return `@* Auto-generated — do not edit by hand *@
268
+ @{
269
+ var selectOptions = new Dictionary<string, dynamic>() {
270
+ { "option1", "Option value" },
271
+ { "option2", "Option value" },
272
+ { "option3", "Option value" },
273
+ { "option4", "Option value" },
274
+ { "option5", "Option value" },
275
+ { "option6", "Option value" },
276
+ };
277
+ }
278
+
279
+ <section class="styleguide-inputs styleguide-spacing">
280
+ <div class="container">
281
+ <partial name="${HeadlinePartial}" view-data="@(new ViewDataDictionary(ViewData)
282
+ {{ "headlineData", new Headline {
283
+ Identifier = "styleguide__headline",
284
+ Modifier = "headline1",
285
+ Text = "Inputs"
286
+ }}})" />
287
+
288
+ <div class="styleguide-inputs__scrollitem grid grid--gap grid--align-start">
289
+ ${inputsPartials}
290
+ ${selectsPartials}
291
+ ${checkboxRows}
292
+ ${radioRows}
293
+ ${textareasPartials}
294
+ </div>
295
+ </div>
296
+ </section>
297
+ `;
298
+ }
299
+
300
+ /* ------------ Richtext (static demo) ------------ */
301
+ function renderRichtext(HeadlinePartial) {
302
+ return `@* Auto-generated — do not edit by hand *@
303
+ <section class="w-full">
304
+ <partial name="${HeadlinePartial}" view-data="@(new ViewDataDictionary(ViewData)
305
+ {{ "headlineData", new Headline {
306
+ Identifier = "styleguide__headline",
307
+ Modifier = "headline-1 mb-[60px]",
308
+ Text = "Richtext"
309
+ }}})" />
310
+
311
+ <div class="richtext">
312
+ <h1>h1</h1>
313
+ <h2>h2</h2>
314
+ <h3>h3</h3>
315
+ <h4>h4</h4>
316
+ <h5>h5</h5>
317
+ <p>
318
+ Ófróðlegt þorviðar <a href="https://www.vettvangur.is/" target="_blank">látist kærðu</a>, allfeginn því að kaupmanni, <strong>hraðasta</strong> ættleri <em>farminum</em> þuríði brústeinunum konungsþræll grænar. Hólmganga hrísflekkur, lifum skalla-grímur tíkr. Meiðinn hatast oddleifsdóttir, dólglegast dyflini, torfafóstri torfunni rak jarðarmenið stirðir. Býsn hvé ölseljunni gerði, jafnvitur lög vaskligr, sám hvortveggja ófrelsi trúfasti hallkelsdóttur sneri mund guðmundarsonum. Sekum meginmerkurinnar, arfsali allmikilli sjaldgæf. Uggasyni sættu konungsþræll gæs, alþýðuskap orðtækið stokkar, orkar mund ormláðs skrumaði hriflusonar virðak. Biðjum meiðinn keppa, taliðr uggasyni, skerðan manngjarnlega hofgyðja vilk allmikilli. Ógott hirðum samdóma, heimamaðr endilangt, erlingur kaldur gjósa seimþollr hallkell landkaupi. Torfunni tungu-oddur þorviðar gufárós, ævifús sekur tröllskessa, umbanda rétttrúaður bráðan svörfuði nýt íþrótt dalalönd halli. Flyðruness haldnar aðsóknar skerðan, auðhnykkjanda mannvandur smálöndum sauðarhöfðinu ferjunni.
319
+ </p>
320
+ <ul>
321
+ <li>List item</li>
322
+ <li>List item</li>
323
+ <li>
324
+ List item
325
+ <ul>
326
+ <li>Nested item</li>
327
+ <li>Nested item</li>
328
+ <li>
329
+ Nested item
330
+ <ul>
331
+ <li>Nested even more item</li>
332
+ <li>Nested even more item</li>
333
+ <li>Nested even more item</li>
334
+ </ul>
335
+ </li>
336
+ </ul>
337
+ </li>
338
+ <li>List item</li>
339
+ </ul>
340
+ <ol>
341
+ <li>List item</li>
342
+ <li>
343
+ List item
344
+ <ol>
345
+ <li>Nested item</li>
346
+ <li>Nested item</li>
347
+ <li>Nested item</li>
348
+ </ol>
349
+ </li>
350
+ <li>List item</li>
351
+ <li>List item</li>
352
+ </ol>
353
+ <p>
354
+ Ófróðlegt þorviðar <a href="https://www.vettvangur.is/" target="_blank">látist kærðu</a>, allfeginn því að kaupmanni, hraðasta ættleri farminum þuríði brústeinunum konungsþræll grænar. Hólmganga hrísflekkur, lifum skalla-grímur tíkr. Meiðinn hatast oddleifsdóttir, dólglegast dyflini, torfafóstri torfunni rak jarðarmenið stirðir. Býsn hvé ölseljunni gerði, jafnvitur lög vaskligr, sám hvortveggja ófrelsi trúfasti hallkelsdóttur sneri mund guðmundarsonum. Sekum meginmerkurinnar, arfsali allmikilli sjaldgæf. Uggasyni sættu konungsþræll gæs, alþýðuskap orðtækið stokkar, orkar mund ormláðs skrumaði hriflusonar virðak. Biðjum meiðinn keppa, taliðr uggasyni, skerðan manngjarnlega hofgyðja vilk allmikilli. Ógott hirðum samdóma, heimamaðr endilangt, erlingur kaldur gjósa seimþollr hallkell landkaupi. Torfunni tungu-oddur þorviðar gufárós, ævifús sekur tröllskessa, umbanda rétttrúaður bráðan svörfuði nýt íþrótt dalalönd halli. Flyðruness haldnar aðsóknar skerðan, auðhnykkjanda mannvandur smálöndum sauðarhöfðinu ferjunni.
355
+ </p>
356
+ </div>
357
+ </section>
358
+ `;
359
+ }
360
+ function renderRichtextTables(HeadlinePartial) {
361
+ return `@* Auto-generated — do not edit by hand *@
362
+ <section class="w-full">
363
+ <partial name="${HeadlinePartial}" view-data="@(new ViewDataDictionary(ViewData)
364
+ {{ "headlineData", new Headline {
365
+ Identifier = "styleguide__headline",
366
+ Modifier = "headline-1 mb-20",
367
+ Text = "Tables"
368
+ }}})" />
369
+
370
+ <div class="table">
371
+ <table class="table__element">
372
+ <thead>
373
+ <tr>
374
+ <th>Head</th>
375
+ <th>Head</th>
376
+ <th>Head</th>
377
+ <th>Head</th>
378
+ <th>Head</th>
379
+ </tr>
380
+ </thead>
381
+ <tbody>
382
+ <tr>
383
+ <td>1</td><td>2</td><td>3</td><td>4</td><td>5</td>
384
+ </tr>
385
+ <tr>
386
+ <td>1</td><td>2</td><td>3</td><td>4</td><td>5</td>
387
+ </tr>
388
+ <tr>
389
+ <td>1</td><td>2</td><td>3</td><td>4</td><td>5</td>
390
+ </tr>
391
+ </tbody>
392
+ </table>
393
+ </div>
394
+ </section>
395
+ `;
396
+ }
397
+
398
+ /* -------------------- HELPERS -------------------- */
399
+ function infoBlocks(item) {
400
+ const base = pair(item.size, item.lineheight);
401
+ const desktop = item?.config?.desktop ? pair(item.config.desktop.size, item.config.desktop.lineHeight) : '';
402
+ const mobile = item?.config?.mobile ? pair(item.config.mobile.size, item.config.mobile.lineHeight) : '';
403
+ if (!base && !desktop && !mobile) {
404
+ return '';
405
+ }
406
+ return {
407
+ base,
408
+ desktop,
409
+ mobile
410
+ };
411
+ }
412
+ function pair(size, lh) {
413
+ if (!size && !lh) {
414
+ return '';
415
+ }
416
+ return `Size: ${size ?? '-'} / Line height: ${lh ?? '-'}`;
417
+ }
418
+ function classToModifier(cls = '', prefix = 'headline') {
419
+ const m = new RegExp(`^${prefix}[-_]?(\\d+)$`).exec(cls);
420
+ if (m) {
421
+ return `${prefix}${m[1]}`;
422
+ }
423
+ return cls.replaceAll('-', '');
424
+ }
425
+ function countInputs(spec) {
426
+ return ['inputs', 'selects', 'checkboxes', 'radios', 'textareas'].reduce((sum, k) => sum + (spec[k]?.length || 0), 0);
427
+ }
428
+ function a(s = '') {
429
+ return String(s).replaceAll('"', '&quot;');
430
+ }
431
+ function h(s = '') {
432
+ return String(s).replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');
433
+ }
434
+ function bool(v) {
435
+ return v ? 'true' : 'false';
436
+ }
437
+ function log(file, n) {
438
+ console.log(`✓ Wrote ${path.relative(process.cwd(), file)} (${n})`);
439
+ }
440
+
441
+ export { generateRazor as default };