iconora 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,1475 @@
1
+ # Iconora
2
+
3
+ A lightweight, customizable React icon package built with TypeScript and SVG, with built-in CLI tooling for importing, deriving, generating, validating, inspecting, and managing icons.
4
+
5
+ Iconora provides clean, reusable icons designed for modern React applications with a simple and consistent API. It also provides a source-to-package workflow that can derive icons from external icon repositories such as Lucide and convert them into the Iconora architecture.
6
+
7
+ ## Features
8
+
9
+ - โš›๏ธ Built for React
10
+
11
+ - ๐Ÿ”ท Written in TypeScript
12
+
13
+ - ๐ŸŽจ Customizable icon color
14
+
15
+ - ๐Ÿ“ Customizable icon size
16
+
17
+ - โœ๏ธ Customizable stroke width
18
+
19
+ - ๐Ÿงฉ Supports standard SVG props
20
+
21
+ - ๐ŸŒณ Tree-shakeable
22
+
23
+ - ๐Ÿ“ฆ Available as an npm package
24
+
25
+ - ๐Ÿชถ Lightweight and dependency-friendly
26
+
27
+ - ๐Ÿ”„ Automated SVG โ†’ TSX icon generation
28
+
29
+ - ๐Ÿงช Automated icon validation and testing
30
+
31
+ - ๐Ÿ—‚๏ธ Automatic icon metadata generation
32
+
33
+ - ๐Ÿ› ๏ธ Built-in CLI tools for icon management and source import
34
+
35
+ ๐Ÿ“ฅ Lucide repository icon import and derivation
36
+
37
+ ๐Ÿ”„ Source SVG โ†’ Iconora architecture conversion
38
+
39
+ - ๐Ÿ” Metadata inspection for individual or multiple icons
40
+
41
+ - โœ… Production project verification
42
+
43
+ ---
44
+
45
+ ## Installation
46
+
47
+ Install Iconora using npm:
48
+
49
+ ```bash
50
+
51
+ npm install iconora
52
+
53
+ ```
54
+
55
+ Or using other package managers:
56
+
57
+ ```bash
58
+
59
+ yarn add iconora
60
+
61
+ ```
62
+
63
+ ```bash
64
+
65
+ pnpm add iconora
66
+
67
+ ```
68
+
69
+ ---
70
+
71
+ ## Usage
72
+
73
+ Import an icon from Iconora:
74
+
75
+ ```tsx
76
+
77
+ import { Search } from "iconora";
78
+
79
+ ```
80
+
81
+ Then use it inside your React component:
82
+
83
+ ```tsx
84
+
85
+ <Search />
86
+
87
+ ```
88
+
89
+ ---
90
+
91
+ ## Customization
92
+
93
+ Iconora icons can be customized using props.
94
+
95
+ ### Size
96
+
97
+ ```tsx
98
+
99
+ <Search size={24} />
100
+
101
+ ```
102
+
103
+ ```tsx
104
+
105
+ <Search size={48} />
106
+
107
+ ```
108
+
109
+ ### Color
110
+
111
+ ```tsx
112
+
113
+ <Search color="red" />
114
+
115
+ ```
116
+
117
+ ```tsx
118
+
119
+ <Search color="#0f95" />
120
+
121
+ ```
122
+
123
+ You can also use CSS-based coloring:
124
+
125
+ ```tsx
126
+
127
+ <Search className="text-red-500" />
128
+
129
+ ```
130
+
131
+ ### Stroke Width
132
+
133
+ ```tsx
134
+
135
+ <Search strokeWidth={3} />
136
+
137
+ ```
138
+
139
+ ### Combining Props
140
+
141
+ ```tsx
142
+
143
+ <Search
144
+
145
+ ย  size={48}
146
+
147
+ ย  color="#0f95"
148
+
149
+ ย  strokeWidth={3}
150
+
151
+ />
152
+
153
+ ```
154
+
155
+ ---
156
+
157
+ ## SVG Props
158
+
159
+ Iconora icons support standard React SVG properties.
160
+
161
+ For example:
162
+
163
+ ```tsx
164
+
165
+ <Search
166
+
167
+ ย  size={32}
168
+
169
+ ย  className="my-icon"
170
+
171
+ ย  aria-label="Search"
172
+
173
+ />
174
+
175
+ ```
176
+
177
+ You can also use standard SVG-related props such as:
178
+
179
+ ```text
180
+
181
+ id
182
+
183
+ style
184
+
185
+ role
186
+
187
+ aria-label
188
+
189
+ onClick
190
+
191
+ ```
192
+
193
+ Because Iconora icons are React SVG components, standard React SVG attributes and event handlers can be used where supported by React.
194
+
195
+ ---
196
+
197
+ ## TypeScript
198
+
199
+ Iconora includes TypeScript type declarations, so you get type safety and editor autocomplete when using the package.
200
+
201
+ ```tsx
202
+
203
+ import {
204
+
205
+ ย  Search,
206
+
207
+ ย  type IconProps,
208
+
209
+ } from "iconora";
210
+
211
+ ```
212
+
213
+ ---
214
+
215
+ # Importing Icons from Lucide
216
+
217
+ Iconora can import and derive the SVG icon collection from the official Lucide GitHub repository using a built-in CLI.
218
+
219
+ The import command is:
220
+
221
+ npm run import:lucide
222
+
223
+ This command is designed for source acquisition and derivation. It extracts the Lucide SVG icon sources and places them into Iconora's icons/ source directory.
224
+
225
+ It does not directly create the final React components. The imported SVG files become Iconora source files and then pass through the normal Iconora generation pipeline.
226
+
227
+ ## Lucide Import Workflow
228
+
229
+ The complete flow is:
230
+
231
+ Lucide GitHub Repository
232
+ โ”‚
233
+ โ–ผ
234
+ npm run import:lucide
235
+ โ”‚
236
+ โ–ผ
237
+ icons/*.svg
238
+ โ”‚
239
+ โ–ผ
240
+ npm run validate
241
+ โ”‚
242
+ โ–ผ
243
+ npm run generate
244
+ โ”‚
245
+ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
246
+ โ–ผ โ–ผ โ–ผ
247
+ TSX icons index.ts metadata
248
+ โ”‚ โ”‚ โ”‚
249
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
250
+ โ–ผ
251
+ npm run check
252
+ โ”‚
253
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
254
+ โ–ผ โ–ผ โ–ผ
255
+ typecheck tests build
256
+ โ”‚ โ”‚ โ”‚
257
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
258
+ โ–ผ
259
+ ๐Ÿ“ฆ Iconora
260
+
261
+ ## What npm run import:lucide Does
262
+
263
+ The command is responsible for:
264
+
265
+ Obtaining the Lucide SVG icon sources from the Lucide GitHub repository.
266
+
267
+ Extracting the SVG icon files.
268
+
269
+ Deriving the source collection into Iconora's icons/ directory.
270
+
271
+ Preparing the icons for Iconora's validation and generation pipeline.
272
+
273
+ Keeping external icon acquisition separate from React component generation.
274
+
275
+ The important architectural distinction is:
276
+
277
+ import:lucide
278
+ โ†“
279
+ External source โ†’ Iconora SVG source
280
+
281
+ generate
282
+ โ†“
283
+ Iconora SVG source โ†’ Iconora React architecture
284
+
285
+ ## Example
286
+
287
+ Run:
288
+
289
+ npm run import:lucide
290
+
291
+ The imported source collection is placed under:
292
+
293
+ icons/
294
+ โ”œโ”€โ”€ activity.svg
295
+ โ”œโ”€โ”€ airplay.svg
296
+ โ”œโ”€โ”€ alarm-clock.svg
297
+ โ”œโ”€โ”€ search.svg
298
+ โ”œโ”€โ”€ x.svg
299
+ โ””โ”€โ”€ ...
300
+
301
+ After importing, validate the collection:
302
+
303
+ npm run validate
304
+
305
+ Then generate the Iconora components:
306
+
307
+ npm run generate
308
+
309
+ Finally verify the complete project:
310
+
311
+ npm run check
312
+
313
+ ## Important
314
+
315
+ npm run import:lucide is an import/derivation command, not the final Iconora generation command.
316
+
317
+ The commands have separate responsibilities:
318
+
319
+ Command
320
+
321
+ Responsibility
322
+
323
+ npm run import:lucide
324
+
325
+ Derive/import Lucide SVG sources into Iconora
326
+
327
+ npm run validate
328
+
329
+ Validate Iconora SVG sources
330
+
331
+ npm run generate
332
+
333
+ Convert SVG sources into Iconora React/TypeScript architecture
334
+
335
+ npm run check
336
+
337
+ Verify TypeScript, tests, and production build
338
+
339
+ This separation allows Iconora to remain a standalone icon package instead of being tightly coupled to Lucide's runtime package.
340
+
341
+ ## Recommended Lucide Import Workflow
342
+
343
+ When refreshing the Lucide-derived icon collection:
344
+
345
+ npm run import:lucide
346
+ npm run validate
347
+ npm run generate
348
+ npm run check
349
+
350
+ After the import, icons/ remains the source layer used by the rest of the Iconora pipeline.
351
+
352
+ ---
353
+
354
+ # Adding New Icons
355
+
356
+ Iconora uses SVG files as the **source of truth**.
357
+
358
+ You do not manually create the corresponding `.tsx` icon component, update `index.ts`, or update the metadata file.
359
+
360
+ Instead, add the SVG to:
361
+
362
+ ```text
363
+
364
+ icons/
365
+
366
+ ```
367
+
368
+ and let Iconora generate everything automatically.
369
+
370
+ ---
371
+
372
+ ## 1. Add the SVG
373
+
374
+ Place your SVG file inside:
375
+
376
+ ```text
377
+
378
+ icons/
379
+
380
+ ```
381
+
382
+ For example:
383
+
384
+ ```text
385
+
386
+ icons/
387
+
388
+ โ”œโ”€โ”€ search.svg
389
+
390
+ โ”œโ”€โ”€ x.svg
391
+
392
+ โ””โ”€โ”€ home.svg
393
+
394
+ ```
395
+
396
+ The filename determines the generated component name.
397
+
398
+ For example:
399
+
400
+ ```text
401
+
402
+ search.svg โ†’ Search
403
+
404
+ x.svg ย  ย  ย โ†’ X
405
+
406
+ home.svg ย  โ†’ Home
407
+
408
+ ```
409
+
410
+ For names containing hyphens:
411
+
412
+ ```text
413
+
414
+ arrow-left.svg โ†’ ArrowLeft
415
+
416
+ chevron-down.svg โ†’ ChevronDown
417
+
418
+ ```
419
+
420
+ ---
421
+
422
+ ## 2. Validate the SVG
423
+
424
+ After adding the SVG, run:
425
+
426
+ ```bash
427
+
428
+ npm run validate
429
+
430
+ ```
431
+
432
+ This checks the source SVG collection before generating the React components.
433
+
434
+ Example:
435
+
436
+ ```text
437
+
438
+ Iconora SVG validation
439
+
440
+ โœ“ Iconora SVG validation passed
441
+
442
+ 3 SVG icons checked
443
+
444
+ 0 failed
445
+
446
+ ```
447
+
448
+ If validation fails, fix the SVG before continuing.
449
+
450
+ ---
451
+
452
+ ## 3. Generate the Icon
453
+
454
+ Once validation passes, run:
455
+
456
+ ```bash
457
+
458
+ npm run generate
459
+
460
+ ```
461
+
462
+ Iconora automatically generates the React/TypeScript component.
463
+
464
+ For example:
465
+
466
+ ```text
467
+
468
+ icons/home.svg
469
+
470
+ ```
471
+
472
+ becomes:
473
+
474
+ ```text
475
+
476
+ src/icons/Home.tsx
477
+
478
+ ```
479
+
480
+ The generator also updates:
481
+
482
+ ```text
483
+
484
+ src/index.ts
485
+
486
+ ```
487
+
488
+ and:
489
+
490
+ ```text
491
+
492
+ src/metadata/icons.json
493
+
494
+ ```
495
+
496
+ The generated structure looks like:
497
+
498
+ ```text
499
+
500
+ src/
501
+
502
+ โ”œโ”€โ”€ icons/
503
+
504
+ โ”‚ ย  โ”œโ”€โ”€ Search.tsx
505
+
506
+ โ”‚ ย  โ”œโ”€โ”€ X.tsx
507
+
508
+ โ”‚ ย  โ””โ”€โ”€ Home.tsx
509
+
510
+ โ”‚
511
+
512
+ โ”œโ”€โ”€ metadata/
513
+
514
+ โ”‚ ย  โ””โ”€โ”€ icons.json
515
+
516
+ โ”‚
517
+
518
+ โ””โ”€โ”€ index.ts
519
+
520
+ ```
521
+
522
+ ### Important
523
+
524
+ Do not manually edit generated files:
525
+
526
+ ```text
527
+
528
+ src/icons/
529
+
530
+ src/index.ts
531
+
532
+ src/metadata/icons.json
533
+
534
+ ```
535
+
536
+ If you need to change an icon, modify the original SVG inside:
537
+
538
+ ```text
539
+
540
+ icons/
541
+
542
+ ```
543
+
544
+ and run:
545
+
546
+ ```bash
547
+
548
+ npm run generate
549
+
550
+ ```
551
+
552
+ again.
553
+
554
+ ---
555
+
556
+ ## 4. Verify the Project
557
+
558
+ After generating the icon, run:
559
+
560
+ ```bash
561
+
562
+ npm run check
563
+
564
+ ```
565
+
566
+ This is the recommended verification command.
567
+
568
+ It automatically runs:
569
+
570
+ ```text
571
+
572
+ npm run validate
573
+
574
+ ย  ย  ย  โ†“
575
+
576
+ npm run typecheck
577
+
578
+ ย  ย  ย  โ†“
579
+
580
+ npm run test:run
581
+
582
+ ย  ย  ย  โ†“
583
+
584
+ npm run build
585
+
586
+ ```
587
+
588
+ A successful check means the generated icon passes:
589
+
590
+ - SVG validation
591
+
592
+ - TypeScript type checking
593
+
594
+ - Icon tests
595
+
596
+ - Production build
597
+
598
+ ---
599
+
600
+ ## Complete New Icon Workflow
601
+
602
+ Whenever you add a new icon, the recommended workflow is:
603
+
604
+ ```bash
605
+
606
+ npm run validate
607
+
608
+ npm run generate
609
+
610
+ npm run check
611
+
612
+ ```
613
+
614
+ The complete process is:
615
+
616
+ ```text
617
+
618
+ icons/home.svg
619
+
620
+ ย  ย  ย  โ”‚
621
+
622
+ ย  ย  ย  โ–ผ
623
+
624
+ npm run validate
625
+
626
+ ย  ย  ย  โ”‚
627
+
628
+ ย  ย  ย  โ–ผ
629
+
630
+ npm run generate
631
+
632
+ ย  ย  ย  โ”‚
633
+
634
+ ย  ย  ย  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
635
+
636
+ ย  ย  ย  โ–ผ ย  ย  ย  ย  ย  ย  ย  โ–ผ
637
+
638
+ Home.tsx ย  ย  ย  ย  ย metadata
639
+
640
+ ย  ย  ย  โ”‚
641
+
642
+ ย  ย  ย  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
643
+
644
+ ย  ย  ย  ย  ย  ย  ย  โ–ผ
645
+
646
+ ย  ย  ย  ย  ย  ย index.ts
647
+
648
+ ย  ย  ย  ย  ย  ย  ย  โ”‚
649
+
650
+ ย  ย  ย  ย  ย  ย  ย  โ–ผ
651
+
652
+ ย  ย  ย  ย  npm run check
653
+
654
+ ย  ย  ย  ย  ย  ย  ย  โ”‚
655
+
656
+ ย  ย  ย  ย โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”
657
+
658
+ ย  ย  ย  ย โ–ผ ย  ย  ย โ–ผ ย  ย  ย โ–ผ
659
+
660
+ ย  ย Typecheck Tests ย Build
661
+
662
+ ย  ย  ย  ย โ”‚ ย  ย  ย โ”‚ ย  ย  ย โ”‚
663
+
664
+ ย  ย  ย  ย โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”˜
665
+
666
+ ย  ย  ย  ย  ย  ย  ย  โ–ผ
667
+
668
+ ย  ย  ย  ย  ย  ๐Ÿ“ฆ Iconora
669
+
670
+ ```
671
+
672
+ ---
673
+
674
+ # Inspecting Icon Metadata
675
+
676
+ Iconora provides a metadata inspection command.
677
+
678
+ ## Single Icon
679
+
680
+ ```bash
681
+
682
+ npm run getMetadata -- Search
683
+
684
+ ```
685
+
686
+ Icon names are case-insensitive:
687
+
688
+ ```bash
689
+
690
+ npm run getMetadata -- Search
691
+
692
+ ```
693
+
694
+ ```bash
695
+
696
+ npm run getMetadata -- search
697
+
698
+ ```
699
+
700
+ ```bash
701
+
702
+ npm run getMetadata -- SEARCH
703
+
704
+ ```
705
+
706
+ These all refer to the same icon.
707
+
708
+ ---
709
+
710
+ ## Multiple Icons
711
+
712
+ You can inspect multiple icons at once:
713
+
714
+ ```bash
715
+
716
+ npm run getMetadata -- Search X Home
717
+
718
+ ```
719
+
720
+ You can also use:
721
+
722
+ ```bash
723
+
724
+ npm run getMetadata -- --Search --X --Home
725
+
726
+ ```
727
+
728
+ ---
729
+
730
+ ## All Icons
731
+
732
+ To display metadata for every icon:
733
+
734
+ ```bash
735
+
736
+ npm run getMetadata -- --all
737
+
738
+ ```
739
+
740
+ > **Note:** This can produce a large amount of terminal output for large icon collections.
741
+
742
+ ---
743
+
744
+ ## Missing Icons
745
+
746
+ Missing icons are reported without stopping successful lookups.
747
+
748
+ For example:
749
+
750
+ ```bash
751
+
752
+ npm run getMetadata -- Search X DoesNotExist
753
+
754
+ ```
755
+
756
+ The command will display the metadata for `Search` and `X` while reporting:
757
+
758
+ ```text
759
+
760
+ โœ— DoesNotExist
761
+
762
+ ย  Metadata not found
763
+
764
+ ```
765
+
766
+ ---
767
+
768
+ ## Metadata Source
769
+
770
+ Metadata is read from:
771
+
772
+ ```text
773
+
774
+ src/metadata/icons.json
775
+
776
+ ```
777
+
778
+ `getMetadata` is completely **read-only**.
779
+
780
+ It does not modify:
781
+
782
+ ```text
783
+
784
+ icons/
785
+
786
+ src/icons/
787
+
788
+ src/index.ts
789
+
790
+ src/metadata/icons.json
791
+
792
+ ```
793
+
794
+ If the metadata file is missing or outdated, run:
795
+
796
+ ```bash
797
+
798
+ npm run generate
799
+
800
+ ```
801
+
802
+ before using `getMetadata`.
803
+
804
+ ---
805
+
806
+ # Removing Icons
807
+
808
+ Iconora provides a CLI command for removing icons.
809
+
810
+ ## Full Icon Deletion
811
+
812
+ To completely remove an icon:
813
+
814
+ ```bash
815
+
816
+ npm run delete -- Search
817
+
818
+ ```
819
+
820
+ This removes:
821
+
822
+ ```text
823
+
824
+ icons/search.svg
825
+
826
+ src/icons/Search.tsx
827
+
828
+ Search from src/index.ts
829
+
830
+ Search from src/metadata/icons.json
831
+
832
+ ```
833
+
834
+ Icon names are case-insensitive:
835
+
836
+ ```bash
837
+
838
+ npm run delete -- Search
839
+
840
+ npm run delete -- search
841
+
842
+ npm run delete -- SEARCH
843
+
844
+ ```
845
+
846
+ Iconora asks for confirmation before performing the deletion.
847
+
848
+ ---
849
+
850
+ ## Selective Deletion
851
+
852
+ You can also delete individual parts of an icon.
853
+
854
+ ### Delete only the SVG
855
+
856
+ ```bash
857
+
858
+ npm run delete -- --Search svg
859
+
860
+ ```
861
+
862
+ ### Delete only the generated TSX
863
+
864
+ ```bash
865
+
866
+ npm run delete -- --Search tsx
867
+
868
+ ```
869
+
870
+ ### Delete only metadata
871
+
872
+ ```bash
873
+
874
+ npm run delete -- --Search metadata
875
+
876
+ ```
877
+
878
+ ### Delete multiple parts
879
+
880
+ ```bash
881
+
882
+ npm run delete -- --Search svg tsx
883
+
884
+ ```
885
+
886
+ Deletion targets are case-insensitive:
887
+
888
+ ```bash
889
+
890
+ npm run delete -- --SEARCH SVG TSX
891
+
892
+ ```
893
+
894
+ ### Important
895
+
896
+ Selective deletion can intentionally leave generated files out of sync.
897
+
898
+ For normal icon removal, use:
899
+
900
+ ```bash
901
+
902
+ npm run delete -- Search
903
+
904
+ ```
905
+
906
+ If you intentionally perform a partial deletion and need to regenerate the project state from the remaining SVG sources, run:
907
+
908
+ ```bash
909
+
910
+ npm run generate
911
+
912
+ ```
913
+
914
+ ---
915
+
916
+ # Iconora CLI Architecture
917
+
918
+ Iconora's built-in CLIs are organized as a pipeline rather than as unrelated utilities.
919
+
920
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
921
+ โ”‚ External Icon Source โ”‚
922
+ โ”‚ Lucide GitHub Repository โ”‚
923
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
924
+ โ”‚
925
+ โ–ผ
926
+ npm run import:lucide
927
+ โ”‚
928
+ โ–ผ
929
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
930
+ โ”‚ Iconora Source Layer โ”‚
931
+ โ”‚ icons/*.svg โ”‚
932
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
933
+ โ”‚
934
+ โ–ผ
935
+ npm run validate
936
+ โ”‚
937
+ โ–ผ
938
+ npm run generate
939
+ โ”‚
940
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
941
+ โ–ผ โ–ผ โ–ผ
942
+ TSX index metadata
943
+ โ”‚ โ”‚ โ”‚
944
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
945
+ โ–ผ
946
+ npm run check
947
+ โ”‚
948
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
949
+ โ–ผ โ–ผ โ–ผ
950
+ typecheck tests build
951
+ โ”‚
952
+ โ–ผ
953
+ ๐Ÿ“ฆ Iconora
954
+
955
+ This architecture gives Iconora a clear separation of concerns:
956
+
957
+ Import/derivation acquires external icon sources.
958
+
959
+ Source SVGs are the Iconora collection's source layer.
960
+
961
+ Validation checks source correctness.
962
+
963
+ Generation converts SVGs into the Iconora React/TypeScript architecture.
964
+
965
+ Metadata tooling provides icon information.
966
+
967
+ Deletion tooling manages the source and generated collection.
968
+
969
+ Verification ensures the package is production-ready.
970
+
971
+ The package is therefore not simply a wrapper around Lucide. Lucide can be one source used to derive the Iconora collection, while Iconora maintains its own source, generation, metadata, and package architecture.
972
+
973
+ ---
974
+
975
+ # Development
976
+
977
+ Clone the repository:
978
+
979
+ ```bash
980
+
981
+ git clone <repository-url>
982
+
983
+ ```
984
+
985
+ Enter the project:
986
+
987
+ ```bash
988
+
989
+ cd iconora
990
+
991
+ ```
992
+
993
+ Install dependencies:
994
+
995
+ ```bash
996
+
997
+ npm install
998
+
999
+ ```
1000
+
1001
+ ---
1002
+
1003
+ ## Development Commands
1004
+
1005
+ ### Validate SVG icons
1006
+
1007
+ ```bash
1008
+
1009
+ npm run validate
1010
+
1011
+ ```
1012
+
1013
+ ### Generate icon components
1014
+
1015
+ ```bash
1016
+
1017
+ npm run generate
1018
+
1019
+ ```
1020
+
1021
+ ### Delete an icon
1022
+
1023
+ ```bash
1024
+
1025
+ npm run delete -- IconName
1026
+
1027
+ ```
1028
+
1029
+ ### Get icon metadata
1030
+
1031
+ ```bash
1032
+
1033
+ npm run getMetadata -- IconName
1034
+
1035
+ ```
1036
+
1037
+ ### Check the complete project
1038
+
1039
+ ```bash
1040
+
1041
+ npm run check
1042
+
1043
+ ```
1044
+
1045
+ ### Typecheck
1046
+
1047
+ ```bash
1048
+
1049
+ npm run typecheck
1050
+
1051
+ ```
1052
+
1053
+ ### Run tests once
1054
+
1055
+ ```bash
1056
+
1057
+ npm run test:run
1058
+
1059
+ ```
1060
+
1061
+ ### Run tests in development mode
1062
+
1063
+ ```bash
1064
+
1065
+ npm run test
1066
+
1067
+ ```
1068
+
1069
+ ### Run tests in watch mode
1070
+
1071
+ ```bash
1072
+
1073
+ npm run test:watch
1074
+
1075
+ ```
1076
+
1077
+ ### Build the package
1078
+
1079
+ ```bash
1080
+
1081
+ npm run build
1082
+
1083
+ ```
1084
+
1085
+ For a detailed explanation of every command, see:
1086
+
1087
+ ```text
1088
+
1089
+ docs/commands.md
1090
+
1091
+ ```
1092
+
1093
+ ---
1094
+
1095
+ # Project Structure
1096
+
1097
+ ```text
1098
+
1099
+ iconora/
1100
+
1101
+ โ”‚
1102
+
1103
+ โ”œโ”€โ”€ icons/
1104
+
1105
+ โ”‚ ย  โ”œโ”€โ”€ search.svg
1106
+
1107
+ โ”‚ ย  โ””โ”€โ”€ x.svg
1108
+
1109
+ โ”‚
1110
+
1111
+ โ”œโ”€โ”€ src/
1112
+
1113
+ โ”‚ ย  โ”œโ”€โ”€ components/
1114
+
1115
+ โ”‚ ย  โ”‚ ย  โ””โ”€โ”€ IconBase.tsx
1116
+
1117
+ โ”‚ ย  โ”‚
1118
+
1119
+ โ”‚ ย  โ”œโ”€โ”€ icons/
1120
+
1121
+ โ”‚ ย  โ”‚ ย  โ”œโ”€โ”€ Search.tsx
1122
+
1123
+ โ”‚ ย  โ”‚ ย  โ””โ”€โ”€ X.tsx
1124
+
1125
+ โ”‚ ย  โ”‚
1126
+
1127
+ โ”‚ ย  โ”œโ”€โ”€ metadata/
1128
+
1129
+ โ”‚ ย  โ”‚ ย  โ”œโ”€โ”€ icons.json
1130
+
1131
+ โ”‚ ย  โ”‚ ย  โ””โ”€โ”€ types.ts
1132
+
1133
+ โ”‚ ย  โ”‚
1134
+
1135
+ โ”‚ ย  โ”œโ”€โ”€ types.ts
1136
+
1137
+ โ”‚ ย  โ””โ”€โ”€ index.ts
1138
+
1139
+ โ”‚
1140
+
1141
+ โ”œโ”€โ”€ scripts/
1142
+
1143
+ โ”‚ ย  โ”œโ”€โ”€ check.ts
1144
+
1145
+ โ”‚ ย  โ”œโ”€โ”€ delete-icons.ts
1146
+
1147
+ โ”‚ ย  โ”œโ”€โ”€ generate-icons.ts
1148
+
1149
+ โ”‚ ย  โ”œโ”€โ”€ get-metadata.ts
1150
+
1151
+ โ”‚ ย  โ””โ”€โ”€ validate-icons.ts
1152
+
1153
+ โ”‚
1154
+
1155
+ โ”œโ”€โ”€ tests/
1156
+
1157
+ โ”‚ ย  โ”œโ”€โ”€ icons.test.tsx
1158
+
1159
+ โ”‚ ย  โ””โ”€โ”€ setup.ts
1160
+
1161
+ โ”‚
1162
+
1163
+ โ”œโ”€โ”€ docs/
1164
+
1165
+ โ”‚ ย  โ””โ”€โ”€ commands.md
1166
+
1167
+ โ”‚
1168
+
1169
+ โ”œโ”€โ”€ .gitignore
1170
+
1171
+ โ”œโ”€โ”€ LICENSE
1172
+
1173
+ โ”œโ”€โ”€ README.md
1174
+
1175
+ โ”œโ”€โ”€ package.json
1176
+
1177
+ โ”œโ”€โ”€ package-lock.json
1178
+
1179
+ โ”œโ”€โ”€ tsconfig.json
1180
+
1181
+ โ””โ”€โ”€ tsup.config.ts
1182
+
1183
+ ```
1184
+
1185
+ ---
1186
+
1187
+ # Source of Truth
1188
+
1189
+ The most important rule in Iconora is:
1190
+
1191
+ ```text
1192
+
1193
+ icons/
1194
+
1195
+ ```
1196
+
1197
+ is the **source of truth**.
1198
+
1199
+ The SVG files inside `icons/` are the original icon sources.
1200
+
1201
+ Generated files include:
1202
+
1203
+ ```text
1204
+
1205
+ src/icons/
1206
+
1207
+ src/index.ts
1208
+
1209
+ src/metadata/icons.json
1210
+
1211
+ ```
1212
+
1213
+ These files should normally **not be edited manually**.
1214
+
1215
+ The intended architecture is:
1216
+
1217
+ ```text
1218
+
1219
+ ย  ย  ย  ย  ย  ย  ย  SVG SOURCE
1220
+
1221
+ ย  ย  ย  ย  ย  ย  ย  ย  ย  โ”‚
1222
+
1223
+ ย  ย  ย  ย  ย  ย  ย  ย  ย  โ–ผ
1224
+
1225
+ ย  ย  ย  ย  ย  ย  ย  icons/*.svg
1226
+
1227
+ ย  ย  ย  ย  ย  ย  ย  ย  ย  โ”‚
1228
+
1229
+ ย  ย  ย  ย  ย  ย  ย  ย  ย  โ–ผ
1230
+
1231
+ ย  ย  ย  ย  ย  npm run validate
1232
+
1233
+ ย  ย  ย  ย  ย  ย  ย  ย  ย  โ”‚
1234
+
1235
+ ย  ย  ย  ย  ย  ย  ย  ย  ย  โ–ผ
1236
+
1237
+ ย  ย  ย  ย  ย  ย npm run generate
1238
+
1239
+ ย  ย  ย  ย  ย  ย  ย  ย  ย  โ”‚
1240
+
1241
+ ย  ย  ย  ย  ย  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1242
+
1243
+ ย  ย  ย  ย  ย  โ–ผ ย  ย  ย  โ–ผ ย  ย  ย  ย โ–ผ
1244
+
1245
+ ย  ย  ย  ย  TSX ย  ย  index ย  metadata
1246
+
1247
+ ย  ย  ย  ย  ย  โ”‚ ย  ย  ย  โ”‚ ย  ย  ย  ย โ”‚
1248
+
1249
+ ย  ย  ย  ย  ย  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1250
+
1251
+ ย  ย  ย  ย  ย  ย  ย  ย  ย  โ–ผ
1252
+
1253
+ ย  ย  ย  ย  ย  ย  ย npm run check
1254
+
1255
+ ย  ย  ย  ย  ย  ย  ย  ย  ย  โ”‚
1256
+
1257
+ ย  ย  ย  ย  ย  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1258
+
1259
+ ย  ย  ย  ย  ย  โ–ผ ย  ย  ย  โ–ผ ย  ย  ย  ย โ–ผ
1260
+
1261
+ ย  ย  ย typecheck ย  tests ย  ย build
1262
+
1263
+ ย  ย  ย  ย  ย  โ”‚ ย  ย  ย  โ”‚ ย  ย  ย  ย โ”‚
1264
+
1265
+ ย  ย  ย  ย  ย  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1266
+
1267
+ ย  ย  ย  ย  ย  ย  ย  ย  ย  โ–ผ
1268
+
1269
+ ย  ย  ย  ย  ย  ย  ย  ๐Ÿ“ฆ Iconora
1270
+
1271
+ ```
1272
+
1273
+ ---
1274
+
1275
+ # Production Verification
1276
+
1277
+ Before publishing a version of Iconora, run:
1278
+
1279
+ ```bash
1280
+
1281
+ npm run validate
1282
+
1283
+ npm run generate
1284
+
1285
+ npm run check
1286
+
1287
+ ```
1288
+
1289
+ The `check` command automatically runs:
1290
+
1291
+ ```bash
1292
+
1293
+ npm run typecheck
1294
+
1295
+ npm run test:run
1296
+
1297
+ npm run build
1298
+
1299
+ ```
1300
+
1301
+ Therefore, the complete production workflow is:
1302
+
1303
+ ```text
1304
+
1305
+ npm run validate
1306
+
1307
+ ย  ย  ย  ย  โ†“
1308
+
1309
+ npm run generate
1310
+
1311
+ ย  ย  ย  ย  โ†“
1312
+
1313
+ npm run check
1314
+
1315
+ ย  ย  ย  ย  โ†“
1316
+
1317
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1318
+
1319
+ โ”‚ TypeScript ย  ย  ย  ย โ”‚
1320
+
1321
+ โ”‚ Tests ย  ย  ย  ย  ย  ย  โ”‚
1322
+
1323
+ โ”‚ Production Build ย โ”‚
1324
+
1325
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1326
+
1327
+ ย  ย  ย  ย  โ†“
1328
+
1329
+ ย  ย โœ“ Ready to publish
1330
+
1331
+ ```
1332
+
1333
+ All commands should complete successfully.
1334
+
1335
+ If any command fails, **do not publish the package** until the issue has been resolved.
1336
+
1337
+ ---
1338
+
1339
+ # Roadmap
1340
+
1341
+ - [x] Initial npm package setup
1342
+
1343
+ - [x] TypeScript support
1344
+
1345
+ - [x] React support
1346
+
1347
+ - [x] SVG icon architecture
1348
+
1349
+ - [x] Initial icons
1350
+
1351
+ - [x] Local package testing
1352
+
1353
+ - [x] Automated SVG validation
1354
+
1355
+ - [x] Automated SVG โ†’ TSX generation
1356
+
1357
+ - [x] Automatic icon exports
1358
+
1359
+ - [x] Automatic icon metadata generation
1360
+
1361
+ - [x] Aggregated icon tests
1362
+
1363
+ - [x] Type checking
1364
+
1365
+ - [x] ESM build
1366
+
1367
+ - [x] CommonJS build
1368
+
1369
+ - [x] Type declaration generation
1370
+
1371
+ - [x] Icon deletion CLI
1372
+
1373
+ - [x] Metadata inspection CLI
1374
+
1375
+ - [x] Project verification CLI
1376
+
1377
+ - [x] Command documentation
1378
+
1379
+ - [ ] Expand icon collection
1380
+
1381
+ - [ ] Add continuous integration
1382
+
1383
+ - [ ] Improve package tooling
1384
+
1385
+ - [ ] Publish stable release to npm
1386
+
1387
+ - [ ] Expand documentation
1388
+
1389
+ - [ ] Build Iconora documentation website
1390
+
1391
+ ---
1392
+
1393
+ # License
1394
+
1395
+ Iconora is released under the MIT License.
1396
+
1397
+ You are free to use, modify, and redistribute Iconora in personal, commercial, educational, and other projects, subject to the terms of the MIT License.
1398
+
1399
+ The license grants permission to use and modify the software; it does not transfer ownership or intellectual property rights in the original Iconora project or its original assets.
1400
+
1401
+ See the [LICENSE](LICENSE) file for the complete license text.
1402
+
1403
+ ---
1404
+
1405
+ # Contributing
1406
+
1407
+ Contributions, suggestions, bug reports, and new icon ideas are welcome.
1408
+
1409
+ If you want to contribute a new icon:
1410
+
1411
+ 1. Add the SVG to `icons/`.
1412
+
1413
+ 2. Run `npm run validate`.
1414
+
1415
+ 3. Run `npm run generate`.
1416
+
1417
+ 4. Run `npm run check`.
1418
+
1419
+ 5. Submit your changes.
1420
+
1421
+ The `check` command automatically runs:
1422
+
1423
+ ```text
1424
+
1425
+ TypeScript typecheck
1426
+
1427
+ Tests
1428
+
1429
+ Production build
1430
+
1431
+ ```
1432
+
1433
+ Please do not manually edit generated icon files unless you are specifically working on the generation system itself.
1434
+
1435
+ ---
1436
+
1437
+ # Documentation
1438
+
1439
+ Detailed command documentation is available at:
1440
+
1441
+ ```text
1442
+
1443
+ docs/commands.md
1444
+
1445
+ ```
1446
+
1447
+ The command documentation covers:
1448
+
1449
+ - SVG validation
1450
+
1451
+ - Icon generation
1452
+
1453
+ - Icon deletion
1454
+
1455
+ - Metadata generation
1456
+
1457
+ - Metadata inspection
1458
+
1459
+ - Project verification
1460
+
1461
+ - Type checking
1462
+
1463
+ - Testing
1464
+
1465
+ - Test watch mode
1466
+
1467
+ - Production builds
1468
+
1469
+ - Recommended development workflows
1470
+
1471
+ ---
1472
+
1473
+ Made with โค๏ธ for React developers.
1474
+
1475
+ **Iconora โ€” Simple icons. Your way.**