@eduardoalvarez/arrecife 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/README.md +288 -49
  3. package/dist/brand/index.cjs +2 -2
  4. package/dist/brand/index.js +3 -3
  5. package/dist/chart/index.cjs +129 -2
  6. package/dist/chart/index.d.cts +114 -4
  7. package/dist/chart/index.d.ts +114 -4
  8. package/dist/chart/index.js +129 -5
  9. package/dist/{chunk-PMN7NR3G.js → chunk-5A5GH2PF.js} +1 -1
  10. package/dist/{chunk-DKCN7BAL.js → chunk-6IGD5REB.js} +1 -1
  11. package/dist/{chunk-XKYHTOUJ.js → chunk-FAAGZG7A.js} +1 -1
  12. package/dist/{chunk-O4TAH7YJ.js → chunk-FGFNK72B.js} +29 -5
  13. package/dist/chunk-HOADZ6GS.js +72 -0
  14. package/dist/chunk-LXRGQKMG.js +145 -0
  15. package/dist/{chunk-6O3KWB6P.js → chunk-MPZBF2TZ.js} +2 -2
  16. package/dist/{chunk-JMOOFZ3B.js → chunk-TRPBID2W.js} +1 -1
  17. package/dist/{chunk-25YNFCIF.js → chunk-XXDATT3A.js} +6 -3
  18. package/dist/doctor.mjs +248 -0
  19. package/dist/form/index.cjs +2 -2
  20. package/dist/form/index.d.cts +1 -1
  21. package/dist/form/index.d.ts +1 -1
  22. package/dist/form/index.js +4 -4
  23. package/dist/icons/index.cjs +149 -0
  24. package/dist/icons/index.d.cts +94 -0
  25. package/dist/icons/index.d.ts +94 -0
  26. package/dist/icons/index.js +28 -0
  27. package/dist/index-BbRplw_B.d.cts +58 -0
  28. package/dist/index-BbRplw_B.d.ts +58 -0
  29. package/dist/index.cjs +425 -251
  30. package/dist/index.d.cts +303 -104
  31. package/dist/index.d.ts +303 -104
  32. package/dist/index.js +283 -285
  33. package/dist/{label-MgHFKnFy.d.ts → label-DJ4HuD-R.d.cts} +3 -2
  34. package/dist/{label-MgHFKnFy.d.cts → label-DJ4HuD-R.d.ts} +3 -2
  35. package/dist/og/index.cjs +3 -2
  36. package/dist/og/index.js +1 -1
  37. package/dist/shiki/index.js +1 -1
  38. package/dist/social/data.cjs +161 -0
  39. package/dist/social/data.d.cts +161 -0
  40. package/dist/social/data.d.ts +161 -0
  41. package/dist/social/data.js +2 -0
  42. package/dist/social/index.cjs +153 -0
  43. package/dist/social/index.d.cts +2 -0
  44. package/dist/social/index.d.ts +2 -0
  45. package/dist/social/index.js +3 -0
  46. package/dist/tokens/index.cjs +29 -5
  47. package/dist/tokens/index.d.cts +37 -10
  48. package/dist/tokens/index.d.ts +37 -10
  49. package/dist/tokens/index.js +2 -2
  50. package/dist/tokens/theme.css +79 -22
  51. package/dist/variants/index.cjs +6 -3
  52. package/dist/variants/index.d.cts +6 -3
  53. package/dist/variants/index.d.ts +6 -3
  54. package/dist/variants/index.js +1 -1
  55. package/llms.txt +530 -80
  56. package/package.json +29 -2
