@grove-dev/astro 0.2.6 → 0.2.10

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 (100) hide show
  1. package/package.json +3 -3
  2. package/templates/default/.astro/content.d.ts +155 -0
  3. package/templates/default/.astro/settings.json +5 -0
  4. package/templates/default/.astro/types.d.ts +1 -0
  5. package/templates/default/dist/_astro/BaseLayout.Dz_HR-68.css +1 -0
  6. package/templates/default/dist/about/index.html +165 -0
  7. package/templates/default/dist/icons/platforms/android.svg +1 -0
  8. package/templates/default/dist/icons/platforms/apple-dark.svg +1 -0
  9. package/templates/default/dist/icons/platforms/apple-light.svg +1 -0
  10. package/templates/default/dist/icons/platforms/chrome.svg +1 -0
  11. package/templates/default/dist/icons/platforms/chromeos.svg +5 -0
  12. package/templates/default/dist/icons/platforms/desktop.svg +4 -0
  13. package/templates/default/dist/icons/platforms/embedded.svg +5 -0
  14. package/templates/default/dist/icons/platforms/ios.svg +1 -0
  15. package/templates/default/dist/icons/platforms/linux.svg +1 -0
  16. package/templates/default/dist/icons/platforms/macos.svg +1 -0
  17. package/templates/default/dist/icons/platforms/ubuntu.svg +1 -0
  18. package/templates/default/dist/icons/platforms/web.svg +5 -0
  19. package/templates/default/dist/icons/platforms/windows.svg +6 -0
  20. package/templates/default/dist/icons/stacks/android.svg +1 -0
  21. package/templates/default/dist/icons/stacks/apple-dark.svg +1 -0
  22. package/templates/default/dist/icons/stacks/apple-light.svg +1 -0
  23. package/templates/default/dist/icons/stacks/capacitor.svg +14 -0
  24. package/templates/default/dist/icons/stacks/dart.svg +1 -0
  25. package/templates/default/dist/icons/stacks/firebase.svg +1 -0
  26. package/templates/default/dist/icons/stacks/flutter.svg +1 -0
  27. package/templates/default/dist/icons/stacks/graphql.svg +1 -0
  28. package/templates/default/dist/icons/stacks/ionic.svg +4 -0
  29. package/templates/default/dist/icons/stacks/java.svg +1 -0
  30. package/templates/default/dist/icons/stacks/javascript.svg +1 -0
  31. package/templates/default/dist/icons/stacks/kotlin.svg +1 -0
  32. package/templates/default/dist/icons/stacks/mongodb.svg +1 -0
  33. package/templates/default/dist/icons/stacks/nodejs.svg +1 -0
  34. package/templates/default/dist/icons/stacks/python.svg +1 -0
  35. package/templates/default/dist/icons/stacks/react-native.svg +1 -0
  36. package/templates/default/dist/icons/stacks/react.svg +1 -0
  37. package/templates/default/dist/icons/stacks/rust.svg +1 -0
  38. package/templates/default/dist/icons/stacks/solidity.svg +1 -0
  39. package/templates/default/dist/icons/stacks/swift.svg +1 -0
  40. package/templates/default/dist/icons/stacks/tensorflow.svg +1 -0
  41. package/templates/default/dist/icons/stacks/typescript.svg +1 -0
  42. package/templates/default/dist/index.html +55 -0
  43. package/templates/default/dist/llms-full.txt +14 -0
  44. package/templates/default/dist/llms.txt +11 -0
  45. package/templates/default/dist/og-image.svg +48 -0
  46. package/templates/default/dist/projects/index.html +61 -0
  47. package/templates/default/dist/robots.txt +53 -0
  48. package/templates/default/dist/sitemap.xml +21 -0
  49. package/templates/default/dist/submit/index.html +69 -0
  50. package/templates/default/node_modules/.bin/astro +21 -0
  51. package/templates/default/node_modules/.bin/astro-check +21 -0
  52. package/templates/default/node_modules/.bin/grove +21 -0
  53. package/templates/default/node_modules/.bin/jiti +21 -0
  54. package/templates/default/node_modules/.bin/prettier +21 -0
  55. package/templates/default/node_modules/.bin/rollup +21 -0
  56. package/templates/default/node_modules/.bin/tsc +21 -0
  57. package/templates/default/node_modules/.bin/tsserver +21 -0
  58. package/templates/default/node_modules/.bin/tsx +21 -0
  59. package/templates/default/node_modules/.bin/vite +21 -0
  60. package/templates/default/node_modules/.bin/yaml +21 -0
  61. package/templates/default/node_modules/.vite/deps/_metadata.json +79 -0
  62. package/templates/default/node_modules/.vite/deps/astro-KRVZHBC5.js +433 -0
  63. package/templates/default/node_modules/.vite/deps/astro-KRVZHBC5.js.map +7 -0
  64. package/templates/default/node_modules/.vite/deps/astro___aria-query.js +5 -0
  65. package/templates/default/node_modules/.vite/deps/astro___aria-query.js.map +7 -0
  66. package/templates/default/node_modules/.vite/deps/astro___axobject-query.js +5 -0
  67. package/templates/default/node_modules/.vite/deps/astro___axobject-query.js.map +7 -0
  68. package/templates/default/node_modules/.vite/deps/astro___html-escaper.js +9 -0
  69. package/templates/default/node_modules/.vite/deps/astro___html-escaper.js.map +7 -0
  70. package/templates/default/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +241 -0
  71. package/templates/default/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +7 -0
  72. package/templates/default/node_modules/.vite/deps/audit-GYHQ3ITH.js +1592 -0
  73. package/templates/default/node_modules/.vite/deps/audit-GYHQ3ITH.js.map +7 -0
  74. package/templates/default/node_modules/.vite/deps/chunk-5WRI5ZAA.js +30 -0
  75. package/templates/default/node_modules/.vite/deps/chunk-5WRI5ZAA.js.map +7 -0
  76. package/templates/default/node_modules/.vite/deps/chunk-7P4KIK53.js +186 -0
  77. package/templates/default/node_modules/.vite/deps/chunk-7P4KIK53.js.map +7 -0
  78. package/templates/default/node_modules/.vite/deps/chunk-BQGHFQJH.js +48 -0
  79. package/templates/default/node_modules/.vite/deps/chunk-BQGHFQJH.js.map +7 -0
  80. package/templates/default/node_modules/.vite/deps/chunk-CJCDKWP2.js +6779 -0
  81. package/templates/default/node_modules/.vite/deps/chunk-CJCDKWP2.js.map +7 -0
  82. package/templates/default/node_modules/.vite/deps/chunk-FHJ3XBDE.js +33 -0
  83. package/templates/default/node_modules/.vite/deps/chunk-FHJ3XBDE.js.map +7 -0
  84. package/templates/default/node_modules/.vite/deps/chunk-FQEMNIUQ.js +88 -0
  85. package/templates/default/node_modules/.vite/deps/chunk-FQEMNIUQ.js.map +7 -0
  86. package/templates/default/node_modules/.vite/deps/chunk-HBSVDAQD.js +72 -0
  87. package/templates/default/node_modules/.vite/deps/chunk-HBSVDAQD.js.map +7 -0
  88. package/templates/default/node_modules/.vite/deps/chunk-HDOQ2U3U.js +3757 -0
  89. package/templates/default/node_modules/.vite/deps/chunk-HDOQ2U3U.js.map +7 -0
  90. package/templates/default/node_modules/.vite/deps/chunk-XEBKRCNE.js +54 -0
  91. package/templates/default/node_modules/.vite/deps/chunk-XEBKRCNE.js.map +7 -0
  92. package/templates/default/node_modules/.vite/deps/package.json +3 -0
  93. package/templates/default/node_modules/.vite/deps/settings-C5H4VHXU.js +213 -0
  94. package/templates/default/node_modules/.vite/deps/settings-C5H4VHXU.js.map +7 -0
  95. package/templates/default/node_modules/.vite/deps/toolbar-H5DB6HVP.js +525 -0
  96. package/templates/default/node_modules/.vite/deps/toolbar-H5DB6HVP.js.map +7 -0
  97. package/templates/default/node_modules/.vite/deps/ui-library-JGHU6JE2.js +1020 -0
  98. package/templates/default/node_modules/.vite/deps/ui-library-JGHU6JE2.js.map +7 -0
  99. package/templates/default/node_modules/.vite/deps/xray-EFCQOW4E.js +147 -0
  100. package/templates/default/node_modules/.vite/deps/xray-EFCQOW4E.js.map +7 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grove-dev/astro",
3
- "version": "0.2.6",
3
+ "version": "0.2.10",
4
4
  "type": "module",
5
5
  "description": "Astro framework adapter for Grove. Components, layouts, design tokens, and a default template.",
6
6
  "license": "MIT",
@@ -44,8 +44,8 @@
44
44
  },
