@pixelated-tech/components 3.9.17 → 3.9.18
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/dist/components/general/accordion.css +4 -4
- package/dist/components/general/faq-accordion.js +4 -2
- package/dist/config/pixelated.config.json.enc +1 -1
- package/dist/scripts/pixelated-eslint-plugin.js +64 -15
- package/dist/types/components/general/faq-accordion.d.ts.map +1 -1
- package/dist/types/tests/required-faq.rule.test.d.ts +2 -0
- package/dist/types/tests/required-faq.rule.test.d.ts.map +1 -0
- package/package.json +4 -4
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
.accordion-title {
|
|
18
18
|
cursor: pointer;
|
|
19
19
|
padding: 1rem;
|
|
20
|
-
font-size: 1rem;
|
|
21
|
-
font-weight: 600;
|
|
20
|
+
/* font-size: 1rem;
|
|
21
|
+
font-weight: 600; */
|
|
22
22
|
color: #1a202c;
|
|
23
23
|
background: none;
|
|
24
24
|
border: none;
|
|
@@ -62,8 +62,8 @@ details[open] .accordion-title::before {
|
|
|
62
62
|
|
|
63
63
|
.accordion-title h3 {
|
|
64
64
|
margin: 0;
|
|
65
|
-
font-size: inherit;
|
|
66
|
-
font-weight: inherit;
|
|
65
|
+
/* font-size: inherit;
|
|
66
|
+
font-weight: inherit; */
|
|
67
67
|
color: inherit;
|
|
68
68
|
flex: 1;
|
|
69
69
|
}
|
|
@@ -10,7 +10,8 @@ const categoryIcons = {
|
|
|
10
10
|
'Content & Management': '📝',
|
|
11
11
|
'Support & Maintenance': '🛠️',
|
|
12
12
|
'Ownership & Legal': '📋',
|
|
13
|
-
'Services': '💼'
|
|
13
|
+
'Services': '💼',
|
|
14
|
+
'': ''
|
|
14
15
|
};
|
|
15
16
|
FAQAccordion.propTypes = {
|
|
16
17
|
faqsData: PropTypes.shape({
|
|
@@ -55,7 +56,8 @@ export function FAQAccordion({ faqsData }) {
|
|
|
55
56
|
const accordionItems = filteredFaqs.map((faq, index) => {
|
|
56
57
|
const content = Array.isArray(faq.acceptedAnswer.text) ? (_jsx("div", { children: faq.acceptedAnswer.text.map((paragraph, pIndex) => (_jsx("p", { dangerouslySetInnerHTML: { __html: paragraph } }, pIndex))) })) : (_jsx("div", { dangerouslySetInnerHTML: { __html: faq.acceptedAnswer.text } }));
|
|
57
58
|
return {
|
|
58
|
-
title: `${categoryIcons[faq.category] || '❓'} ${faq.name}`,
|
|
59
|
+
/* title: `${categoryIcons[faq.category as CategoryKey] || '❓'} ${faq.name}`, */
|
|
60
|
+
title: `${categoryIcons[faq.category] || ''} ${faq.name}`,
|
|
59
61
|
content,
|
|
60
62
|
open: expandedStates[index] || undefined
|
|
61
63
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
pxl:v1:
|
|
1
|
+
pxl:v1:e782f45daa51bb928539fac3:115a6b53f654fd4fe26a72c37a21cdea:16c14158f160ce9e53070dd7776d016d98f1355027a0b150c66e85da0f88422dd7770d25f1cd03f90d52d0743d12df1df936ca7266b12da0a5e9e872825985cb3da3985ed65e9d95509b653c5f87632d0847bf417e1b7fb36ec973964d912178f9acb8fa8f63bd9df93196f73521971dfe2c3cbc69f9fcaab1ac29c1c40ba802ff7bfed9a880efb099920eefac4f16bb01de23bf1fe57aff4597eb3bc4fee3e7e0715bf81f653ac06e2d7c7835b775176e61dcca434ae3da1f1983226513ae9e2b4f70704e3387981904ebcab67bb4034b573ac28c331b8adb86025672351c0fde64380b80f16669ff5acf5293623cf87ae06bcefbf65046776c582fc87803b777f0cc4edef5f3eeac96ea41e9daee0ba16e62e581487e899ed8101dd5f0f043b32c128578cd4e2613d690ce6a290842d42221cbb0ea91ded435314b188589329c09ff3602e3bfaa473975b5cf8833de0729cac2129a3b54206ca02de526e28e931d0fefb9fcf006cef8b2ce7ee8b9a558289f95029a92ea918b1f9cde77f163460d65a4c68b96ccd46778acf22075dd0b60840c3a9abc86b5e84f9daef1583388102acf2262ae9ff441ac95c0d49b069e67c5b1d3d700d89c305e6f6e24af2e06e623101515cde459564d2217c4d5b5bfe4b9a0c426306b0c354f51b7556be2d3bf7b7fcc36dc97697aee564bb8c75f9f8a7a279230902512d503309e1f072550cbbdfb40eeaaab2fbde2951ca4b6960fb9b2afae78ef00d03bb5a1e90d11684cb30b0abe79615e263872b88fdfe1f02aaa6bcc4d12e8d3bb0ef68be0f4682c745f838cf2fd5859aaae268d75a21b0bc89b8e63db17aed45bf7fe86c85a1f86ed7b95007821aeac7fcce94e1c4bbeabde111b43edd4a70f6332cd88ac6651ca033bedcab40eb635aa54fb748811ef304c574b1c15db0ebedb8d21fc1a7200a83b5960567c8a65c325a49c8a5ebeab063c95d94ce6e0625a77fe42d98d1afe1bb6c5f98b92d41487f20fcb771c2b9850514f6849c2849f23c4e845795efec2f7502101b1e6870eae0a7b0ee536d5e8589b87e9a1da0c5805c4be9fe3c91697267946bd3540a110da410f1b350b0b29f51ff7f06c2776d519e9a7aa94024324d6fe3ff4b84c8b5a2b7132e9fcd01a0d775d0553ad9b053eac28f98e255d98dfb75c6dbe995f8da1738245d94b5476d2f2933cc214fc1cca3c4246cff28c56843cca16c63bd8b95c161df6b1e2fbad299f9e010e6781d2e003cc472a0c030e07168b23abe475ef081269c56d8e8bd748a82e496ec5e21e3d62301b2956af2f30927f4cf52a3a83a00576e5a81a91b808f547b4c2c7472cf6933873b1941f64782e2447d4807b751777b38b9c84114ce1a29874ec3683dba66c2a9b4498acfd96d361c14b39135e98342834ece9dee616aa774594d8cfc755886fb7c737cab68c5577515866f10f886da7f92f0ac6b6c4c7cf63d74fd6291134e84950dbf1c00b250d5a13e56763b79abfe2b66c01e5fdce64d15fee6cde069bd2cc1570f4201fde7b9bfc53f9b9ca8a64e85a261e23356548150043180fcb8466dea7b9711d89f147fb718d93ed8177b5f59b6510ec747728f580597f36a39a891f25bd35c55aba9d7cb0e9644d1b6c428d8a7110ee330cce1c28ce8cc8cebd638f9f5101a87e060a1fb903a934a4c9d87eb7d47f5d3172c19f05fadb52291a2b54d2861341066217b2976878597caa0f411cc269669127f4c4316b594085ee9422f4124bde8856455b58784ad74d7b2ec8e4ca886ce01fc5c35585245da981e5a3f51a6a640d77fc5fd547b74d1047ae05d91c62f533f7ca8c46f71a4dd9634b9f7a2248a85a0133afeb4eb5170952dcd9c35d5756872e523d84ad6401a0f294239b1327cee4bb0a8b31f40a6ad0a7b7abd3217364ee197b37a4ac8411da33dd0dd9040247517de7ac2c25af805f14bef2856ee0418b2d99a6359b77493dce9c2bfdc1c10c9af103a801a58395b5b4b9f82934bfeda0dfefd5c12f7d946ffaf55d0f556ee3f76dfd0ca3ac7ca3faa5b263cc6c79771353e81a36ce25cc083764f7e2e949f65f7e00d656037c277065d94aa1614f8d3f65b59f004995903d03c8f674d26303704eb98b7f87681a5485a52f0a9ea3d1192bcc57b873b67303793f4a83bae61b166574bb4e85969a50157c031a25d0890fe2df943071db1993d848df88ef98a0102104c61b8d2d6354b8b1c0e87e417aec9b7a3ae01f9130df7c1654517b3d169613c1dbe94b8a75fa1eccb085f0292d312625039947c04cede0591575b1c81ff4d7fbb6183fed8b954af014eb77500ecfef90dd30c366f297a8a5ffa8ec84e24af2d22db51f0b7bc2444e72766401c0565fcf7e6d20274959895c25419faa3d533062f410d6fda5b682a231c3edcd905b05021dcf74c5d667a07a4873f82963c0696b4db4e4867969681278e03044ec5ecd73ee95801fd1965287c0fd78df966a82c9bc62601ab50753b3992d935ee1d76e639b84ffa811fc48535e001130432b758c64842b1ffb9d7b6fe28cfb25a14d6ba086621800cae5613583449e77d036f2b2a2748adb48a3ca1634ae4d9888c984eba30165f7b2653a53173d3166494b20ec74ce98bcb03343d9d2bd70d805a00667987a1f11e64d76f8c41f38f0a1c70514f2455ee11202cf55c31f5abc88690437daf3a761850c5cf91fb91d3c9424e18c3932703326029c03f8c18969b5a59cec8fd755b66ee972dee5c90637b8cadbb1319fdba26e1f783c12eb79d290aebb84b24b274f99f9e7b1a106dd947044d7dd9f5047f45cdeacfea3d419fd3530563bea5969543aed03e2eca3a7186f9ad461601644b475f063f0aa35797709da3dfbd13bf51b4bd47b5dd6701efa7637bda9002ec10a1235c08f8e5b4ca2c63acaff2cdfc4528ca9813117786ac776269f2d590bc3ed0537c547c6083ef306a80b7197bbe514c4f6b672cee07516af002146f6580162463a2591b61cb514c2c299fecc13cd78961a8768283aad580f61107e07caf0742c4c0d7472cd851fd14ee12fbde0e665aa0ab62723b67de7bc3e83a5177b9d47d67504cc2604617a85eeb58c414958483443cf861a326fd7cc6364de17ff220fd9fcf75e9615ae7b4127bbf0af7562c6a2b3603cb81f9e6185b68e830592b1b332828648aa6dfcfb689343ac29941ddc71b36dcfda990bd2ea168f653c3789881de424503a658701acd9eb15fffe9eb9673e7a9fee71553526157bf19b9dc463e0ea599333a4cac639d6479580576fdb2875701461ad663fdc65d4e81fe26c3929d1fd1bbfffe1d8dcc37d801f83fab3f83a047945df7b22d05d393148ffb4a78cf642d0c64d1d2c075905ee8846f7307257c826fd19da00dd1ff2fd1015b831af7bef16baf067532087a83fbf24125085cc066d465cf1a16517575335889e5c676e808491b5c7bcf0428aafa0c1f9ac0f383ca192fe294591a82d839d4ea6106f07510a479ac3927383f9e0322d2c8cfe145a6504f89f541d4868ab4ceeb2c4ed464e481f047399f7d2d2901762abb86c05d4d40abf912606e173df0cb8ec9a95c5af9db8e78d70e40d5f916372fbf1e0237564ea222e126ad54c756641c8e9bd962b5cf7634ea60b80462562b10fdc7ef7f7164084db690ec60c13f02deea52a8d67990a44abc866cd706e8caf11102c1c15a694e7d31ffd7259f174f748c8d58214d52fcddc7cefa5d0d4ed6bd9c0fe0dd9564430b2064b98af41aebec95055bed3806a1c1e5e43b02d9b5d9488520efdee2439795ef3ad515d6cb7c77712c17191d1034f194666495c1fcc041d673db059c61f15ce49b2dab93653f54cb26ba66b60705c464a0ae30d089d1aa6977f7f95e960234a50ca0f879d87ccac777749fcfd282bebc511469485ad5b062fdf8c0d41e8e74ac8c6fcc76ecf0c370bfa5b01eed1d2d84d0d799609b671a0faa2af74c0833de5cff09826a82e3906b2ef0b135d3a19ebfe86c1869d97b36a0e17d9c8a36308486c2f18e2f37d209b93c06b740e8708318a63535e81bbf041a85efc60fa3806d844da736e869cd085ed22e3e39b31948cb360918393bf910b3691c2758b8220dca7b18852bf4b62e957f617a8ef176e5b4d3749ab80bfe9d7ebf6e5079d96ec972a3be7c1e9b81c0aa40fdcc48e59fe281f0d5afef13f981ac48f7e2ec5dd17b598225130998f0ac0740796ca7bdac8aca59bab8d8574c904dfb40b3a7ebca11ed658024992c894b548db90ab0ee64f76e9efaad5965325d38fd69b14d6dcc66a1e14b301e5da5e1bd6ad85e3c3170b22c0d1e723a5c087047e8257fd2315da98eb13116f7ca043c3f81aa67a86bb80cd679191ca557ed700c5fa11ba75e038fb9f44c42b82c73fe3faefb4664419663f9166c3cc729274c89b6bc86888a7ccb9cf7509e8cdb62b5b82c037cd37299bff061a5523da8357c0f0415c6930adadca35f866577e0a00f5bc20ae53eabf8c37d8c95b8e54a905f8e8bfd6b73d601fcde08e72e99abedf123f00570d3790660ae8110abff5d0f14b24da298fc7a42698d89679a62c3321d7b9d437b3a17d2880953a226123c37645d2505fa77433fd475d909c2252f83e32249066c5a902440aaf7397d4995051c72c64c395145259b68cfdefed47a8f8721e4816f6cd03e76b3c55b45028b4e740e5c5f3861dd981344aad041777e46e5d78619b66a64b67be410e57989b2f95dd8cdd9f56533e03bc7257dd243998579263ea00f69a8770d6984b173941f617327835cbfb150c0adf64b4143e23e33d451d0f3aaa5bdaa674fa140a2354672c62f0a27fdaee5f67887c13a1b04afb3d07ff5946fbebd62b62052c27a7c133e406b22f738efaa23af3a8aa7f6b3f6e78c61cb7fe42585395822f3f9a42f57e9ed93700c4679c2538d23e2df32a45918d39c3580c406cba0f3c1e96d08e207c3be5193d3a7a7e865ada35d0b19fab5625ca48f737e205d52afed1c6140c703bb3ad80e73d69da475222efee5f92aa98a6f590da6c666f81e65e6bc94c6122a7c98ca8891f5fc36d240de206a01933291a30e6c6bf34aa769ab9594a54f021b9f84ec46f403c324b50f87cc9540d11bb0a6e2a02d8c1fc3c0f36377d73530a61f5e165af302ea1ea24cd4c69e203cd91d8d63dc08a9804072701
|
|
@@ -428,8 +428,8 @@ const requiredFaqRule = {
|
|
|
428
428
|
recommended: true,
|
|
429
429
|
},
|
|
430
430
|
messages: {
|
|
431
|
-
missingFaqPage: 'FAQ page is missing. FAQ pages are strongly recommended
|
|
432
|
-
missingFaqSchema: 'FAQSchema is missing from the FAQ page.',
|
|
431
|
+
missingFaqPage: 'FAQ page is missing. FAQ pages are strongly recommended (examples: src/app/faqs/page.tsx, src/app/(pages)/faqs/page.tsx, src/pages/faqs/index.tsx).',
|
|
432
|
+
missingFaqSchema: 'FAQSchema (SchemaFAQ / JSON-LD @type:FAQPage) is missing from the FAQ page.',
|
|
433
433
|
},
|
|
434
434
|
},
|
|
435
435
|
create(context) {
|
|
@@ -437,27 +437,76 @@ const requiredFaqRule = {
|
|
|
437
437
|
if (!context.getFilename().endsWith('layout.tsx')) return {};
|
|
438
438
|
|
|
439
439
|
const projectRoot = context.cwd;
|
|
440
|
-
|
|
440
|
+
|
|
441
|
+
function findFaqPath(root) {
|
|
442
|
+
// Walk `src/` and match any path segment or filename named `faq` or `faqs`.
|
|
443
|
+
// Return the first matching `page.*` / `index.*` or a direct faq(s).(ts|tsx|js|jsx) file.
|
|
444
|
+
// Returns `null` when no candidate is found.
|
|
445
|
+
const srcRoot = path.join(root, 'src');
|
|
446
|
+
if (!fs.existsSync(srcRoot)) return null;
|
|
447
|
+
|
|
448
|
+
const stack = [srcRoot];
|
|
449
|
+
const filePattern = /(^|\/)faqs?\.(t|j)sx?$/i; // matches .../faq.tsx, .../faqs.js, etc.
|
|
450
|
+
while (stack.length) {
|
|
451
|
+
const cur = stack.pop();
|
|
452
|
+
try {
|
|
453
|
+
const entries = fs.readdirSync(cur, { withFileTypes: true });
|
|
454
|
+
for (const e of entries) {
|
|
455
|
+
const full = path.join(cur, e.name);
|
|
456
|
+
const rel = path.relative(root, full).replace(/\\/g, '/');
|
|
457
|
+
|
|
458
|
+
if (e.isDirectory()) {
|
|
459
|
+
// directory named faq/faqs -> prefer page/index inside it
|
|
460
|
+
if (/^faqs?$/i.test(e.name)) {
|
|
461
|
+
const candidates = [
|
|
462
|
+
path.join(full, 'page.tsx'),
|
|
463
|
+
path.join(full, 'page.ts'),
|
|
464
|
+
path.join(full, 'index.tsx'),
|
|
465
|
+
path.join(full, 'index.ts'),
|
|
466
|
+
];
|
|
467
|
+
for (const c of candidates) if (fs.existsSync(c)) return c;
|
|
468
|
+
}
|
|
469
|
+
// continue walking
|
|
470
|
+
stack.push(full);
|
|
471
|
+
continue;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// direct file matches like src/pages/faqs.tsx
|
|
475
|
+
if (filePattern.test(rel)) return full;
|
|
476
|
+
}
|
|
477
|
+
} catch (err) {
|
|
478
|
+
/* ignore unreadable dirs */
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
const faqPath = findFaqPath(projectRoot);
|
|
441
486
|
|
|
442
487
|
return {
|
|
443
488
|
'Program:exit'() {
|
|
444
|
-
|
|
489
|
+
// If finder returned nothing or the candidate does not exist -> missing page
|
|
490
|
+
if (!faqPath || !fs.existsSync(faqPath)) {
|
|
445
491
|
context.report({
|
|
446
492
|
loc: { line: 1, column: 0 },
|
|
447
493
|
messageId: 'missingFaqPage',
|
|
448
494
|
});
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// Accept component-based SchemaFAQ, `FAQSchema` identifier, or JSON-LD @type:FAQPage
|
|
499
|
+
try {
|
|
500
|
+
const content = fs.readFileSync(faqPath, 'utf8');
|
|
501
|
+
const hasSchema = /FAQSchema|SchemaFAQ|"@type"\s*:\s*"FAQPage"/i.test(content);
|
|
502
|
+
if (!hasSchema) {
|
|
503
|
+
context.report({
|
|
504
|
+
loc: { line: 1, column: 0 },
|
|
505
|
+
messageId: 'missingFaqSchema',
|
|
506
|
+
});
|
|
460
507
|
}
|
|
508
|
+
} catch (e) {
|
|
509
|
+
// Ignore read errors
|
|
461
510
|
}
|
|
462
511
|
},
|
|
463
512
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"faq-accordion.d.ts","sourceRoot":"","sources":["../../../../src/components/general/faq-accordion.tsx"],"names":[],"mappings":"AACA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"faq-accordion.d.ts","sourceRoot":"","sources":["../../../../src/components/general/faq-accordion.tsx"],"names":[],"mappings":"AACA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,qBAAqB,CAAC;AA+B7B,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CAuF1D;yBAvFe,YAAY"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-faq.rule.test.d.ts","sourceRoot":"","sources":["../../../src/tests/required-faq.rule.test.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixelated-tech/components",
|
|
3
|
-
"version": "3.9.
|
|
3
|
+
"version": "3.9.18",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Pixelated Technologies",
|
|
@@ -122,15 +122,15 @@
|
|
|
122
122
|
"@storybook/preset-scss": "^1.0.3",
|
|
123
123
|
"@storybook/react-webpack5": "^10.1.11",
|
|
124
124
|
"@testing-library/dom": "^10.4.1",
|
|
125
|
-
"@testing-library/react": "^16.3.
|
|
125
|
+
"@testing-library/react": "^16.3.2",
|
|
126
126
|
"@testing-library/user-event": "^14.6.1",
|
|
127
127
|
"@types/md5": "^2.3.6",
|
|
128
128
|
"@types/node": "^25.0.9",
|
|
129
129
|
"@types/prop-types": "^15.7.15",
|
|
130
130
|
"@types/react": "^19.2.8",
|
|
131
131
|
"@types/react-dom": "^19.2.3",
|
|
132
|
-
"@typescript-eslint/eslint-plugin": "^8.53.
|
|
133
|
-
"@typescript-eslint/parser": "^8.53.
|
|
132
|
+
"@typescript-eslint/eslint-plugin": "^8.53.1",
|
|
133
|
+
"@typescript-eslint/parser": "^8.53.1",
|
|
134
134
|
"@vitejs/plugin-react": "^5.1.2",
|
|
135
135
|
"@vitest/coverage-v8": "^4.0.17",
|
|
136
136
|
"@vitest/ui": "^4.0.17",
|