jbx 2.11.0 → 2.13.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.
package/README.md CHANGED
@@ -73,3 +73,18 @@ npm run dev # rebuild on change
73
73
  npm run typecheck
74
74
  npm test # renders every export, fails on any React warning
75
75
  ```
76
+
77
+ ## Publish
78
+
79
+ New versions are published to npm automatically when they reach `main`. A push whose
80
+ version is already on npm succeeds without publishing again.
81
+
82
+ 1. Add the release notes to `CHANGELOG.md`.
83
+ 2. Run `npm version minor --no-git-tag-version` to update `package.json`.
84
+ 3. Run `npm test`.
85
+ 4. Commit the changes and push them to `main`.
86
+ 5. Confirm the **Publish package** workflow succeeds, then check the version with
87
+ `npm view jbx version`.
88
+
89
+ Publishing uses npm trusted publishing through GitHub Actions. It does not require an
90
+ npm token in the repository.
@@ -1 +1 @@
1
- {"version":3,"file":"MoreExperiments.d.ts","sourceRoot":"","sources":["../../src/components/MoreExperiments.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AA8CxC,KAAK,oBAAoB,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,EAAE,oBAAoB,qBAuBhE"}
1
+ {"version":3,"file":"MoreExperiments.d.ts","sourceRoot":"","sources":["../../src/components/MoreExperiments.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AA6DxC,KAAK,oBAAoB,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,EAAE,oBAAoB,qBAgChE"}
@@ -35,14 +35,34 @@ const PROJECT_DATA = [
35
35
  name: 'Cohesive Colors',
36
36
  description: 'Tool that can help you to create cohesive color palettes',
37
37
  url: 'https://javier.xyz/cohesive-colors'
38
+ },
39
+ {
40
+ name: 'img2css',
41
+ description: 'Tool that can convert any image into a pure CSS image',
42
+ url: 'https://javier.xyz/img2css'
38
43
  }
39
44
  ];
40
- const seed = 0;
41
45
  const maxItems = 5;
46
+ // Fallback offset for a site that isn't in PROJECT_DATA itself. Derived from the site's
47
+ // own name rather than randomized, so it always renders the same slice — no hydration
48
+ // mismatch, no build-to-build churn.
49
+ function seedFor(key) {
50
+ let hash = 0;
51
+ for (let idx = 0; idx < key.length; idx++) {
52
+ hash = (hash * 31 + key.charCodeAt(idx)) | 0;
53
+ }
54
+ return Math.abs(hash);
55
+ }
42
56
  export function MoreExperiments({ exclude }) {
43
- const projects = exclude
44
- ? PROJECT_DATA.filter((project) => !project.url.includes(exclude))
45
- : PROJECT_DATA;
57
+ // A site listed in PROJECT_DATA links to the maxItems entries that follow it. Since
58
+ // every site starts one step further along, each project ends up linked from the same
59
+ // number of sites, instead of the first maxItems entries being the only ones to show up.
60
+ const selfIdx = exclude
61
+ ? PROJECT_DATA.findIndex((project) => project.url.includes(exclude))
62
+ : -1;
63
+ const projects = selfIdx === -1 ? PROJECT_DATA : PROJECT_DATA.filter((_0, idx) => idx !== selfIdx);
64
+ // Dropping self shifts the tail left by one, so this index is already the next project.
65
+ const seed = selfIdx === -1 ? (exclude ? seedFor(exclude) : 0) : selfIdx;
46
66
  const items = new Array(Math.min(maxItems, projects.length)).fill('').map((_0, idx) => {
47
67
  const project = projects[(seed + idx) % projects.length];
48
68
  return (React.createElement(Li, { key: project.url },
@@ -1 +1 @@
1
- {"version":3,"file":"MoreExperiments.js","sourceRoot":"","sources":["../../src/components/MoreExperiments.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,YAAY,GAAG;IACnB;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,6DAA6D;QAC1E,GAAG,EAAE,0BAA0B;KAChC;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,2DAA2D;QACxE,GAAG,EAAE,kCAAkC;KACxC;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,wFAAwF;QAC1F,GAAG,EAAE,uBAAuB;KAC7B;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EACT,2FAA2F;QAC7F,GAAG,EAAE,4BAA4B;KAClC;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,gDAAgD;QAC7D,GAAG,EAAE,mCAAmC;KACzC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,6EAA6E;QAC1F,GAAG,EAAE,qBAAqB;KAC3B;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,0DAA0D;QACvE,GAAG,EAAE,oCAAoC;KAC1C;CACO,CAAC;AAEX,MAAM,IAAI,GAAG,CAAC,CAAC;AACf,MAAM,QAAQ,GAAG,CAAC,CAAC;AAMnB,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,EAAwB;IAC/D,MAAM,QAAQ,GAAG,OAAO;QACtB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClE,CAAC,CAAC,YAAY,CAAC;IAEjB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE;QACpF,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzD,OAAO,CACL,oBAAC,EAAE,IAAC,GAAG,EAAE,OAAO,CAAC,GAAG;YAClB,oBAAC,CAAC,IAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAG,OAAO,CAAC,IAAI,CAAK;YACvC,IAAI;YACJ,OAAO,CAAC,WAAW;gBACjB,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,oBAAC,QAAQ;QACP,oBAAC,IAAI,2BAAwB;QAC7B,oBAAC,KAAK,IAAC,CAAC,EAAE,CAAC,GAAI;QACf,oBAAC,EAAE,QAAE,KAAK,CAAM,CACP,CACZ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"MoreExperiments.js","sourceRoot":"","sources":["../../src/components/MoreExperiments.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jbx",
3
- "version": "2.11.0",
3
+ "version": "2.13.0",
4
4
  "author": "hi@javier.xyz",
5
5
  "license": "Unlicensed",
6
6
  "repository": {
@@ -38,20 +38,44 @@ const PROJECT_DATA = [
38
38
  name: 'Cohesive Colors',
39
39
  description: 'Tool that can help you to create cohesive color palettes',
40
40
  url: 'https://javier.xyz/cohesive-colors'
41
+ },
42
+ {
43
+ name: 'img2css',
44
+ description: 'Tool that can convert any image into a pure CSS image',
45
+ url: 'https://javier.xyz/img2css'
41
46
  }
42
47
  ] as const;
43
48
 
44
- const seed = 0;
45
49
  const maxItems = 5;
46
50
 
51
+ // Fallback offset for a site that isn't in PROJECT_DATA itself. Derived from the site's
52
+ // own name rather than randomized, so it always renders the same slice — no hydration
53
+ // mismatch, no build-to-build churn.
54
+ function seedFor(key: string) {
55
+ let hash = 0;
56
+ for (let idx = 0; idx < key.length; idx++) {
57
+ hash = (hash * 31 + key.charCodeAt(idx)) | 0;
58
+ }
59
+ return Math.abs(hash);
60
+ }
61
+
47
62
  type MoreExperimentsProps = {
48
63
  exclude?: string;
49
64
  };
50
65
 
51
66
  export function MoreExperiments({ exclude }: MoreExperimentsProps) {
52
- const projects = exclude
53
- ? PROJECT_DATA.filter((project) => !project.url.includes(exclude))
54
- : PROJECT_DATA;
67
+ // A site listed in PROJECT_DATA links to the maxItems entries that follow it. Since
68
+ // every site starts one step further along, each project ends up linked from the same
69
+ // number of sites, instead of the first maxItems entries being the only ones to show up.
70
+ const selfIdx = exclude
71
+ ? PROJECT_DATA.findIndex((project) => project.url.includes(exclude))
72
+ : -1;
73
+
74
+ const projects =
75
+ selfIdx === -1 ? PROJECT_DATA : PROJECT_DATA.filter((_0, idx) => idx !== selfIdx);
76
+
77
+ // Dropping self shifts the tail left by one, so this index is already the next project.
78
+ const seed = selfIdx === -1 ? (exclude ? seedFor(exclude) : 0) : selfIdx;
55
79
 
56
80
  const items = new Array(Math.min(maxItems, projects.length)).fill('').map((_0, idx) => {
57
81
  const project = projects[(seed + idx) % projects.length];