@@ -0,0 +1,149 @@
1
+ 'use strict';
2
+
3
+ var clsx = require('clsx');
4
+ var tailwindMerge = require('tailwind-merge');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ // src/lib/cn.ts
8
+ var typeScale = {
9
+ display: { family: "display", size: 76, lineHeight: 0.96, weight: 800, tracking: "-0.035em" },
10
+ /** Large metrics. Numbers, not prose: line height 1 and no descenders. */
11
+ stat: { family: "display", size: 46, lineHeight: 1, weight: 800, tracking: "-0.035em" },
12
+ h1: { family: "display", size: 44, lineHeight: 1.05, weight: 700, tracking: "-0.03em" },
13
+ h2: { family: "display", size: 30, lineHeight: 1.1, weight: 600, tracking: "-0.02em" },
14
+ h3: { family: "display", size: 25, lineHeight: 1.15, weight: 600, tracking: "-0.02em" },
15
+ body: { family: "sans", size: 18, lineHeight: 1.75, weight: 400 },
16
+ /**
17
+ * 17px. The large button, and the deck on interior pages.
18
+ *
19
+ * It earns its own step because the identity document uses it TWICE, in two
20
+ * different pieces: «lg 15/30 r12» with 17px text, and «h1 44/700 · deck 17px
21
+ * · context paragraph 15px». One use would not have justified splitting the
22
+ * gap between `ui` (15) and `body` (18); two did.
23
+ */
24
+ lead: { family: "sans", size: 17, lineHeight: 1.5, weight: 400 },
25
+ ui: { family: "sans", size: 15, lineHeight: 1.6, weight: 400 },
26
+ label: { family: "sans", size: 13, lineHeight: 1.5, weight: 500 },
27
+ /**
28
+ * The status-badge scale: sans 12.5/500, squared off.
29
+ *
30
+ * That is half a pixel below `label`, and this time the half pixel matters: a
31
+ * status badge sits inside a table or next to a title, and at 13 it competed
32
+ * with the text it accompanies. The document specifies 12.5 and it shows.
33
+ */
34
+ tag: { family: "sans", size: 12.5, lineHeight: 1.4, weight: 500 },
35
+ /**
36
+ * The category and metric scale: mono 11.5.
37
+ *
38
+ * It breaks the floor set by `limits.minScreenPx`, deliberately. That floor
39
+ * protects TEXT — what you read in a sentence — and a one-word pill is not
40
+ * running text: it is a mark. Contrast is still measured and still passes AA
41
+ * (plankton 5.57:1 over abyss), which is the part that is not negotiable.
42
+ *
43
+ * At 13 the three badge families grew past the size of a small button and
44
+ * outweighed the title they accompany. See `docs/decisions/`.
45
+ */
46
+ chip: { family: "mono", size: 11.5, lineHeight: 1.4, weight: 400 },
47
+ /**
48
+ * Mono with NO transform: dates, paths, versions, file names, the footer
49
+ * signature and metric labels. It is most of the mono in the system.
50
+ *
51
+ * It exists because `eyebrow` ships `uppercase` and that is not a preference
52
+ * you can switch off: it IS the eyebrow scale. An `18 Aug 2026` in small caps
53
+ * or a `pose-laptop-coffee.png` in all caps are wrong, and without this step
54
+ * the only way out was a `normal-case` at every call site.
55
+ *
56
+ * The document says 12.5. This is 13 for the same reason `textMuted` was
57
+ * corrected: `limits.minScreenPx` is 13 and plankton is «never under 13px».
58
+ * This scale is exactly where muted metadata gets written, so putting it at
59
+ * 12.5 would have made its most common use illegible by half a pixel.
60
+ */
61
+ meta: { family: "mono", size: 13, lineHeight: 1.6, weight: 400 },
62
+ eyebrow: { family: "mono", size: 12, tracking: "0.12em", transform: "uppercase" }
63
+ };
64
+ var radius = {
65
+ chip: 6,
66
+ control: 10,
67
+ card: 14,
68
+ panel: 16,
69
+ pill: 999
70
+ };
71
+ var control = {
72
+ sm: 14,
73
+ md: 22,
74
+ lg: 30,
75
+ /** Icon button: square, no text. */
76
+ icon: 42,
77
+ /**
78
+ * The dense icon button, 32×32.
79
+ *
80
+ * 42 is the right measure for a control you hit with a thumb, and the four
81
+ * reading sites are where that fits. `cursos` is the odd one out: it is the
82
+ * only admin app of the set, with three actions per table row, and at 42 the
83
+ * row grows with them — the original used 24 and 28.
84
+ *
85
+ * It is 32 and not 28 because 32 is `sm`'s height. A dense icon button lines
86
+ * up with a small text button, so a toolbar mixing the two stays on one
87
+ * baseline; 28 would have been a fifth height that matches nothing.
88
+ *
89
+ * It does not replace `icon`. A page's primary action stays at 42; this is for
90
+ * a row of a table. See `docs/decisions/0.6.md` § 22.
91
+ */
92
+ iconSm: 32
93
+ };
94
+ var spacing = {
95
+ stepXs: 8,
96
+ stepSm: 12,
97
+ stepMd: 16,
98
+ stepLg: 26,
99
+ stepXl: 40,
100
+ section: 96
101
+ };
102
+
103
+ // src/lib/cn.ts
104
+ var kebab = (name) => name.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
105
+ var scales = Object.keys(typeScale);
106
+ var radii = Object.keys(radius);
107
+ var namespaces = Object.keys(spacing).map(kebab);
108
+ var controls = Object.keys(control).map((name) => `control-${kebab(name)}`);
109
+ var twMerge = tailwindMerge.extendTailwindMerge({
110
+ extend: {
111
+ classGroups: {
112
+ "font-size": [{ text: scales }],
113
+ rounded: [{ rounded: radii }],
114
+ p: [{ p: namespaces }],
115
+ px: [{ px: [...namespaces, ...controls] }],
116
+ py: [{ py: namespaces }],
117
+ gap: [{ gap: namespaces }],
118
+ size: [{ size: controls }]
119
+ }
120
+ }
121
+ });
122
+ function cn(...inputs) {
123
+ return twMerge(clsx.clsx(inputs));
124
+ }
125
+ var ICON_WEIGHT = "regular";
126
+ var TONE_WEIGHT = {
127
+ action: ICON_WEIGHT,
128
+ current: "fill",
129
+ quiet: "light"
130
+ };
131
+ function Icon({ as: Glyph, tone = "action", label, className, ...props }) {
132
+ return /* @__PURE__ */ jsxRuntime.jsx(
133
+ Glyph,
134
+ {
135
+ size: "1em",
136
+ weight: TONE_WEIGHT[tone],
137
+ "aria-hidden": label ? void 0 : true,
138
+ "aria-label": label,
139
+ role: label ? "img" : void 0,
140
+ focusable: "false",
141
+ className: cn("shrink-0", className),
142
+ ...props
143
+ }
144
+ );
145
+ }
146
+
147
+ exports.ICON_WEIGHT = ICON_WEIGHT;
148
+ exports.Icon = Icon;
149
+ exports.TONE_WEIGHT = TONE_WEIGHT;
@@ -0,0 +1,94 @@
1
+ import * as react from 'react';
2
+ import { IconWeight, IconProps as IconProps$1, Icon as Icon$1 } from '@phosphor-icons/react';
3
+
4
+ /**
5
+ * The system adopts `@phosphor-icons/react`, and this is the whole of what
6
+ * «adopts» means: an optional peer dependency, and one place that fixes what a
7
+ * call site was getting wrong on its own.
8
+ *
9
+ * WHY IT IS HERE AT ALL. The position used to be that the system has no icons.
10
+ * That was right for what the library was — five reading sites, where
11
+ * `lib/glyphs.tsx` covers everything a primitive needs — and it stopped being
12
+ * right when an admin panel arrived. Measured across the four consumers, the one
13
+ * admin app imports 89 distinct icons in 229 places and the other three import
14
+ * 9, 0 and 0. Seventy-seven of the 89 are domain icons for a course admin —
15
+ * `GraduationCap`, `TicketPercent`, `Webhook` — and no design system was ever
16
+ * going to ship them. The set is not the problem.
17
+ *
18
+ * WHAT WAS ACTUALLY BROKEN is that nobody said how they should be DRAWN, so they
19
+ * were sized by hand in five different ways — `size-4` twenty-six times, then
20
+ * `size-3.5`, `size-3`, `size-6`, `size-7` — with no rule behind any of them.
21
+ *
22
+ * WHY PHOSPHOR AND NOT A STROKE-WIDTH SET. Phosphor bakes the weight into the
23
+ * path instead of exposing `strokeWidth`, and its `regular` lands almost exactly
24
+ * on the one stroke the identity document names. Measured on `Minus`, whose
25
+ * regular path is a bar of radius 8 on a 256 grid:
26
+ *
27
+ * phosphor regular 16/256 = 0.0625em
28
+ * the document 1.6/24 = 0.0667em «funcionales en trazo 1.6»
29
+ *
30
+ * Six per cent apart, which is no pixel on any screen. Nothing has to be derived
31
+ * and no number has to be invented: `regular` IS the system's line.
32
+ *
33
+ * THE SIZE IS 1em, which is Phosphor's own default and also the rule every icon
34
+ * in this library already follows. An icon beside `text-label` is 13px and
35
+ * beside `text-ui` is 15px, and nobody picks a number.
36
+ *
37
+ * THE WEIGHT IS AN AXIS, AND IT IS THE ONLY ONE AN ICON HAS. There are three
38
+ * roles and `tone` is how you name them; the weights themselves are not a prop,
39
+ * because Phosphor's other three — `thin`, `bold`, `duotone` — say nothing this
40
+ * system means. See `TONE_WEIGHT` below and `docs/decisions/0.7.md` § 35.
41
+ *
42
+ * `lib/glyphs.tsx` is the outlier and it is NOT reconciled here: it draws at
43
+ * 1.75 on a 16 grid, which is 0.109em — three quarters heavier than both the
44
+ * document and this. Aligning it restyles every primitive in the library and is
45
+ * its own change. See `docs/decisions/0.7.md` § 29.
46
+ *
47
+ * IN NEXT, IMPORT FROM `@phosphor-icons/react/ssr` inside a Server Component.
48
+ * Phosphor's default build reads `IconContext` through `useContext`, and a hook
49
+ * in a Server Component throws — it ships no `"use client"` to stop you. The
50
+ * `/ssr` entry is the same icons without the context read. This wrapper works
51
+ * with either.
52
+ */
53
+ type IconTone = 'action' | 'current' | 'quiet';
54
+ type IconProps = Omit<IconProps$1, 'size' | 'weight' | 'ref'> & {
55
+ /** The Phosphor icon itself, passed as a component: `<Icon as={Books} />`. */
56
+ as: Icon$1;
57
+ /**
58
+ * WHAT THE ICON IS DOING, which is what picks the weight. Three values, and
59
+ * there is no fourth: `action` is the default and the system's line, `current`
60
+ * is the one of a set you are on, `quiet` is furniture that is not a control.
61
+ * `weight` is deliberately not a prop — see `TONE_WEIGHT`.
62
+ */
63
+ tone?: IconTone | undefined;
64
+ /**
65
+ * The accessible name. WITHOUT it the icon is decorative and gets
66
+ * `aria-hidden`, which is the right default: most icons sit beside their own
67
+ * label and announcing them twice is noise.
68
+ *
69
+ * If the icon is inside a button with no text, the name belongs on the BUTTON
70
+ * and not here — that is what `Button size="icon"` asks for.
71
+ */
72
+ label?: string | undefined;
73
+ };
74
+ /** Phosphor's own name for the system's line. It is what `tone="action"` resolves to. */
75
+ declare const ICON_WEIGHT: IconWeight;
76
+ /**
77
+ * The three roles, and the weight each one is drawn at. This is the whole of the
78
+ * weight axis: Phosphor ships six and this system reads three, because the other
79
+ * three — `thin`, `bold`, `duotone` — have no role behind them here.
80
+ *
81
+ * `current` is the one that earns the axis. A sidebar's active item already
82
+ * carries `aria-current="page"` and paints itself biolume, and colour alone is
83
+ * the one channel WCAG 1.4.1 says may not carry meaning by itself. A filled
84
+ * glyph is the second channel, and it survives a forced-colours mode where the
85
+ * biolume does not.
86
+ *
87
+ * `quiet` is for the icon that is not a control and not a state — a marker in a
88
+ * metadata row, a bullet that happens to be a shape. At `regular` it competes
89
+ * with the text it is annotating; at `light` it sits under it.
90
+ */
91
+ declare const TONE_WEIGHT: Record<IconTone, IconWeight>;
92
+ declare function Icon({ as: Glyph, tone, label, className, ...props }: IconProps): react.JSX.Element;
93
+
94
+ export { ICON_WEIGHT, Icon, type IconProps, type IconTone, TONE_WEIGHT };
@@ -0,0 +1,94 @@
1
+ import * as react from 'react';
2
+ import { IconWeight, IconProps as IconProps$1, Icon as Icon$1 } from '@phosphor-icons/react';
3
+
4
+ /**
5
+ * The system adopts `@phosphor-icons/react`, and this is the whole of what
6
+ * «adopts» means: an optional peer dependency, and one place that fixes what a
7
+ * call site was getting wrong on its own.
8
+ *
9
+ * WHY IT IS HERE AT ALL. The position used to be that the system has no icons.
10
+ * That was right for what the library was — five reading sites, where
11
+ * `lib/glyphs.tsx` covers everything a primitive needs — and it stopped being
12
+ * right when an admin panel arrived. Measured across the four consumers, the one
13
+ * admin app imports 89 distinct icons in 229 places and the other three import
14
+ * 9, 0 and 0. Seventy-seven of the 89 are domain icons for a course admin —
15
+ * `GraduationCap`, `TicketPercent`, `Webhook` — and no design system was ever
16
+ * going to ship them. The set is not the problem.
17
+ *
18
+ * WHAT WAS ACTUALLY BROKEN is that nobody said how they should be DRAWN, so they
19
+ * were sized by hand in five different ways — `size-4` twenty-six times, then
20
+ * `size-3.5`, `size-3`, `size-6`, `size-7` — with no rule behind any of them.
21
+ *
22
+ * WHY PHOSPHOR AND NOT A STROKE-WIDTH SET. Phosphor bakes the weight into the
23
+ * path instead of exposing `strokeWidth`, and its `regular` lands almost exactly
24
+ * on the one stroke the identity document names. Measured on `Minus`, whose
25
+ * regular path is a bar of radius 8 on a 256 grid:
26
+ *
27
+ * phosphor regular 16/256 = 0.0625em
28
+ * the document 1.6/24 = 0.0667em «funcionales en trazo 1.6»
29
+ *
30
+ * Six per cent apart, which is no pixel on any screen. Nothing has to be derived
31
+ * and no number has to be invented: `regular` IS the system's line.
32
+ *
33
+ * THE SIZE IS 1em, which is Phosphor's own default and also the rule every icon
34
+ * in this library already follows. An icon beside `text-label` is 13px and
35
+ * beside `text-ui` is 15px, and nobody picks a number.
36
+ *
37
+ * THE WEIGHT IS AN AXIS, AND IT IS THE ONLY ONE AN ICON HAS. There are three
38
+ * roles and `tone` is how you name them; the weights themselves are not a prop,
39
+ * because Phosphor's other three — `thin`, `bold`, `duotone` — say nothing this
40
+ * system means. See `TONE_WEIGHT` below and `docs/decisions/0.7.md` § 35.
41
+ *
42
+ * `lib/glyphs.tsx` is the outlier and it is NOT reconciled here: it draws at
43
+ * 1.75 on a 16 grid, which is 0.109em — three quarters heavier than both the
44
+ * document and this. Aligning it restyles every primitive in the library and is
45
+ * its own change. See `docs/decisions/0.7.md` § 29.
46
+ *
47
+ * IN NEXT, IMPORT FROM `@phosphor-icons/react/ssr` inside a Server Component.
48
+ * Phosphor's default build reads `IconContext` through `useContext`, and a hook
49
+ * in a Server Component throws — it ships no `"use client"` to stop you. The
50
+ * `/ssr` entry is the same icons without the context read. This wrapper works
51
+ * with either.
52
+ */
53
+ type IconTone = 'action' | 'current' | 'quiet';
54
+ type IconProps = Omit<IconProps$1, 'size' | 'weight' | 'ref'> & {
55
+ /** The Phosphor icon itself, passed as a component: `<Icon as={Books} />`. */
56
+ as: Icon$1;
57
+ /**
58
+ * WHAT THE ICON IS DOING, which is what picks the weight. Three values, and
59
+ * there is no fourth: `action` is the default and the system's line, `current`
60
+ * is the one of a set you are on, `quiet` is furniture that is not a control.
61
+ * `weight` is deliberately not a prop — see `TONE_WEIGHT`.
62
+ */
63
+ tone?: IconTone | undefined;
64
+ /**
65
+ * The accessible name. WITHOUT it the icon is decorative and gets
66
+ * `aria-hidden`, which is the right default: most icons sit beside their own
67
+ * label and announcing them twice is noise.
68
+ *
69
+ * If the icon is inside a button with no text, the name belongs on the BUTTON
70
+ * and not here — that is what `Button size="icon"` asks for.
71
+ */
72
+ label?: string | undefined;
73
+ };
74
+ /** Phosphor's own name for the system's line. It is what `tone="action"` resolves to. */
75
+ declare const ICON_WEIGHT: IconWeight;
76
+ /**
77
+ * The three roles, and the weight each one is drawn at. This is the whole of the
78
+ * weight axis: Phosphor ships six and this system reads three, because the other
79
+ * three — `thin`, `bold`, `duotone` — have no role behind them here.
80
+ *
81
+ * `current` is the one that earns the axis. A sidebar's active item already
82
+ * carries `aria-current="page"` and paints itself biolume, and colour alone is
83
+ * the one channel WCAG 1.4.1 says may not carry meaning by itself. A filled
84
+ * glyph is the second channel, and it survives a forced-colours mode where the
85
+ * biolume does not.
86
+ *
87
+ * `quiet` is for the icon that is not a control and not a state — a marker in a
88
+ * metadata row, a bullet that happens to be a shape. At `regular` it competes
89
+ * with the text it is annotating; at `light` it sits under it.
90
+ */
91
+ declare const TONE_WEIGHT: Record<IconTone, IconWeight>;
92
+ declare function Icon({ as: Glyph, tone, label, className, ...props }: IconProps): react.JSX.Element;
93
+
94
+ export { ICON_WEIGHT, Icon, type IconProps, type IconTone, TONE_WEIGHT };
@@ -0,0 +1,28 @@
1
+ import { cn } from '../chunk-FAAGZG7A.js';
2
+ import '../chunk-FGFNK72B.js';
3
+ import '../chunk-MLKGABMK.js';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var ICON_WEIGHT = "regular";
7
+ var TONE_WEIGHT = {
8
+ action: ICON_WEIGHT,
9
+ current: "fill",
10
+ quiet: "light"
11
+ };
12
+ function Icon({ as: Glyph, tone = "action", label, className, ...props }) {
13
+ return /* @__PURE__ */ jsx(
14
+ Glyph,
15
+ {
16
+ size: "1em",
17
+ weight: TONE_WEIGHT[tone],
18
+ "aria-hidden": label ? void 0 : true,
19
+ "aria-label": label,
20
+ role: label ? "img" : void 0,
21
+ focusable: "false",
22
+ className: cn("shrink-0", className),
23
+ ...props
24
+ }
25
+ );
26
+ }
27
+
28
+ export { ICON_WEIGHT, Icon, TONE_WEIGHT };
@@ -0,0 +1,58 @@
1
+ import * as react from 'react';
2
+ import { SVGProps } from 'react';
3
+
4
+ /**
5
+ * What every icon in this catalogue accepts, and it is exported for one concrete
6
+ * reason: the grouped form exists so a project can ITERATE the catalogue, and
7
+ * typing `Record<string, ComponentType<…>>` needs a name for the element.
8
+ *
9
+ * There is no `GitHubProps`: ten identical signatures under ten names inform
10
+ * nobody, and the generator would print the same row ten times.
11
+ */
12
+ type SocialIconProps = SVGProps<SVGSVGElement>;
13
+ declare const GitHub: (props: SocialIconProps) => react.JSX.Element;
14
+ declare const LinkedIn: (props: SocialIconProps) => react.JSX.Element;
15
+ declare const X: (props: SocialIconProps) => react.JSX.Element;
16
+ declare const Instagram: (props: SocialIconProps) => react.JSX.Element;
17
+ declare const Discord: (props: SocialIconProps) => react.JSX.Element;
18
+ declare const YouTube: (props: SocialIconProps) => react.JSX.Element;
19
+ declare const Rss: (props: SocialIconProps) => react.JSX.Element;
20
+ declare const Email: (props: SocialIconProps) => react.JSX.Element;
21
+ /**
22
+ * The newsletter. It plays the same role as `Rss` — a way to follow, not a
23
+ * social network — which is why it belongs in this catalogue and does not open
24
+ * the door to an icon library.
25
+ *
26
+ * It is named for what it means and not for what it draws, like everything else
27
+ * in the system: it is a bell, and it is called `Newsletter`. `eduardoalvarez.dev`
28
+ * had it drawn in the project, following the contract by hand so it would not
29
+ * clash while it waited.
30
+ */
31
+ declare const Newsletter: (props: SocialIconProps) => react.JSX.Element;
32
+ /**
33
+ * «My other site»: the personal domain in a footer full of social networks.
34
+ *
35
+ * The tenth, and it got in by the same test as `Newsletter` rather than by being
36
+ * useful: it is a way to reach the author, it is not a network, and every one of
37
+ * the five projects has more than one domain. What it replaces is Phosphor's
38
+ * `Globe` in the footer of `cursos` — a correct globe drawn with another set's
39
+ * pen, in a row where the other six come from here.
40
+ */
41
+ declare const Website: (props: SocialIconProps) => react.JSX.Element;
42
+
43
+ declare const index_Discord: typeof Discord;
44
+ declare const index_Email: typeof Email;
45
+ declare const index_GitHub: typeof GitHub;
46
+ declare const index_Instagram: typeof Instagram;
47
+ declare const index_LinkedIn: typeof LinkedIn;
48
+ declare const index_Newsletter: typeof Newsletter;
49
+ declare const index_Rss: typeof Rss;
50
+ type index_SocialIconProps = SocialIconProps;
51
+ declare const index_Website: typeof Website;
52
+ declare const index_X: typeof X;
53
+ declare const index_YouTube: typeof YouTube;
54
+ declare namespace index {
55
+ export { index_Discord as Discord, index_Email as Email, index_GitHub as GitHub, index_Instagram as Instagram, index_LinkedIn as LinkedIn, index_Newsletter as Newsletter, index_Rss as Rss, type index_SocialIconProps as SocialIconProps, index_Website as Website, index_X as X, index_YouTube as YouTube };
56
+ }
57
+
58
+ export { Discord as D, Email as E, GitHub as G, Instagram as I, LinkedIn as L, Newsletter as N, Rss as R, type SocialIconProps as S, Website as W, X, YouTube as Y, index as i };
@@ -0,0 +1,58 @@
1
+ import * as react from 'react';
2
+ import { SVGProps } from 'react';
3
+
4
+ /**
5
+ * What every icon in this catalogue accepts, and it is exported for one concrete
6
+ * reason: the grouped form exists so a project can ITERATE the catalogue, and
7
+ * typing `Record<string, ComponentType<…>>` needs a name for the element.
8
+ *
9
+ * There is no `GitHubProps`: ten identical signatures under ten names inform
10
+ * nobody, and the generator would print the same row ten times.
11
+ */
12
+ type SocialIconProps = SVGProps<SVGSVGElement>;
13
+ declare const GitHub: (props: SocialIconProps) => react.JSX.Element;
14
+ declare const LinkedIn: (props: SocialIconProps) => react.JSX.Element;
15
+ declare const X: (props: SocialIconProps) => react.JSX.Element;
16
+ declare const Instagram: (props: SocialIconProps) => react.JSX.Element;
17
+ declare const Discord: (props: SocialIconProps) => react.JSX.Element;
18
+ declare const YouTube: (props: SocialIconProps) => react.JSX.Element;
19
+ declare const Rss: (props: SocialIconProps) => react.JSX.Element;
20
+ declare const Email: (props: SocialIconProps) => react.JSX.Element;
21
+ /**
22
+ * The newsletter. It plays the same role as `Rss` — a way to follow, not a
23
+ * social network — which is why it belongs in this catalogue and does not open
24
+ * the door to an icon library.
25
+ *
26
+ * It is named for what it means and not for what it draws, like everything else
27
+ * in the system: it is a bell, and it is called `Newsletter`. `eduardoalvarez.dev`
28
+ * had it drawn in the project, following the contract by hand so it would not
29
+ * clash while it waited.
30
+ */
31
+ declare const Newsletter: (props: SocialIconProps) => react.JSX.Element;
32
+ /**
33
+ * «My other site»: the personal domain in a footer full of social networks.
34
+ *
35
+ * The tenth, and it got in by the same test as `Newsletter` rather than by being
36
+ * useful: it is a way to reach the author, it is not a network, and every one of
37
+ * the five projects has more than one domain. What it replaces is Phosphor's
38
+ * `Globe` in the footer of `cursos` — a correct globe drawn with another set's
39
+ * pen, in a row where the other six come from here.
40
+ */
41
+ declare const Website: (props: SocialIconProps) => react.JSX.Element;
42
+
43
+ declare const index_Discord: typeof Discord;
44
+ declare const index_Email: typeof Email;
45
+ declare const index_GitHub: typeof GitHub;
46
+ declare const index_Instagram: typeof Instagram;
47
+ declare const index_LinkedIn: typeof LinkedIn;
48
+ declare const index_Newsletter: typeof Newsletter;
49
+ declare const index_Rss: typeof Rss;
50
+ type index_SocialIconProps = SocialIconProps;
51
+ declare const index_Website: typeof Website;
52
+ declare const index_X: typeof X;
53
+ declare const index_YouTube: typeof YouTube;
54
+ declare namespace index {
55
+ export { index_Discord as Discord, index_Email as Email, index_GitHub as GitHub, index_Instagram as Instagram, index_LinkedIn as LinkedIn, index_Newsletter as Newsletter, index_Rss as Rss, type index_SocialIconProps as SocialIconProps, index_Website as Website, index_X as X, index_YouTube as YouTube };
56
+ }
57
+
58
+ export { Discord as D, Email as E, GitHub as G, Instagram as I, LinkedIn as L, Newsletter as N, Rss as R, type SocialIconProps as S, Website as W, X, YouTube as Y, index as i };