45
45
  "dependencies": {
46
46
  "astro": "^6.4.6",
47
- "@grove-dev/core": "0.2.6",
48
- "@grove-dev/ui": "0.2.6"
47
+ "@grove-dev/core": "0.2.10",
48
+ "@grove-dev/ui": "0.2.10"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "astro": "^6.0.0"
@@ -0,0 +1,155 @@
1
+ declare module 'astro:content' {
2
+ export interface RenderResult {
3
+ Content: import('astro/runtime/server/index.js').AstroComponentFactory;
4
+ headings: import('astro').MarkdownHeading[];
5
+ remarkPluginFrontmatter: Record<string, any>;
6
+ }
7
+ interface Render {
8
+ '.md': Promise<RenderResult>;
9
+ }
10
+
11
+ export interface RenderedContent {
12
+ html: string;
13
+ metadata?: {
14
+ imagePaths: Array<string>;
15
+ [key: string]: unknown;
16
+ };
17
+ }
18
+
19
+ type Flatten<T> = T extends { [K: string]: infer U } ? U : never;
20
+
21
+ export type CollectionKey = keyof DataEntryMap;
22
+ export type CollectionEntry<C extends CollectionKey> = Flatten<DataEntryMap[C]>;
23
+
24
+ type AllValuesOf<T> = T extends any ? T[keyof T] : never;
25
+
26
+ export type ReferenceDataEntry<
27
+ C extends CollectionKey,
28
+ E extends keyof DataEntryMap[C] = string,
29
+ > = {
30
+ collection: C;
31
+ id: E;
32
+ };
33
+
34
+ export type ReferenceLiveEntry<C extends keyof LiveContentConfig['collections']> = {
35
+ collection: C;
36
+ id: string;
37
+ };
38
+
39
+ export function getCollection<C extends keyof DataEntryMap, E extends CollectionEntry<C>>(
40
+ collection: C,
41
+ filter?: (entry: CollectionEntry<C>) => entry is E,
42
+ ): Promise<E[]>;
43
+ export function getCollection<C extends keyof DataEntryMap>(
44
+ collection: C,
45
+ filter?: (entry: CollectionEntry<C>) => unknown,
46
+ ): Promise<CollectionEntry<C>[]>;
47
+
48
+ export function getLiveCollection<C extends keyof LiveContentConfig['collections']>(
49
+ collection: C,
50
+ filter?: LiveLoaderCollectionFilterType<C>,
51
+ ): Promise<
52
+ import('astro').LiveDataCollectionResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>
53
+ >;
54
+
55
+ export function getEntry<
56
+ C extends keyof DataEntryMap,
57
+ E extends keyof DataEntryMap[C] | (string & {}),
58
+ >(
59
+ entry: ReferenceDataEntry<C, E>,
60
+ ): E extends keyof DataEntryMap[C]
61
+ ? Promise<DataEntryMap[C][E]>
62
+ : Promise<CollectionEntry<C> | undefined>;
63
+ export function getEntry<
64
+ C extends keyof DataEntryMap,
65
+ E extends keyof DataEntryMap[C] | (string & {}),
66
+ >(
67
+ collection: C,
68
+ id: E,
69
+ ): E extends keyof DataEntryMap[C]
70
+ ? string extends keyof DataEntryMap[C]
71
+ ? Promise<DataEntryMap[C][E]> | undefined
72
+ : Promise<DataEntryMap[C][E]>
73
+ : Promise<CollectionEntry<C> | undefined>;
74
+ export function getLiveEntry<C extends keyof LiveContentConfig['collections']>(
75
+ collection: C,
76
+ filter: string | LiveLoaderEntryFilterType<C>,
77
+ ): Promise<import('astro').LiveDataEntryResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>>;
78
+
79
+ /** Resolve an array of entry references from the same collection */
80
+ export function getEntries<C extends keyof DataEntryMap>(
81
+ entries: ReferenceDataEntry<C, keyof DataEntryMap[C]>[],
82
+ ): Promise<CollectionEntry<C>[]>;
83
+
84
+ export function render<C extends keyof DataEntryMap>(
85
+ entry: DataEntryMap[C][string],
86
+ ): Promise<RenderResult>;
87
+
88
+ export function reference<
89
+ C extends
90
+ | keyof DataEntryMap
91
+ // Allow generic `string` to avoid excessive type errors in the config
92
+ // if `dev` is not running to update as you edit.
93
+ // Invalid collection names will be caught at build time.
94
+ | (string & {}),
95
+ >(
96
+ collection: C,
97
+ ): import('astro/zod').ZodPipe<
98
+ import('astro/zod').ZodString,
99
+ import('astro/zod').ZodTransform<
100
+ C extends keyof DataEntryMap
101
+ ? {
102
+ collection: C;
103
+ id: string;
104
+ }
105
+ : never,
106
+ string
107
+ >
108
+ >;
109
+
110
+ type ReturnTypeOrOriginal<T> = T extends (...args: any[]) => infer R ? R : T;
111
+ type InferEntrySchema<C extends keyof DataEntryMap> = import('astro/zod').infer<
112
+ ReturnTypeOrOriginal<Required<ContentConfig['collections'][C]>['schema']>
113
+ >;
114
+ type ExtractLoaderConfig<T> = T extends { loader: infer L } ? L : never;
115
+ type InferLoaderSchema<
116
+ C extends keyof DataEntryMap,
117
+ L = ExtractLoaderConfig<ContentConfig['collections'][C]>,
118
+ > = L extends { schema: import('astro/zod').ZodSchema }
119
+ ? import('astro/zod').infer<L['schema']>
120
+ : any;
121
+
122
+ type DataEntryMap = {
123
+
124
+ };
125
+
126
+ type ExtractLoaderTypes<T> = T extends import('astro/loaders').LiveLoader<
127
+ infer TData,
128
+ infer TEntryFilter,
129
+ infer TCollectionFilter,
130
+ infer TError
131
+ >
132
+ ? { data: TData; entryFilter: TEntryFilter; collectionFilter: TCollectionFilter; error: TError }
133
+ : { data: never; entryFilter: never; collectionFilter: never; error: never };
134
+ type ExtractEntryFilterType<T> = ExtractLoaderTypes<T>['entryFilter'];
135
+ type ExtractCollectionFilterType<T> = ExtractLoaderTypes<T>['collectionFilter'];
136
+ type ExtractErrorType<T> = ExtractLoaderTypes<T>['error'];
137
+ type ExtractDataType<T> = ExtractLoaderTypes<T>['data'];
138
+
139
+ type LiveLoaderDataType<C extends keyof LiveContentConfig['collections']> =
140
+ LiveContentConfig['collections'][C]['schema'] extends undefined
141
+ ? ExtractDataType<LiveContentConfig['collections'][C]['loader']>
142
+ : import('astro/zod').infer<
143
+ Exclude<LiveContentConfig['collections'][C]['schema'], undefined>
144
+ >;
145
+ type LiveLoaderEntryFilterType<C extends keyof LiveContentConfig['collections']> =
146
+ ExtractEntryFilterType<LiveContentConfig['collections'][C]['loader']>;
147
+ type LiveLoaderCollectionFilterType<C extends keyof LiveContentConfig['collections']> =
148
+ ExtractCollectionFilterType<LiveContentConfig['collections'][C]['loader']>;
149
+ type LiveLoaderErrorType<C extends keyof LiveContentConfig['collections']> = ExtractErrorType<
150
+ LiveContentConfig['collections'][C]['loader']
151
+ >;
152
+
153
+ export type ContentConfig = never;
154
+ export type LiveContentConfig = never;
155
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "_variables": {
3
+ "lastUpdateCheck": 1781103180236
4
+ }
5
+ }
@@ -0,0 +1 @@
1
+ /// <reference types="astro/client" />
@@ -0,0 +1 @@
1
+ @theme{ --color-ink-50: hsl(224, 19%, 97%); --color-ink-100: hsl(224, 20%, 94%); --color-ink-200: hsl(224, 6%, 77%); --color-ink-300: hsl(224, 6%, 56%); --color-ink-400: hsl(224, 6%, 56%); --color-ink-500: hsl(224, 7%, 36%); --color-ink-600: hsl(224, 10%, 23%); --color-ink-700: hsl(224, 10%, 23%); --color-ink-800: hsl(224, 14%, 16%); --color-ink-900: hsl(224, 10%, 10%); --color-ink-950: hsl(224, 10%, 10%); --color-accent: hsl(234, 90%, 60%); --color-accent-muted: hsl(234, 88%, 90%); --color-emerald-50: hsl(101, 85%, 90%); --color-emerald-300: hsl(101, 82%, 63%); --color-emerald-400: hsl(101, 90%, 46%); --color-emerald-700: hsl(101, 80%, 22%); --color-emerald-800: hsl(101, 80%, 22%); --color-emerald-950: hsl(101, 39%, 22%); --color-orange-50: hsl(41, 90%, 88%); --color-orange-300: hsl(41, 82%, 63%); --color-orange-400: hsl(41, 90%, 60%); --color-orange-700: hsl(41, 80%, 25%); --color-orange-800: hsl(41, 80%, 25%); --color-orange-950: hsl(41, 39%, 22%); --color-blue-50: hsl(234, 88%, 90%); --color-blue-300: hsl(234, 100%, 87%); --color-blue-400: hsl(234, 90%, 60%); --color-blue-700: hsl(234, 80%, 30%); --color-blue-800: hsl(234, 80%, 30%); --color-blue-950: hsl(234, 54%, 20%); --color-amber-50: hsl(41, 90%, 88%); --color-amber-300: hsl(41, 82%, 63%); --color-amber-400: hsl(41, 90%, 60%); --color-amber-700: hsl(41, 80%, 25%); --color-amber-800: hsl(41, 80%, 25%); --color-amber-950: hsl(41, 39%, 22%); --font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; --text-2xs: .6875rem; --text-2xs--line-height: 1rem; --container-container: 1140px; --container-wide: 1400px; --container-narrow: 720px; --radius: .375rem; --radius-lg: .5rem; --radius-xl: .75rem; --animate-fade-in-up: fade-in-up .6s ease-out both; --animate-fade-in: fade-in .8s ease-out both; --animate-gradient-shift: gradient-shift 8s ease-in-out infinite; --animate-subtle-bob: subtle-bob 3s ease-in-out infinite; }@keyframes fade-in-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes gradient-shift{0%,to{background-position:0% 50%}50%{background-position:100% 50%}}@keyframes subtle-bob{0%,to{transform:translateY(0)}50%{transform:translateY(-2px)}}@layer base{:root{--color-ink-50: hsl(224, 19%, 97%);--color-ink-100: hsl(224, 20%, 94%);--color-ink-200: hsl(224, 6%, 77%);--color-ink-300: hsl(224, 6%, 56%);--color-ink-400: hsl(224, 6%, 56%);--color-ink-500: hsl(224, 7%, 36%);--color-ink-600: hsl(224, 10%, 23%);--color-ink-700: hsl(224, 10%, 23%);--color-ink-800: hsl(224, 14%, 16%);--color-ink-900: hsl(224, 10%, 10%);--color-ink-950: hsl(224, 10%, 10%);--color-accent: hsl(234, 90%, 60%);--color-accent-muted: hsl(234, 88%, 90%);--color-emerald-50: hsl(101, 85%, 90%);--color-emerald-300: hsl(101, 82%, 63%);--color-emerald-400: hsl(101, 90%, 46%);--color-emerald-700: hsl(101, 80%, 22%);--color-emerald-800: hsl(101, 80%, 22%);--color-emerald-950: hsl(101, 39%, 22%);--color-orange-50: hsl(41, 90%, 88%);--color-orange-300: hsl(41, 82%, 63%);--color-orange-400: hsl(41, 90%, 60%);--color-orange-700: hsl(41, 80%, 25%);--color-orange-800: hsl(41, 80%, 25%);--color-orange-950: hsl(41, 39%, 22%);--color-blue-50: hsl(234, 88%, 90%);--color-blue-300: hsl(234, 100%, 87%);--color-blue-400: hsl(234, 90%, 60%);--color-blue-700: hsl(234, 80%, 30%);--color-blue-800: hsl(234, 80%, 30%);--color-blue-950: hsl(234, 54%, 20%);--color-amber-50: hsl(41, 90%, 88%);--color-amber-300: hsl(41, 82%, 63%);--color-amber-400: hsl(41, 90%, 60%);--color-amber-700: hsl(41, 80%, 25%);--color-amber-800: hsl(41, 80%, 25%);--color-amber-950: hsl(41, 39%, 22%);--font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--text-2xs: .6875rem;--text-2xs--line-height: 1rem;--radius: .375rem;--radius-lg: .5rem;--radius-xl: .75rem;--sl-color-white: hsl(0, 0%, 100%);--sl-color-gray-1: hsl(224, 20%, 94%);--sl-color-gray-2: hsl(224, 6%, 77%);--sl-color-gray-3: hsl(224, 6%, 56%);--sl-color-gray-4: hsl(224, 7%, 36%);--sl-color-gray-5: hsl(224, 10%, 23%);--sl-color-gray-6: hsl(224, 14%, 16%);--sl-color-black: hsl(224, 10%, 10%);--sl-hue-orange: 41;--sl-hue-green: 101;--sl-hue-blue: 234;--sl-hue-purple: 281;--sl-hue-red: 339;--sl-color-orange-low: hsl(var(--sl-hue-orange), 39%, 22%);--sl-color-orange: hsl(var(--sl-hue-orange), 82%, 63%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 82%, 87%);--sl-color-green-low: hsl(var(--sl-hue-green), 39%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 82%, 63%);--sl-color-green-high: hsl(var(--sl-hue-green), 82%, 80%);--sl-color-blue-low: hsl(var(--sl-hue-blue), 54%, 20%);--sl-color-blue: hsl(var(--sl-hue-blue), 100%, 60%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 100%, 87%);--sl-color-purple-low: hsl(var(--sl-hue-purple), 39%, 22%);--sl-color-purple: hsl(var(--sl-hue-purple), 82%, 63%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 82%, 89%);--sl-color-red-low: hsl(var(--sl-hue-red), 39%, 22%);--sl-color-red: hsl(var(--sl-hue-red), 82%, 63%);--sl-color-red-high: hsl(var(--sl-hue-red), 82%, 87%);--sl-color-accent-low: hsl(224, 54%, 20%);--sl-color-accent: hsl(224, 100%, 60%);--sl-color-accent-high: hsl(224, 100%, 85%);--sl-color-text: var(--sl-color-gray-2);--sl-color-bg: var(--sl-color-black);--sl-color-bg-inline-code: var(--sl-color-gray-5);--sl-color-hairline: var(--sl-color-gray-6);--sl-font-system: var(--font-sans);--sl-font-system-mono: var(--font-mono);color-scheme:light dark}:root:not(.dark){--sl-color-white: hsl(224, 10%, 10%);--sl-color-gray-1: hsl(224, 14%, 16%);--sl-color-gray-2: hsl(224, 10%, 23%);--sl-color-gray-3: hsl(224, 7%, 36%);--sl-color-gray-4: hsl(224, 6%, 56%);--sl-color-gray-5: hsl(224, 6%, 77%);--sl-color-gray-6: hsl(224, 20%, 94%);--sl-color-gray-7: hsl(224, 19%, 97%);--sl-color-black: hsl(0, 0%, 100%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 80%, 25%);--sl-color-orange: hsl(var(--sl-hue-orange), 90%, 60%);--sl-color-orange-low: hsl(var(--sl-hue-orange), 90%, 88%);--sl-color-green-high: hsl(var(--sl-hue-green), 80%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 90%, 46%);--sl-color-green-low: hsl(var(--sl-hue-green), 85%, 90%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 80%, 30%);--sl-color-blue: hsl(var(--sl-hue-blue), 90%, 60%);--sl-color-blue-low: hsl(var(--sl-hue-blue), 88%, 90%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 90%, 30%);--sl-color-purple: hsl(var(--sl-hue-purple), 90%, 60%);--sl-color-purple-low: hsl(var(--sl-hue-purple), 80%, 90%);--sl-color-red-high: hsl(var(--sl-hue-red), 80%, 30%);--sl-color-red: hsl(var(--sl-hue-red), 90%, 60%);--sl-color-red-low: hsl(var(--sl-hue-red), 80%, 90%);--sl-color-accent-high: hsl(234, 80%, 30%);--sl-color-accent: hsl(234, 90%, 60%);--sl-color-accent-low: hsl(234, 88%, 90%);--sl-color-text: var(--sl-color-gray-2);--sl-color-bg: var(--sl-color-black);--sl-color-bg-inline-code: var(--sl-color-gray-6);--sl-color-hairline: var(--sl-color-gray-6)}html{-webkit-text-size-adjust:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;background:var(--sl-color-bg);color:var(--sl-color-text);font-family:var(--sl-font-system);font-size:15px;line-height:1.75}.dark body{background:var(--sl-color-bg);color:var(--sl-color-text)}a{color:inherit;text-decoration:none}::selection{background:var(--color-ink-200);color:var(--color-ink-900)}.dark ::selection{background:var(--color-ink-800);color:var(--color-ink-100)}*{scrollbar-width:thin;scrollbar-color:var(--color-ink-300) transparent}*::-webkit-scrollbar{width:8px;height:8px}*::-webkit-scrollbar-thumb{background:var(--color-ink-200);border-radius:4px}.dark *::-webkit-scrollbar-thumb{background:var(--color-ink-800)}input,select,textarea,button{font:inherit}}@layer components{.grove-section{padding-top:3rem;padding-bottom:3rem}@media(min-width:640px){.grove-section{padding-top:4rem;padding-bottom:4rem}}.grove-section-tight{padding-top:2.5rem;padding-bottom:2.5rem}@media(min-width:640px){.grove-section-tight{padding-top:3rem;padding-bottom:3rem}}.grove-card{border:1px solid var(--color-ink-200);background:var(--sl-color-bg);border-radius:var(--radius-lg);transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}.dark .grove-card{border-color:var(--sl-color-hairline);background:var(--sl-color-bg)}.grove-card-hover:hover{border-color:var(--color-ink-300);background:#f4f4f599;box-shadow:0 1px 2px #0000000a,0 4px 12px -2px #0000000f}.dark .grove-card-hover:hover{border-color:var(--color-ink-700);background:#18181b66;box-shadow:0 1px 2px #0006,0 4px 12px -2px #0000004d}.grove-badge{display:inline-flex;align-items:center;gap:.25rem;border-radius:.25rem;border:1px solid var(--color-ink-200);background:var(--color-ink-50);padding:.125rem .375rem;font-size:var(--text-2xs);line-height:var(--text-2xs--line-height);font-weight:500;color:var(--color-ink-700)}.dark .grove-badge{border-color:var(--color-ink-800);background:#18181b99;color:var(--color-ink-300)}.grove-badge-accent{border-color:var(--color-ink-900);background:var(--color-ink-900);color:#fff}.dark .grove-badge-accent{border-color:var(--color-ink-100);background:var(--color-ink-100);color:var(--color-ink-900)}.grove-badge-new{border-color:#6ee7b799;background:var(--color-emerald-50);color:var(--color-emerald-800)}.dark .grove-badge-new{border-color:#065f4699;background:#022c2266;color:var(--color-emerald-300)}.grove-badge-hot{border-color:#fdba7499;background:var(--color-orange-50);color:var(--color-orange-800)}.dark .grove-badge-hot{border-color:#9a341299;background:#43140766;color:var(--color-orange-300)}.grove-badge-mature{border-color:#93c5fd99;background:var(--color-blue-50);color:var(--color-blue-800)}.dark .grove-badge-mature{border-color:#1e40af99;background:#17255466;color:var(--color-blue-300)}.grove-badge-stale{border-color:#fcd34d99;background:var(--color-amber-50);color:var(--color-amber-800)}.dark .grove-badge-stale{border-color:#92400e99;background:#451a0366;color:var(--color-amber-300)}.grove-btn{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;border-radius:var(--radius);border:1px solid transparent;padding:.375rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition:color .15s ease,background-color .15s ease,border-color .15s ease;text-decoration:none;cursor:pointer}.grove-btn-ghost{color:var(--color-ink-700)}.grove-btn-ghost:hover{background:var(--color-ink-100)}.dark .grove-btn-ghost{color:var(--color-ink-300)}.dark .grove-btn-ghost:hover{background:var(--color-ink-900)}.grove-btn-outline{border-color:var(--color-ink-200);background:var(--sl-color-bg);color:var(--color-ink-900)}.grove-btn-outline:hover{border-color:var(--color-ink-300);background:var(--color-ink-50)}.dark .grove-btn-outline{border-color:var(--color-ink-800);background:var(--color-ink-950);color:var(--color-ink-100)}.dark .grove-btn-outline:hover{border-color:var(--color-ink-700);background:#18181b66}.grove-btn-primary{border-color:var(--color-ink-900);background:var(--color-ink-900);color:#fff}.grove-btn-primary:hover{background:var(--color-ink-800)}.dark .grove-btn-primary{border-color:var(--color-ink-100);background:var(--color-ink-100);color:var(--color-ink-900)}.dark .grove-btn-primary:hover{background:#fff}}
@@ -0,0 +1,165 @@
1
+ <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="Astro v6.4.5"><meta name="theme-color" content="#0a0a0c" media="(prefers-color-scheme: dark)"><meta name="theme-color" content="#fafafa" media="(prefers-color-scheme: light)"><link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%2318181b'/%3E%3C/svg%3E"><link rel="sitemap" href="/sitemap.xml"><link rel="alternate" type="text/plain" href="/llms.txt" title="LLM usage guidance"><!-- Primary meta --><title>About — Grove Directory</title><meta name="description" content="About Grove Directory — A curated, health-aware developer directory."><link rel="canonical" href="https://example.com/about/"><!-- Open Graph --><meta property="og:type" content="website"><meta property="og:url" content="https://example.com/about/"><meta property="og:title" content="About — Grove Directory"><meta property="og:description" content="About Grove Directory — A curated, health-aware developer directory."><meta property="og:image" content="https://example.com/og-image.svg"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta property="og:image:alt" content="Grove Directory — A curated, health-aware developer directory powered by Grove."><meta property="og:site_name" content="Grove Directory"><meta property="og:locale" content="en"><!-- Twitter Card --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="About — Grove Directory"><meta name="twitter:description" content="About Grove Directory — A curated, health-aware developer directory."><meta name="twitter:image" content="https://example.com/og-image.svg"><meta name="twitter:image:alt" content="Grove Directory — A curated, health-aware developer directory powered by Grove."><!-- JSON-LD: site-wide identity --><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"Grove Directory","description":"A curated, health-aware developer directory powered by Grove.","url":"https://example.com","inLanguage":"en","potentialAction":{"@type":"SearchAction","target":"https://example.com/projects?q={search_term_string}","query-input":"required name=search_term_string"}}</script><script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Grove Directory","url":"https://example.com","logo":"https://example.com/og-image.svg","sameAs":["https://github.com/tortuvshin/grove"]}</script><!-- JSON-LD: per-page (SoftwareSourceCode for [slug], etc.) --><script>
2
+ // THEME_INIT — runs before paint so the user never sees a
3
+ // flash of the wrong theme. State is persisted in localStorage
4
+ // under the key "grove-theme" (matching ThemeToggle.astro).
5
+ (function () {
6
+ var STORAGE_KEY = "grove-theme";
7
+ function getMode() {
8
+ try {
9
+ var stored = localStorage.getItem(STORAGE_KEY);
10
+ if (stored === "light" || stored === "dark" || stored === "system")
11
+ return stored;
12
+ } catch (e) {
13
+ // localStorage may be blocked (private mode, etc.) —
14
+ // fall through to the system default.
15
+ }
16
+ return "system";
17
+ }
18
+ function apply(mode) {
19
+ var resolved =
20
+ mode === "system"
21
+ ? (window.matchMedia("(prefers-color-scheme: dark)").matches
22
+ ? "dark"
23
+ : "light")
24
+ : mode;
25
+ var root = document.documentElement;
26
+ if (resolved === "dark") root.classList.add("dark");
27
+ else root.classList.remove("dark");
28
+ root.dataset.theme = mode;
29
+ root.dataset.resolvedTheme = resolved;
30
+ }
31
+ apply(getMode());
32
+ window.addEventListener("theme:set", function (e) {
33
+ apply(e.detail);
34
+ });
35
+ var mq = window.matchMedia("(prefers-color-scheme: dark)");
36
+ mq.addEventListener("change", function () {
37
+ if (getMode() === "system") apply("system");
38
+ });
39
+ })();
40
+ </script><link rel="stylesheet" href="/_astro/BaseLayout.Dz_HR-68.css">
41
+ <style>.grove-container[data-astro-cid-nj4gdmks]{max-width:var(--container-container, 1140px)}.grove-container-wide[data-astro-cid-nj4gdmks]{max-width:var(--container-wide, 1400px)}.grove-container-narrow[data-astro-cid-nj4gdmks]{max-width:var(--container-narrow, 720px)}
42
+ </style></head> <body class="min-h-screen bg-white text-ink-900 dark:bg-ink-950 dark:text-ink-100"> <header class="sticky top-0 z-50 border-b border-ink-200 bg-white/85 backdrop-blur dark:border-ink-800 dark:bg-ink-950/85"> <div class="mx-auto flex max-w-wide items-center gap-6 px-5 py-3 sm:px-7" style="max-width: var(--container-wide, 1400px);"> <a href="/" class="inline-flex items-center gap-2 text-[0.95rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100"> <span aria-hidden="true" class="inline-block h-[18px] w-[18px] rounded bg-ink-900 dark:bg-ink-100"></span> <span>Grove Directory</span> </a> <nav class="hidden flex-1 md:block" aria-label="Primary"> <ul class="m-0 flex list-none gap-5 p-0"> <li> <a href="/" class="text-[0.875rem] font-medium text-ink-500 transition-colors hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> Home </a> </li><li> <a href="/projects" class="text-[0.875rem] font-medium text-ink-500 transition-colors hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> Browse </a> </li><li> <a href="/about" class="text-[0.875rem] font-medium text-ink-500 transition-colors hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> About </a> </li> </ul> </nav> <div class="ml-auto flex items-center gap-2"> <a href="https://github.com/tortuvshin/grove" target="_blank" rel="noopener noreferrer" aria-label="Star" title="Star" class="grove-btn grove-btn-outline"> <svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true" fill="currentColor"> <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38v-1.33c-2.22.48-2.69-1.07-2.69-1.07-.36-.92-.89-1.17-.89-1.17-.73-.5.05-.49.05-.49.8.06 1.23.83 1.23.83.72 1.22 1.87.87 2.33.67.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48v2.19c0 .21.15.46.55.38A8 8 0 0 0 8 0Z"></path> </svg> <span>Star</span> </a> <button type="button" data-theme-toggle aria-label="Toggle theme" title="Toggle theme" class="relative inline-flex h-8 w-8 items-center justify-center rounded-md border border-ink-200 bg-white text-ink-700 transition-colors hover:border-ink-300 hover:bg-ink-50 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-200 dark:hover:border-ink-700 dark:hover:bg-ink-900/40"> <svg class="hidden h-4 w-4 dark:block" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <circle cx="12" cy="12" r="4"></circle> <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"></path> </svg> <svg class="block h-4 w-4 dark:hidden" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z"></path> </svg> </button> <script type="module">const c="grove-theme";function o(){try{const e=localStorage.getItem(c);return e==="light"||e==="dark"||e==="system"?e:"system"}catch{return"system"}}function s(){const e=["light","dark","system"],n=o(),r=e[(e.indexOf(n)+1)%e.length];try{localStorage.setItem(c,r)}catch{}return window.dispatchEvent(new CustomEvent("theme:set",{detail:r})),r}function t(e){e.title=`Theme: ${o()} (click to switch)`}document.querySelectorAll("[data-theme-toggle]").forEach(e=>{t(e),e.addEventListener("click",()=>{s(),t(e)}),e.addEventListener("mouseenter",()=>t(e)),e.addEventListener("focus",()=>t(e))});</script> </div> </div> </header> <script type="module">document.addEventListener("click",t=>{if(t.defaultPrevented||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.button!==0)return;const r=t.target.closest('a[href^="#"]');if(!r)return;const e=r.getAttribute("href");if(e.length<=1)return;const n=document.querySelector(e);n&&(t.preventDefault(),n.scrollIntoView({behavior:"smooth",block:"start"}),history.replaceState(null,"",e))});</script> <main> <div class="mx-auto grove-container px-5 sm:px-7" data-astro-cid-nj4gdmks> <article class="py-12 sm:py-16"> <span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
43
+ About
44
+ </span> <h1 class="mt-1 text-[1.75rem] sm:text-[2.25rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100 m-0">
45
+ About Grove Directory </h1> <p class="mt-4 max-w-[62ch] text-base text-ink-700 dark:text-ink-200 m-0"> Grove Directory is a community knowledge site built with <a href="https://github.com/tortuvshin/grove" target="_blank" rel="noopener noreferrer" class="text-ink-900 underline hover:text-ink-700 dark:text-ink-100 dark:hover:text-white">
46
+ Grove
47
+ </a>
48
+ — an open-source framework for growing useful structured knowledge.
49
+ </p> </article> </div> <section class="grove-section"> <div class="grove-container-narrow mx-auto px-5 sm:px-7"> <header class="mb-6 flex flex-col gap-2"> <h2 class="m-0 text-[1.5rem] sm:text-[1.625rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100"> Why this exists </h2> <p class="m-0 text-[0.9375rem] text-ink-500 dark:text-ink-400"> Three principles guide what gets listed and how it&#39;s surfaced. </p> </header> <ol class="m-0 flex list-none flex-col gap-5 p-0"> <li class="flex gap-4"> <span aria-hidden="true" class="flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-md border border-ink-200 bg-ink-50 font-mono text-2xs text-ink-500 dark:border-ink-800 dark:bg-ink-900 dark:text-ink-400">
50
+ 01 </span> <div> <h3 class="m-0 text-[1rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100"> Curated, not scraped </h3> <p class="m-0 mt-1 text-[0.9375rem] leading-relaxed text-ink-500 dark:text-ink-400"> Every entry is hand-checked. If something here, it&#39;s because someone looked at the source, ran the build, and decided it was worth your time. </p> </div> </li><li class="flex gap-4"> <span aria-hidden="true" class="flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-md border border-ink-200 bg-ink-50 font-mono text-2xs text-ink-500 dark:border-ink-800 dark:bg-ink-900 dark:text-ink-400">
51
+ 02 </span> <div> <h3 class="m-0 text-[1rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100"> Plain text all the way down </h3> <p class="m-0 mt-1 text-[0.9375rem] leading-relaxed text-ink-500 dark:text-ink-400"> Records live in plain YAML, content in plain Markdown, and the static output in plain HTML. No database, no JavaScript framework, no CDN with sticky sessions. </p> </div> </li><li class="flex gap-4"> <span aria-hidden="true" class="flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-md border border-ink-200 bg-ink-50 font-mono text-2xs text-ink-500 dark:border-ink-800 dark:bg-ink-900 dark:text-ink-400">
52
+ 03 </span> <div> <h3 class="m-0 text-[1rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100"> Free to fork, free to extend </h3> <p class="m-0 mt-1 text-[0.9375rem] leading-relaxed text-ink-500 dark:text-ink-400"> This whole site is one repo. If you want your own copy, fork it. If you want to add a record, open a PR. The directory is the community. </p> </div> </li> </ol> </div> </section> <div class="mx-auto grove-container px-5 sm:px-7" data-astro-cid-nj4gdmks> <section class="py-12 sm:py-16" aria-labelledby="methodology-heading"> <span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
53
+ Methodology
54
+ </span> <h2 id="methodology-heading" class="mt-1 text-[1.5rem] sm:text-[1.75rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100 m-0">
55
+ How records are picked, scored, and surfaced
56
+ </h2> <p class="mt-3 max-w-[62ch] text-sm text-ink-500 dark:text-ink-400 m-0">
57
+ The full editorial + scoring methodology lives in
58
+ <code class="font-mono text-ink-900 dark:text-ink-100">content/pages/methodology.md</code>.
59
+ Below is the rendered source so reviewers can audit the criteria.
60
+ </p> <pre class="mt-6 overflow-x-auto rounded-md border border-ink-200 bg-ink-50 p-4 text-xs leading-relaxed text-ink-800 dark:border-ink-800 dark:bg-ink-900/60 dark:text-ink-200"><code>---
61
+ title: &quot;Methodology&quot;
62
+ description: &quot;How records are picked, scored, and surfaced in this directory.&quot;
63
+ ---
64
+
65
+ # Methodology
66
+
67
+ This page describes how entries in the directory are chosen, how the
68
+ curation signals are computed, and what we do (and don&#39;t) promise about
69
+ the data. The intent is to make the directory&#39;s logic auditable — every
70
+ number on a detail page is reproducible from the record&#39;s YAML.
71
+
72
+ ## Selection
73
+
74
+ A record is included if it is:
75
+
76
+ 1. **Open source.** Source is public under an OSI-approved license
77
+ (or public-domain dedication).
78
+ 2. **Actively maintained.** A pushed commit within the last 18 months
79
+ OR a declared maintenance status of `maintained` / `passive`.
80
+ 3. **Useful to a curious developer.** A working build, a real user
81
+ base (or a credible path to one), and a clear description of what
82
+ the project does.
83
+
84
+ We exclude: abandoned experiments, vapourware, projects whose entire
85
+ purpose is to sell a hosted plan, and any record that has not been
86
+ hand-checked by a maintainer.
87
+
88
+ ## Curation labels
89
+
90
+ The `curation.labels` field is a small, hand-set list. The supported
91
+ labels are:
92
+
93
+ - `hot` — high recent activity or attention (≥ 1 000 stars or a
94
+ commit within the last 30 days).
95
+ - `new` — added to the directory in the last 7 days.
96
+ - `mature` — long-running curated project, pushed &gt; 365 days ago,
97
+ but still maintained.
98
+ - `featured` — editor&#39;s pick for the front page.
99
+ - `needs-review` — open submission awaiting a second maintainer
100
+ look.
101
+
102
+ These labels are mutually additive, not exclusive. A `new` record
103
+ can also be `hot`; a `mature` record can also be `featured`.
104
+
105
+ ## Scoring
106
+
107
+ The detail page surfaces a five-dimension score block. The five
108
+ dimensions are:
109
+
110
+ - **Documentation** — is the README / docs site enough to onboard
111
+ without reading the source?
112
+ - **Onboarding** — install in &lt; 5 min, first useful result in &lt; 1 h.
113
+ - **Maintenance** — recent commits, issue close rate, release cadence.
114
+ - **Community** — issues answered, discussions active, contributors
115
+ per release.
116
+ - **Production-readiness** — CI, tests, security policy, releases
117
+ with semver.
118
+
119
+ Each dimension is scored 0-5. The overall score on the detail page
120
+ is the mean. Scores are stored on the record, not computed at build
121
+ time, so we can deliberately disagree with the raw signals (a 1-line
122
+ toy that happens to be wildly popular can still score low on
123
+ documentation).
124
+
125
+ ## Health signals
126
+
127
+ The `health` block on each record tracks four state machines:
128
+
129
+ - `status` — `healthy` / `slowing` / `stale` / `archived`.
130
+ - `tier` — `curated` / `community` / `experimental`.
131
+ - `issue_close_rate` — moving 90-day average.
132
+ - `last_release` — most recent semver tag.
133
+
134
+ A record&#39;s `status` transitions are time-boxed: a project with no
135
+ commits in 365 days flips from `slowing` to `stale`; 730 days flips
136
+ to `archived`. The transition is mechanical; the recovery is
137
+ manual (a maintainer sets `tier` back to `community` after review).
138
+
139
+ ## Lenses
140
+
141
+ The directory&#39;s home page surfaces three curated lenses:
142
+
143
+ - **Hot** — `curation.labels` includes `hot`, OR `github.stars` ≥
144
+ 1 000, OR `pushedAt` within 30 days.
145
+ - **New** — `pushedAt` within 7 days, OR `curation.labels` includes
146
+ `new`.
147
+ - **Mature** — `health.tier === &quot;curated&quot;` AND `pushedAt` &gt; 365 days
148
+ ago.
149
+
150
+ Each lens caps at 6 items on the home page; the full filtered list
151
+ is reachable via the lens tab on `/projects`.
152
+
153
+ ## What we don&#39;t promise
154
+
155
+ - **Real-time data.** The site is rebuilt on a schedule, not on
156
+ every push. Counts and dates can lag by up to one build cycle.
157
+ - **Verdict-free scores.** A high overall score means &quot;useful to a
158
+ curious developer&quot;, not &quot;best in class&quot; — judgement calls are
159
+ documented per record, not baked into the score.
160
+ - **Causal claims.** The &quot;best for&quot; / &quot;why listed&quot; / &quot;caveats&quot;
161
+ blocks are editorial notes, not derived signals. They reflect
162
+ what a maintainer thought at review time.
163
+ </code></pre> </section> </div> </main> <footer class="mt-16 border-t border-ink-200 bg-white text-ink-500 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-400"> <div class="mx-auto grid max-w-wide grid-cols-2 gap-8 px-5 py-12 md:grid-cols-4 sm:px-7" style="max-width: var(--container-wide, 1400px);"> <div class="col-span-2 md:col-span-1"> <div class="mb-2 inline-flex items-center gap-2 text-[0.95rem] font-semibold text-ink-900 dark:text-ink-100"> <span aria-hidden="true" class="inline-block h-3.5 w-3.5 rounded bg-ink-900 dark:bg-ink-100"></span> <span>Grove Directory</span> </div> <p class="m-0 max-w-[36ch] text-[0.8125rem] leading-relaxed text-ink-500 dark:text-ink-400"> A curated, health-aware developer directory. </p> </div> <div> <h4 class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"> Discover </h4> <ul class="m-0 flex list-none flex-col gap-2 p-0"> <li> <a href="https://github.com/tortuvshin/grove" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Source on GitHub </a> </li><li> <a href="https://github.com/tortuvshin/grove/releases" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Latest release </a> </li> </ul> </div> <div> <h4 class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"> Contribute </h4> <ul class="m-0 flex list-none flex-col gap-2 p-0"> <li> <a href="https://github.com/tortuvshin/grove/blob/main/CONTRIBUTING.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Submit via GitHub </a> </li><li> <a href="https://github.com/tortuvshin/grove/issues" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Report an issue </a> </li><li> <a href="https://github.com/tortuvshin/grove/blob/main/CONTRIBUTING.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Contributing guide </a> </li> </ul> </div> <div> <h4 class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"> Project </h4> <ul class="m-0 flex list-none flex-col gap-2 p-0"> <li> <a href="https://github.com/tortuvshin/grove/blob/main/README.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> README </a> </li><li> <a href="https://github.com/tortuvshin/grove/blob/main/CHANGELOG.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Changelog </a> </li> </ul> </div> </div> <div class="border-t border-ink-200 dark:border-ink-800"> <div class="mx-auto flex max-w-wide flex-wrap items-center gap-3 px-5 py-4 text-2xs text-ink-500 sm:px-7 dark:text-ink-400" style="max-width: var(--container-wide, 1400px);"> <span>© 2026 Grove Directory.</span> <span class="text-ink-300 dark:text-ink-700">·</span> <a href="https://github.com/tortuvshin/grove" target="_blank" rel="noopener noreferrer" class="transition-colors hover:text-ink-900 dark:hover:text-ink-100">
164
+ View source on GitHub
165
+ </a> </div> </div> </footer> </body> </html>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid" viewBox="0 0 256 150"><path fill="#34A853" d="M255.285 143.47c-.084-.524-.164-1.042-.251-1.56a128.1 128.1 0 0 0-12.794-38.288 128.8 128.8 0 0 0-23.45-31.86 129.2 129.2 0 0 0-22.713-18.005c.049-.08.09-.168.14-.25 2.582-4.461 5.172-8.917 7.755-13.38l7.576-13.068c1.818-3.126 3.632-6.26 5.438-9.386a11.78 11.78 0 0 0 .662-10.484 11.67 11.67 0 0 0-4.823-5.536 11.85 11.85 0 0 0-5.004-1.61 12 12 0 0 0-2.218.018 11.74 11.74 0 0 0-8.968 5.798c-1.814 3.127-3.628 6.26-5.438 9.386l-7.576 13.069c-2.583 4.462-5.173 8.918-7.755 13.38-.282.487-.567.973-.848 1.467q-.586-.237-1.172-.462c-14.24-5.43-29.688-8.4-45.836-8.4-.442 0-.879 0-1.324.006-14.357.143-28.152 2.64-41.022 7.12a119 119 0 0 0-4.42 1.642c-.262-.455-.532-.911-.79-1.367-2.583-4.462-5.173-8.918-7.755-13.38l-7.576-13.07a3915 3915 0 0 1-5.439-9.386A11.74 11.74 0 0 0 48.5.048a11.7 11.7 0 0 0-5.01 1.612 11.7 11.7 0 0 0-4.077 4.063c-.281.474-.532.967-.742 1.473a11.8 11.8 0 0 0-.365 8.188c.259.786.594 1.554 1.023 2.296a3973 3973 0 0 1 5.439 9.386c2.53 4.357 5.054 8.713 7.58 13.069 2.582 4.462 5.168 8.918 7.75 13.38.02.038.046.075.065.112A129 129 0 0 0 45.32 64.38a129.7 129.7 0 0 0-22.2 24.015 128 128 0 0 0-9.34 15.24 128.2 128.2 0 0 0-10.843 28.764 131 131 0 0 0-1.951 9.524c-.087.518-.167 1.042-.247 1.56A125 125 0 0 0 0 149.118h256a130 130 0 0 0-.734-5.636z"/><path fill="#202124" d="M194.59 113.712c5.122-3.41 5.867-11.3 1.661-17.62-4.203-6.323-11.763-8.682-16.883-5.273-5.122 3.41-5.868 11.3-1.662 17.621 4.203 6.322 11.764 8.682 16.883 5.272Zm-116.072-5.25c4.206-6.321 3.46-14.21-1.662-17.62-5.123-3.41-12.68-1.05-16.886 5.27-4.203 6.323-3.458 14.212 1.662 17.622 5.122 3.41 12.683 1.05 16.886-5.272"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 814 1000"><path d="M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76.5 0-103.7 40.8-165.9 40.8s-105.6-57-155.5-127C46.7 790.7 0 663 0 541.8c0-194.4 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2m-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 814 1000"><path fill="#fff" d="M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76.5 0-103.7 40.8-165.9 40.8s-105.6-57-155.5-127C46.7 790.7 0 663 0 541.8c0-194.4 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2m-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><g clip-path="url(#a)"><path fill="#fff" d="M50 74.99c13.807 0 25-11.193 25-25s-11.193-25-25-25-25 11.192-25 25 11.193 25 25 25"/><path fill="url(#b)" d="M50 25h43.294a49.988 49.988 0 0 0-86.591.006L28.35 62.501l.02-.005A24.969 24.969 0 0 1 50 25"/><path fill="#1A73E8" d="M50 69.792c10.93 0 19.792-8.86 19.792-19.791S60.93 30.209 50 30.209s-19.792 8.86-19.792 19.792c0 10.93 8.861 19.791 19.792 19.791"/><path fill="url(#c)" d="M71.649 62.507 50.002 100A49.98 49.98 0 0 0 93.3 75.004a49.99 49.99 0 0 0-.01-49.997H49.999l-.005.02a24.97 24.97 0 0 1 21.655 37.48"/><path fill="url(#d)" d="M28.351 62.507 6.704 25.013A49.988 49.988 0 0 0 50.005 100l21.647-37.493-.014-.015a24.97 24.97 0 0 1-43.287.015"/></g><defs><linearGradient id="b" x1="6.703" x2="93.294" y1="31.25" y2="31.25" gradientUnits="userSpaceOnUse"><stop stop-color="#D93025"/><stop offset="1" stop-color="#EA4335"/></linearGradient><linearGradient id="c" x1="43.171" x2="86.466" y1="99.332" y2="24.341" gradientUnits="userSpaceOnUse"><stop stop-color="#FCC934"/><stop offset="1" stop-color="#FBBC04"/></linearGradient><linearGradient id="d" x1="55.413" x2="12.117" y1="96.879" y2="21.888" gradientUnits="userSpaceOnUse"><stop stop-color="#1E8E3E"/><stop offset="1" stop-color="#34A853"/></linearGradient><clipPath id="a"><path fill="#fff" d="M0 0h100v100H0z"/></clipPath></defs></svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
2
+ <circle cx="12" cy="12" r="10"/>
3
+ <circle cx="12" cy="12" r="3.5" fill="currentColor" stroke="none"/>
4
+ <path d="M12 2v6M12 16v6M2 12h6M16 12h6"/>
5
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
2
+ <rect x="2" y="4" width="20" height="13" rx="1.5"/>
3
+ <path d="M9 21h6M12 17v4"/>
4
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
2
+ <rect x="5" y="5" width="14" height="14" rx="1.5"/>
3
+ <rect x="9" y="9" width="6" height="6" fill="currentColor" stroke="none"/>
4
+ <path d="M2 9v6M22 9v6M9 12H4M20 12h-5M12 4V2M12 22v-2"/>
5
+ </svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 814 1000"><path d="M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76.5 0-103.7 40.8-165.9 40.8s-105.6-57-155.5-127C46.7 790.7 0 663 0 541.8c0-194.4 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2m-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="4.31 0.8 249.38 282.43"><defs><linearGradient id="b" x1="48.548%" x2="51.047%" y1="115.276%" y2="41.364%"><stop offset="0%" stop-color="#FFEED7"/><stop offset="100%" stop-color="#BDBFC2"/></linearGradient><linearGradient id="c" x1="54.407%" x2="46.175%" y1="2.404%" y2="90.542%"><stop offset="0%" stop-color="#FFF" stop-opacity=".8"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><linearGradient id="d" x1="51.86%" x2="47.947%" y1="88.248%" y2="9.748%"><stop offset="0%" stop-color="#FFEED7"/><stop offset="100%" stop-color="#BDBFC2"/></linearGradient><linearGradient id="e" x1="49.925%" x2="49.924%" y1="85.49%" y2="13.811%"><stop offset="0%" stop-color="#FFEED7"/><stop offset="100%" stop-color="#BDBFC2"/></linearGradient><linearGradient id="f" x1="53.901%" x2="45.956%" y1="3.102%" y2="93.895%"><stop offset="0%" stop-color="#FFF" stop-opacity=".65"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><linearGradient id="g" x1="45.593%" x2="54.811%" y1="5.475%" y2="93.524%"><stop offset="0%" stop-color="#FFF" stop-opacity=".65"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><linearGradient id="h" x1="49.984%" x2="49.984%" y1="89.845%" y2="40.632%"><stop offset="0%" stop-color="#FFEED7"/><stop offset="100%" stop-color="#BDBFC2"/></linearGradient><linearGradient id="i" x1="53.505%" x2="42.746%" y1="99.975%" y2="23.545%"><stop offset="0%" stop-color="#FFEED7"/><stop offset="100%" stop-color="#BDBFC2"/></linearGradient><linearGradient id="j" x1="49.841%" x2="50.241%" y1="13.229%" y2="94.673%"><stop offset="0%" stop-color="#FFF" stop-opacity=".8"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><linearGradient id="k" x1="49.927%" x2="50.727%" y1="37.327%" y2="92.782%"><stop offset="0%" stop-color="#FFF" stop-opacity=".65"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><linearGradient id="l" x1="49.876%" x2="49.876%" y1="2.299%" y2="81.204%"><stop offset="0%" stop-color="#FFF" stop-opacity=".65"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><linearGradient id="m" x1="49.833%" x2="49.824%" y1="2.272%" y2="71.799%"><stop offset="0%" stop-color="#FFF" stop-opacity=".65"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><linearGradient id="n" x1="53.467%" x2="38.949%" y1="48.921%" y2="98.1%"><stop offset="0%" stop-color="#FFA63F"/><stop offset="100%" stop-color="#FF0"/></linearGradient><linearGradient id="o" x1="52.373%" x2="47.579%" y1="143.009%" y2="-64.622%"><stop offset="0%" stop-color="#FFEED7"/><stop offset="100%" stop-color="#BDBFC2"/></linearGradient><linearGradient id="p" x1="30.581%" x2="65.887%" y1="34.024%" y2="89.175%"><stop offset="0%" stop-color="#FFA63F"/><stop offset="100%" stop-color="#FF0"/></linearGradient><linearGradient id="q" x1="59.572%" x2="48.361%" y1="-17.216%" y2="66.118%"><stop offset="0%" stop-color="#FFF" stop-opacity=".65"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><linearGradient id="r" x1="47.769%" x2="51.373%" y1="1.565%" y2="104.313%"><stop offset="0%" stop-color="#FFF" stop-opacity=".65"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><linearGradient id="s" x1="43.55%" x2="57.114%" y1="4.533%" y2="92.827%"><stop offset="0%" stop-color="#FFF" stop-opacity=".65"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><linearGradient id="t" x1="49.733%" x2="50.558%" y1="17.609%" y2="99.385%"><stop offset="0%" stop-color="#FFA63F"/><stop offset="100%" stop-color="#FF0"/></linearGradient><linearGradient id="u" x1="50.17%" x2="49.68%" y1="2.89%" y2="94.17%"><stop offset="0%" stop-color="#FFF" stop-opacity=".65"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><filter id="a" width="200%" height="200%" x="-50%" y="-50%" filterUnits="objectBoundingBox"><feOffset in="SourceAlpha" result="shadowOffsetOuter1"/><feGaussianBlur in="shadowOffsetOuter1" result="shadowBlurOuter1" stdDeviation="6.5"/></filter></defs><g fill="none"><path fill="#000" fill-opacity=".2" d="M235.125 249.359c0 17.355-52.617 31.497-117.54 31.497S.044 266.806.044 249.359c0-17.356 52.618-31.498 117.54-31.498 64.924 0 117.45 14.142 117.541 31.498" filter="url(#a)" transform="translate(10)"/><path fill="#000" d="M63.213 215.474c-11.387-16.346-13.591-69.606 12.947-102.39C89.292 97.383 92.69 86.455 93.7 71.67c.734-16.805-11.846-66.851 35.537-70.616 48.027-3.857 45.364 43.526 45.088 68.596-.183 21.12 15.52 33.15 26.355 49.68 19.927 30.303 18.274 82.461-3.765 110.745-27.916 35.354-51.791 20.018-67.678 21.304-29.752 1.745-30.762 17.54-66.024-35.905"/><path fill="url(#b)" d="M169.1 122.451c8.265 7.622 29.661 41.69-4.224 62.995-11.937 7.438 10.653 35.721 21.488 22.039 19.193-24.61 6.98-63.913-4.591-77.963-7.714-9.917-19.651-13.774-12.672-7.07" transform="translate(10)"/><path fill="#000" stroke="#000" stroke-width=".977" d="M176.805 117.86c13.59 11.02 38.292 49.587 2.204 74.748-11.846 7.806 10.468 32.508 23.049 19.927 43.618-43.894-1.102-94.308-16.53-111.664-13.774-15.151-25.987 3.49-8.723 16.989z"/><path fill="url(#c)" d="M147.245 25.02c-.459 12.581-14.325 23.51-30.946 24.52S86.639 41 87.097 28.419c.46-12.581 14.326-23.509 30.947-24.519 16.62-.918 29.66 8.54 29.201 21.12" transform="translate(10)"/><path fill="url(#d)" d="M107.483 54.957c.46 8.173-3.397 15.06-8.723 15.335s-10.01-6.06-10.469-14.233 3.398-15.06 8.724-15.335 10.01 6.06 10.468 14.233" transform="translate(10)"/><path fill="url(#e)" d="M117.125 55.6c.184 9.458 6.337 16.988 13.683 16.805 7.346-.184 13.131-7.99 12.948-17.54-.184-9.458-6.336-16.988-13.683-16.804-7.346.183-13.223 8.08-12.948 17.539" transform="translate(10)"/><path fill="#000" d="M133.186 57.712c-.092 5.234 2.48 9.458 5.877 9.458 3.306 0 6.153-4.224 6.245-9.366.091-5.234-2.48-9.459-5.878-9.459-3.397 0-6.152 4.225-6.244 9.367m-21.212.092c.459 4.316-1.194 7.989-3.582 8.356-2.387.276-4.683-2.938-5.142-7.254s1.194-7.99 3.581-8.357c2.388-.275 4.684 2.939 5.143 7.255"/><path fill="url(#f)" d="M124.564 54.773c-.276 2.939 1.102 5.326 3.03 5.51s3.765-2.112 4.04-4.959c.276-2.938-1.102-5.326-3.03-5.51-1.928-.183-3.765 2.113-4.04 4.96" transform="translate(10)"/><path fill="url(#g)" d="M99.953 55.508c.276 2.388-.734 4.5-2.203 4.683-1.47.184-2.847-1.653-3.123-4.132-.275-2.388.735-4.5 2.204-4.683 1.47-.184 2.847 1.744 3.122 4.132" transform="translate(10)"/><path fill="url(#h)" d="M71.027 145.684c6.52-14.785 20.386-40.772 20.662-60.883 0-15.978 47.843-19.835 51.7-3.856 3.856 15.978 13.59 39.853 19.834 51.424 6.245 11.478 24.335 48.118 5.051 80.074-17.356 28.284-69.973 50.69-98.073-3.856-9.55-18.917-7.806-42.333.826-62.903" transform="translate(10)"/><path fill="url(#i)" d="M65.15 134.664c-5.601 10.56-17.172 38.293 11.112 53.445 30.395 16.162 30.303 49.312-6.245 33.517-33.425-14.233-18.641-71.902-9.274-85.676 6.06-9.642 15.243-21.488 4.407-1.286" transform="translate(10)"/><path fill="#000" stroke="#000" stroke-width="1.25" d="M79.925 122.727c-8.907 14.509-30.211 48.669-1.652 66.484 38.384 23.6 27.548 47.108-7.53 25.895-49.404-29.568-5.97-89.257 13.774-112.03 22.59-25.529 4.316 4.683-4.592 19.65z"/><path fill="url(#j)" d="M156.428 151.285c0 16.162-15.519 37.1-42.15 36.916-27.456.183-39.118-20.754-39.118-36.916s18.182-29.293 40.588-29.293c22.498.092 40.68 13.132 40.68 29.293" transform="translate(10)"/><path fill="url(#k)" d="M141.92 100.504c-.276 16.713-11.204 20.662-24.978 20.662s-23.784-2.48-24.978-20.662c0-11.387 11.203-17.998 24.978-17.998 13.774-.092 24.977 6.52 24.977 17.998" transform="translate(10)"/><path fill="url(#l)" d="M58.63 126.216c9-13.682 28.008-34.711 3.582 2.939-19.835 31.038-7.346 50.965-.918 56.474 18.549 16.53 17.814 27.64 3.214 18.917-31.314-18.641-24.794-50.047-5.878-78.33" transform="translate(10)"/><path fill="url(#m)" d="M188.936 131.818c-7.806-16.07-32.6-56.842 1.193-9.459 30.763 42.884 9.183 72.729 5.326 75.667-3.856 2.939-16.804 8.908-13.04-1.469 3.858-10.377 22.958-30.028 6.52-64.74" transform="translate(10)"/><path fill="url(#n)" stroke="#E68C3F" stroke-width="6.25" d="M51.835 258.542c-20.57-10.928-50.414 2.112-39.578-27.457 2.204-6.704-3.214-16.805.275-23.325 4.133-7.989 13.04-6.244 18.366-11.57 5.234-5.51 8.54-15.06 18.366-13.59 9.734 1.468 16.254 13.406 23.049 28.099 5.05 10.468 22.865 25.253 21.672 37.007-1.47 17.998-21.948 21.396-42.15 10.836z" transform="translate(10)"/><path fill="url(#o)" d="M201.608 189.119c-3.122 5.877-16.162 15.335-24.886 12.856-8.815-2.388-12.856-15.795-11.111-25.988 1.653-11.386 11.111-12.03 23.05-6.336 12.855 6.336 16.712 11.662 12.947 19.468" transform="translate(10)"/><path fill="url(#p)" stroke="#E68C3F" stroke-width="6.251" d="M194.445 253.49c15.06-18.273 48.578-14.508 25.988-39.577-4.775-5.418-3.306-16.989-9.183-21.947-6.887-6.061-14.509-1.102-21.488-4.224-6.979-3.398-14.325-9.918-22.865-5.327-8.54 4.684-9.459 16.805-10.285 32.783-.735 11.479-11.203 30.671-5.602 41.231 8.081 16.346 29.11 14.142 43.435-2.938z" transform="translate(10)"/><path fill="url(#q)" d="M187.925 229.064c23.325-34.435 5.97-34.16.092-36.823-5.877-2.755-12.03-8.173-18.916-4.408-6.888 3.857-7.255 13.775-7.439 26.814-.275 9.367-8.08 25.07-3.397 33.793 5.693 10.193 19.467-4.591 29.66-19.376" transform="translate(10)"/><path fill="url(#r)" d="M47.06 234.023c-34.895-22.59-18.55-30.303-13.315-33.885 6.336-4.591 6.428-13.407 14.233-12.58 7.806.826 12.397 10.468 17.631 22.406 3.857 8.54 17.264 19.927 16.254 29.753-1.285 11.57-19.743 3.948-34.803-5.694" transform="translate(10)"/><path fill="#000" d="M209.588 188.843c-2.755 4.776-13.958 12.306-21.396 10.285-7.622-1.928-11.112-12.672-9.55-20.753 1.377-9.183 9.55-9.642 19.834-5.05 10.928 4.958 14.326 9.182 11.112 15.518"/><path fill="url(#s)" d="M192.058 186.18c-1.745 3.306-9.091 8.54-14.234 7.163-5.142-1.377-7.713-8.815-6.887-14.417.735-6.336 6.244-6.704 13.223-3.581 7.53 3.49 9.918 6.428 7.898 10.835" transform="translate(10)"/><path fill="url(#t)" stroke="#E68C3F" stroke-width="3.75" d="M97.107 66.344c3.673-3.398 12.58-13.774 29.477-2.939 3.122 2.02 5.693 2.204 11.662 4.775 12.03 4.96 6.336 16.897-6.52 20.937-5.51 1.745-10.468 8.449-20.386 7.806-8.54-.46-10.744-6.06-15.978-9.091-9.275-5.234-10.652-12.305-5.602-16.07 5.051-3.765 6.98-5.143 7.347-5.418z" transform="translate(10)"/><path stroke="#E68C3F" stroke-width="2.5" d="M148.43 75.986c-5.05.275-15.979 11.203-27.457 11.203s-18.366-10.652-20.11-10.652"/><path fill="url(#u)" d="M102.8 65.426c1.837-1.653 7.622-6.153 15.244-1.562 1.653.919 3.306 1.929 5.693 3.306 4.867 2.847 2.48 6.98-3.398 9.55-2.663 1.102-7.07 3.49-10.376 3.306-3.673-.367-6.153-2.755-8.54-4.316-4.5-2.938-4.224-5.418-2.112-7.346 1.56-1.47 3.305-2.847 3.49-2.938" transform="translate(10)"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 814 1000"><path fill="#fff" d="M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76.5 0-103.7 40.8-165.9 40.8s-105.6-57-155.5-127C46.7 790.7 0 663 0 541.8c0-194.4 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2m-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="#FF6309" d="M11.728 59.736c5.373 0 9.728-4.355 9.728-9.728s-4.355-9.728-9.728-9.728S2 44.635 2 50.008s4.355 9.728 9.728 9.728"/><path fill="#FFB515" d="M81.485 100c5.373 0 9.728-4.355 9.728-9.728s-4.355-9.73-9.728-9.73-9.73 4.357-9.73 9.73S76.113 100 81.486 100"/><path fill="#C90016" d="M81.476 19.457c5.373 0 9.728-4.356 9.728-9.728C91.204 4.356 86.85 0 81.476 0s-9.728 4.356-9.728 9.729 4.356 9.728 9.728 9.728"/><path fill="#FF6309" d="M58.23 25.936c12.115 0 22.165 8.995 23.83 20.656h16.666c-.758-9.163-4.556-17.704-10.908-24.439-4.068 2.071-9.07 2.111-13.319-.341-4.252-2.456-6.719-6.81-6.956-11.374A41 41 0 0 0 58.23 9.37c-6.082 0-11.959 1.327-17.304 3.845l8.346 14.452a23.9 23.9 0 0 1 8.959-1.731"/><path fill="#FFB515" d="M34.16 50.008c0-7.67 3.605-14.51 9.208-18.922l-8.343-14.45a41 41 0 0 0-5.532 4.636c-4.828 4.828-8.29 10.658-10.195 17.02 3.839 2.486 6.38 6.802 6.38 11.716s-2.541 9.23-6.38 11.715c1.905 6.362 5.367 12.191 10.195 17.02a41.3 41.3 0 0 0 5.528 4.636l8.344-14.453c-5.602-4.41-9.205-11.251-9.205-18.918"/><path fill="#C90016" d="M82.06 53.414C80.4 65.078 70.348 74.078 58.231 74.078c-3.166 0-6.192-.616-8.962-1.733L40.924 86.8c5.343 2.519 11.224 3.847 17.307 3.847 3.177 0 6.3-.367 9.32-1.07.233-4.57 2.7-8.931 6.955-11.388 4.25-2.454 9.254-2.416 13.322-.34 6.346-6.736 10.141-15.275 10.896-24.434z"/></svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
2
+ <circle cx="12" cy="12" r="10"/>
3
+ <ellipse cx="12" cy="12" rx="4" ry="10"/>
4
+ <path d="M2 12h20"/>
5
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
2
+ <rect x="2" y="3" width="9" height="9"/>
3
+ <rect x="13" y="3" width="9" height="9"/>
4
+ <rect x="2" y="13" width="9" height="9"/>
5
+ <rect x="13" y="13" width="9" height="9"/>
6
+ </svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid" viewBox="0 0 256 150"><path fill="#34A853" d="M255.285 143.47c-.084-.524-.164-1.042-.251-1.56a128.1 128.1 0 0 0-12.794-38.288 128.8 128.8 0 0 0-23.45-31.86 129.2 129.2 0 0 0-22.713-18.005c.049-.08.09-.168.14-.25 2.582-4.461 5.172-8.917 7.755-13.38l7.576-13.068c1.818-3.126 3.632-6.26 5.438-9.386a11.78 11.78 0 0 0 .662-10.484 11.67 11.67 0 0 0-4.823-5.536 11.85 11.85 0 0 0-5.004-1.61 12 12 0 0 0-2.218.018 11.74 11.74 0 0 0-8.968 5.798c-1.814 3.127-3.628 6.26-5.438 9.386l-7.576 13.069c-2.583 4.462-5.173 8.918-7.755 13.38-.282.487-.567.973-.848 1.467q-.586-.237-1.172-.462c-14.24-5.43-29.688-8.4-45.836-8.4-.442 0-.879 0-1.324.006-14.357.143-28.152 2.64-41.022 7.12a119 119 0 0 0-4.42 1.642c-.262-.455-.532-.911-.79-1.367-2.583-4.462-5.173-8.918-7.755-13.38l-7.576-13.07a3915 3915 0 0 1-5.439-9.386A11.74 11.74 0 0 0 48.5.048a11.7 11.7 0 0 0-5.01 1.612 11.7 11.7 0 0 0-4.077 4.063c-.281.474-.532.967-.742 1.473a11.8 11.8 0 0 0-.365 8.188c.259.786.594 1.554 1.023 2.296a3973 3973 0 0 1 5.439 9.386c2.53 4.357 5.054 8.713 7.58 13.069 2.582 4.462 5.168 8.918 7.75 13.38.02.038.046.075.065.112A129 129 0 0 0 45.32 64.38a129.7 129.7 0 0 0-22.2 24.015 128 128 0 0 0-9.34 15.24 128.2 128.2 0 0 0-10.843 28.764 131 131 0 0 0-1.951 9.524c-.087.518-.167 1.042-.247 1.56A125 125 0 0 0 0 149.118h256a130 130 0 0 0-.734-5.636z"/><path fill="#202124" d="M194.59 113.712c5.122-3.41 5.867-11.3 1.661-17.62-4.203-6.323-11.763-8.682-16.883-5.273-5.122 3.41-5.868 11.3-1.662 17.621 4.203 6.322 11.764 8.682 16.883 5.272Zm-116.072-5.25c4.206-6.321 3.46-14.21-1.662-17.62-5.123-3.41-12.68-1.05-16.886 5.27-4.203 6.323-3.458 14.212 1.662 17.622 5.122 3.41 12.683 1.05 16.886-5.272"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 814 1000"><path d="M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76.5 0-103.7 40.8-165.9 40.8s-105.6-57-155.5-127C46.7 790.7 0 663 0 541.8c0-194.4 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2m-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 814 1000"><path fill="#fff" d="M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76.5 0-103.7 40.8-165.9 40.8s-105.6-57-155.5-127C46.7 790.7 0 663 0 541.8c0-194.4 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2m-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3"/></svg>
@@ -0,0 +1,14 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
2
+ <!-- Capacitor brand: dark navy background, white capacitor symbol -->
3
+ <rect width="100" height="100" rx="20" fill="#142B45"/>
4
+ <g fill="none" stroke="#FFFFFF" stroke-width="6" stroke-linecap="round" stroke-linejoin="round">
5
+ <!-- Left plate (vertical line) -->
6
+ <line x1="34" y1="30" x2="34" y2="70"/>
7
+ <!-- Right plate (vertical line) -->
8
+ <line x1="66" y1="30" x2="66" y2="70"/>
9
+ <!-- Left arc connecting top and bottom of left plate -->
10
+ <path d="M34 30 C20 34 20 66 34 70"/>
11
+ <!-- Right arc connecting top and bottom of right plate -->
12
+ <path d="M66 30 C80 34 80 66 66 70"/>
13
+ </g>
14
+ </svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><g clip-path="url(#a)"><path fill="#00C4B3" d="m26.878 27.059-6.425-6.426v46.335l.09 2.172c0 .995.181 2.172.543 3.348l50.86 17.919 12.67-5.61z"/><path fill="#22D3C5" d="m84.615 84.796-12.67 5.61-50.769-17.918c.996 3.71 3.077 7.874 5.43 10.227l16.561 16.47 36.923.09z"/><path fill="#0075C9" d="M20.634 20.633.905 50.497c-1.629 1.72-.814 5.34 1.81 8.055l11.403 11.493 7.149 2.534c-.271-1.177-.543-2.353-.543-3.349l-.09-2.172z"/><path fill="#0075C9" d="M72.308 21.176a26 26 0 0 0-3.349-.543l-2.262-.09H20.453l64.162 64.163 5.611-12.67z"/><path fill="#00A8E1" d="M82.534 26.606c-2.353-2.353-6.425-4.525-10.226-5.43l17.918 50.86-5.61 12.67L98.37 80.27V42.534z"/><path fill="#00C4B3" d="M69.774 14.117 58.28 2.715C55.656.09 52.036-.725 50.226.905L20.362 20.633h46.244l2.263.09c.995 0 2.172.182 3.348.544z"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h100v100H0z"/></clipPath></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="#FFA000" d="m61.405 36.118-10 9.312-9.284-18.733 4.796-10.771c1.212-2.149 3.194-2.177 4.407 0z"/><path fill="#F57F17" d="M51.409 45.426 14 80.22l28.126-53.523z"/><path fill="#FFCA28" d="M72.371 21.877c1.792-1.707 3.636-1.131 4.103 1.293l9.725 56.58-32.257 19.365c-1.13.632-4.13.88-4.13.88s-2.729-.333-3.774-.909L14 80.22z"/><path fill="#FFA000" d="M42.126 26.697 14 80.22 26.535 1.989c.47-2.424 1.844-2.672 3.084-.523z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="#42A5F5" fill-opacity=".8" d="M25.399 65.395 10 49.996 60 0h30.794zm65.395-19.258H60L48.465 57.672 63.864 73.07"/><path fill="#0D47A1" d="M48.465 88.465 60 100h30.794l-26.93-26.93"/><path fill="#42A5F5" d="M33.103 73.079 48.477 57.7l15.375 15.375-15.375 15.378z"/><path fill="url(#a)" d="M48.477 88.453 63.852 73.08l2.146 2.146L50.623 90.6z"/><path fill="url(#b)" d="m48.465 88.465 22.848-7.893-7.449-7.506"/><defs><linearGradient id="a" x1="56.167" x2="58.314" y1="80.763" y2="82.909" gradientUnits="userSpaceOnUse"><stop offset=".2" stop-opacity=".15"/><stop offset=".85" stop-color="#616161" stop-opacity=".01"/></linearGradient><linearGradient id="b" x1="48.471" x2="71.318" y1="80.766" y2="80.766" gradientUnits="userSpaceOnUse"><stop offset=".2" stop-opacity=".55"/><stop offset=".85" stop-color="#616161" stop-opacity=".01"/></linearGradient></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="#E535AB" fill-rule="evenodd" d="M58.972 11.445 79.507 23.3a9 9 0 0 1 2.02-1.598c4.259-2.448 9.69-.995 12.164 3.264 2.449 4.259.995 9.69-3.264 12.165a9 9 0 0 1-2.372.944v23.721c.823.2 1.613.516 2.347.939 4.284 2.473 5.738 7.905 3.264 12.164-2.448 4.259-7.906 5.713-12.165 3.265a8.8 8.8 0 0 1-2.2-1.787L58.89 88.16a9 9 0 0 1 .449 2.805c0 4.897-3.978 8.9-8.9 8.9a8.89 8.89 0 0 1-8.9-8.9c0-.874.125-1.72.36-2.518L21.37 76.595a9 9 0 0 1-1.992 1.57c-4.284 2.448-9.716.994-12.164-3.265s-.995-9.69 3.264-12.165a9 9 0 0 1 2.346-.938V38.076a9 9 0 0 1-2.371-.944c-4.26-2.448-5.713-7.906-3.265-12.165s7.906-5.712 12.165-3.264a9 9 0 0 1 2.01 1.588l20.54-11.86a9 9 0 0 1-.363-2.53c0-4.922 3.978-8.9 8.9-8.9s8.9 3.978 8.9 8.9c0 .884-.129 1.738-.368 2.544m-2.14 3.653 20.585 11.884a8.9 8.9 0 0 0 .846 6.885 8.85 8.85 0 0 0 5.56 4.188v23.751q-.174.043-.345.092L56.594 15.336q.121-.117.239-.238m-12.54.243L17.408 61.902a9 9 0 0 0-.35-.093V38.055a8.85 8.85 0 0 0 5.559-4.188 8.9 8.9 0 0 0 .842-6.898l20.578-11.88q.124.128.255.252m8.635 2.11L79.804 64a8.9 8.9 0 0 0-2.505 4.345H23.58A9 9 0 0 0 22.643 66a9 9 0 0 0-1.565-1.987l26.883-46.56c.806.231 1.64.349 2.479.348.863 0 1.698-.122 2.487-.35m4.095 67.52 20.45-11.808a9 9 0 0 1-.164-.584H23.57q-.044.173-.092.345l20.55 11.865a8.87 8.87 0 0 1 6.412-2.723 8.88 8.88 0 0 1 6.582 2.904" clip-rule="evenodd"/></svg>
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
2
+ <path d="M12 2 4 6v6c0 5 3.5 8.5 8 10 4.5-1.5 8-5 8-10V6l-8-4Z"/>
3
+ <circle cx="12" cy="11" r="2.5" fill="currentColor" stroke="none"/>
4
+ </svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="#5382A1" d="M36.753 77.336s-3.822 2.222 2.72 2.974c7.924.904 11.973.775 20.706-.878 0 0 2.296 1.44 5.502 2.686-19.576 8.39-44.304-.486-28.928-4.782M34.36 66.388s-4.286 3.172 2.26 3.85c8.464.873 15.149.944 26.716-1.283 0 0 1.6 1.622 4.116 2.509-23.668 6.92-50.03.546-33.092-5.076"/><path fill="#E76F00" d="M54.527 47.816c4.823 5.553-1.268 10.55-1.268 10.55s12.248-6.322 6.623-14.24c-5.253-7.383-9.282-11.052 12.528-23.7 0 0-34.234 8.55-17.883 27.39"/><path fill="#5382A1" d="M80.418 85.434s2.827 2.33-3.115 4.133c-11.3 3.423-47.03 4.457-56.956.136-3.568-1.552 3.124-3.706 5.228-4.158 2.195-.476 3.45-.387 3.45-.387-3.968-2.796-25.648 5.489-11.012 7.86 39.913 6.474 72.757-2.914 62.405-7.584M38.59 55.044s-18.174 4.317-6.436 5.884c4.956.664 14.837.514 24.04-.257 7.522-.634 15.075-1.984 15.075-1.984s-2.653 1.136-4.571 2.446c-18.457 4.854-54.11 2.596-43.846-2.369 8.68-4.196 15.738-3.72 15.738-3.72m32.603 18.224c18.762-9.75 10.088-19.118 4.033-17.856-1.484.309-2.146.577-2.146.577s.551-.863 1.603-1.237c11.978-4.211 21.19 12.42-3.867 19.008 0 0 .29-.26.377-.492"/><path fill="#E76F00" d="M59.882 0s10.39 10.395-9.855 26.378c-16.234 12.82-3.702 20.131-.006 28.483-9.477-8.55-16.432-16.076-11.766-23.081C45.103 21.496 64.075 16.51 59.882 0"/><path fill="#5382A1" d="M40.434 99.686c18.009 1.153 45.663-.64 46.318-9.16 0 0-1.259 3.23-14.883 5.795-15.371 2.893-34.329 2.555-45.573.701 0 0 2.302 1.905 14.138 2.664"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="#F7DF1E" d="M100 0H0v100h100z"/><path fill="#000" d="M67.175 78.126c2.014 3.289 4.634 5.706 9.27 5.706 3.893 0 6.38-1.946 6.38-4.635 0-3.222-2.555-4.363-6.841-6.238l-2.35-1.008c-6.78-2.889-11.285-6.508-11.285-14.158 0-7.048 5.37-12.413 13.762-12.413 5.975 0 10.27 2.08 13.365 7.524l-7.317 4.698c-1.612-2.889-3.35-4.027-6.048-4.027-2.752 0-4.497 1.746-4.497 4.027 0 2.82 1.746 3.96 5.778 5.707l2.35 1.006c7.983 3.424 12.491 6.914 12.491 14.762 0 8.46-6.646 13.095-15.571 13.095-8.727 0-14.365-4.159-17.124-9.61zm-33.196.814c1.477 2.62 2.82 4.834 6.048 4.834 3.087 0 5.035-1.208 5.035-5.905V45.916h9.397v32.08c0 9.73-5.705 14.159-14.032 14.159-7.524 0-11.881-3.894-14.097-8.584z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="url(#a)" d="M100 100H0V0h100L48.965 49.276z"/><defs><radialGradient id="a" cx="0" cy="0" r="1" gradientTransform="translate(96.675 4.11)scale(114.549)" gradientUnits="userSpaceOnUse"><stop offset=".003" stop-color="#EF4857"/><stop offset=".469" stop-color="#D211EC"/><stop offset="1" stop-color="#7F52FF"/></radialGradient></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="#599636" d="m50.146.274 2.668 5.012c.6.925 1.25 1.743 2.016 2.506a70 70 0 0 1 6.262 7.08c4.521 5.938 7.57 12.53 9.749 19.661 1.306 4.356 2.015 8.825 2.069 13.343.218 13.509-4.413 25.108-13.75 34.748a40 40 0 0 1-4.905 4.193c-.925 0-1.363-.71-1.744-1.362a11.2 11.2 0 0 1-1.362-3.922c-.328-1.634-.544-3.268-.438-4.956v-.762c-.075-.163-.89-75.157-.566-75.541"/><path fill="#6CAC48" d="M50.146.108c-.11-.219-.22-.053-.329.053.053 1.094-.328 2.069-.925 3-.656.925-1.524 1.634-2.396 2.397-4.844 4.193-8.656 9.258-11.709 14.924-4.062 7.624-6.156 15.795-6.75 24.398-.271 3.103.982 14.052 1.96 17.21 2.669 8.388 7.462 15.415 13.67 21.515 1.526 1.469 3.157 2.831 4.844 4.14.49 0 .544-.437.656-.762q.324-1.045.491-2.125l1.094-8.168z"/><path fill="#C2BFBF" d="M52.814 90.136c.11-1.25.71-2.288 1.362-3.322-.656-.272-1.143-.812-1.524-1.415a10 10 0 0 1-.813-1.797c-.762-2.288-.925-4.687-1.143-7.025v-1.415c-.272.219-.329 2.069-.329 2.343a54 54 0 0 1-.98 7.353c-.163.981-.273 1.96-.876 2.831 0 .11 0 .219.053.381.981 2.888 1.25 5.828 1.416 8.825v1.093c0 1.306-.053 1.031 1.031 1.469.438.162.925.219 1.362.544.329 0 .382-.272.382-.491l-.163-1.797v-5.012c-.053-.875.11-1.743.219-2.562z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="#8CC84B" d="M46.279 1.067c2.479-1.419 5.709-1.425 8.186 0C66.929 8.11 79.396 15.142 91.858 22.188c2.343 1.32 3.911 3.929 3.887 6.63v42.37c.018 2.813-1.705 5.484-4.178 6.774-12.422 7.004-24.838 14.016-37.259 21.02-2.53 1.447-5.825 1.336-8.277-.23-3.724-2.159-7.455-4.307-11.18-6.464-.76-.454-1.619-.815-2.156-1.553.475-.64 1.324-.72 2.015-1 1.554-.494 2.982-1.287 4.41-2.058.361-.247.802-.152 1.148.07 3.185 1.825 6.342 3.704 9.537 5.513.682.393 1.372-.13 1.955-.454 12.19-6.89 24.396-13.754 36.584-20.645a1.21 1.21 0 0 0 .664-1.192c.009-13.977.002-27.957.005-41.934a1.31 1.31 0 0 0-.781-1.307C75.852 20.756 63.479 13.774 51.102 6.8a1.29 1.29 0 0 0-1.458-.002c-12.378 6.976-24.749 13.965-37.126 20.936-.506.23-.845.738-.785 1.301q.002 20.967 0 41.936a1.19 1.19 0 0 0 .673 1.177c3.303 1.873 6.61 3.733 9.916 5.6 1.861 1.001 4.148 1.597 6.199.829 1.81-.65 3.08-2.497 3.045-4.419.017-13.895-.009-27.793.013-41.687-.046-.617.54-1.126 1.14-1.068 1.586-.011 3.175-.022 4.762.004.663-.015 1.119.65 1.037 1.27-.007 13.984.017 27.968-.01 41.952.003 3.727-1.528 7.782-4.975 9.605-4.247 2.2-9.496 1.734-13.691-.376-3.632-1.812-7.098-3.952-10.666-5.894C6.697 76.681 4.983 74 5 71.19V28.818c-.026-2.757 1.604-5.413 4.021-6.714Q27.651 11.588 46.28 1.067"/><path fill="#8CC84B" d="M57.114 30.418c5.417-.349 11.216-.207 16.091 2.462 3.774 2.045 5.867 6.337 5.933 10.53-.105.566-.696.878-1.236.839-1.572-.002-3.144.021-4.716-.01-.667.025-1.054-.59-1.138-1.18-.451-2.006-1.545-3.993-3.434-4.96-2.898-1.452-6.26-1.379-9.42-1.348-2.308.122-4.79.322-6.744 1.679-1.5 1.028-1.957 3.103-1.421 4.774.505 1.2 1.89 1.587 3.023 1.944 6.529 1.707 13.447 1.537 19.85 3.784 2.651.916 5.245 2.697 6.152 5.473 1.187 3.72.667 8.167-1.98 11.154-2.146 2.458-5.273 3.795-8.39 4.522-4.149.925-8.454.948-12.666.538-3.962-.452-8.084-1.493-11.142-4.192-2.614-2.27-3.892-5.808-3.765-9.222.03-.577.605-.979 1.157-.931 1.583-.013 3.165-.017 4.748.002.632-.046 1.101.5 1.133 1.097.292 1.911 1.01 3.917 2.678 5.05 3.216 2.076 7.253 1.934 10.936 1.992 3.052-.136 6.477-.176 8.967-2.193 1.314-1.15 1.703-3.075 1.348-4.731-.384-1.398-1.847-2.05-3.103-2.475-6.444-2.039-13.44-1.3-19.822-3.605-2.59-.915-5.096-2.647-6.092-5.309-1.389-3.767-.752-8.427 2.172-11.313 2.852-2.87 6.968-3.976 10.881-4.372"/></svg>