tamga-ui 0.1.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/LICENSE +21 -0
- package/README.md +172 -0
- package/dist/blocks/count-row.d.ts +29 -0
- package/dist/blocks/count-row.d.ts.map +1 -0
- package/dist/blocks/count-row.js +19 -0
- package/dist/blocks/filter-bar.d.ts +123 -0
- package/dist/blocks/filter-bar.d.ts.map +1 -0
- package/dist/blocks/filter-bar.js +74 -0
- package/dist/blocks/index.d.ts +24 -0
- package/dist/blocks/index.d.ts.map +1 -0
- package/dist/blocks/index.js +23 -0
- package/dist/blocks/save-bar.d.ts +31 -0
- package/dist/blocks/save-bar.d.ts.map +1 -0
- package/dist/blocks/save-bar.js +21 -0
- package/dist/components/a11y.d.ts +21 -0
- package/dist/components/a11y.d.ts.map +1 -0
- package/dist/components/a11y.js +159 -0
- package/dist/components/advanced-input.d.ts +115 -0
- package/dist/components/advanced-input.d.ts.map +1 -0
- package/dist/components/advanced-input.js +189 -0
- package/dist/components/avatar.d.ts +63 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +54 -0
- package/dist/components/badge.d.ts +37 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +29 -0
- package/dist/components/bar.d.ts +32 -0
- package/dist/components/bar.d.ts.map +1 -0
- package/dist/components/bar.js +33 -0
- package/dist/components/button.d.ts +45 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +56 -0
- package/dist/components/chart.d.ts +43 -0
- package/dist/components/chart.d.ts.map +1 -0
- package/dist/components/chart.js +41 -0
- package/dist/components/checkbox.d.ts +13 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +16 -0
- package/dist/components/chrome.d.ts +87 -0
- package/dist/components/chrome.d.ts.map +1 -0
- package/dist/components/chrome.js +107 -0
- package/dist/components/combobox.d.ts +31 -0
- package/dist/components/combobox.d.ts.map +1 -0
- package/dist/components/combobox.js +62 -0
- package/dist/components/control-base.d.ts +7 -0
- package/dist/components/control-base.d.ts.map +1 -0
- package/dist/components/control-base.js +6 -0
- package/dist/components/data-table.d.ts +68 -0
- package/dist/components/data-table.d.ts.map +1 -0
- package/dist/components/data-table.js +50 -0
- package/dist/components/date-picker.d.ts +52 -0
- package/dist/components/date-picker.d.ts.map +1 -0
- package/dist/components/date-picker.js +73 -0
- package/dist/components/disclosure.d.ts +31 -0
- package/dist/components/disclosure.d.ts.map +1 -0
- package/dist/components/disclosure.js +32 -0
- package/dist/components/display.d.ts +188 -0
- package/dist/components/display.d.ts.map +1 -0
- package/dist/components/display.js +190 -0
- package/dist/components/empty-state.d.ts +150 -0
- package/dist/components/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state.js +113 -0
- package/dist/components/error-state.d.ts +38 -0
- package/dist/components/error-state.d.ts.map +1 -0
- package/dist/components/error-state.js +16 -0
- package/dist/components/file-upload.d.ts +34 -0
- package/dist/components/file-upload.d.ts.map +1 -0
- package/dist/components/file-upload.js +34 -0
- package/dist/components/gauge.d.ts +47 -0
- package/dist/components/gauge.d.ts.map +1 -0
- package/dist/components/gauge.js +65 -0
- package/dist/components/icon.d.ts +32 -0
- package/dist/components/icon.d.ts.map +1 -0
- package/dist/components/icon.js +20 -0
- package/dist/components/icons.d.ts +19 -0
- package/dist/components/icons.d.ts.map +1 -0
- package/dist/components/icons.js +39 -0
- package/dist/components/input.d.ts +35 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +41 -0
- package/dist/components/layout.d.ts +133 -0
- package/dist/components/layout.d.ts.map +1 -0
- package/dist/components/layout.js +132 -0
- package/dist/components/link.d.ts +22 -0
- package/dist/components/link.d.ts.map +1 -0
- package/dist/components/link.js +2 -0
- package/dist/components/live-scope.d.ts +15 -0
- package/dist/components/live-scope.d.ts.map +1 -0
- package/dist/components/live-scope.js +67 -0
- package/dist/components/log-view.d.ts +34 -0
- package/dist/components/log-view.d.ts.map +1 -0
- package/dist/components/log-view.js +30 -0
- package/dist/components/number-input.d.ts +26 -0
- package/dist/components/number-input.d.ts.map +1 -0
- package/dist/components/number-input.js +57 -0
- package/dist/components/overlay.d.ts +257 -0
- package/dist/components/overlay.d.ts.map +1 -0
- package/dist/components/overlay.js +276 -0
- package/dist/components/pagination.d.ts +38 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +46 -0
- package/dist/components/pie.d.ts +40 -0
- package/dist/components/pie.d.ts.map +1 -0
- package/dist/components/pie.js +74 -0
- package/dist/components/primitives.d.ts +96 -0
- package/dist/components/primitives.d.ts.map +1 -0
- package/dist/components/primitives.js +81 -0
- package/dist/components/progress.d.ts +29 -0
- package/dist/components/progress.d.ts.map +1 -0
- package/dist/components/progress.js +16 -0
- package/dist/components/radio-group.d.ts +17 -0
- package/dist/components/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group.js +23 -0
- package/dist/components/rail-link.d.ts +24 -0
- package/dist/components/rail-link.d.ts.map +1 -0
- package/dist/components/rail-link.js +24 -0
- package/dist/components/rich-text.d.ts +51 -0
- package/dist/components/rich-text.d.ts.map +1 -0
- package/dist/components/rich-text.js +147 -0
- package/dist/components/section.d.ts +15 -0
- package/dist/components/section.d.ts.map +1 -0
- package/dist/components/section.js +8 -0
- package/dist/components/segmented.d.ts +13 -0
- package/dist/components/segmented.d.ts.map +1 -0
- package/dist/components/segmented.js +12 -0
- package/dist/components/skeleton.d.ts +69 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +67 -0
- package/dist/components/slider.d.ts +18 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/slider.js +15 -0
- package/dist/components/sparkline.d.ts +17 -0
- package/dist/components/sparkline.d.ts.map +1 -0
- package/dist/components/sparkline.js +19 -0
- package/dist/components/spinner.d.ts +15 -0
- package/dist/components/spinner.d.ts.map +1 -0
- package/dist/components/spinner.js +22 -0
- package/dist/components/stacked-bar.d.ts +21 -0
- package/dist/components/stacked-bar.d.ts.map +1 -0
- package/dist/components/stacked-bar.js +41 -0
- package/dist/components/surface.d.ts +76 -0
- package/dist/components/surface.d.ts.map +1 -0
- package/dist/components/surface.js +49 -0
- package/dist/components/switch.d.ts +12 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +13 -0
- package/dist/components/tabs.d.ts +47 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +12 -0
- package/dist/components/timeline-strip.d.ts +19 -0
- package/dist/components/timeline-strip.d.ts.map +1 -0
- package/dist/components/timeline-strip.js +14 -0
- package/dist/components/tone.d.ts +58 -0
- package/dist/components/tone.d.ts.map +1 -0
- package/dist/components/tone.js +70 -0
- package/dist/components/tree-select.d.ts +26 -0
- package/dist/components/tree-select.d.ts.map +1 -0
- package/dist/components/tree-select.js +59 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/kit.css +2248 -0
- package/dist/lib/cn.d.ts +10 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +12 -0
- package/dist/lib/color.d.ts +68 -0
- package/dist/lib/color.d.ts.map +1 -0
- package/dist/lib/color.js +134 -0
- package/dist/lib/palette.d.ts +84 -0
- package/dist/lib/palette.d.ts.map +1 -0
- package/dist/lib/palette.js +193 -0
- package/dist/lib/scroll-lock.d.ts +19 -0
- package/dist/lib/scroll-lock.d.ts.map +1 -0
- package/dist/lib/scroll-lock.js +33 -0
- package/dist/patterns/app-shell.d.ts +36 -0
- package/dist/patterns/app-shell.d.ts.map +1 -0
- package/dist/patterns/app-shell.js +14 -0
- package/dist/patterns/auth-template.d.ts +36 -0
- package/dist/patterns/auth-template.d.ts.map +1 -0
- package/dist/patterns/auth-template.js +40 -0
- package/dist/patterns/detail-template.d.ts +52 -0
- package/dist/patterns/detail-template.d.ts.map +1 -0
- package/dist/patterns/detail-template.js +11 -0
- package/dist/patterns/index.d.ts +18 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +17 -0
- package/dist/patterns/list-template.d.ts +32 -0
- package/dist/patterns/list-template.d.ts.map +1 -0
- package/dist/patterns/list-template.js +8 -0
- package/dist/patterns/overview-template.d.ts +26 -0
- package/dist/patterns/overview-template.d.ts.map +1 -0
- package/dist/patterns/overview-template.js +8 -0
- package/dist/patterns/public-template.d.ts +28 -0
- package/dist/patterns/public-template.d.ts.map +1 -0
- package/dist/patterns/public-template.js +7 -0
- package/dist/patterns/settings-template.d.ts +50 -0
- package/dist/patterns/settings-template.d.ts.map +1 -0
- package/dist/patterns/settings-template.js +33 -0
- package/dist/patterns/shared.d.ts +40 -0
- package/dist/patterns/shared.d.ts.map +1 -0
- package/dist/patterns/shared.js +29 -0
- package/dist/patterns/wizard-template.d.ts +28 -0
- package/dist/patterns/wizard-template.d.ts.map +1 -0
- package/dist/patterns/wizard-template.js +15 -0
- package/dist/styles.css +5 -0
- package/dist/theme.css +812 -0
- package/package.json +87 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type Tone } from "./tone.js";
|
|
2
|
+
export type ScoreProps = {
|
|
3
|
+
value: number;
|
|
4
|
+
/**
|
|
5
|
+
* The accessible name. REQUIRED, and never derived here: the kit does not translate (docs/08:
|
|
6
|
+
* primitives stay translation-free, the caller passes ready text). It used to build "Health
|
|
7
|
+
* score 87 of 100, Degraded" in English inside this file, which shipped an untranslatable
|
|
8
|
+
* string to every locale. TR: Erişilebilir ad. ZORUNLU, ve burada asla türetilmiyor: kit
|
|
9
|
+
* çeviri yapmaz (docs/08: primitive'ler çevirisiz kalır, hazır metni çağıran geçer). Eskiden
|
|
10
|
+
* bu dosyanın içinde İngilizce "Health score 87 of 100, Degraded" kuruluyordu, yani her dile
|
|
11
|
+
* çevrilemez bir dizgi gönderiliyordu.
|
|
12
|
+
*/
|
|
13
|
+
label: string;
|
|
14
|
+
/**
|
|
15
|
+
* Visible band text under the readout. Omitted = the readout shows no word. TR: Okumanın
|
|
16
|
+
* altında görünen bant metni. Verilmezse okuma hiçbir sözcük göstermiyor.
|
|
17
|
+
*/
|
|
18
|
+
bandLabel?: string;
|
|
19
|
+
size?: number;
|
|
20
|
+
showLabel?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* The PRODUCT decides the band's tone. The `band()` below is the kit's default (90 / 70 / 50)
|
|
23
|
+
* and does not fit every product: in a warehouse dispatch rate the thresholds are 85 / 65 /
|
|
24
|
+
* 50, and in an SLA they could be something else entirely. Without this prop a product would
|
|
25
|
+
* write a label against its own threshold and stand it beside a dial the kit painted against
|
|
26
|
+
* another: the text and the colour contradicted each other. Left out, the kit's default
|
|
27
|
+
* thresholds. TR: Bandın tonunu ÜRÜN belirler. Aşağıdaki `band()` kitin varsayılanı (90 / 70
|
|
28
|
+
* / 50) ve her ürüne uymuyor: depo sevk oranında eşikler 85 / 65 / 50, bir SLA'de bambaşka
|
|
29
|
+
* olabilir. Bu prop olmadan ürün kendi eşiğine göre bir metin yazıp kitin başka bir eşiğe
|
|
30
|
+
* göre boyadığı bir kadranla yan yana koyuyordu: yazı ile renk birbirini yalanlıyordu.
|
|
31
|
+
* Verilmezse kitin varsayılan eşikleri.
|
|
32
|
+
*/
|
|
33
|
+
tone?: Tone;
|
|
34
|
+
};
|
|
35
|
+
export declare function ScoreRing({ value, label, bandLabel, size, showLabel, segments, tone, }: ScoreProps & {
|
|
36
|
+
segments?: number;
|
|
37
|
+
}): import("react").JSX.Element;
|
|
38
|
+
export declare function ScoreMeter({ value, label, bandLabel, target, delta, segments, tone, }: ScoreProps & {
|
|
39
|
+
target?: number;
|
|
40
|
+
delta?: number;
|
|
41
|
+
segments?: number;
|
|
42
|
+
}): import("react").JSX.Element;
|
|
43
|
+
export declare function ScoreMatrix({ value, label, bandLabel, delta, size, }: ScoreProps & {
|
|
44
|
+
delta?: number;
|
|
45
|
+
}): import("react").JSX.Element;
|
|
46
|
+
/** default export keeps the existing call sites working */
|
|
47
|
+
//# sourceMappingURL=gauge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gauge.d.ts","sourceRoot":"","sources":["../../src/components/gauge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAQvD,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;OAQG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,CAAC;AAyBF,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,SAAS,EACT,IAAU,EACV,SAAgB,EAChB,QAAa,EACb,IAAI,GACL,EAAE,UAAU,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,+BA4EpC;AAID,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,SAAS,EACT,MAAW,EACX,KAAK,EACL,QAAa,EACb,IAAI,GACL,EAAE,UAAU,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,+BA+CrE;AAID,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,IAAU,GACX,EAAE,UAAU,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BAmCjC;AAED,2DAA2D"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { toneOf, neutral } from "./tone.js";
|
|
3
|
+
/* Where the readout changes colour. The thresholds are a kit default; a product
|
|
4
|
+
that scores differently passes its own tone instead. Words are NOT decided
|
|
5
|
+
here — see ScoreProps.label. */
|
|
6
|
+
function band(v) {
|
|
7
|
+
if (v >= 90)
|
|
8
|
+
return "positive";
|
|
9
|
+
if (v >= 70)
|
|
10
|
+
return "caution";
|
|
11
|
+
return "danger";
|
|
12
|
+
}
|
|
13
|
+
function Delta({ delta }) {
|
|
14
|
+
const up = delta >= 0;
|
|
15
|
+
return (_jsxs("span", { className: "font-mono text-small font-medium", style: { color: up ? neutral.muted : toneOf("danger").fg }, children: [up ? "▲" : "▼", " ", Math.abs(delta).toFixed(1)] }));
|
|
16
|
+
}
|
|
17
|
+
/* ---------- A · Ring — the segmented strip bent round ---------- */
|
|
18
|
+
export function ScoreRing({ value, label, bandLabel, size = 168, showLabel = true, segments = 32, tone, }) {
|
|
19
|
+
const v = Math.min(100, Math.max(0, value));
|
|
20
|
+
const c = toneOf(tone ?? band(v));
|
|
21
|
+
const sweep = 270;
|
|
22
|
+
const start = 135;
|
|
23
|
+
const cx = size / 2;
|
|
24
|
+
const cy = size / 2;
|
|
25
|
+
const segLength = size * 0.1;
|
|
26
|
+
const segWidth = Math.max(2, size * 0.032);
|
|
27
|
+
const ringRadius = size * 0.42 - segLength / 2;
|
|
28
|
+
const filled = Math.round((v / 100) * segments);
|
|
29
|
+
/* every fifth of the scale gets a longer mark, like a rule */
|
|
30
|
+
const majorEvery = segments / 5;
|
|
31
|
+
const labelReads = size * 0.065 >= 10;
|
|
32
|
+
return (_jsxs("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, role: "img", "aria-label": label, shapeRendering: "crispEdges", children: [Array.from({ length: segments }).map((_, i) => {
|
|
33
|
+
const angle = start + (sweep * i) / (segments - 1);
|
|
34
|
+
const major = i % majorEvery === 0;
|
|
35
|
+
const len = major ? segLength * 1.28 : segLength;
|
|
36
|
+
return (_jsx("rect", { x: cx - segWidth / 2, y: cy - ringRadius - len / 2, width: segWidth, height: len, transform: `rotate(${angle} ${cx} ${cy})`, style: { fill: i < filled ? c.mark : neutral.line } }, i));
|
|
37
|
+
}), _jsx("text", { x: cx, y: cy - size * 0.01, textAnchor: "middle", dominantBaseline: "central", className: "font-mono", shapeRendering: "auto", style: {
|
|
38
|
+
/* derived from the ring's own size, not the type scale: this glyph
|
|
39
|
+
has to stay in proportion to the dial at any diameter */
|
|
40
|
+
fontSize: size * 0.28,
|
|
41
|
+
fontWeight: 700,
|
|
42
|
+
fill: neutral.title,
|
|
43
|
+
fontVariantNumeric: "tabular-nums",
|
|
44
|
+
}, children: Math.round(v) }), showLabel && labelReads ? (_jsx("text", { x: cx, y: cy + size * 0.26, textAnchor: "middle", shapeRendering: "auto", style: { fontSize: size * 0.065, fontWeight: 500, fill: c.fg }, children: bandLabel })) : null] }));
|
|
45
|
+
}
|
|
46
|
+
/* ---------- B · Linear meter — the same strip, left straight ---------- */
|
|
47
|
+
export function ScoreMeter({ value, label, bandLabel, target = 90, delta, segments = 40, tone, }) {
|
|
48
|
+
const v = Math.min(100, Math.max(0, value));
|
|
49
|
+
const c = toneOf(tone ?? band(v));
|
|
50
|
+
const filled = Math.round((v / 100) * segments);
|
|
51
|
+
return (_jsxs("div", { className: "w-full max-w-sm", role: "group", "aria-label": label, children: [_jsxs("div", { className: "flex items-end gap-4", children: [_jsx("span", { className: "font-mono text-display-lg font-bold leading-none tabular-nums text-ink", children: Math.round(v) }), _jsx("span", { className: "mb-1 font-mono text-body text-ink-faint", children: "/ 100" }), delta !== undefined ? (_jsx("span", { className: "mb-1 ml-auto", children: _jsx(Delta, { delta: delta }) })) : null] }), _jsx("p", { className: "mt-2 text-small", style: { color: c.fg }, children: bandLabel }), _jsxs("div", { className: "relative mt-4", children: [_jsx("div", { className: "flex items-end gap-[var(--mark-tick)]", children: Array.from({ length: segments }).map((_, i) => (_jsx("span", { className: "h-6 flex-1", style: { background: i < filled ? c.mark : neutral.line } }, i))) }), _jsx("span", { className: "absolute -top-1 bottom-[var(--dial-label-drop)] w-[var(--mark-tick)]", style: { left: `${target}%`, background: neutral.title } })] }), _jsxs("div", { className: "mt-2 flex justify-between font-mono text-micro text-ink-faint", children: [_jsx("span", { children: "0" }), _jsxs("span", { children: ["target ", target] }), _jsx("span", { children: "100" })] })] }));
|
|
52
|
+
}
|
|
53
|
+
/* ---------- C · Block matrix — one square is one point ---------- */
|
|
54
|
+
export function ScoreMatrix({ value, label, bandLabel, delta, size = 176, }) {
|
|
55
|
+
const v = Math.round(Math.min(100, Math.max(0, value)));
|
|
56
|
+
const c = toneOf(band(v));
|
|
57
|
+
const cell = (size - 9 * 2) / 10;
|
|
58
|
+
return (_jsxs("div", { style: { width: size }, role: "group", "aria-label": label, children: [_jsxs("div", { className: "flex items-end gap-2", children: [_jsx("span", { className: "font-mono text-display font-bold leading-none tabular-nums text-ink", children: v }), delta !== undefined ? (_jsx("span", { className: "mb-1 ml-auto", children: _jsx(Delta, { delta: delta }) })) : null] }), _jsx("p", { className: "mt-1 text-small", style: { color: c.fg }, children: bandLabel }), _jsx("div", { className: "mt-4 grid grid-cols-10 gap-[var(--mark-tick)]", children: Array.from({ length: 100 }).map((_, i) => {
|
|
59
|
+
/* fill bottom-up so the block grows like a column of evidence */
|
|
60
|
+
const row = 9 - Math.floor(i / 10);
|
|
61
|
+
const index = row * 10 + (i % 10);
|
|
62
|
+
const on = index < v;
|
|
63
|
+
return (_jsx("span", { style: { height: cell, background: on ? c.mark : neutral.line } }, i));
|
|
64
|
+
}) }), _jsx("p", { className: "mt-3 font-mono text-micro text-ink-faint", children: "one square is one point" })] }));
|
|
65
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Icon as PhosphorIcon, IconWeight } from "@phosphor-icons/react";
|
|
2
|
+
import type { ComponentProps } from "react";
|
|
3
|
+
import type { Tone } from "./tone.js";
|
|
4
|
+
/**
|
|
5
|
+
* The single icon wrapper.
|
|
6
|
+
*
|
|
7
|
+
* Weight and size live here so the icon character is one decision, not a
|
|
8
|
+
* hundred. Default weight is duotone: its second layer inherits the accent,
|
|
9
|
+
* which is the cheapest brand lever we have.
|
|
10
|
+
*/
|
|
11
|
+
declare const sizes: {
|
|
12
|
+
readonly xs: 14;
|
|
13
|
+
readonly sm: 16;
|
|
14
|
+
readonly base: 18;
|
|
15
|
+
readonly md: 20;
|
|
16
|
+
readonly lg: 24;
|
|
17
|
+
readonly xl: 32;
|
|
18
|
+
};
|
|
19
|
+
export type IconSize = keyof typeof sizes;
|
|
20
|
+
export declare function Icon({ icon: Glyph, size, weight, tone, className, ...rest }: {
|
|
21
|
+
icon: PhosphorIcon;
|
|
22
|
+
size?: IconSize;
|
|
23
|
+
weight?: IconWeight;
|
|
24
|
+
/**
|
|
25
|
+
* paints the duotone second layer with a status colour TR: duotone ikinci katmanı bir durum
|
|
26
|
+
* rengiyle boyar
|
|
27
|
+
*/
|
|
28
|
+
tone?: Tone;
|
|
29
|
+
className?: string;
|
|
30
|
+
} & Omit<ComponentProps<"svg">, "size" | "weight" | "ref">): import("react").JSX.Element;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=icon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../src/components/icon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGtC;;;;;;GAMG;AACH,QAAA,MAAM,KAAK;aACT,EAAE,EAAE,EAAE;aACN,EAAE,EAAE,EAAE;aACN,IAAI,EAAE,EAAE;aACR,EAAE,EAAE,EAAE;aACN,EAAE,EAAE,EAAE;aACN,EAAE,EAAE,EAAE;CACE,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,KAAK,CAAC;AAE1C,wBAAgB,IAAI,CAAC,EACnB,IAAI,EAAE,KAAK,EACX,IAAa,EACb,MAAkB,EAClB,IAAI,EACJ,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC,+BAUzD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { toneOf } from "./tone.js";
|
|
3
|
+
/**
|
|
4
|
+
* The single icon wrapper.
|
|
5
|
+
*
|
|
6
|
+
* Weight and size live here so the icon character is one decision, not a
|
|
7
|
+
* hundred. Default weight is duotone: its second layer inherits the accent,
|
|
8
|
+
* which is the cheapest brand lever we have.
|
|
9
|
+
*/
|
|
10
|
+
const sizes = {
|
|
11
|
+
xs: 14,
|
|
12
|
+
sm: 16,
|
|
13
|
+
base: 18,
|
|
14
|
+
md: 20,
|
|
15
|
+
lg: 24,
|
|
16
|
+
xl: 32,
|
|
17
|
+
};
|
|
18
|
+
export function Icon({ icon: Glyph, size = "base", weight = "duotone", tone, className, ...rest }) {
|
|
19
|
+
return (_jsx(Glyph, { size: sizes[size], weight: weight, className: className ? `shrink-0 ${className}` : "shrink-0", style: tone ? { color: toneOf(tone).fg } : undefined, ...rest }));
|
|
20
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kitin ikon kaydı.
|
|
3
|
+
*
|
|
4
|
+
* Gerekçe: docs/gerekce/06-isaret-ve-ton.md
|
|
5
|
+
*/
|
|
6
|
+
/** PHOSPHOR'UN TAMAMI DA BURADAN GEÇİYOR. */
|
|
7
|
+
export * from "@phosphor-icons/react/ssr";
|
|
8
|
+
/**
|
|
9
|
+
* Bir glifin TİPİ, glifin kendisi değil.
|
|
10
|
+
*
|
|
11
|
+
* Bir ürün ikonları bir eşlemede tutmak istediğinde (`Record<string, ...>`)
|
|
12
|
+
* o eşlemenin tipine ihtiyacı oluyor, ve tek kaynağı Phosphor'du: ürünün
|
|
13
|
+
* `@phosphor-icons/react`ü doğrudan import etmesi gerekiyordu, yani kitin
|
|
14
|
+
* gizlediği bağımlılık dışarı sızıyordu. Adı `Icon` değil `IconGlyph`, çünkü
|
|
15
|
+
* `Icon` zaten kitin çizen BİLEŞENİ.
|
|
16
|
+
*/
|
|
17
|
+
export type { Icon as IconGlyph } from "@phosphor-icons/react";
|
|
18
|
+
export { MagnifyingGlass as Search, ArrowsClockwise as Refresh, ArrowClockwise as RunNow, Pause, Plus, Trash as Delete, DownloadSimple as Download, UploadSimple as Upload, DotsThree as More, Copy, X as Close, Check, FunnelSimple as Filter, SlidersHorizontal as Customize, GearSix as Settings, Lifebuoy as Support, PencilSimple as Edit, FloppyDisk as Save, Printer as Print, ShareNetwork as Share, Archive, Minus, ArrowUUpLeft as Undo, ArrowUUpRight as Redo, ArrowsDownUp as Sort, DotsSixVertical as Drag, CaretDown, CaretLeft, CaretRight, ArrowUp, ArrowDown, ArrowUpRight, ArrowRight, List as Menu, House as Home, ArrowSquareOut as ExternalLink, ArrowsOut as Expand, ArrowsIn as Collapse, Columns as BoardView, ListBullets as ListView, GitBranch as TimelineView, GridFour as GridView, Bell, Star as Main, Eye, EyeSlash, ShieldCheck, Warning, Tray as Empty, CalendarPlus, MoonStars as ThemeDark, Sun as ThemeLight, Info, Question as Help, CheckCircle as Success, XCircle as Failure, Clock, CalendarBlank as Calendar, File, FolderSimple as Folder, Image, Lock, LockOpen as Unlock, Key, Tag, PushPin as Pin, EnvelopeSimple as Mail, Phone, Play, Stop, TextB as Bold, TextItalic as Italic, LinkSimple as Link, ListBullets as BulletList, ListNumbers as NumberedList, TextAa as TextStyle, MagnifyingGlassPlus as ZoomIn, MagnifyingGlassMinus as ZoomOut, Crop, FlipHorizontal, FlipVertical, StackSimple as Layers, CircleHalf as Contrast, Eyedropper, PaintBrush as Brush, Palette, GoogleLogo, GithubLogo, } from "@phosphor-icons/react/ssr";
|
|
19
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/components/icons.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,6CAA6C;AAC7C,cAAc,2BAA2B,CAAC;AAE1C;;;;;;;;GAQG;AACH,YAAY,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAEL,eAAe,IAAI,MAAM,EACzB,eAAe,IAAI,OAAO,EAC1B,cAAc,IAAI,MAAM,EACxB,KAAK,EACL,IAAI,EACJ,KAAK,IAAI,MAAM,EACf,cAAc,IAAI,QAAQ,EAC1B,YAAY,IAAI,MAAM,EACtB,SAAS,IAAI,IAAI,EAIjB,IAAI,EACJ,CAAC,IAAI,KAAK,EACV,KAAK,EACL,YAAY,IAAI,MAAM,EACtB,iBAAiB,IAAI,SAAS,EAC9B,OAAO,IAAI,QAAQ,EACnB,QAAQ,IAAI,OAAO,EACnB,YAAY,IAAI,IAAI,EACpB,UAAU,IAAI,IAAI,EAClB,OAAO,IAAI,KAAK,EAChB,YAAY,IAAI,KAAK,EACrB,OAAO,EAGP,KAAK,EACL,YAAY,IAAI,IAAI,EACpB,aAAa,IAAI,IAAI,EACrB,YAAY,IAAI,IAAI,EAEpB,eAAe,IAAI,IAAI,EAGvB,SAAS,EACT,SAAS,EACT,UAAU,EACV,OAAO,EACP,SAAS,EACT,YAAY,EACZ,UAAU,EACV,IAAI,IAAI,IAAI,EACZ,KAAK,IAAI,IAAI,EACb,cAAc,IAAI,YAAY,EAC9B,SAAS,IAAI,MAAM,EACnB,QAAQ,IAAI,QAAQ,EAGpB,OAAO,IAAI,SAAS,EACpB,WAAW,IAAI,QAAQ,EACvB,SAAS,IAAI,YAAY,EACzB,QAAQ,IAAI,QAAQ,EAGpB,IAAI,EAIJ,IAAI,IAAI,IAAI,EACZ,GAAG,EACH,QAAQ,EACR,WAAW,EACX,OAAO,EACP,IAAI,IAAI,KAAK,EACb,YAAY,EACZ,SAAS,IAAI,SAAS,EACtB,GAAG,IAAI,UAAU,EAIjB,IAAI,EACJ,QAAQ,IAAI,IAAI,EAChB,WAAW,IAAI,OAAO,EACtB,OAAO,IAAI,OAAO,EAClB,KAAK,EACL,aAAa,IAAI,QAAQ,EACzB,IAAI,EACJ,YAAY,IAAI,MAAM,EACtB,KAAK,EACL,IAAI,EACJ,QAAQ,IAAI,MAAM,EAClB,GAAG,EACH,GAAG,EACH,OAAO,IAAI,GAAG,EACd,cAAc,IAAI,IAAI,EACtB,KAAK,EACL,IAAI,EACJ,IAAI,EAGJ,KAAK,IAAI,IAAI,EACb,UAAU,IAAI,MAAM,EACpB,UAAU,IAAI,IAAI,EAClB,WAAW,IAAI,UAAU,EACzB,WAAW,IAAI,YAAY,EAC3B,MAAM,IAAI,SAAS,EAGnB,mBAAmB,IAAI,MAAM,EAC7B,oBAAoB,IAAI,OAAO,EAC/B,IAAI,EACJ,cAAc,EACd,YAAY,EACZ,WAAW,IAAI,MAAM,EACrB,UAAU,IAAI,QAAQ,EACtB,UAAU,EACV,UAAU,IAAI,KAAK,EACnB,OAAO,EAGP,UAAU,EACV,UAAU,GACX,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kitin ikon kaydı.
|
|
3
|
+
*
|
|
4
|
+
* Gerekçe: docs/gerekce/06-isaret-ve-ton.md
|
|
5
|
+
*/
|
|
6
|
+
/** PHOSPHOR'UN TAMAMI DA BURADAN GEÇİYOR. */
|
|
7
|
+
export * from "@phosphor-icons/react/ssr";
|
|
8
|
+
export {
|
|
9
|
+
/* eylemler */
|
|
10
|
+
MagnifyingGlass as Search, ArrowsClockwise as Refresh, ArrowClockwise as RunNow, Pause, Plus, Trash as Delete, DownloadSimple as Download, UploadSimple as Upload, DotsThree as More,
|
|
11
|
+
/* Bir değeri panoya almak: token adı, örnek kod, bir kimlik. Rolü her üründe
|
|
12
|
+
aynı, o yüzden burada. Öncesinde kopyala düğmeleri `Customize`ı (sürgüler)
|
|
13
|
+
kullanıyordu, yani "ayarla" glifi "kopyala" demeye çalışıyordu. */
|
|
14
|
+
Copy, X as Close, Check, FunnelSimple as Filter, SlidersHorizontal as Customize, GearSix as Settings, Lifebuoy as Support, PencilSimple as Edit, FloppyDisk as Save, Printer as Print, ShareNetwork as Share, Archive,
|
|
15
|
+
/* `Plus`ın eşi. Bir sayaç ya da bir yineleyici satır artırıp azaltıyorsa,
|
|
16
|
+
azaltmanın da bir glifi olmak zorunda. */
|
|
17
|
+
Minus, ArrowUUpLeft as Undo, ArrowUUpRight as Redo, ArrowsDownUp as Sort,
|
|
18
|
+
/* Sürükleme tutamağı: sıralanabilir her listede aynı rol. */
|
|
19
|
+
DotsSixVertical as Drag,
|
|
20
|
+
/* yön ve gezinme */
|
|
21
|
+
CaretDown, CaretLeft, CaretRight, ArrowUp, ArrowDown, ArrowUpRight, ArrowRight, List as Menu, House as Home, ArrowSquareOut as ExternalLink, ArrowsOut as Expand, ArrowsIn as Collapse,
|
|
22
|
+
/* görünümler */
|
|
23
|
+
Columns as BoardView, ListBullets as ListView, GitBranch as TimelineView, GridFour as GridView,
|
|
24
|
+
/* durum ve nesneler */
|
|
25
|
+
Bell,
|
|
26
|
+
/* Bir kümedeki BİRİNİ "asıl olan" diye işaretlemek: ana fotoğraf, varsayılan
|
|
27
|
+
adres, birincil kişi. Rolü her üründe aynı, o yüzden burada. Adı `Star`
|
|
28
|
+
değil `Main`: çağrı yeri rolü okur, glifi değil. */
|
|
29
|
+
Star as Main, Eye, EyeSlash, ShieldCheck, Warning, Tray as Empty, CalendarPlus, MoonStars as ThemeDark, Sun as ThemeLight,
|
|
30
|
+
/* Dört geri bildirim işareti. `Warning` zaten vardı ama tek başına bir
|
|
31
|
+
ailenin dörtte biriydi: bir arayüz "oldu", "olmadı", "dikkat" ve "şunu
|
|
32
|
+
bil" demek zorunda, ve üçünü glifsiz bırakmak dördüncüyü de zayıflatıyor. */
|
|
33
|
+
Info, Question as Help, CheckCircle as Success, XCircle as Failure, Clock, CalendarBlank as Calendar, File, FolderSimple as Folder, Image, Lock, LockOpen as Unlock, Key, Tag, PushPin as Pin, EnvelopeSimple as Mail, Phone, Play, Stop,
|
|
34
|
+
/* metin biçimlendirme — bir editörün tuş takımı her üründe aynı şeyi yapar */
|
|
35
|
+
TextB as Bold, TextItalic as Italic, LinkSimple as Link, ListBullets as BulletList, ListNumbers as NumberedList, TextAa as TextStyle,
|
|
36
|
+
/* tuval ve görsel — bir görseli düzenleyen her üründe aynı fiiller */
|
|
37
|
+
MagnifyingGlassPlus as ZoomIn, MagnifyingGlassMinus as ZoomOut, Crop, FlipHorizontal, FlipVertical, StackSimple as Layers, CircleHalf as Contrast, Eyedropper, PaintBrush as Brush, Palette,
|
|
38
|
+
/* sağlayıcı işaretleri — oturum ekranlarının her üründe ihtiyacı olur */
|
|
39
|
+
GoogleLogo, GithubLogo, } from "@phosphor-icons/react/ssr";
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
/**
|
|
3
|
+
* Text entry. Flat until focus, then it joins the raised family — an accent
|
|
4
|
+
* edge plus a 2px accent offset.
|
|
5
|
+
*/
|
|
6
|
+
export declare const inputVariants: (props?: ({
|
|
7
|
+
invalid?: boolean | null | undefined;
|
|
8
|
+
full?: boolean | null | undefined;
|
|
9
|
+
size?: "md" | "sm" | null | undefined;
|
|
10
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
11
|
+
/**
|
|
12
|
+
* `Textarea` NEDEN AYRI BİR TABLO.
|
|
13
|
+
*
|
|
14
|
+
* İkisi aynı `.tamga-input` sınıfını paylaşıyor ama seçenek kümeleri aynı
|
|
15
|
+
* değil: 32px'lik bir `<textarea>` yok, yüksekliğini `rows` veriyor. Tek tablo
|
|
16
|
+
* kalsaydı `Textarea` hiçbir şey yapmayan bir `size` prop'u kabul ederdi — ve
|
|
17
|
+
* props tablosu KAYNAKTAN üretildiği için doküman da onu var gösterirdi.
|
|
18
|
+
* Olmayan bir seçeneği belgelemek, eksik belgelemekten kötü.
|
|
19
|
+
*/
|
|
20
|
+
export declare const textareaVariants: (props?: ({
|
|
21
|
+
invalid?: boolean | null | undefined;
|
|
22
|
+
full?: boolean | null | undefined;
|
|
23
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
24
|
+
export type InputProps = Omit<React.ComponentProps<"input">, "size"> & VariantProps<typeof inputVariants> & {
|
|
25
|
+
/**
|
|
26
|
+
* There is an icon absolutely positioned over the left of this field, so reserve room for it.
|
|
27
|
+
* Opt-in on purpose: the padding used to be unconditional and every plain field opened with a
|
|
28
|
+
* 40px hole where nothing was.
|
|
29
|
+
*/
|
|
30
|
+
leading?: boolean;
|
|
31
|
+
};
|
|
32
|
+
export declare function Input({ className, invalid, full, size, leading, ...props }: InputProps): import("react").JSX.Element;
|
|
33
|
+
export type TextareaProps = React.ComponentProps<"textarea"> & VariantProps<typeof textareaVariants>;
|
|
34
|
+
export declare function Textarea({ className, invalid, full, ...props }: TextareaProps): import("react").JSX.Element;
|
|
35
|
+
//# sourceMappingURL=input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;8EAWxB,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB;;;8EAM3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,GAClE,YAAY,CAAC,OAAO,aAAa,CAAC,GAAG;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEJ,wBAAgB,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,+BAUtF;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,GAC1D,YAAY,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAExC,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,+BAS7E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
/**
|
|
5
|
+
* Text entry. Flat until focus, then it joins the raised family — an accent
|
|
6
|
+
* edge plus a 2px accent offset.
|
|
7
|
+
*/
|
|
8
|
+
export const inputVariants = cva("tamga-input", {
|
|
9
|
+
variants: {
|
|
10
|
+
invalid: { true: "tamga-input-invalid", false: "" },
|
|
11
|
+
full: { true: "w-full", false: "" },
|
|
12
|
+
/**
|
|
13
|
+
* `sm` 32px, düğmenin `sm`'iyle aynı basamak — yardımcı bir yüzey için:
|
|
14
|
+
* bir filtre satırı, bir araç çubuğu. Formun kendi alanları `md` kalır.
|
|
15
|
+
*/
|
|
16
|
+
size: { md: "", sm: "tamga-input-sm" },
|
|
17
|
+
},
|
|
18
|
+
defaultVariants: { invalid: false, full: false, size: "md" },
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* `Textarea` NEDEN AYRI BİR TABLO.
|
|
22
|
+
*
|
|
23
|
+
* İkisi aynı `.tamga-input` sınıfını paylaşıyor ama seçenek kümeleri aynı
|
|
24
|
+
* değil: 32px'lik bir `<textarea>` yok, yüksekliğini `rows` veriyor. Tek tablo
|
|
25
|
+
* kalsaydı `Textarea` hiçbir şey yapmayan bir `size` prop'u kabul ederdi — ve
|
|
26
|
+
* props tablosu KAYNAKTAN üretildiği için doküman da onu var gösterirdi.
|
|
27
|
+
* Olmayan bir seçeneği belgelemek, eksik belgelemekten kötü.
|
|
28
|
+
*/
|
|
29
|
+
export const textareaVariants = cva("tamga-input", {
|
|
30
|
+
variants: {
|
|
31
|
+
invalid: { true: "tamga-input-invalid", false: "" },
|
|
32
|
+
full: { true: "w-full", false: "" },
|
|
33
|
+
},
|
|
34
|
+
defaultVariants: { invalid: false, full: false },
|
|
35
|
+
});
|
|
36
|
+
export function Input({ className, invalid, full, size, leading, ...props }) {
|
|
37
|
+
return (_jsx("input", { "data-slot": "input", "data-leading": leading || undefined, "aria-invalid": invalid || undefined, className: cn(inputVariants({ invalid, full, size }), className), ...props }));
|
|
38
|
+
}
|
|
39
|
+
export function Textarea({ className, invalid, full, ...props }) {
|
|
40
|
+
return (_jsx("textarea", { "data-slot": "textarea", "aria-invalid": invalid || undefined, className: cn(textareaVariants({ invalid, full }), className), ...props }));
|
|
41
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Sınıfı olan ama bileşeni olmayan şeyler.
|
|
4
|
+
*
|
|
5
|
+
* Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Düz yüzey — kenarı var, yükselmiyor.
|
|
9
|
+
*
|
|
10
|
+
* `raised` verilince kartın fiziğini alır (1px kenar + 2px sert offset).
|
|
11
|
+
* İkisi ayrı bileşen değil, çünkü aralarındaki fark bir varyant: aynı şekil,
|
|
12
|
+
* artı yükseklik. Yasa 1 zaten "yükselme tek formül" diyor.
|
|
13
|
+
*/
|
|
14
|
+
export declare function Surface({ raised, className, children, ...props }: React.ComponentProps<"div"> & {
|
|
15
|
+
raised?: boolean;
|
|
16
|
+
}): import("react").JSX.Element;
|
|
17
|
+
/**
|
|
18
|
+
* Yatay taşma kabı — ve bu bileşenin asıl işi erişilebilirlik.
|
|
19
|
+
*
|
|
20
|
+
* `overflow-x: auto` tek başına FARE için çalışır. Klavye kullanan biri o
|
|
21
|
+
* kutuya hiç giremez: kaydırılabilir bir alan odaklanabilir değilse içindeki
|
|
22
|
+
* geniş tabloyu yana kaydırmanın yolu yoktur. Tarayıcılar bunu kendiliğinden
|
|
23
|
+
* çözmüyor.
|
|
24
|
+
*
|
|
25
|
+
* `tabIndex={0}` + `role="region"` + bir ad, o kutuyu klavyeye açıyor. Ad
|
|
26
|
+
* zorunlu: adsız bir `region` ekran okuyucunun landmark listesinde
|
|
27
|
+
* "bölge, bölge, bölge" olarak birikir ve hiçbirinin ne olduğu bilinmez.
|
|
28
|
+
*/
|
|
29
|
+
export declare function ScrollX({ label, className, children, ...props }: React.ComponentProps<"div"> & {
|
|
30
|
+
label: string;
|
|
31
|
+
}): import("react").JSX.Element;
|
|
32
|
+
/**
|
|
33
|
+
* Aşağıdan giren blok.
|
|
34
|
+
*
|
|
35
|
+
* `.tamga-rise` bir HOVER etkisi değil, bir GİRİŞ animasyonu: sekiz piksel
|
|
36
|
+
* aşağıdan, sönükten. Azaltılmış harekette CSS onu tamamen kapatıyor.
|
|
37
|
+
*
|
|
38
|
+
* `delay` bir listeyi sırayla açmak için. Basamak küçük tutulmalı — otuz
|
|
39
|
+
* satırlık bir listede 60ms'lik bir gecikme, sonuncuyu iki saniye sonra
|
|
40
|
+
* gösterir ve bekleme hissi yaratır.
|
|
41
|
+
*/
|
|
42
|
+
export declare function Rise({ delay, className, children, ...props }: React.ComponentProps<"div"> & {
|
|
43
|
+
delay?: number;
|
|
44
|
+
}): import("react").JSX.Element;
|
|
45
|
+
/**
|
|
46
|
+
* İki durumun aynı yerde durması.
|
|
47
|
+
*
|
|
48
|
+
* Bir düğmenin yazısı "Kaydet" iken "Kaydediliyor…" olduğunda düğme genişler
|
|
49
|
+
* ve yanındaki her şey kayar. Swap ikisini de aynı ızgara hücresine koyuyor:
|
|
50
|
+
* kutu her zaman UZUN olanın genişliğinde, yani hiçbir şey oynamıyor.
|
|
51
|
+
*
|
|
52
|
+
* Gizlenen taraf `aria-hidden` alıyor. Almasaydı ekran okuyucu iki metni
|
|
53
|
+
* arka arkaya okurdu — "Kaydet Kaydediliyor" — ve hangisinin geçerli olduğu
|
|
54
|
+
* anlaşılmazdı.
|
|
55
|
+
*/
|
|
56
|
+
export declare function Swap({ showing, a, b, className, }: {
|
|
57
|
+
/** Which side is visible: `"a"` or `"b"`. TR: Hangi taraf görünür: `"a"` ya da `"b"`. */
|
|
58
|
+
showing: "a" | "b";
|
|
59
|
+
a: ReactNode;
|
|
60
|
+
b: ReactNode;
|
|
61
|
+
className?: string;
|
|
62
|
+
}): import("react").JSX.Element;
|
|
63
|
+
/**
|
|
64
|
+
* Liste satırı — tablo olmayan listeler için.
|
|
65
|
+
*
|
|
66
|
+
* Bir tabloya yetmeyen ama bir listeden fazlası olan şey: ayarlar satırı,
|
|
67
|
+
* entegrasyon satırı, üye satırı. Sabit yükseklik ve alt kural, satırların
|
|
68
|
+
* taranabilir kalmasını sağlıyor.
|
|
69
|
+
*
|
|
70
|
+
* `href` verilirse bir bağlantıya, `onClick` verilirse bir düğmeye döner —
|
|
71
|
+
* ikisi de yoksa düz bir satır kalır. Bu ayrım önemli: tıklanabilir bir
|
|
72
|
+
* `<div>` klavyeyle erişilemez ve ekran okuyucuya hiçbir şey söylemez.
|
|
73
|
+
*/
|
|
74
|
+
export declare function ListRow({ size, href, onClick, className, children, }: {
|
|
75
|
+
size?: "base" | "sm";
|
|
76
|
+
href?: string;
|
|
77
|
+
onClick?: () => void;
|
|
78
|
+
className?: string;
|
|
79
|
+
children: ReactNode;
|
|
80
|
+
}): import("react").JSX.Element;
|
|
81
|
+
/**
|
|
82
|
+
* İçinde bir panel AÇILAN tablo hücresi.
|
|
83
|
+
*
|
|
84
|
+
* Tek işi kırpmayı kapatmak — ve o tek iş, unutulduğunda görünmeyen bir hata
|
|
85
|
+
* üretiyor: hücrenin içindeki bir menü, ipucu ya da açılır panel hücre
|
|
86
|
+
* sınırında KESİLİYOR. Kontrol çalışıyor, tıklanıyor, ama yarısı yok. Hata
|
|
87
|
+
* mesajı yok, konsol sessiz, ve ilk akla gelen z-index oluyor. Z-index bunu
|
|
88
|
+
* çözmez: hiçbir yığın sırası bir `overflow` kırpmasını aşamaz.
|
|
89
|
+
*
|
|
90
|
+
* `align` VARSAYILAN OLARAK SAĞDA, çünkü en sık kullanımı satır sonundaki
|
|
91
|
+
* eylem menüsü. Ama hiza ile kırpma AYRI iki karar: sola yaslı bir hücrede
|
|
92
|
+
* ipucu barındırmak isteyen, hizasını feda etmek zorunda kalmasın diye
|
|
93
|
+
* `align="start"` var. (Uzun süre tek parçaydı ve tam bu yüzden yakalandı.)
|
|
94
|
+
*/
|
|
95
|
+
export declare function CellActions({ className, children, align, ...props }: Omit<React.ComponentProps<"td">, "align"> & {
|
|
96
|
+
align?: "start" | "end";
|
|
97
|
+
}): import("react").JSX.Element;
|
|
98
|
+
/**
|
|
99
|
+
* Sayfa başlığı şeridi.
|
|
100
|
+
*
|
|
101
|
+
* Ürün bunu kendi yazmıştı (23 satır) ve doğru yazmıştı — ama her ekranın
|
|
102
|
+
* tepesinde duran bir şeyin her projede yeniden yazılması, on panelde on
|
|
103
|
+
* farklı boşluk demek.
|
|
104
|
+
*
|
|
105
|
+
* Eylem SAĞA yaslı ve başlığın taban çizgisinde. Başka yere koyan bir başlık
|
|
106
|
+
* altındaki listeden kopmuş görünüyor — bu bir tercih değil, ölçülmüş bir şey.
|
|
107
|
+
*/
|
|
108
|
+
export declare function PageBand({ title, subtitle, actions, className, }: {
|
|
109
|
+
title: string;
|
|
110
|
+
subtitle?: string;
|
|
111
|
+
actions?: ReactNode;
|
|
112
|
+
className?: string;
|
|
113
|
+
}): import("react").JSX.Element;
|
|
114
|
+
/**
|
|
115
|
+
* Gezinen bağlantı.
|
|
116
|
+
*
|
|
117
|
+
* `.tamga-link` sınıfı kitte yıllarca vardı, bileşeni yoktu — ve doküman
|
|
118
|
+
* sitesi kendi sarmalayıcısını yazmak zorunda kaldı. Sınıfın olup bileşenin
|
|
119
|
+
* olmaması, tam olarak checkbox'ın yaşadığı boşluk.
|
|
120
|
+
*
|
|
121
|
+
* NEDEN `Button variant="link"` DEĞİL. O bir `<button>`; bir bağlantı gibi
|
|
122
|
+
* GÖRÜNÜR ama gezinmez. Orta tuşla yeni sekmede açılamaz, sağ tıkla
|
|
123
|
+
* kopyalanamaz, ve ekran okuyucuya "düğme" der. Görünüm aynı, sözleşme
|
|
124
|
+
* ters.
|
|
125
|
+
*
|
|
126
|
+
* `external` verilince `rel="noopener noreferrer"` geliyor. `noopener`
|
|
127
|
+
* olmadan açılan sayfa `window.opener` üzerinden seninkini yönlendirebilir —
|
|
128
|
+
* eski ve hâlâ geçerli bir açık.
|
|
129
|
+
*/
|
|
130
|
+
export declare function Link({ external, className, children, ...props }: React.ComponentProps<"a"> & {
|
|
131
|
+
external?: boolean;
|
|
132
|
+
}): import("react").JSX.Element;
|
|
133
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/components/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;GAIG;AAEH;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,EACtB,MAAc,EACd,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,+BAMpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,+BAYjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAAC,EACnB,KAAS,EACT,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BAUlD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,CAAC,EACD,CAAC,EACD,SAAS,GACV,EAAE;IACD,yFAAyF;IACzF,OAAO,EAAE,GAAG,GAAG,GAAG,CAAC;IACnB,CAAC,EAAE,SAAS,CAAC;IACb,CAAC,EAAE,SAAS,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAWA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,EACtB,IAAa,EACb,IAAI,EACJ,OAAO,EACP,SAAS,EACT,QAAQ,GACT,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB,+BAiBA;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,QAAQ,EACR,KAAa,EACb,GAAG,KAAK,EAGT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAA;CAAE,+BAWzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAUA;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,IAAI,CAAC,EACnB,QAAgB,EAChB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,+BAWpD"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
/**
|
|
4
|
+
* Sınıfı olan ama bileşeni olmayan şeyler.
|
|
5
|
+
*
|
|
6
|
+
* Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Düz yüzey — kenarı var, yükselmiyor.
|
|
10
|
+
*
|
|
11
|
+
* `raised` verilince kartın fiziğini alır (1px kenar + 2px sert offset).
|
|
12
|
+
* İkisi ayrı bileşen değil, çünkü aralarındaki fark bir varyant: aynı şekil,
|
|
13
|
+
* artı yükseklik. Yasa 1 zaten "yükselme tek formül" diyor.
|
|
14
|
+
*/
|
|
15
|
+
export function Surface({ raised = false, className, children, ...props }) {
|
|
16
|
+
return (_jsx("div", { className: cn(raised ? "tamga-raised" : "tamga-surface", className), ...props, children: children }));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Yatay taşma kabı — ve bu bileşenin asıl işi erişilebilirlik.
|
|
20
|
+
*
|
|
21
|
+
* `overflow-x: auto` tek başına FARE için çalışır. Klavye kullanan biri o
|
|
22
|
+
* kutuya hiç giremez: kaydırılabilir bir alan odaklanabilir değilse içindeki
|
|
23
|
+
* geniş tabloyu yana kaydırmanın yolu yoktur. Tarayıcılar bunu kendiliğinden
|
|
24
|
+
* çözmüyor.
|
|
25
|
+
*
|
|
26
|
+
* `tabIndex={0}` + `role="region"` + bir ad, o kutuyu klavyeye açıyor. Ad
|
|
27
|
+
* zorunlu: adsız bir `region` ekran okuyucunun landmark listesinde
|
|
28
|
+
* "bölge, bölge, bölge" olarak birikir ve hiçbirinin ne olduğu bilinmez.
|
|
29
|
+
*/
|
|
30
|
+
export function ScrollX({ label, className, children, ...props }) {
|
|
31
|
+
return (_jsx("div", { className: cn("tamga-scroll-x", className), role: "region", "aria-label": label, tabIndex: 0, ...props, children: children }));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Aşağıdan giren blok.
|
|
35
|
+
*
|
|
36
|
+
* `.tamga-rise` bir HOVER etkisi değil, bir GİRİŞ animasyonu: sekiz piksel
|
|
37
|
+
* aşağıdan, sönükten. Azaltılmış harekette CSS onu tamamen kapatıyor.
|
|
38
|
+
*
|
|
39
|
+
* `delay` bir listeyi sırayla açmak için. Basamak küçük tutulmalı — otuz
|
|
40
|
+
* satırlık bir listede 60ms'lik bir gecikme, sonuncuyu iki saniye sonra
|
|
41
|
+
* gösterir ve bekleme hissi yaratır.
|
|
42
|
+
*/
|
|
43
|
+
export function Rise({ delay = 0, className, children, ...props }) {
|
|
44
|
+
return (_jsx("div", { className: cn("tamga-rise", className), style: delay ? { animationDelay: `${delay}ms` } : undefined, ...props, children: children }));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* İki durumun aynı yerde durması.
|
|
48
|
+
*
|
|
49
|
+
* Bir düğmenin yazısı "Kaydet" iken "Kaydediliyor…" olduğunda düğme genişler
|
|
50
|
+
* ve yanındaki her şey kayar. Swap ikisini de aynı ızgara hücresine koyuyor:
|
|
51
|
+
* kutu her zaman UZUN olanın genişliğinde, yani hiçbir şey oynamıyor.
|
|
52
|
+
*
|
|
53
|
+
* Gizlenen taraf `aria-hidden` alıyor. Almasaydı ekran okuyucu iki metni
|
|
54
|
+
* arka arkaya okurdu — "Kaydet Kaydediliyor" — ve hangisinin geçerli olduğu
|
|
55
|
+
* anlaşılmazdı.
|
|
56
|
+
*/
|
|
57
|
+
export function Swap({ showing, a, b, className, }) {
|
|
58
|
+
return (_jsxs("span", { className: cn("tamga-swap", className), children: [_jsx("span", { "data-hidden": showing !== "a", "aria-hidden": showing !== "a", children: a }), _jsx("span", { "data-hidden": showing !== "b", "aria-hidden": showing !== "b", children: b })] }));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Liste satırı — tablo olmayan listeler için.
|
|
62
|
+
*
|
|
63
|
+
* Bir tabloya yetmeyen ama bir listeden fazlası olan şey: ayarlar satırı,
|
|
64
|
+
* entegrasyon satırı, üye satırı. Sabit yükseklik ve alt kural, satırların
|
|
65
|
+
* taranabilir kalmasını sağlıyor.
|
|
66
|
+
*
|
|
67
|
+
* `href` verilirse bir bağlantıya, `onClick` verilirse bir düğmeye döner —
|
|
68
|
+
* ikisi de yoksa düz bir satır kalır. Bu ayrım önemli: tıklanabilir bir
|
|
69
|
+
* `<div>` klavyeyle erişilemez ve ekran okuyucuya hiçbir şey söylemez.
|
|
70
|
+
*/
|
|
71
|
+
export function ListRow({ size = "base", href, onClick, className, children, }) {
|
|
72
|
+
const cls = cn("tamga-list-row", size === "sm" && "tamga-list-row-sm", className);
|
|
73
|
+
if (href) {
|
|
74
|
+
return (_jsx("a", { href: href, className: cls, children: children }));
|
|
75
|
+
}
|
|
76
|
+
if (onClick) {
|
|
77
|
+
return (_jsx("button", { type: "button", onClick: onClick, className: cn(cls, "w-full text-left"), children: children }));
|
|
78
|
+
}
|
|
79
|
+
return _jsx("div", { className: cls, children: children });
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* İçinde bir panel AÇILAN tablo hücresi.
|
|
83
|
+
*
|
|
84
|
+
* Tek işi kırpmayı kapatmak — ve o tek iş, unutulduğunda görünmeyen bir hata
|
|
85
|
+
* üretiyor: hücrenin içindeki bir menü, ipucu ya da açılır panel hücre
|
|
86
|
+
* sınırında KESİLİYOR. Kontrol çalışıyor, tıklanıyor, ama yarısı yok. Hata
|
|
87
|
+
* mesajı yok, konsol sessiz, ve ilk akla gelen z-index oluyor. Z-index bunu
|
|
88
|
+
* çözmez: hiçbir yığın sırası bir `overflow` kırpmasını aşamaz.
|
|
89
|
+
*
|
|
90
|
+
* `align` VARSAYILAN OLARAK SAĞDA, çünkü en sık kullanımı satır sonundaki
|
|
91
|
+
* eylem menüsü. Ama hiza ile kırpma AYRI iki karar: sola yaslı bir hücrede
|
|
92
|
+
* ipucu barındırmak isteyen, hizasını feda etmek zorunda kalmasın diye
|
|
93
|
+
* `align="start"` var. (Uzun süre tek parçaydı ve tam bu yüzden yakalandı.)
|
|
94
|
+
*/
|
|
95
|
+
export function CellActions({ className, children, align = "end", ...props
|
|
96
|
+
/* `Omit`: `<td>`in kendi `align` niteliği var (HTML 4'ten kalma, artık
|
|
97
|
+
kullanılmıyor) ve tipi bizimkiyle çakışıyor. */
|
|
98
|
+
}) {
|
|
99
|
+
return (_jsx("td", { className: cn("tamga-cell-open", align === "end" && "tamga-cell-actions", className), ...props, children: _jsx("span", { className: cn("flex items-center gap-1", align === "end" ? "justify-end" : "justify-start"), children: children }) }));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Sayfa başlığı şeridi.
|
|
103
|
+
*
|
|
104
|
+
* Ürün bunu kendi yazmıştı (23 satır) ve doğru yazmıştı — ama her ekranın
|
|
105
|
+
* tepesinde duran bir şeyin her projede yeniden yazılması, on panelde on
|
|
106
|
+
* farklı boşluk demek.
|
|
107
|
+
*
|
|
108
|
+
* Eylem SAĞA yaslı ve başlığın taban çizgisinde. Başka yere koyan bir başlık
|
|
109
|
+
* altındaki listeden kopmuş görünüyor — bu bir tercih değil, ölçülmüş bir şey.
|
|
110
|
+
*/
|
|
111
|
+
export function PageBand({ title, subtitle, actions, className, }) {
|
|
112
|
+
return (_jsxs("div", { className: cn("tamga-section tamga-gutter flex flex-wrap items-center gap-4 py-4", className), children: [_jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "text-title font-semibold text-ink", children: title }), subtitle ? _jsx("p", { className: "text-small text-ink-faint", children: subtitle }) : null] }), actions ? _jsx("div", { className: "ml-auto flex flex-wrap items-center gap-2", children: actions }) : null] }));
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Gezinen bağlantı.
|
|
116
|
+
*
|
|
117
|
+
* `.tamga-link` sınıfı kitte yıllarca vardı, bileşeni yoktu — ve doküman
|
|
118
|
+
* sitesi kendi sarmalayıcısını yazmak zorunda kaldı. Sınıfın olup bileşenin
|
|
119
|
+
* olmaması, tam olarak checkbox'ın yaşadığı boşluk.
|
|
120
|
+
*
|
|
121
|
+
* NEDEN `Button variant="link"` DEĞİL. O bir `<button>`; bir bağlantı gibi
|
|
122
|
+
* GÖRÜNÜR ama gezinmez. Orta tuşla yeni sekmede açılamaz, sağ tıkla
|
|
123
|
+
* kopyalanamaz, ve ekran okuyucuya "düğme" der. Görünüm aynı, sözleşme
|
|
124
|
+
* ters.
|
|
125
|
+
*
|
|
126
|
+
* `external` verilince `rel="noopener noreferrer"` geliyor. `noopener`
|
|
127
|
+
* olmadan açılan sayfa `window.opener` üzerinden seninkini yönlendirebilir —
|
|
128
|
+
* eski ve hâlâ geçerli bir açık.
|
|
129
|
+
*/
|
|
130
|
+
export function Link({ external = false, className, children, ...props }) {
|
|
131
|
+
return (_jsx("a", { className: cn("tamga-link", className), target: external ? "_blank" : undefined, rel: external ? "noopener noreferrer" : undefined, ...props, children: children }));
|
|
132
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ComponentType, ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Yönlendiricinin bağlantısı, dışarıdan verilir.
|
|
4
|
+
*
|
|
5
|
+
* NEDEN KİTİN İÇİNDE DEĞİL: kit hangi yönlendiricinin kullanıldığını
|
|
6
|
+
* bilmiyor ve bilmemeli (`next/link`, `react-router`, ya da düz `a`).
|
|
7
|
+
* Bileşen bir `href` alıp `a` yazsaydı her tıklama tam sayfa yüklerdi.
|
|
8
|
+
*
|
|
9
|
+
* NEDEN `components/` ALTINDA, `patterns/` ALTINDA DEĞİL: burada doğmuştu,
|
|
10
|
+
* ama bir BİLEŞEN de (`Kpi`) bağlantı olabildiği için şablon katmanına
|
|
11
|
+
* bağımlı olması gerekiyordu. Bir bileşenin şablondan import etmesi katmanı
|
|
12
|
+
* ters çevirir; tip aşağı indi, `patterns/shared.tsx` onu yeniden dışa
|
|
13
|
+
* vuruyor ve dışarıdan bakan API hiç değişmedi.
|
|
14
|
+
*/
|
|
15
|
+
export type LinkComponent = ComponentType<{
|
|
16
|
+
href: string;
|
|
17
|
+
className?: string;
|
|
18
|
+
children?: ReactNode;
|
|
19
|
+
[key: string]: unknown;
|
|
20
|
+
}>;
|
|
21
|
+
export declare const PlainLink: LinkComponent;
|
|
22
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/components/link.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC,CAAC;AAEH,eAAO,MAAM,SAAS,EAAE,aAIvB,CAAC"}
|