nubos-pilot 0.7.2 → 0.8.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.
Files changed (241) hide show
  1. package/agents/np-executor.md +1 -0
  2. package/bin/install.js +2 -0
  3. package/bin/np-tools/_commands.cjs +98 -64
  4. package/bin/np-tools/dashboard.cjs +11 -5
  5. package/bin/np-tools/dashboard.test.cjs +80 -0
  6. package/bin/np-tools/help.cjs +16 -7
  7. package/bin/np-tools/help.test.cjs +63 -0
  8. package/bin/np-tools/stats.cjs +99 -3
  9. package/bin/np-tools/stats.test.cjs +65 -0
  10. package/lib/dashboard.cjs +41 -10
  11. package/lib/dashboard.test.cjs +83 -0
  12. package/lib/install/runtime-assets.cjs +50 -1
  13. package/lib/install/runtime-assets.test.cjs +190 -0
  14. package/lib/install/runtimes-registry.cjs +1 -0
  15. package/lib/runtime/_readline.cjs +49 -11
  16. package/lib/runtime/_readline.test.cjs +59 -0
  17. package/lib/runtime/claude.cjs +8 -1
  18. package/package.json +2 -1
  19. package/skills/np-composition-patterns/AGENTS.md +946 -0
  20. package/skills/np-composition-patterns/README.md +60 -0
  21. package/skills/np-composition-patterns/SKILL.md +89 -0
  22. package/skills/np-composition-patterns/metadata.json +11 -0
  23. package/skills/np-composition-patterns/rules/_sections.md +29 -0
  24. package/skills/np-composition-patterns/rules/_template.md +24 -0
  25. package/skills/np-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  26. package/skills/np-composition-patterns/rules/architecture-compound-components.md +112 -0
  27. package/skills/np-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  28. package/skills/np-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  29. package/skills/np-composition-patterns/rules/react19-no-forwardref.md +42 -0
  30. package/skills/np-composition-patterns/rules/state-context-interface.md +191 -0
  31. package/skills/np-composition-patterns/rules/state-decouple-implementation.md +113 -0
  32. package/skills/np-composition-patterns/rules/state-lift-state.md +125 -0
  33. package/skills/np-council/SKILL.md +300 -0
  34. package/skills/np-design/SKILL.md +679 -0
  35. package/skills/np-frontend-design/LICENSE.txt +177 -0
  36. package/skills/np-frontend-design/SKILL.md +42 -0
  37. package/skills/np-high-end-visual-design/SKILL.md +98 -0
  38. package/skills/np-impeccable/SKILL.md +152 -0
  39. package/skills/np-impeccable/agents/openai.yaml +4 -0
  40. package/skills/np-impeccable/reference/adapt.md +190 -0
  41. package/skills/np-impeccable/reference/animate.md +173 -0
  42. package/skills/np-impeccable/reference/audit.md +134 -0
  43. package/skills/np-impeccable/reference/bolder.md +113 -0
  44. package/skills/np-impeccable/reference/brand.md +104 -0
  45. package/skills/np-impeccable/reference/clarify.md +174 -0
  46. package/skills/np-impeccable/reference/cognitive-load.md +106 -0
  47. package/skills/np-impeccable/reference/color-and-contrast.md +105 -0
  48. package/skills/np-impeccable/reference/colorize.md +154 -0
  49. package/skills/np-impeccable/reference/craft.md +138 -0
  50. package/skills/np-impeccable/reference/critique.md +213 -0
  51. package/skills/np-impeccable/reference/delight.md +302 -0
  52. package/skills/np-impeccable/reference/distill.md +111 -0
  53. package/skills/np-impeccable/reference/document.md +427 -0
  54. package/skills/np-impeccable/reference/extract.md +70 -0
  55. package/skills/np-impeccable/reference/harden.md +347 -0
  56. package/skills/np-impeccable/reference/heuristics-scoring.md +234 -0
  57. package/skills/np-impeccable/reference/interaction-design.md +195 -0
  58. package/skills/np-impeccable/reference/layout.md +141 -0
  59. package/skills/np-impeccable/reference/live.md +513 -0
  60. package/skills/np-impeccable/reference/motion-design.md +99 -0
  61. package/skills/np-impeccable/reference/onboard.md +234 -0
  62. package/skills/np-impeccable/reference/optimize.md +258 -0
  63. package/skills/np-impeccable/reference/overdrive.md +130 -0
  64. package/skills/np-impeccable/reference/personas.md +178 -0
  65. package/skills/np-impeccable/reference/polish.md +232 -0
  66. package/skills/np-impeccable/reference/product.md +62 -0
  67. package/skills/np-impeccable/reference/quieter.md +99 -0
  68. package/skills/np-impeccable/reference/responsive-design.md +114 -0
  69. package/skills/np-impeccable/reference/shape.md +136 -0
  70. package/skills/np-impeccable/reference/spatial-design.md +100 -0
  71. package/skills/np-impeccable/reference/teach.md +137 -0
  72. package/skills/np-impeccable/reference/typeset.md +124 -0
  73. package/skills/np-impeccable/reference/typography.md +159 -0
  74. package/skills/np-impeccable/reference/ux-writing.md +107 -0
  75. package/skills/np-impeccable/scripts/cleanup-deprecated.mjs +284 -0
  76. package/skills/np-impeccable/scripts/command-metadata.json +94 -0
  77. package/skills/np-impeccable/scripts/design-parser.mjs +820 -0
  78. package/skills/np-impeccable/scripts/detect-csp.mjs +198 -0
  79. package/skills/np-impeccable/scripts/is-generated.mjs +69 -0
  80. package/skills/np-impeccable/scripts/live-accept.mjs +465 -0
  81. package/skills/np-impeccable/scripts/live-browser.js +4684 -0
  82. package/skills/np-impeccable/scripts/live-inject.mjs +436 -0
  83. package/skills/np-impeccable/scripts/live-poll.mjs +187 -0
  84. package/skills/np-impeccable/scripts/live-server.mjs +679 -0
  85. package/skills/np-impeccable/scripts/live-wrap.mjs +395 -0
  86. package/skills/np-impeccable/scripts/live.mjs +247 -0
  87. package/skills/np-impeccable/scripts/load-context.mjs +93 -0
  88. package/skills/np-impeccable/scripts/modern-screenshot.umd.js +14 -0
  89. package/skills/np-impeccable/scripts/pin.mjs +214 -0
  90. package/skills/np-industrial-brutalist-ui/SKILL.md +92 -0
  91. package/skills/np-minimalist-ui/SKILL.md +85 -0
  92. package/skills/np-react-best-practices/AGENTS.md +3810 -0
  93. package/skills/np-react-best-practices/README.md +123 -0
  94. package/skills/np-react-best-practices/SKILL.md +149 -0
  95. package/skills/np-react-best-practices/metadata.json +15 -0
  96. package/skills/np-react-best-practices/rules/_sections.md +46 -0
  97. package/skills/np-react-best-practices/rules/_template.md +28 -0
  98. package/skills/np-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
  99. package/skills/np-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  100. package/skills/np-react-best-practices/rules/advanced-init-once.md +42 -0
  101. package/skills/np-react-best-practices/rules/advanced-use-latest.md +39 -0
  102. package/skills/np-react-best-practices/rules/async-api-routes.md +38 -0
  103. package/skills/np-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  104. package/skills/np-react-best-practices/rules/async-defer-await.md +82 -0
  105. package/skills/np-react-best-practices/rules/async-dependencies.md +51 -0
  106. package/skills/np-react-best-practices/rules/async-parallel.md +28 -0
  107. package/skills/np-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  108. package/skills/np-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
  109. package/skills/np-react-best-practices/rules/bundle-barrel-imports.md +60 -0
  110. package/skills/np-react-best-practices/rules/bundle-conditional.md +31 -0
  111. package/skills/np-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  112. package/skills/np-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  113. package/skills/np-react-best-practices/rules/bundle-preload.md +50 -0
  114. package/skills/np-react-best-practices/rules/client-event-listeners.md +74 -0
  115. package/skills/np-react-best-practices/rules/client-localstorage-schema.md +71 -0
  116. package/skills/np-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  117. package/skills/np-react-best-practices/rules/client-swr-dedup.md +56 -0
  118. package/skills/np-react-best-practices/rules/js-batch-dom-css.md +107 -0
  119. package/skills/np-react-best-practices/rules/js-cache-function-results.md +80 -0
  120. package/skills/np-react-best-practices/rules/js-cache-property-access.md +28 -0
  121. package/skills/np-react-best-practices/rules/js-cache-storage.md +70 -0
  122. package/skills/np-react-best-practices/rules/js-combine-iterations.md +32 -0
  123. package/skills/np-react-best-practices/rules/js-early-exit.md +50 -0
  124. package/skills/np-react-best-practices/rules/js-flatmap-filter.md +60 -0
  125. package/skills/np-react-best-practices/rules/js-hoist-regexp.md +45 -0
  126. package/skills/np-react-best-practices/rules/js-index-maps.md +37 -0
  127. package/skills/np-react-best-practices/rules/js-length-check-first.md +49 -0
  128. package/skills/np-react-best-practices/rules/js-min-max-loop.md +82 -0
  129. package/skills/np-react-best-practices/rules/js-request-idle-callback.md +105 -0
  130. package/skills/np-react-best-practices/rules/js-set-map-lookups.md +24 -0
  131. package/skills/np-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  132. package/skills/np-react-best-practices/rules/rendering-activity.md +26 -0
  133. package/skills/np-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  134. package/skills/np-react-best-practices/rules/rendering-conditional-render.md +40 -0
  135. package/skills/np-react-best-practices/rules/rendering-content-visibility.md +38 -0
  136. package/skills/np-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  137. package/skills/np-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  138. package/skills/np-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  139. package/skills/np-react-best-practices/rules/rendering-resource-hints.md +85 -0
  140. package/skills/np-react-best-practices/rules/rendering-script-defer-async.md +68 -0
  141. package/skills/np-react-best-practices/rules/rendering-svg-precision.md +28 -0
  142. package/skills/np-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  143. package/skills/np-react-best-practices/rules/rerender-defer-reads.md +39 -0
  144. package/skills/np-react-best-practices/rules/rerender-dependencies.md +45 -0
  145. package/skills/np-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  146. package/skills/np-react-best-practices/rules/rerender-derived-state.md +29 -0
  147. package/skills/np-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  148. package/skills/np-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  149. package/skills/np-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  150. package/skills/np-react-best-practices/rules/rerender-memo.md +44 -0
  151. package/skills/np-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  152. package/skills/np-react-best-practices/rules/rerender-no-inline-components.md +82 -0
  153. package/skills/np-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  154. package/skills/np-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  155. package/skills/np-react-best-practices/rules/rerender-transitions.md +40 -0
  156. package/skills/np-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  157. package/skills/np-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  158. package/skills/np-react-best-practices/rules/server-after-nonblocking.md +73 -0
  159. package/skills/np-react-best-practices/rules/server-auth-actions.md +96 -0
  160. package/skills/np-react-best-practices/rules/server-cache-lru.md +41 -0
  161. package/skills/np-react-best-practices/rules/server-cache-react.md +76 -0
  162. package/skills/np-react-best-practices/rules/server-dedup-props.md +65 -0
  163. package/skills/np-react-best-practices/rules/server-hoist-static-io.md +149 -0
  164. package/skills/np-react-best-practices/rules/server-no-shared-module-state.md +50 -0
  165. package/skills/np-react-best-practices/rules/server-parallel-fetching.md +83 -0
  166. package/skills/np-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
  167. package/skills/np-react-best-practices/rules/server-serialization.md +38 -0
  168. package/skills/np-react-native-skills/AGENTS.md +2897 -0
  169. package/skills/np-react-native-skills/README.md +165 -0
  170. package/skills/np-react-native-skills/SKILL.md +121 -0
  171. package/skills/np-react-native-skills/metadata.json +16 -0
  172. package/skills/np-react-native-skills/rules/_sections.md +86 -0
  173. package/skills/np-react-native-skills/rules/_template.md +28 -0
  174. package/skills/np-react-native-skills/rules/animation-derived-value.md +53 -0
  175. package/skills/np-react-native-skills/rules/animation-gesture-detector-press.md +95 -0
  176. package/skills/np-react-native-skills/rules/animation-gpu-properties.md +65 -0
  177. package/skills/np-react-native-skills/rules/design-system-compound-components.md +66 -0
  178. package/skills/np-react-native-skills/rules/fonts-config-plugin.md +71 -0
  179. package/skills/np-react-native-skills/rules/imports-design-system-folder.md +68 -0
  180. package/skills/np-react-native-skills/rules/js-hoist-intl.md +61 -0
  181. package/skills/np-react-native-skills/rules/list-performance-callbacks.md +44 -0
  182. package/skills/np-react-native-skills/rules/list-performance-function-references.md +132 -0
  183. package/skills/np-react-native-skills/rules/list-performance-images.md +53 -0
  184. package/skills/np-react-native-skills/rules/list-performance-inline-objects.md +97 -0
  185. package/skills/np-react-native-skills/rules/list-performance-item-expensive.md +94 -0
  186. package/skills/np-react-native-skills/rules/list-performance-item-memo.md +82 -0
  187. package/skills/np-react-native-skills/rules/list-performance-item-types.md +104 -0
  188. package/skills/np-react-native-skills/rules/list-performance-virtualize.md +67 -0
  189. package/skills/np-react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
  190. package/skills/np-react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
  191. package/skills/np-react-native-skills/rules/navigation-native-navigators.md +188 -0
  192. package/skills/np-react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
  193. package/skills/np-react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
  194. package/skills/np-react-native-skills/rules/react-state-dispatcher.md +91 -0
  195. package/skills/np-react-native-skills/rules/react-state-fallback.md +56 -0
  196. package/skills/np-react-native-skills/rules/react-state-minimize.md +65 -0
  197. package/skills/np-react-native-skills/rules/rendering-no-falsy-and.md +74 -0
  198. package/skills/np-react-native-skills/rules/rendering-text-in-text-component.md +36 -0
  199. package/skills/np-react-native-skills/rules/scroll-position-no-state.md +82 -0
  200. package/skills/np-react-native-skills/rules/state-ground-truth.md +80 -0
  201. package/skills/np-react-native-skills/rules/ui-expo-image.md +66 -0
  202. package/skills/np-react-native-skills/rules/ui-image-gallery.md +104 -0
  203. package/skills/np-react-native-skills/rules/ui-measure-views.md +78 -0
  204. package/skills/np-react-native-skills/rules/ui-menus.md +174 -0
  205. package/skills/np-react-native-skills/rules/ui-native-modals.md +77 -0
  206. package/skills/np-react-native-skills/rules/ui-pressable.md +61 -0
  207. package/skills/np-react-native-skills/rules/ui-safe-area-scroll.md +65 -0
  208. package/skills/np-react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
  209. package/skills/np-react-native-skills/rules/ui-styling.md +87 -0
  210. package/skills/np-react-view-transitions/AGENTS.md +955 -0
  211. package/skills/np-react-view-transitions/README.md +42 -0
  212. package/skills/np-react-view-transitions/SKILL.md +320 -0
  213. package/skills/np-react-view-transitions/metadata.json +12 -0
  214. package/skills/np-react-view-transitions/references/css-recipes.md +242 -0
  215. package/skills/np-react-view-transitions/references/implementation.md +182 -0
  216. package/skills/np-react-view-transitions/references/nextjs.md +176 -0
  217. package/skills/np-react-view-transitions/references/patterns.md +262 -0
  218. package/skills/np-redesign-existing-projects/SKILL.md +178 -0
  219. package/skills/np-shadcn/SKILL.md +250 -0
  220. package/skills/np-shadcn/agents/openai.yml +5 -0
  221. package/skills/np-shadcn/assets/shadcn-small.png +0 -0
  222. package/skills/np-shadcn/assets/shadcn.png +0 -0
  223. package/skills/np-shadcn/cli.md +276 -0
  224. package/skills/np-shadcn/customization.md +209 -0
  225. package/skills/np-shadcn/evals/evals.json +47 -0
  226. package/skills/np-shadcn/mcp.md +94 -0
  227. package/skills/np-shadcn/rules/base-vs-radix.md +306 -0
  228. package/skills/np-shadcn/rules/composition.md +195 -0
  229. package/skills/np-shadcn/rules/forms.md +192 -0
  230. package/skills/np-shadcn/rules/icons.md +101 -0
  231. package/skills/np-shadcn/rules/styling.md +162 -0
  232. package/skills/np-stitch-design-taste/DESIGN.md +121 -0
  233. package/skills/np-stitch-design-taste/SKILL.md +184 -0
  234. package/skills/np-web-design-guidelines/SKILL.md +39 -0
  235. package/workflows/add-todo.md +5 -0
  236. package/workflows/discuss-phase.md +2 -0
  237. package/workflows/execute-phase.md +27 -0
  238. package/workflows/note.md +5 -0
  239. package/workflows/plan-phase.md +12 -0
  240. package/workflows/stats.md +27 -90
  241. package/workflows/verify-work.md +12 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Shared context loader for every impeccable command that needs to know
