@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.
- package/CHANGELOG.md +112 -0
- package/README.md +288 -49
- package/dist/brand/index.cjs +2 -2
- package/dist/brand/index.js +3 -3
- package/dist/chart/index.cjs +129 -2
- package/dist/chart/index.d.cts +114 -4
- package/dist/chart/index.d.ts +114 -4
- package/dist/chart/index.js +129 -5
- package/dist/{chunk-PMN7NR3G.js → chunk-5A5GH2PF.js} +1 -1
- package/dist/{chunk-DKCN7BAL.js → chunk-6IGD5REB.js} +1 -1
- package/dist/{chunk-XKYHTOUJ.js → chunk-FAAGZG7A.js} +1 -1
- package/dist/{chunk-O4TAH7YJ.js → chunk-FGFNK72B.js} +29 -5
- package/dist/chunk-HOADZ6GS.js +72 -0
- package/dist/chunk-LXRGQKMG.js +145 -0
- package/dist/{chunk-6O3KWB6P.js → chunk-MPZBF2TZ.js} +2 -2
- package/dist/{chunk-JMOOFZ3B.js → chunk-TRPBID2W.js} +1 -1
- package/dist/{chunk-25YNFCIF.js → chunk-XXDATT3A.js} +6 -3
- package/dist/doctor.mjs +248 -0
- package/dist/form/index.cjs +2 -2
- package/dist/form/index.d.cts +1 -1
- package/dist/form/index.d.ts +1 -1
- package/dist/form/index.js +4 -4
- package/dist/icons/index.cjs +149 -0
- package/dist/icons/index.d.cts +94 -0
- package/dist/icons/index.d.ts +94 -0
- package/dist/icons/index.js +28 -0
- package/dist/index-BbRplw_B.d.cts +58 -0
- package/dist/index-BbRplw_B.d.ts +58 -0
- package/dist/index.cjs +425 -251
- package/dist/index.d.cts +303 -104
- package/dist/index.d.ts +303 -104
- package/dist/index.js +283 -285
- package/dist/{label-MgHFKnFy.d.ts → label-DJ4HuD-R.d.cts} +3 -2
- package/dist/{label-MgHFKnFy.d.cts → label-DJ4HuD-R.d.ts} +3 -2
- package/dist/og/index.cjs +3 -2
- package/dist/og/index.js +1 -1
- package/dist/shiki/index.js +1 -1
- package/dist/social/data.cjs +161 -0
- package/dist/social/data.d.cts +161 -0
- package/dist/social/data.d.ts +161 -0
- package/dist/social/data.js +2 -0
- package/dist/social/index.cjs +153 -0
- package/dist/social/index.d.cts +2 -0
- package/dist/social/index.d.ts +2 -0
- package/dist/social/index.js +3 -0
- package/dist/tokens/index.cjs +29 -5
- package/dist/tokens/index.d.cts +37 -10
- package/dist/tokens/index.d.ts +37 -10
- package/dist/tokens/index.js +2 -2
- package/dist/tokens/theme.css +79 -22
- package/dist/variants/index.cjs +6 -3
- package/dist/variants/index.d.cts +6 -3
- package/dist/variants/index.d.ts +6 -3
- package/dist/variants/index.js +1 -1
- package/llms.txt +530 -80
- 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 };
|