3
+ * "who is this for" and "what does this look like".
4
+ *
5
+ * Input: project root (process.cwd()).
6
+ *
7
+ * Output (JSON to stdout):
8
+ * {
9
+ * hasProduct: boolean, // PRODUCT.md found (or auto-migrated)
10
+ * product: string | null, // PRODUCT.md contents
11
+ * productPath: string | null, // relative path
12
+ * hasDesign: boolean, // DESIGN.md found
13
+ * design: string | null, // DESIGN.md contents
14
+ * designPath: string | null,
15
+ * migrated: boolean, // true if we auto-renamed .impeccable.md -> PRODUCT.md
16
+ * }
17
+ *
18
+ * Filename matching is case-insensitive for PRODUCT.md and DESIGN.md. The
19
+ * Google DESIGN.md convention is uppercase at repo root; Kiro-style and
20
+ * lowercase variants are also matched so users don't get punished for case.
21
+ */
22
+
23
+ import fs from 'node:fs';
24
+ import path from 'node:path';
25
+
26
+ const PRODUCT_NAMES = ['PRODUCT.md', 'Product.md', 'product.md'];
27
+ const DESIGN_NAMES = ['DESIGN.md', 'Design.md', 'design.md'];
28
+ const LEGACY_NAMES = ['.impeccable.md'];
29
+
30
+ export function loadContext(cwd = process.cwd()) {
31
+ let migrated = false;
32
+
33
+ // 1. Look for PRODUCT.md (case-insensitive)
34
+ let productPath = firstExisting(cwd, PRODUCT_NAMES);
35
+
36
+ // 2. Legacy: if no PRODUCT.md but .impeccable.md exists, rename in place
37
+ if (!productPath) {
38
+ const legacyPath = firstExisting(cwd, LEGACY_NAMES);
39
+ if (legacyPath) {
40
+ const newPath = path.join(cwd, 'PRODUCT.md');
41
+ try {
42
+ fs.renameSync(legacyPath, newPath);
43
+ productPath = newPath;
44
+ migrated = true;
45
+ } catch {
46
+ // Rename failed (permissions, etc.) — fall back to reading legacy in place
47
+ productPath = legacyPath;
48
+ }
49
+ }
50
+ }
51
+
52
+ // 3. DESIGN.md (case-insensitive)
53
+ const designPath = firstExisting(cwd, DESIGN_NAMES);
54
+
55
+ const product = productPath ? safeRead(productPath) : null;
56
+ const design = designPath ? safeRead(designPath) : null;
57
+
58
+ return {
59
+ hasProduct: !!product,
60
+ product,
61
+ productPath: productPath ? path.relative(cwd, productPath) : null,
62
+ hasDesign: !!design,
63
+ design,
64
+ designPath: designPath ? path.relative(cwd, designPath) : null,
65
+ migrated,
66
+ };
67
+ }
68
+
69
+ function firstExisting(cwd, names) {
70
+ for (const name of names) {
71
+ const abs = path.join(cwd, name);
72
+ if (fs.existsSync(abs)) return abs;
73
+ }
74
+ return null;
75
+ }
76
+
77
+ function safeRead(p) {
78
+ try { return fs.readFileSync(p, 'utf-8'); } catch { return null; }
79
+ }
80
+
81
+ // ---------------------------------------------------------------------------
82
+ // CLI mode — print the context as JSON
83
+ // ---------------------------------------------------------------------------
84
+
85
+ function cli() {
86
+ const result = loadContext(process.cwd());
87
+ console.log(JSON.stringify(result, null, 2));
88
+ }
89
+
90
+ const _running = process.argv[1];
91
+ if (_running?.endsWith('load-context.mjs') || _running?.endsWith('load-context.mjs/')) {
92
+ cli();
93
+ }
@@ -0,0 +1,14 @@
1
+ (function(y,v){typeof exports=="object"&&typeof module!="undefined"?v(exports):typeof define=="function"&&define.amd?define(["exports"],v):(y=typeof globalThis!="undefined"?globalThis:y||self,v(y.modernScreenshot={}))})(this,function(y){"use strict";var rr=Object.defineProperty,nr=Object.defineProperties;var or=Object.getOwnPropertyDescriptors;var Z=Object.getOwnPropertySymbols;var xe=Object.prototype.hasOwnProperty,Me=Object.prototype.propertyIsEnumerable;var Oe=Math.pow,Le=(y,v,N)=>v in y?rr(y,v,{enumerable:!0,configurable:!0,writable:!0,value:N}):y[v]=N,D=(y,v)=>{for(var N in v||(v={}))xe.call(v,N)&&Le(y,N,v[N]);if(Z)for(var N of Z(v))Me.call(v,N)&&Le(y,N,v[N]);return y},M=(y,v)=>nr(y,or(v));var je=(y,v)=>{var N={};for(var R in y)xe.call(y,R)&&v.indexOf(R)<0&&(N[R]=y[R]);if(y!=null&&Z)for(var R of Z(y))v.indexOf(R)<0&&Me.call(y,R)&&(N[R]=y[R]);return N};var C=(y,v,N)=>new Promise((R,O)=>{var X=P=>{try{q(N.next(P))}catch(W){O(W)}},j=P=>{try{q(N.throw(P))}catch(W){O(W)}},q=P=>P.done?R(P.value):Promise.resolve(P.value).then(X,j);q((N=N.apply(y,v)).next())});var Be;function v(e,t){return e[13]=1,e[14]=t>>8,e[15]=t&255,e[16]=t>>8,e[17]=t&255,e}const N=112,R=72,O=89,X=115;let j;function q(){const e=new Int32Array(256);for(let t=0;t<256;t++){let r=t;for(let n=0;n<8;n++)r=r&1?3988292384^r>>>1:r>>>1;e[t]=r}return e}function P(e){let t=-1;j||(j=q());for(let r=0;r<e.length;r++)t=j[(t^e[r])&255]^t>>>8;return t^-1}function W(e){const t=e.length-1;for(let r=t;r>=4;r--)if(e[r-4]===9&&e[r-3]===N&&e[r-2]===R&&e[r-1]===O&&e[r]===X)return r-3;return 0}function ae(e,t,r=!1){const n=new Uint8Array(13);t*=39.3701,n[0]=N,n[1]=R,n[2]=O,n[3]=X,n[4]=t>>>24,n[5]=t>>>16,n[6]=t>>>8,n[7]=t&255,n[8]=n[4],n[9]=n[5],n[10]=n[6],n[11]=n[7],n[12]=1;const i=P(n),a=new Uint8Array(4);if(a[0]=i>>>24,a[1]=i>>>16,a[2]=i>>>8,a[3]=i&255,r){const s=W(e);return e.set(n,s),e.set(a,s+13),e}else{const s=new Uint8Array(4);s[0]=0,s[1]=0,s[2]=0,s[3]=9;const o=new Uint8Array(54);return o.set(e,0),o.set(s,33),o.set(n,37),o.set(a,50),o}}const qe="AAlwSFlz",We="AAAJcEhZ",He="AAAACXBI";function Ve(e){let t=e.indexOf(qe);return t===-1&&(t=e.indexOf(We)),t===-1&&(t=e.indexOf(He)),t}const se="[modern-screenshot]",U=typeof window!="undefined",ze=U&&"Worker"in window,ie=U&&"atob"in window,Xe=U&&"btoa"in window,ee=U?(Be=window.navigator)==null?void 0:Be.userAgent:"",le=ee.includes("Chrome"),G=ee.includes("AppleWebKit")&&!le,te=ee.includes("Firefox"),Ge=e=>e&&"__CONTEXT__"in e,Ye=e=>e.constructor.name==="CSSFontFaceRule",Je=e=>e.constructor.name==="CSSImportRule",Ke=e=>e.constructor.name==="CSSLayerBlockRule",I=e=>e.nodeType===1,H=e=>typeof e.className=="object",ce=e=>e.tagName==="image",Qe=e=>e.tagName==="use",V=e=>I(e)&&typeof e.style!="undefined"&&!H(e),Ze=e=>e.nodeType===8,et=e=>e.nodeType===3,$=e=>e.tagName==="IMG",Y=e=>e.tagName==="VIDEO",tt=e=>e.tagName==="CANVAS",rt=e=>e.tagName==="TEXTAREA",nt=e=>e.tagName==="INPUT",ot=e=>e.tagName==="STYLE",at=e=>e.tagName==="SCRIPT",st=e=>e.tagName==="SELECT",it=e=>e.tagName==="SLOT",lt=e=>e.tagName==="IFRAME",ct=(...e)=>console.warn(se,...e);function ut(e){var r;const t=(r=e==null?void 0:e.createElement)==null?void 0:r.call(e,"canvas");return t&&(t.height=t.width=1),!!t&&"toDataURL"in t&&!!t.toDataURL("image/webp").includes("image/webp")}const re=e=>e.startsWith("data:");function ue(e,t){if(e.match(/^[a-z]+:\/\//i))return e;if(U&&e.match(/^\/\//))return window.location.protocol+e;if(e.match(/^[a-z]+:/i)||!U)return e;const r=J().implementation.createHTMLDocument(),n=r.createElement("base"),i=r.createElement("a");return r.head.appendChild(n),r.body.appendChild(i),t&&(n.href=t),i.href=e,i.href}function J(e){var t;return(t=e&&I(e)?e==null?void 0:e.ownerDocument:e)!=null?t:window.document}const K="http://www.w3.org/2000/svg";function fe(e,t,r){const n=J(r).createElementNS(K,"svg");return n.setAttributeNS(null,"width",e.toString()),n.setAttributeNS(null,"height",t.toString()),n.setAttributeNS(null,"viewBox",`0 0 ${e} ${t}`),n}function de(e,t){let r=new XMLSerializer().serializeToString(e);return t&&(r=r.replace(/[\u0000-\u0008\v\f\u000E-\u001F\uD800-\uDFFF\uFFFE\uFFFF]/gu,"")),`data:image/svg+xml;charset=utf-8,${encodeURIComponent(r)}`}function ft(e,t="image/png",r=1){return C(this,null,function*(){try{return yield new Promise((n,i)=>{e.toBlob(a=>{a?n(a):i(new Error("Blob is null"))},t,r)})}catch(n){if(ie)return dt(e.toDataURL(t,r));throw n}})}function dt(e){var o,c;const[t,r]=e.split(","),n=(c=(o=t.match(/data:(.+);/))==null?void 0:o[1])!=null?c:void 0,i=window.atob(r),a=i.length,s=new Uint8Array(a);for(let u=0;u<a;u+=1)s[u]=i.charCodeAt(u);return new Blob([s],{type:n})}function ge(e,t){return new Promise((r,n)=>{const i=new FileReader;i.onload=()=>r(i.result),i.onerror=()=>n(i.error),i.onabort=()=>n(new Error(`Failed read blob to ${t}`)),t==="dataUrl"?i.readAsDataURL(e):t==="arrayBuffer"&&i.readAsArrayBuffer(e)})}const gt=e=>ge(e,"dataUrl"),mt=e=>ge(e,"arrayBuffer");function _(e,t){const r=J(t).createElement("img");return r.decoding="sync",r.loading="eager",r.src=e,r}function L(e,t){return new Promise(r=>{const{timeout:n,ownerDocument:i,onError:a,onWarn:s}=t!=null?t:{},o=typeof e=="string"?_(e,J(i)):e;let c=null,u=null;function l(){r(o),c&&clearTimeout(c),u==null||u()}if(n&&(c=setTimeout(l,n)),Y(o)){const d=o.currentSrc||o.src;if(!d)return o.poster?L(o.poster,t).then(r):l();if(o.readyState>=2)return l();const m=l,f=h=>{s==null||s("Failed video load",d,h),a==null||a(h),l()};u=()=>{o.removeEventListener("loadeddata",m),o.removeEventListener("error",f)},o.addEventListener("loadeddata",m,{once:!0}),o.addEventListener("error",f,{once:!0})}else{const d=ce(o)?o.href.baseVal:o.currentSrc||o.src;if(!d)return l();const m=()=>C(this,null,function*(){if($(o)&&"decode"in o)try{yield o.decode()}catch(h){s==null||s("Failed to decode image, trying to render anyway",o.dataset.originalSrc||d,h)}l()}),f=h=>{s==null||s("Failed image load",o.dataset.originalSrc||d,h),l()};if($(o)&&o.complete)return m();u=()=>{o.removeEventListener("load",m),o.removeEventListener("error",f)},o.addEventListener("load",m,{once:!0}),o.addEventListener("error",f,{once:!0})}})}function me(e,t){return C(this,null,function*(){V(e)&&($(e)||Y(e)?yield L(e,t):yield Promise.all(["img","video"].flatMap(r=>Array.from(e.querySelectorAll(r)).map(n=>L(n,t)))))})}const he=function(){let t=0;const r=()=>`0000${(Math.random()*Oe(36,4)<<0).toString(36)}`.slice(-4);return()=>(t+=1,`u${r()}${t}`)}();function we(e){return e==null?void 0:e.split(",").map(t=>t.trim().replace(/"|'/g,"").toLowerCase()).filter(Boolean)}let pe=0;function ht(e){const t=`${se}[#${pe}]`;return pe++,{time:r=>e&&console.time(`${t} ${r}`),timeEnd:r=>e&&console.timeEnd(`${t} ${r}`),warn:(...r)=>e&&ct(...r)}}function wt(e){return{cache:e?"no-cache":"force-cache"}}function k(e,t){return C(this,null,function*(){return Ge(e)?e:ye(e,M(D({},t),{autoDestruct:!0}))})}function ye(e,t){return C(this,null,function*(){var f,h,g,p,E;const{scale:r=1,workerUrl:n,workerNumber:i=1}=t||{},a=!!(t!=null&&t.debug),s=(f=t==null?void 0:t.features)!=null?f:!0,o=(h=e.ownerDocument)!=null?h:U?window.document:void 0,c=(p=(g=e.ownerDocument)==null?void 0:g.defaultView)!=null?p:U?window:void 0,u=new Map,l=M(D({width:0,height:0,quality:1,type:"image/png",scale:r,backgroundColor:null,style:null,filter:null,maximumCanvasSize:0,timeout:3e4,progress:null,debug:a,fetch:D({requestInit:wt((E=t==null?void 0:t.fetch)==null?void 0:E.bypassingCache),placeholderImage:"data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",bypassingCache:!1},t==null?void 0:t.fetch),fetchFn:null,font:{},drawImageInterval:100,workerUrl:null,workerNumber:i,onCloneEachNode:null,onCloneNode:null,onEmbedNode:null,onCreateForeignObjectSvg:null,includeStyleProperties:null,autoDestruct:!1},t),{__CONTEXT__:!0,log:ht(a),node:e,ownerDocument:o,ownerWindow:c,dpi:r===1?null:96*r,svgStyleElement:be(o),svgDefsElement:o==null?void 0:o.createElementNS(K,"defs"),svgStyles:new Map,defaultComputedStyles:new Map,workers:[...Array.from({length:ze&&n&&i?i:0})].map(()=>{try{const b=new Worker(n);return b.onmessage=w=>C(this,null,function*(){var A,F,B,$e;const{url:S,result:T}=w.data;T?(F=(A=u.get(S))==null?void 0:A.resolve)==null||F.call(A,T):($e=(B=u.get(S))==null?void 0:B.reject)==null||$e.call(B,new Error(`Error receiving message from worker: ${S}`))}),b.onmessageerror=w=>{var T,A;const{url:S}=w.data;(A=(T=u.get(S))==null?void 0:T.reject)==null||A.call(T,new Error(`Error receiving message from worker: ${S}`))},b}catch(b){return l.log.warn("Failed to new Worker",b),null}}).filter(Boolean),fontFamilies:new Map,fontCssTexts:new Map,acceptOfImage:`${[ut(o)&&"image/webp","image/svg+xml","image/*","*/*"].filter(Boolean).join(",")};q=0.8`,requests:u,drawImageCount:0,tasks:[],features:s,isEnable:b=>{var w,S;return b==="restoreScrollPosition"?typeof s=="boolean"?!1:(w=s[b])!=null?w:!1:typeof s=="boolean"?s:(S=s[b])!=null?S:!0},shadowRoots:[]});l.log.time("wait until load"),yield me(e,{timeout:l.timeout,onWarn:l.log.warn}),l.log.timeEnd("wait until load");const{width:d,height:m}=pt(e,l);return l.width=d,l.height=m,l})}function be(e){if(!e)return;const t=e.createElement("style"),r=t.ownerDocument.createTextNode(`
2
+ .______background-clip--text {
3
+ background-clip: text;
4
+ -webkit-background-clip: text;
5
+ }
6
+ `);return t.appendChild(r),t}function pt(e,t){let{width:r,height:n}=t;if(I(e)&&(!r||!n)){const i=e.getBoundingClientRect();r=r||i.width||Number(e.getAttribute("width"))||0,n=n||i.height||Number(e.getAttribute("height"))||0}return{width:r,height:n}}function yt(e,t){return C(this,null,function*(){const{log:r,timeout:n,drawImageCount:i,drawImageInterval:a}=t;r.time("image to canvas");const s=yield L(e,{timeout:n,onWarn:t.log.warn}),{canvas:o,context2d:c}=bt(e.ownerDocument,t),u=()=>{try{c==null||c.drawImage(s,0,0,o.width,o.height)}catch(l){t.log.warn("Failed to drawImage",l)}};if(u(),t.isEnable("fixSvgXmlDecode"))for(let l=0;l<i;l++)yield new Promise(d=>{setTimeout(()=>{c==null||c.clearRect(0,0,o.width,o.height),u(),d()},l+a)});return t.drawImageCount=0,r.timeEnd("image to canvas"),o})}function bt(e,t){const{width:r,height:n,scale:i,backgroundColor:a,maximumCanvasSize:s}=t,o=e.createElement("canvas");o.width=Math.floor(r*i),o.height=Math.floor(n*i),o.style.width=`${r}px`,o.style.height=`${n}px`,s&&(o.width>s||o.height>s)&&(o.width>s&&o.height>s?o.width>o.height?(o.height*=s/o.width,o.width=s):(o.width*=s/o.height,o.height=s):o.width>s?(o.height*=s/o.width,o.width=s):(o.width*=s/o.height,o.height=s));const c=o.getContext("2d");return c&&a&&(c.fillStyle=a,c.fillRect(0,0,o.width,o.height)),{canvas:o,context2d:c}}function Se(e,t){if(e.ownerDocument)try{const a=e.toDataURL();if(a!=="data:,")return _(a,e.ownerDocument)}catch(a){t.log.warn("Failed to clone canvas",a)}const r=e.cloneNode(!1),n=e.getContext("2d"),i=r.getContext("2d");try{return n&&i&&i.putImageData(n.getImageData(0,0,e.width,e.height),0,0),r}catch(a){t.log.warn("Failed to clone canvas",a)}return r}function St(e,t){var r;try{if((r=e==null?void 0:e.contentDocument)!=null&&r.documentElement)return ne(e.contentDocument.documentElement,t)}catch(n){t.log.warn("Failed to clone iframe",n)}return e.cloneNode(!1)}function Et(e){const t=e.cloneNode(!1);return e.currentSrc&&e.currentSrc!==e.src&&(t.src=e.currentSrc,t.srcset=""),t.loading==="lazy"&&(t.loading="eager"),t}function Ct(e,t){return C(this,null,function*(){if(e.ownerDocument&&!e.currentSrc&&e.poster)return _(e.poster,e.ownerDocument);const r=e.cloneNode(!1);r.crossOrigin="anonymous",e.currentSrc&&e.currentSrc!==e.src&&(r.src=e.currentSrc);const n=r.ownerDocument;if(n){let i=!0;if(yield L(r,{onError:()=>i=!1,onWarn:t.log.warn}),!i)return e.poster?_(e.poster,e.ownerDocument):r;r.currentTime=e.currentTime,yield new Promise(s=>{r.addEventListener("seeked",s,{once:!0})});const a=n.createElement("canvas");a.width=e.offsetWidth,a.height=e.offsetHeight;try{const s=a.getContext("2d");s&&s.drawImage(r,0,0,a.width,a.height)}catch(s){return t.log.warn("Failed to clone video",s),e.poster?_(e.poster,e.ownerDocument):r}return Se(a,t)}return r})}function Tt(e,t){return tt(e)?Se(e,t):lt(e)?St(e,t):$(e)?Et(e):Y(e)?Ct(e,t):e.cloneNode(!1)}function vt(e){let t=e.sandbox;if(!t){const{ownerDocument:r}=e;try{r&&(t=r.createElement("iframe"),t.id=`__SANDBOX__${he()}`,t.width="0",t.height="0",t.style.visibility="hidden",t.style.position="fixed",r.body.appendChild(t),t.srcdoc='<!DOCTYPE html><meta charset="UTF-8"><title></title><body>',e.sandbox=t)}catch(n){e.log.warn("Failed to getSandBox",n)}}return t}const At=["width","height","-webkit-text-fill-color"],Nt=["stroke","fill"];function Ee(e,t,r){const{defaultComputedStyles:n}=r,i=e.nodeName.toLowerCase(),a=H(e)&&i!=="svg",s=a?Nt.map(g=>[g,e.getAttribute(g)]).filter(([,g])=>g!==null):[],o=[a&&"svg",i,s.map((g,p)=>`${g}=${p}`).join(","),t].filter(Boolean).join(":");if(n.has(o))return n.get(o);const c=vt(r),u=c==null?void 0:c.contentWindow;if(!u)return new Map;const l=u==null?void 0:u.document;let d,m;a?(d=l.createElementNS(K,"svg"),m=d.ownerDocument.createElementNS(d.namespaceURI,i),s.forEach(([g,p])=>{m.setAttributeNS(null,g,p)}),d.appendChild(m)):d=m=l.createElement(i),m.textContent=" ",l.body.appendChild(d);const f=u.getComputedStyle(m,t),h=new Map;for(let g=f.length,p=0;p<g;p++){const E=f.item(p);At.includes(E)||h.set(E,f.getPropertyValue(E))}return l.body.removeChild(d),n.set(o,h),h}function Ce(e,t,r){var o;const n=new Map,i=[],a=new Map;if(r)for(const c of r)s(c);else for(let c=e.length,u=0;u<c;u++){const l=e.item(u);s(l)}for(let c=i.length,u=0;u<c;u++)(o=a.get(i[u]))==null||o.forEach((l,d)=>n.set(d,l));function s(c){const u=e.getPropertyValue(c),l=e.getPropertyPriority(c),d=c.lastIndexOf("-"),m=d>-1?c.substring(0,d):void 0;if(m){let f=a.get(m);f||(f=new Map,a.set(m,f)),f.set(c,[u,l])}t.get(c)===u&&!l||(m?i.push(m):n.set(c,[u,l]))}return n}function Rt(e,t,r,n){var d,m,f,h;const{ownerWindow:i,includeStyleProperties:a,currentParentNodeStyle:s}=n,o=t.style,c=i.getComputedStyle(e),u=Ee(e,null,n);s==null||s.forEach((g,p)=>{u.delete(p)});const l=Ce(c,u,a);l.delete("transition-property"),l.delete("all"),l.delete("d"),l.delete("content"),r&&(l.delete("position"),l.delete("margin-top"),l.delete("margin-right"),l.delete("margin-bottom"),l.delete("margin-left"),l.delete("margin-block-start"),l.delete("margin-block-end"),l.delete("margin-inline-start"),l.delete("margin-inline-end"),l.set("box-sizing",["border-box",""])),((d=l.get("background-clip"))==null?void 0:d[0])==="text"&&t.classList.add("______background-clip--text"),le&&(l.has("font-kerning")||l.set("font-kerning",["normal",""]),(((m=l.get("overflow-x"))==null?void 0:m[0])==="hidden"||((f=l.get("overflow-y"))==null?void 0:f[0])==="hidden")&&((h=l.get("text-overflow"))==null?void 0:h[0])==="ellipsis"&&e.scrollWidth===e.clientWidth&&l.set("text-overflow",["clip",""]));for(let g=o.length,p=0;p<g;p++)o.removeProperty(o.item(p));return l.forEach(([g,p],E)=>{o.setProperty(E,g,p)}),l}function It(e,t){(rt(e)||nt(e)||st(e))&&t.setAttribute("value",e.value)}const kt=["::before","::after"],Dt=["::-webkit-scrollbar","::-webkit-scrollbar-button","::-webkit-scrollbar-thumb","::-webkit-scrollbar-track","::-webkit-scrollbar-track-piece","::-webkit-scrollbar-corner","::-webkit-resizer"];function Pt(e,t,r,n,i){const{ownerWindow:a,svgStyleElement:s,svgStyles:o,currentNodeStyle:c}=n;if(!s||!a)return;function u(l){var w;const d=a.getComputedStyle(e,l);let m=d.getPropertyValue("content");if(!m||m==="none")return;i==null||i(m),m=m.replace(/(')|(")|(counter\(.+\))/g,"");const f=[he()],h=Ee(e,l,n);c==null||c.forEach((S,T)=>{h.delete(T)});const g=Ce(d,h,n.includeStyleProperties);g.delete("content"),g.delete("-webkit-locale"),((w=g.get("background-clip"))==null?void 0:w[0])==="text"&&t.classList.add("______background-clip--text");const p=[`content: '${m}';`];if(g.forEach(([S,T],A)=>{p.push(`${A}: ${S}${T?" !important":""};`)}),p.length===1)return;try{t.className=[t.className,...f].join(" ")}catch(S){n.log.warn("Failed to copyPseudoClass",S);return}const E=p.join(`
7
+ `);let b=o.get(E);b||(b=[],o.set(E,b)),b.push(`.${f[0]}${l}`)}kt.forEach(u),r&&Dt.forEach(u)}const Te=new Set(["symbol"]);function ve(e,t,r,n,i){return C(this,null,function*(){if(I(r)&&(ot(r)||at(r))||n.filter&&!n.filter(r))return;Te.has(t.nodeName)||Te.has(r.nodeName)?n.currentParentNodeStyle=void 0:n.currentParentNodeStyle=n.currentNodeStyle;const a=yield ne(r,n,!1,i);n.isEnable("restoreScrollPosition")&&Ut(e,a),t.appendChild(a)})}function Ae(e,t,r,n){return C(this,null,function*(){var a;let i=e.firstChild;I(e)&&e.shadowRoot&&(i=(a=e.shadowRoot)==null?void 0:a.firstChild,r.shadowRoots.push(e.shadowRoot));for(let s=i;s;s=s.nextSibling)if(!Ze(s))if(I(s)&&it(s)&&typeof s.assignedNodes=="function"){const o=s.assignedNodes();for(let c=0;c<o.length;c++)yield ve(e,t,o[c],r,n)}else yield ve(e,t,s,r,n)})}function Ut(e,t){if(!V(e)||!V(t))return;const{scrollTop:r,scrollLeft:n}=e;if(!r&&!n)return;const{transform:i}=t.style,a=new DOMMatrix(i),{a:s,b:o,c,d:u}=a;a.a=1,a.b=0,a.c=0,a.d=1,a.translateSelf(-n,-r),a.a=s,a.b=o,a.c=c,a.d=u,t.style.transform=a.toString()}function _t(e,t){const{backgroundColor:r,width:n,height:i,style:a}=t,s=e.style;if(r&&s.setProperty("background-color",r,"important"),n&&s.setProperty("width",`${n}px`,"important"),i&&s.setProperty("height",`${i}px`,"important"),a)for(const o in a)s[o]=a[o]}const Ft=/^[\w-:]+$/;function ne(e,t,r=!1,n){return C(this,null,function*(){var u,l,d,m;const{ownerDocument:i,ownerWindow:a,fontFamilies:s,onCloneEachNode:o}=t;if(i&&et(e))return n&&/\S/.test(e.data)&&n(e.data),i.createTextNode(e.data);if(i&&a&&I(e)&&(V(e)||H(e))){const f=yield Tt(e,t);if(t.isEnable("removeAbnormalAttributes")){const w=f.getAttributeNames();for(let S=w.length,T=0;T<S;T++){const A=w[T];Ft.test(A)||f.removeAttribute(A)}}const h=t.currentNodeStyle=Rt(e,f,r,t);r&&_t(f,t);let g=!1;if(t.isEnable("copyScrollbar")){const w=[(u=h.get("overflow-x"))==null?void 0:u[0],(l=h.get("overflow-y"))==null?void 0:l[0]];g=w.includes("scroll")||(w.includes("auto")||w.includes("overlay"))&&(e.scrollHeight>e.clientHeight||e.scrollWidth>e.clientWidth)}const p=(d=h.get("text-transform"))==null?void 0:d[0],E=we((m=h.get("font-family"))==null?void 0:m[0]),b=E?w=>{p==="uppercase"?w=w.toUpperCase():p==="lowercase"?w=w.toLowerCase():p==="capitalize"&&(w=w[0].toUpperCase()+w.substring(1)),E.forEach(S=>{let T=s.get(S);T||s.set(S,T=new Set),w.split("").forEach(A=>T.add(A))})}:void 0;return Pt(e,f,g,t,b),It(e,f),Y(e)||(yield Ae(e,f,t,b)),yield o==null?void 0:o(f),f}const c=e.cloneNode(!1);return yield Ae(e,c,t),yield o==null?void 0:o(c),c})}function Ne(e){if(e.ownerDocument=void 0,e.ownerWindow=void 0,e.svgStyleElement=void 0,e.svgDefsElement=void 0,e.svgStyles.clear(),e.defaultComputedStyles.clear(),e.sandbox){try{e.sandbox.remove()}catch(t){e.log.warn("Failed to destroyContext",t)}e.sandbox=void 0}e.workers=[],e.fontFamilies.clear(),e.fontCssTexts.clear(),e.requests.clear(),e.tasks=[],e.shadowRoots=[]}function Bt(e){const o=e,{url:t,timeout:r,responseType:n}=o,i=je(o,["url","timeout","responseType"]),a=new AbortController,s=r?setTimeout(()=>a.abort(),r):void 0;return fetch(t,D({signal:a.signal},i)).then(c=>{if(!c.ok)throw new Error("Failed fetch, not 2xx response",{cause:c});switch(n){case"arrayBuffer":return c.arrayBuffer();case"dataUrl":return c.blob().then(gt);case"text":default:return c.text()}}).finally(()=>clearTimeout(s))}function z(e,t){const{url:r,requestType:n="text",responseType:i="text",imageDom:a}=t;let s=r;const{timeout:o,acceptOfImage:c,requests:u,fetchFn:l,fetch:{requestInit:d,bypassingCache:m,placeholderImage:f},font:h,workers:g,fontFamilies:p}=e;n==="image"&&(G||te)&&e.drawImageCount++;let E=u.get(r);if(!E){m&&m instanceof RegExp&&m.test(s)&&(s+=(/\?/.test(s)?"&":"?")+new Date().getTime());const b=n.startsWith("font")&&h&&h.minify,w=new Set;b&&n.split(";")[1].split(",").forEach(F=>{p.has(F)&&p.get(F).forEach(B=>w.add(B))});const S=b&&w.size,T=D({url:s,timeout:o,responseType:S?"arrayBuffer":i,headers:n==="image"?{accept:c}:void 0},d);E={type:n,resolve:void 0,reject:void 0,response:null},E.response=C(this,null,function*(){if(l&&n==="image"){const A=yield l(r);if(A)return A}return!G&&r.startsWith("http")&&g.length?new Promise((A,F)=>{g[u.size&g.length-1].postMessage(D({rawUrl:r},T)),E.resolve=A,E.reject=F}):Bt(T)}).catch(A=>{if(u.delete(r),n==="image"&&f)return e.log.warn("Failed to fetch image base64, trying to use placeholder image",s),typeof f=="string"?f:f(a);throw A}),u.set(r,E)}return E.response}function Re(e,t,r,n){return C(this,null,function*(){if(!Ie(e))return e;for(const[i,a]of $t(e,t))try{const s=yield z(r,{url:a,requestType:n?"image":"text",responseType:"dataUrl"});e=e.replace(Lt(i),`$1${s}$3`)}catch(s){r.log.warn("Failed to fetch css data url",i,s)}return e})}function Ie(e){return/url\((['"]?)([^'"]+?)\1\)/.test(e)}const ke=/url\((['"]?)([^'"]+?)\1\)/g;function $t(e,t){const r=[];return e.replace(ke,(n,i,a)=>(r.push([a,ue(a,t)]),n)),r.filter(([n])=>!re(n))}function Lt(e){const t=e.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${t})(['"]?\\))`,"g")}const xt=["background-image","border-image-source","-webkit-border-image","-webkit-mask-image","list-style-image"];function Mt(e,t){return xt.map(r=>{const n=e.getPropertyValue(r);return!n||n==="none"?null:((G||te)&&t.drawImageCount++,Re(n,null,t,!0).then(i=>{!i||n===i||e.setProperty(r,i,e.getPropertyPriority(r))}))}).filter(Boolean)}function Ot(e,t){if($(e)){const r=e.currentSrc||e.src;if(!re(r))return[z(t,{url:r,imageDom:e,requestType:"image",responseType:"dataUrl"}).then(n=>{n&&(e.srcset="",e.dataset.originalSrc=r,e.src=n||"")})];(G||te)&&t.drawImageCount++}else if(H(e)&&!re(e.href.baseVal)){const r=e.href.baseVal;return[z(t,{url:r,imageDom:e,requestType:"image",responseType:"dataUrl"}).then(n=>{n&&(e.dataset.originalSrc=r,e.href.baseVal=n||"")})]}return[]}function jt(e,t){var o;const{ownerDocument:r,svgDefsElement:n}=t,i=(o=e.getAttribute("href"))!=null?o:e.getAttribute("xlink:href");if(!i)return[];const[a,s]=i.split("#");if(s){const c=`#${s}`,u=t.shadowRoots.reduce((l,d)=>l!=null?l:d.querySelector(`svg ${c}`),r==null?void 0:r.querySelector(`svg ${c}`));if(a&&e.setAttribute("href",c),n!=null&&n.querySelector(c))return[];if(u)return n==null||n.appendChild(u.cloneNode(!0)),[];if(a)return[z(t,{url:a,responseType:"text"}).then(l=>{n==null||n.insertAdjacentHTML("beforeend",l)})]}return[]}function De(e,t){const{tasks:r}=t;I(e)&&(($(e)||ce(e))&&r.push(...Ot(e,t)),Qe(e)&&r.push(...jt(e,t))),V(e)&&r.push(...Mt(e.style,t)),e.childNodes.forEach(n=>{De(n,t)})}function qt(e,t){return C(this,null,function*(){const{ownerDocument:r,svgStyleElement:n,fontFamilies:i,fontCssTexts:a,tasks:s,font:o}=t;if(!(!r||!n||!i.size))if(o&&o.cssText){const c=Ue(o.cssText,t);n.appendChild(r.createTextNode(`${c}
8
+ `))}else{const c=Array.from(r.styleSheets).filter(f=>{try{return"cssRules"in f&&!!f.cssRules.length}catch(h){return t.log.warn(`Error while reading CSS rules from ${f.href}`,h),!1}}),u=r.implementation.createHTMLDocument(""),l=u.createElement("style");u.head.appendChild(l);const d=l.sheet;yield Promise.all(c.flatMap(f=>Array.from(f.cssRules).map(h=>C(this,null,function*(){if(Je(h)){const g=h.href;let p="";try{p=yield z(t,{url:g,requestType:"text",responseType:"text"})}catch(b){t.log.warn(`Error fetch remote css import from ${g}`,b)}const E=p.replace(ke,(b,w,S)=>b.replace(S,ue(S,g)));for(const b of Ht(E))try{d.insertRule(b,d.cssRules.length)}catch(w){t.log.warn("Error inserting rule from remote css import",{rule:b,error:w})}}})))),d.cssRules.length&&c.push(d);const m=[];c.forEach(f=>{oe(f.cssRules,m)}),m.filter(f=>{var h;return Ye(f)&&Ie(f.style.getPropertyValue("src"))&&((h=we(f.style.getPropertyValue("font-family")))==null?void 0:h.some(g=>i.has(g)))}).forEach(f=>{const h=f,g=a.get(h.cssText);g?n.appendChild(r.createTextNode(`${g}
9
+ `)):s.push(Re(h.cssText,h.parentStyleSheet?h.parentStyleSheet.href:null,t).then(p=>{p=Ue(p,t),a.set(h.cssText,p),n.appendChild(r.createTextNode(`${p}
10
+ `))}))})}})}const Wt=/(\/\*[\s\S]*?\*\/)/g,Pe=/((@.*?keyframes [\s\S]*?){([\s\S]*?}\s*?)})/gi;function Ht(e){if(e==null)return[];const t=[];let r=e.replace(Wt,"");for(;;){const a=Pe.exec(r);if(!a)break;t.push(a[0])}r=r.replace(Pe,"");const n=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,i=new RegExp("((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})","gi");for(;;){let a=n.exec(r);if(a)i.lastIndex=n.lastIndex;else if(a=i.exec(r),a)n.lastIndex=i.lastIndex;else break;t.push(a[0])}return t}const Vt=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,zt=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function Ue(e,t){const{font:r}=t,n=r?r==null?void 0:r.preferredFormat:void 0;return n?e.replace(zt,i=>{for(;;){const[a,,s]=Vt.exec(i)||[];if(!s)return"";if(s===n)return`src: ${a};`}}):e}function oe(e,t=[]){for(const r of Array.from(e))Ke(r)?t.push(...oe(r.cssRules)):"cssRules"in r?oe(r.cssRules,t):t.push(r);return t}const Xt=/\bx?link:?href\s*=\s*["'](?!data:)[^"']+["']/i;function Gt(e){return Xt.test(e.innerHTML)}function _e(e,t){return C(this,null,function*(){const r=yield k(e,t);if(I(r.node)&&H(r.node)&&!Gt(r.node))return r.node;const{ownerDocument:n,log:i,tasks:a,svgStyleElement:s,svgDefsElement:o,svgStyles:c,font:u,progress:l,autoDestruct:d,onCloneNode:m,onEmbedNode:f,onCreateForeignObjectSvg:h}=r;i.time("clone node");const g=yield ne(r.node,r,!0);if(s&&n){let S="";c.forEach((T,A)=>{S+=`${T.join(`,
11
+ `)} {
12
+ ${A}
13
+ }
14
+ `}),s.appendChild(n.createTextNode(S))}i.timeEnd("clone node"),yield m==null?void 0:m(g),u!==!1&&I(g)&&(i.time("embed web font"),yield qt(g,r),i.timeEnd("embed web font")),i.time("embed node"),De(g,r);const p=a.length;let E=0;const b=()=>C(this,null,function*(){for(;;){const S=a.pop();if(!S)break;try{yield S}catch(T){r.log.warn("Failed to run task",T)}l==null||l(++E,p)}});l==null||l(E,p),yield Promise.all([...Array.from({length:4})].map(b)),i.timeEnd("embed node"),yield f==null?void 0:f(g);const w=Yt(g,r);return o&&w.insertBefore(o,w.children[0]),s&&w.insertBefore(s,w.children[0]),d&&Ne(r),yield h==null?void 0:h(w),w})}function Yt(e,t){const{width:r,height:n}=t,i=fe(r,n,e.ownerDocument),a=i.ownerDocument.createElementNS(i.namespaceURI,"foreignObject");return a.setAttributeNS(null,"x","0%"),a.setAttributeNS(null,"y","0%"),a.setAttributeNS(null,"width","100%"),a.setAttributeNS(null,"height","100%"),a.append(e),i.appendChild(a),i}function Q(e,t){return C(this,null,function*(){var s;const r=yield k(e,t),n=yield _e(r),i=de(n,r.isEnable("removeControlCharacter"));r.autoDestruct||(r.svgStyleElement=be(r.ownerDocument),r.svgDefsElement=(s=r.ownerDocument)==null?void 0:s.createElementNS(K,"defs"),r.svgStyles.clear());const a=_(i,n.ownerDocument);return yield yt(a,r)})}function Jt(e,t){return C(this,null,function*(){const r=yield k(e,t),{log:n,type:i,quality:a,dpi:s}=r,o=yield Q(r);n.time("canvas to blob");const c=yield ft(o,i,a);if(["image/png","image/jpeg"].includes(i)&&s){const u=yield mt(c.slice(0,33));let l=new Uint8Array(u);return i==="image/png"?l=ae(l,s):i==="image/jpeg"&&(l=v(l,s)),n.timeEnd("canvas to blob"),new Blob([l,c.slice(33)],{type:i})}return n.timeEnd("canvas to blob"),c})}function x(e,t){return C(this,null,function*(){const r=yield k(e,t),{log:n,quality:i,type:a,dpi:s}=r,o=yield Q(r);n.time("canvas to data url");let c=o.toDataURL(a,i);if(["image/png","image/jpeg"].includes(a)&&s&&ie&&Xe){const[u,l]=c.split(",");let d=0,m=!1;if(a==="image/png"){const w=Ve(l);w>=0?(d=Math.ceil((w+28)/3)*4,m=!0):d=33/3*4}else a==="image/jpeg"&&(d=18/3*4);const f=l.substring(0,d),h=l.substring(d),g=window.atob(f),p=new Uint8Array(g.length);for(let w=0;w<p.length;w++)p[w]=g.charCodeAt(w);const E=a==="image/png"?ae(p,s,m):v(p,s),b=window.btoa(String.fromCharCode(...E));c=[u,",",b,h].join("")}return n.timeEnd("canvas to data url"),c})}function Fe(e,t){return C(this,null,function*(){const r=yield k(e,t),{width:n,height:i,ownerDocument:a}=r,s=yield x(r),o=fe(n,i,a),c=o.ownerDocument.createElementNS(o.namespaceURI,"image");return c.setAttributeNS(null,"href",s),c.setAttributeNS(null,"height","100%"),c.setAttributeNS(null,"width","100%"),o.appendChild(c),de(o,r.isEnable("removeControlCharacter"))})}function Kt(e,t){return C(this,null,function*(){const r=yield k(e,t),{ownerDocument:n,width:i,height:a,scale:s,type:o}=r,c=o==="image/svg+xml"?yield Fe(r):yield x(r),u=_(c,n);return u.width=Math.floor(i*s),u.height=Math.floor(a*s),u.style.width=`${i}px`,u.style.height=`${a}px`,u})}function Qt(e,t){return C(this,null,function*(){return x(yield k(e,M(D({},t),{type:"image/jpeg"})))})}function Zt(e,t){return C(this,null,function*(){const r=yield k(e,t),n=yield Q(r);return n.getContext("2d").getImageData(0,0,n.width,n.height).data})}function er(e,t){return C(this,null,function*(){return x(yield k(e,M(D({},t),{type:"image/png"})))})}function tr(e,t){return C(this,null,function*(){return x(yield k(e,M(D({},t),{type:"image/webp"})))})}y.createContext=ye,y.destroyContext=Ne,y.domToBlob=Jt,y.domToCanvas=Q,y.domToDataUrl=x,y.domToForeignObjectSvg=_e,y.domToImage=Kt,y.domToJpeg=Qt,y.domToPixel=Zt,y.domToPng=er,y.domToSvg=Fe,y.domToWebp=tr,y.loadMedia=L,y.waitUntilLoad=me,Object.defineProperty(y,Symbol.toStringTag,{value:"Module"})});
@@ -0,0 +1,214 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Pin/unpin sub-commands as standalone skill shortcuts.
4
+ *
5
+ * Usage:
6
+ * node <scripts_path>/pin.mjs pin <command>
7
+ * node <scripts_path>/pin.mjs unpin <command>
8
+ *
9
+ * `pin audit` creates a lightweight /audit skill that redirects to /impeccable audit.
10
+ * `unpin audit` removes that shortcut.
11
+ *
12
+ * The script discovers harness directories (.claude/skills, .cursor/skills, etc.)
13
+ * in the project root and creates/removes the pin in all of them.
14
+ */
15
+
16
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, readdirSync } from 'node:fs';
17
+ import { join, resolve, dirname } from 'node:path';
18
+ import { fileURLToPath } from 'node:url';
19
+
20
+ const __dirname = dirname(fileURLToPath(import.meta.url));
21
+
22
+ // All known harness directories
23
+ const HARNESS_DIRS = [
24
+ '.claude', '.cursor', '.gemini', '.codex', '.agents',
25
+ '.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
26
+ ];
27
+
28
+ // Valid sub-command names
29
+ const VALID_COMMANDS = [
30
+ 'craft', 'teach', 'extract', 'document', 'shape',
31
+ 'critique', 'audit',
32
+ 'polish', 'bolder', 'quieter', 'distill', 'harden', 'onboard', 'live',
33
+ 'animate', 'colorize', 'typeset', 'layout', 'delight', 'overdrive',
34
+ 'clarify', 'adapt', 'optimize',
35
+ ];
36
+
37
+ // Marker to identify pinned skills (so unpin doesn't delete user skills)
38
+ const PIN_MARKER = '<!-- impeccable-pinned-skill -->';
39
+
40
+ /**
41
+ * Walk up from startDir to find a project root.
42
+ */
43
+ function findProjectRoot(startDir = process.cwd()) {
44
+ let dir = resolve(startDir);
45
+ while (dir !== '/') {
46
+ if (
47
+ existsSync(join(dir, 'package.json')) ||
48
+ existsSync(join(dir, '.git')) ||
49
+ existsSync(join(dir, 'skills-lock.json'))
50
+ ) {
51
+ return dir;
52
+ }
53
+ const parent = resolve(dir, '..');
54
+ if (parent === dir) break;
55
+ dir = parent;
56
+ }
57
+ return resolve(startDir);
58
+ }
59
+
60
+ /**
61
+ * Find harness skill directories that have an impeccable skill installed.
62
+ */
63
+ function findHarnessDirs(projectRoot) {
64
+ const dirs = [];
65
+ for (const harness of HARNESS_DIRS) {
66
+ const skillsDir = join(projectRoot, harness, 'skills');
67
+ // Only pin in harness dirs that already have impeccable installed
68
+ const impeccableDir = join(skillsDir, 'impeccable');
69
+ if (existsSync(impeccableDir) || existsSync(join(skillsDir, 'i-impeccable'))) {
70
+ dirs.push(skillsDir);
71
+ }
72
+ }
73
+ return dirs;
74
+ }
75
+
76
+ /**
77
+ * Load command metadata (descriptions for pinned skills).
78
+ */
79
+ function loadCommandMetadata() {
80
+ const metadataPath = join(__dirname, 'command-metadata.json');
81
+ if (existsSync(metadataPath)) {
82
+ return JSON.parse(readFileSync(metadataPath, 'utf-8'));
83
+ }
84
+ return {};
85
+ }
86
+
87
+ /**
88
+ * Generate a pinned skill's SKILL.md content.
89
+ */
90
+ function generatePinnedSkill(command, metadata) {
91
+ const desc = metadata[command]?.description || `Shortcut for /impeccable ${command}.`;
92
+ const hint = metadata[command]?.argumentHint || '[target]';
93
+
94
+ return `---
95
+ name: ${command}
96
+ description: "${desc}"
97
+ argument-hint: "${hint}"
98
+ user-invocable: true
99
+ ---
100
+
101
+ ${PIN_MARKER}
102
+
103
+ This is a pinned shortcut for \`{{command_prefix}}impeccable ${command}\`.
104
+
105
+ Invoke {{command_prefix}}impeccable ${command}, passing along any arguments provided here, and follow its instructions.
106
+ `;
107
+ }
108
+
109
+ /**
110
+ * Pin a command: create shortcut skill in all harness dirs.
111
+ */
112
+ function pin(command, projectRoot) {
113
+ const metadata = loadCommandMetadata();
114
+ const harnessDirs = findHarnessDirs(projectRoot);
115
+
116
+ if (harnessDirs.length === 0) {
117
+ console.log('No harness directories with impeccable installed found.');
118
+ return false;
119
+ }
120
+
121
+ const content = generatePinnedSkill(command, metadata);
122
+ let created = 0;
123
+
124
+ for (const skillsDir of harnessDirs) {
125
+ // Check if skill already exists (and isn't a pin)
126
+ const skillDir = join(skillsDir, command);
127
+ if (existsSync(skillDir)) {
128
+ const existingMd = join(skillDir, 'SKILL.md');
129
+ if (existsSync(existingMd)) {
130
+ const existing = readFileSync(existingMd, 'utf-8');
131
+ if (!existing.includes(PIN_MARKER)) {
132
+ console.log(` SKIP: ${skillDir} (non-pinned skill already exists)`);
133
+ continue;
134
+ }
135
+ }
136
+ }
137
+
138
+ mkdirSync(skillDir, { recursive: true });
139
+ writeFileSync(join(skillDir, 'SKILL.md'), content, 'utf-8');
140
+ console.log(` + ${skillDir}`);
141
+ created++;
142
+ }
143
+
144
+ if (created > 0) {
145
+ console.log(`\nPinned '${command}' as a standalone shortcut in ${created} location(s).`);
146
+ console.log(`You can now use /${command} directly.`);
147
+ }
148
+
149
+ return created > 0;
150
+ }
151
+
152
+ /**
153
+ * Unpin a command: remove shortcut skill from all harness dirs.
154
+ */
155
+ function unpin(command, projectRoot) {
156
+ const harnessDirs = findHarnessDirs(projectRoot);
157
+ let removed = 0;
158
+
159
+ for (const skillsDir of harnessDirs) {
160
+ const skillDir = join(skillsDir, command);
161
+ if (!existsSync(skillDir)) continue;
162
+
163
+ const skillMd = join(skillDir, 'SKILL.md');
164
+ if (!existsSync(skillMd)) continue;
165
+
166
+ // Safety: only remove if it's a pinned skill
167
+ const content = readFileSync(skillMd, 'utf-8');
168
+ if (!content.includes(PIN_MARKER)) {
169
+ console.log(` SKIP: ${skillDir} (not a pinned skill)`);
170
+ continue;
171
+ }
172
+
173
+ rmSync(skillDir, { recursive: true, force: true });
174
+ console.log(` - ${skillDir}`);
175
+ removed++;
176
+ }
177
+
178
+ if (removed > 0) {
179
+ console.log(`\nUnpinned '${command}' from ${removed} location(s).`);
180
+ console.log(`Use /impeccable ${command} to access it.`);
181
+ } else {
182
+ console.log(`No pinned '${command}' shortcut found.`);
183
+ }
184
+
185
+ return removed > 0;
186
+ }
187
+
188
+ // --- CLI ---
189
+ const [,, action, command] = process.argv;
190
+
191
+ if (!action || !command) {
192
+ console.log('Usage: node pin.mjs <pin|unpin> <command>');
193
+ console.log(`\nAvailable commands: ${VALID_COMMANDS.join(', ')}`);
194
+ process.exit(1);
195
+ }
196
+
197
+ if (action !== 'pin' && action !== 'unpin') {
198
+ console.error(`Unknown action: ${action}. Use 'pin' or 'unpin'.`);
199
+ process.exit(1);
200
+ }
201
+
202
+ if (!VALID_COMMANDS.includes(command)) {
203
+ console.error(`Unknown command: ${command}`);
204
+ console.error(`Available commands: ${VALID_COMMANDS.join(', ')}`);
205
+ process.exit(1);
206
+ }
207
+
208
+ const root = findProjectRoot();
209
+
210
+ if (action === 'pin') {
211
+ pin(command, root);
212
+ } else {
213
+ unpin(command, root);
214
+ }
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: np-industrial-brutalist-ui
3
+ description: Raw mechanical interfaces fusing Swiss typographic print with military terminal aesthetics. Rigid grids, extreme type scale contrast, utilitarian color, analog degradation effects. For data-heavy dashboards, portfolios, or editorial sites that need to feel like declassified blueprints.
4
+ ---
5
+
6
+ # SKILL: Industrial Brutalism & Tactical Telemetry UI
7
+
8
+ ## 1. Skill Meta
9
+ **Name:** Industrial Brutalism & Tactical Telemetry Interface Engineering
10
+ **Description:** Advanced proficiency in architecting web interfaces that synthesize mid-century Swiss Typographic design, industrial manufacturing manuals, and retro-futuristic aerospace/military terminal interfaces. This discipline requires absolute mastery over rigid modular grids, extreme typographic scale contrast, purely utilitarian color palettes, and the programmatic simulation of analog degradation (halftones, CRT scanlines, bitmap dithering). The objective is to construct digital environments that project raw functionality, mechanical precision, and high data density, deliberately discarding conventional consumer UI patterns.
11
+
12
+ ## 2. Visual Archetypes
13
+ The design system operates by merging two distinct but highly compatible visual paradigms. **Pick ONE per project and commit to it. Do not alternate or mix both modes within the same interface.**
14
+
15
+ ### 2.1 Swiss Industrial Print
16
+ Derived from 1960s corporate identity systems and heavy machinery blueprints.
17
+ * **Characteristics:** High-contrast light modes (newsprint/off-white substrates). Reliance on monolithic, heavy sans-serif typography. Unforgiving structural grids outlined by visible dividing lines. Aggressive, asymmetric use of negative space punctuated by oversized, viewport-bleeding numerals or letterforms. Heavy use of primary red as an alert/accent color.
18
+
19
+ ### 2.2 Tactical Telemetry & CRT Terminal
20
+ Derived from classified military databases, legacy mainframes, and aerospace Heads-Up Displays (HUDs).
21
+ * **Characteristics:** Dark mode exclusivity. High-density tabular data presentation. Absolute dominance of monospaced typography. Integration of technical framing devices (ASCII brackets, crosshairs). Application of simulated hardware limitations (phosphor glow, scanlines, low bit-depth rendering).
22
+
23
+ ## 3. Typographic Architecture
24
+ Typography is the primary structural and decorative infrastructure. Imagery is secondary. The system demands extreme variance in scale, weight, and spacing.
25
+
26
+ ### 3.1 Macro-Typography (Structural Headers)
27
+ * **Classification:** Neo-Grotesque / Heavy Sans-Serif.
28
+ * **Optimal Web Fonts:** Neue Haas Grotesk (Black), Inter (Extra Bold/Black), Archivo Black, Roboto Flex (Heavy), Monument Extended.
29
+ * **Implementation Parameters:**
30
+ * **Scale:** Deployed at massive scales using fluid typography (e.g., `clamp(4rem, 10vw, 15rem)`).
31
+ * **Tracking (Letter-spacing):** Extremely tight, often negative (`-0.03em` to `-0.06em`), forcing glyphs to form solid architectural blocks.
32
+ * **Leading (Line-height):** Highly compressed (`0.85` to `0.95`).
33
+ * **Casing:** Exclusively uppercase for structural impact.
34
+
35
+ ### 3.2 Micro-Typography (Data & Telemetry)
36
+ * **Classification:** Monospace / Technical Sans.
37
+ * **Optimal Web Fonts:** JetBrains Mono, IBM Plex Mono, Space Mono, VT323, Courier Prime.
38
+ * **Implementation Parameters:**
39
+ * **Scale:** Fixed and small (`10px` to `14px` / `0.7rem` to `0.875rem`).
40
+ * **Tracking:** Generous (`0.05em` to `0.1em`) to simulate mechanical typewriter spacing or terminal matrices.
41
+ * **Leading:** Standard to tight (`1.2` to `1.4`).
42
+ * **Casing:** Exclusively uppercase. Used for all metadata, navigation, unit IDs, and coordinates.
43
+
44
+ ### 3.3 Textural Contrast (Artistic Disruption)
45
+ * **Classification:** High-Contrast Serif.
46
+ * **Optimal Web Fonts:** Playfair Display, EB Garamond, Times New Roman.
47
+ * **Implementation Parameters:** Used exceedingly sparingly. Must be subjected to heavy post-processing (halftone filters, 1-bit dithering) to degrade vector perfection and create textural juxtaposition against the clean sans-serifs.
48
+
49
+ ## 4. Color System
50
+ The color architecture is uncompromising. Gradients, soft drop shadows, and modern translucency are strictly prohibited. Colors simulate physical media or primitive emissive displays.
51
+
52
+ **CRITICAL: Choose ONE substrate palette per project and use it consistently. Never mix light and dark substrates within the same interface.**
53
+
54
+ ### If Swiss Industrial Print (Light):
55
+ * **Background:** `#F4F4F0` or `#EAE8E3` (Matte, unbleached documentation paper).
56
+ * **Foreground:** `#050505` to `#111111` (Carbon Ink).
57
+ * **Accent:** `#E61919` or `#FF2A2A` (Aviation/Hazard Red). This is the ONLY accent color. Used for strike-throughs, thick structural dividing lines, or vital data highlights.
58
+
59
+ ### If Tactical Telemetry (Dark):
60
+ * **Background:** `#0A0A0A` or `#121212` (Deactivated CRT. Avoid pure `#000000`).
61
+ * **Foreground:** `#EAEAEA` (White phosphor). This is the primary text color.
62
+ * **Accent:** `#E61919` or `#FF2A2A` (Aviation/Hazard Red). Same red, same rules.
63
+ * **Terminal Green (`#4AF626`):** Optional. Use ONLY for a single specific UI element (e.g., one status indicator or one data readout) — never as a general text color. If it doesn't serve a clear purpose, omit it entirely.
64
+
65
+ ## 5. Layout and Spatial Engineering
66
+ The layout must appear mathematically engineered. It rejects conventional web padding in favor of visible compartmentalization.
67
+
68
+ * **The Blueprint Grid:** Strict adherence to CSS Grid architectures. Elements do not float; they are anchored precisely to grid tracks and intersections.
69
+ * **Visible Compartmentalization:** Extensive utilization of solid borders (`1px` or `2px solid`) to delineate distinct zones of information. Horizontal rules (`<hr>`) frequently span the entire container width to segregate operational units.
70
+ * **Bimodal Density:** Layouts oscillate between extreme data density (tightly packed monospace metadata clustered together) and vast expanses of calculated negative space framing macro-typography.
71
+ * **Geometry:** Absolute rejection of `border-radius`. All corners must be exactly 90 degrees to enforce mechanical rigidity.
72
+
73
+ ## 6. UI Components and Symbology
74
+ Standard web UI conventions are replaced with utilitarian, industrial graphic elements.
75
+
76
+ * **Syntax Decoration:** Utilization of ASCII characters to frame data points.
77
+ * *Framing:* `[ DELIVERY SYSTEMS ]`, `< RE-IND >`
78
+ * *Directional:* `>>>`, `///`, `\\\\`
79
+ * **Industrial Markers:** Prominent integration of registration (`®`), copyright (`©`), and trademark (`™`) symbols functioning as structural geometric elements rather than legal text.
80
+ * **Technical Assets:** Integration of crosshairs (`+`) at grid intersections, repeating vertical lines (barcodes), thick horizontal warning stripes, and randomized string data (e.g., `REV 2.6`, `UNIT / D-01`) to simulate active mechanical processes.
81
+
82
+ ## 7. Textural and Post-Processing Effects
83
+ To prevent the design from appearing purely digital, simulated analog degradation is engineered into the frontend via CSS and SVG filters.
84
+
85
+ * **Halftone and 1-Bit Dithering:** Transforming continuous-tone images or large serif typography into dot-matrix patterns. Achieved via pre-processing or CSS `mix-blend-mode: multiply` overlays combined with SVG radial dot patterns.
86
+ * **CRT Scanlines:** For terminal interfaces, applying a `repeating-linear-gradient` to the background to simulate horizontal electron beam sweeps (e.g., `repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0,0,0,0.1) 2px, rgba(0,0,0,0.1) 4px)`).
87
+ * **Mechanical Noise:** A global, low-opacity SVG static/noise filter applied to the DOM root to introduce a unified physical grain across both dark and light modes.
88
+
89
+ ## 8. Web Engineering Directives
90
+ 1. **Grid Determinism:** Utilize `display: grid; gap: 1px;` with contrasting parent/child background colors to generate mathematically perfect, razor-thin dividing lines without complex border declarations.
91
+ 2. **Semantic Rigidity:** Construct the DOM using precise semantic tags (`<data>`, `<samp>`, `<kbd>`, `<output>`, `<dl>`) to accurately reflect the technical nature of the telemetry.
92
+ 3. **Typography Clamping:** Implement CSS `clamp()` functions exclusively for macro-typography to ensure massive text scales aggressively while maintaining structural integrity across viewports.
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: np-minimalist-ui
3
+ description: Clean editorial-style interfaces. Warm monochrome palette, typographic contrast, flat bento grids, muted pastels. No gradients, no heavy shadows.
4
+ ---
5
+
6
+ # Protocol: Premium Utilitarian Minimalism UI Architect
7
+
8
+ ## 1. Protocol Overview
9
+ Name: Premium Utilitarian Minimalism & Editorial UI
10
+ Description: An advanced frontend engineering directive for generating highly refined, ultra-minimalist, "document-style" web interfaces analogous to top-tier workspace platforms. This protocol strictly enforces a high-contrast warm monochrome palette, bespoke typographic hierarchies, meticulous structural macro-whitespace, bento-grid layouts, and an ultra-flat component architecture with deliberate muted pastel accents. It actively rejects standard generic SaaS design trends.
11
+
12
+ ## 2. Absolute Negative Constraints (Banned Elements)
13
+ The AI must strictly avoid the following generic web development defaults:
14
+ - DO NOT use the "Inter", "Roboto", or "Open Sans" typefaces.
15
+ - DO NOT use generic, thin-line icon libraries like "Lucide", "Feather", or standard "Heroicons".
16
+ - DO NOT use Tailwind's default heavy drop shadows (e.g., `shadow-md`, `shadow-lg`, `shadow-xl`). Shadows must be practically non-existent or heavily customized to be ultra-diffuse and low opacity (< 0.05).
17
+ - DO NOT use primary colored backgrounds for large elements or sections (e.g., no bright blue, green, or red hero sections).
18
+ - DO NOT use gradients, neon colors, or 3D glassmorphism (beyond subtle navbar blurs).
19
+ - DO NOT use `rounded-full` (pill shapes) for large containers, cards, or primary buttons.
20
+ - DO NOT use emojis anywhere in code, markup, text content, headings, or alt text. Replace with proper icons or clean SVG primitives.
21
+ - DO NOT use generic placeholder names like "John Doe", "Acme Corp", or "Lorem Ipsum". Use realistic, contextual content.
22
+ - DO NOT use AI copywriting clichés: "Elevate", "Seamless", "Unleash", "Next-Gen", "Game-changer", "Delve". Write plain, specific language.
23
+
24
+ ## 3. Typographic Architecture
25
+ The interface must rely on extreme typographic contrast and premium font selection to establish an editorial feel.
26
+ - Primary Sans-Serif (Body, UI, Buttons): Use clean, geometric, or system-native fonts with character. Target: `font-family: 'SF Pro Display', 'Geist Sans', 'Helvetica Neue', 'Switzer', sans-serif`.
27
+ - Editorial Serif (Hero Headings & Quotes): Target: `font-family: 'Lyon Text', 'Newsreader', 'Playfair Display', 'Instrument Serif', serif`. Apply tight tracking (`letter-spacing: -0.02em` to `-0.04em`) and tight line-height (`1.1`).
28
+ - Monospace (Code, Keystrokes, Meta-data): Target: `font-family: 'Geist Mono', 'SF Mono', 'JetBrains Mono', monospace`.
29
+ - Text Colors: Body text must never be absolute black (`#000000`). Use off-black/charcoal (`#111111` or `#2F3437`) with a generous `line-height` of `1.6` for legibility. Secondary text should be muted gray (`#787774`).
30
+
31
+ ## 4. Color Palette (Warm Monochrome + Spot Pastels)
32
+ Color is a scarce resource, utilized only for semantic meaning or subtle accents.
33
+ - Canvas / Background: Pure White `#FFFFFF` or Warm Bone/Off-White `#F7F6F3` / `#FBFBFA`.
34
+ - Primary Surface (Cards): `#FFFFFF` or `#F9F9F8`.
35
+ - Structural Borders / Dividers: Ultra-light gray `#EAEAEA` or `rgba(0,0,0,0.06)`.
36
+ - Accent Colors: Exclusively use highly desaturated, washed-out pastels for tags, inline code backgrounds, or subtle icon backgrounds.
37
+ - Pale Red: `#FDEBEC` (Text: `#9F2F2D`)
38
+ - Pale Blue: `#E1F3FE` (Text: `#1F6C9F`)
39
+ - Pale Green: `#EDF3EC` (Text: `#346538`)
40
+ - Pale Yellow: `#FBF3DB` (Text: `#956400`)
41
+
42
+ ## 5. Component Specifications
43
+ - Bento Box Feature Grids:
44
+ - Utilize asymmetrical CSS Grid layouts.
45
+ - Cards must have exactly `border: 1px solid #EAEAEA`.
46
+ - Border-radius must be crisp: `8px` or `12px` maximum.
47
+ - Internal padding must be generous (e.g., `24px` to `40px`).
48
+ - Primary Call-To-Action (Buttons):
49
+ - Solid background `#111111`, text `#FFFFFF`.
50
+ - Slight border-radius (`4px` to `6px`). No box-shadow.
51
+ - Hover state should be a subtle color shift to `#333333` or a micro-scale `transform: scale(0.98)`.
52
+ - Tags & Status Badges:
53
+ - Pill-shaped (`border-radius: 9999px`), very small typography (`text-xs`), uppercase with wide tracking (`letter-spacing: 0.05em`).
54
+ - Background must use the defined Muted Pastels.
55
+ - Accordions (FAQ):
56
+ - Strip all container boxes. Separate items only with a `border-bottom: 1px solid #EAEAEA`.
57
+ - Use a clean, sharp `+` and `-` icon for the toggle state.
58
+ - Keystroke Micro-UIs:
59
+ - Render shortcuts as physical keys using `<kbd>` tags: `border: 1px solid #EAEAEA`, `border-radius: 4px`, `background: #F7F6F3`, using the Monospace font.
60
+ - Faux-OS Window Chrome:
61
+ - When mocking up software, wrap it in a minimalist container with a white top bar containing three small, light gray circles (replicating macOS window controls).
62
+
63
+ ## 6. Iconography & Imagery Directives
64
+ - System Icons: Use "Phosphor Icons (Bold or Fill weights)" or "Radix UI Icons" for a technical, slightly thicker-stroke aesthetic. Standardize stroke width across all icons.
65
+ - Illustrations: Monochromatic, rough continuous-line ink sketches on a white background, featuring a single offset geometric shape filled with a muted pastel color.
66
+ - Photography: Use high-quality, desaturated images with a warm tone. Apply subtle overlays (`opacity: 0.04` warm grain) to blend photos into the monochrome palette. Never use oversaturated stock photos. Use reliable placeholders like `https://picsum.photos/seed/{context}/1200/800` when real assets are unavailable.
67
+ - Hero & Section Backgrounds: Sections should not feel empty and flat. Use subtle full-width background imagery at very low opacity, soft radial light spots (`radial-gradient` with warm tones at `opacity: 0.03`), or minimal geometric line patterns to add depth without breaking the clean aesthetic.
68
+
69
+ ## 7. Subtle Motion & Micro-Animations
70
+ Motion should feel invisible — present but never distracting. The goal is quiet sophistication, not spectacle.
71
+ - Scroll Entry: Elements fade in gently as they enter the viewport. Use `translateY(12px)` + `opacity: 0` resolving over `600ms` with `cubic-bezier(0.16, 1, 0.3, 1)`. Use `IntersectionObserver`, never `window.addEventListener('scroll')`.
72
+ - Hover States: Cards lift with an ultra-subtle shadow shift (`box-shadow` transitioning from `0 0 0` to `0 2px 8px rgba(0,0,0,0.04)` over `200ms`). Buttons respond with `scale(0.98)` on `:active`.
73
+ - Staggered Reveals: Lists and grid items enter with a cascade delay (`animation-delay: calc(var(--index) * 80ms)`). Never mount everything at once.
74
+ - Background Ambient Motion: Optional. A single, very slow-moving radial gradient blob (`animation-duration: 20s+`, `opacity: 0.02-0.04`) drifting behind hero sections. Must be applied to a `position: fixed; pointer-events: none` layer. Never on scrolling containers.
75
+ - Performance: Animate exclusively via `transform` and `opacity`. No layout-triggering properties (`top`, `left`, `width`, `height`). Use `will-change: transform` sparingly and only on actively animating elements.
76
+
77
+ ## 8. Execution Protocol
78
+ When tasked with writing frontend code (HTML, React, Tailwind, Vue) or designing a layout:
79
+ 1. Establish the macro-whitespace first. Use massive vertical padding between sections (e.g., `py-24` or `py-32` in Tailwind).
80
+ 2. Constrain the main typography content width to `max-w-4xl` or `max-w-5xl`.
81
+ 3. Apply the custom typographic hierarchy and monochromatic color variables immediately.
82
+ 4. Ensure every card, divider, and border adheres strictly to the `1px solid #EAEAEA` rule.
83
+ 5. Add scroll-entry animations to all major content blocks.
84
+ 6. Ensure sections have visual depth through imagery, ambient gradients, or subtle textures — no empty flat backgrounds.
85
+ 7. Provide code that reflects this high-end, uncluttered, editorial aesthetic natively without requiring manual adjustments.