@ahmetilhn/hanui 5.3.2 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -3
- package/build/chat.cjs +3 -2
- package/build/chat.cjs.map +1 -1
- package/build/chat.css +1 -1
- package/build/chat.js +859 -446
- package/build/chat.js.map +1 -1
- package/build/index.cjs +2 -2
- package/build/index.cjs.map +1 -1
- package/build/index.d.ts +131 -117
- package/build/index.js +373 -367
- package/build/index.js.map +1 -1
- package/build/scss/_mixins.scss +25 -0
- package/build/styles.css +1 -1
- package/build/types/chat/CodeBlock/format.d.ts +7 -0
- package/build/types/chat/CodeBlock/grammars.d.ts +44 -0
- package/build/types/chat/CodeBlock/highlight.d.ts +22 -0
- package/build/types/chat/CodeBlock/index.d.ts +11 -5
- package/build/types/theme/palette.d.ts +16 -0
- package/build/types/theme/tokens.d.ts +17 -0
- package/package.json +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kod bloğunun biçimlendiricisi. Her dilde başındaki ve sonundaki boş satırları atar (çitli
|
|
3
|
+
* bloğun son `\n`i gövdede boş bir satır çiziyordu); JSON'u yeniden girintiler.
|
|
4
|
+
* ⚠ Girinti başka hiçbir dilde DEĞİŞTİRİLMEZ: bir dosyadan alınmış parçanın girintisi o dosyadaki
|
|
5
|
+
* derinliği anlatıyor ve Python'da anlamın kendisi.
|
|
6
|
+
*/
|
|
7
|
+
export declare const formatCode: (code: string, language: string | undefined) => string;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DİL TANIMLARI — yerleşik vurgulayıcının (`highlight.ts`) kuralları.
|
|
3
|
+
*
|
|
4
|
+
* Her dil SIRALI bir kural listesidir: aynı konumda eşleşen İLK kural kazanır. Kurallar tek bir
|
|
5
|
+
* düzenli ifadede birleşir (`gm` bayraklı), bu yüzden:
|
|
6
|
+
* - kural ifadeleri bayrak TAŞIMAZ ve YAKALAYAN GRUP içermez (`(?:…)` yazılır) — eşleşen kuralı
|
|
7
|
+
* grubun sırası söyler;
|
|
8
|
+
* - geriye bakış (`(?<=…)`) KULLANILMAZ: Safari 16.4 öncesinde ifade kurulurken `SyntaxError`
|
|
9
|
+
* atıyor ve kod bloğu çizilemiyordu. Önceki karaktere bağlı kurallar `reject` ile yazılır.
|
|
10
|
+
*
|
|
11
|
+
* ⚠ Kapanmamış yorum ve dize metnin SONUNA kadar uzanır (`(?![\s\S])`): akan yanıtta blok henüz
|
|
12
|
+
* bitmemişken renk doğru tarafta kalır.
|
|
13
|
+
*
|
|
14
|
+
* Kurallar ve kelime kümeleri ilk kullanımda kurulur (fabrika): modül düzeyinde çağrı yok, sohbet
|
|
15
|
+
* girişinden yalnızca başka bir bileşen alan uygulamaya vurgulayıcı inmez.
|
|
16
|
+
*/
|
|
17
|
+
/** Vurgulanan parçanın türü; her biri bir renk token'ına bağlanır (`index.module.scss`). */
|
|
18
|
+
export type CodeTokenType = 'comment' | 'keyword' | 'string' | 'number' | 'name' | 'type' | 'punctuation' | 'inserted' | 'deleted';
|
|
19
|
+
/**
|
|
20
|
+
* Kuralın türü. Bir `CodeTokenType` eşleşmeyi olduğu gibi boyar; ötekiler ek karar ister:
|
|
21
|
+
* - `word` — tanıtıcı; anahtar kelime / sabit / tip / çağrı ayrımını `classify` yapar
|
|
22
|
+
* - `tag` — `<ad` ya da `</ad`: ayraç noktalama, ad etiket (büyük harfle başlıyorsa bileşen → tip)
|
|
23
|
+
* - `markup` — işaretleme etiketinin tamamı; içi `MARKUP_TAG` ile ayrıca vurgulanır
|
|
24
|
+
* - `regex` — JS düzenli ifade değişmezi; `/` bölme işareti de olabildiği için bağlama bakılır
|
|
25
|
+
*/
|
|
26
|
+
export type RuleKind = CodeTokenType | 'word' | 'tag' | 'markup' | 'regex';
|
|
27
|
+
/** `[tür, ifade, reject?]` — `reject` eşleşmeden ÖNCEKİ karaktere uyarsa eşleşme reddedilir. */
|
|
28
|
+
export type Rule = readonly [kind: RuleKind, pattern: RegExp, reject?: RegExp];
|
|
29
|
+
export type Grammar = {
|
|
30
|
+
rules: readonly Rule[];
|
|
31
|
+
keywords?: ReadonlySet<string>;
|
|
32
|
+
/** Sabit değişmezler (`true`, `null`, `None`) — sayıyla aynı renk. */
|
|
33
|
+
literals?: ReadonlySet<string>;
|
|
34
|
+
/** Yerleşik tipler (`string`, `int`, `varchar`). */
|
|
35
|
+
types?: ReadonlySet<string>;
|
|
36
|
+
/** Büyük harfle başlayan ad tiptir (`Button`); TAMAMI büyük harf olan sabittir (`MAX_SIZE`). */
|
|
37
|
+
hasCapitalTypes?: boolean;
|
|
38
|
+
/** SQL: anahtar kelime ve tip kümesi küçük harfle yazılır, kelime küçültülerek aranır. */
|
|
39
|
+
isCaseInsensitive?: boolean;
|
|
40
|
+
};
|
|
41
|
+
/** İşaretleme etiketinin İÇİ (`markup` kuralının eşleşmesi): ad, öznitelik, değer. */
|
|
42
|
+
export declare const MARKUP_TAG: () => Grammar;
|
|
43
|
+
/** Dil adı (küçük harf) → dil. Takma adlar aynı fabrikayı gösterir; önbellek fabrikaya bağlı. */
|
|
44
|
+
export declare const GRAMMARS: Readonly<Record<string, () => Grammar>>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type CodeTokenType } from './grammars';
|
|
2
|
+
export type { CodeTokenType } from './grammars';
|
|
3
|
+
/** Vurgulanmış bir parça; `type` yoksa düz metin. */
|
|
4
|
+
export type CodeToken = {
|
|
5
|
+
text: string;
|
|
6
|
+
type?: CodeTokenType;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Bu boyun üstündeki kod VURGULANMAZ, düz çizilir.
|
|
10
|
+
* ⚠ Maliyet çözümlemede DEĞİL, `<span>` sayısında. Ölçüldü (chromium, galeri sunucusu, React
|
|
11
|
+
* geliştirme kipi): 50 000 karakterlik TypeScript 8,5 ms'de 4 333 parçaya ayrılıyor, ama yalnızca
|
|
12
|
+
* DOM kurulumu + yerleşim 66 ms, React'in ilk çizimi 590 ms ve akan yanıtta her güncelleme 173 ms.
|
|
13
|
+
* 20 000 karakterde aynı ölçüm 3,8 ms · 1 555 parça · 17 ms · 139 ms · 78 ms. Sınırın altında renk,
|
|
14
|
+
* üstünde akıcılık; ~500 satırdan uzun bir sohbet bloğu zaten istisna.
|
|
15
|
+
*/
|
|
16
|
+
export declare const HIGHLIGHT_LIMIT = 20000;
|
|
17
|
+
/**
|
|
18
|
+
* Kodu renk parçalarına ayırır — bağımlılıksız, tek geçişlik bir sözcük çözümleyici.
|
|
19
|
+
* Bir dilbilgisi ÇÖZÜMLEYİCİSİ değil: Shiki düzeyinde doğruluk gerekiyorsa vurgulanmış HTML
|
|
20
|
+
* `CodeBlock`a `html` olarak verilir.
|
|
21
|
+
*/
|
|
22
|
+
export declare const highlight: (code: string, language: string | undefined) => CodeToken[];
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { type FC } from 'react';
|
|
2
2
|
type Props = {
|
|
3
|
-
/** Ham kod
|
|
3
|
+
/** Ham kod. `html` yoksa biçimlendirilip vurgulanır; kopyalanan metin ekranda görünendir. */
|
|
4
4
|
code: string;
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* Dil adı (`ts`, `json`, `bash`, `diff`…); başlık şeridinde, kopyalama düğmesinin adında ve
|
|
7
|
+
* vurgulayıcının seçiminde. Tanınmayan dil düz çizilir.
|
|
8
|
+
*/
|
|
6
9
|
language?: string;
|
|
7
10
|
/**
|
|
8
|
-
* ÖNCEDEN VURGULANMIŞ HTML (Shiki çıktısı)
|
|
11
|
+
* ÖNCEDEN VURGULANMIŞ HTML (Shiki çıktısı) — yerleşik vurgulayıcının yerine geçer; `code`
|
|
12
|
+
* biçimlendirilmez ve olduğu gibi kopyalanır.
|
|
9
13
|
* ⚠ GÜVENLİK ÇAĞIRANIN: bu dize olduğu gibi DOM'a yazılır. Yalnızca kendi vurgulayıcınızın
|
|
10
14
|
* ürettiği çıktıyı verin; kullanıcı girdisini asla doğrudan geçirmeyin.
|
|
11
15
|
*/
|
|
@@ -18,8 +22,10 @@ type Props = {
|
|
|
18
22
|
/**
|
|
19
23
|
* Kod bloğu — başlık şeridi (dil + kopyala) ve kod gövdesi.
|
|
20
24
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
25
|
+
* Yerleşik vurgulayıcı ve biçimlendirici (bağımlılıksız): renkler `syntax-*` token'larından,
|
|
26
|
+
* yani temayla döner ve kontrastı derlemede ölçülür. JSON yeniden girintilenir, kenarlardaki boş
|
|
27
|
+
* satırlar atılır. Shiki düzeyinde doğruluk gerekiyorsa `html` verilir; Shiki'nin çift tema
|
|
28
|
+
* çıktısı (`--shiki-light` / `--shiki-dark`) burada temaya bağlanır.
|
|
23
29
|
* Kod satırları SARILMAZ: dar ekranda kutu yatay kayar (kodun girintisi anlamdır).
|
|
24
30
|
*/
|
|
25
31
|
declare const CodeBlock: FC<Props>;
|
|
@@ -201,3 +201,19 @@ export declare const CATEGORY: {
|
|
|
201
201
|
readonly series2: "#8f3beb";
|
|
202
202
|
readonly series2Dark: "#b699eb";
|
|
203
203
|
};
|
|
204
|
+
/**
|
|
205
|
+
* SÖZDİZİMİ — `CodeBlock`ın vurgulayıcısı; kategorik tonlar METİN aydınlığında (≥4,5:1).
|
|
206
|
+
* ⚠ Yeşil yok: fark satırının yeşili bir durum (`ok-fg`), sözdizimi rengi değil.
|
|
207
|
+
*/
|
|
208
|
+
export declare const SYNTAX: {
|
|
209
|
+
readonly keyword: "#a4277a";
|
|
210
|
+
readonly keywordDark: "#f691cc";
|
|
211
|
+
readonly string: "#9d451f";
|
|
212
|
+
readonly stringDark: "#f59e7c";
|
|
213
|
+
readonly number: "#7b2dcd";
|
|
214
|
+
readonly numberDark: "#c2a7f5";
|
|
215
|
+
readonly name: "#2063b0";
|
|
216
|
+
readonly nameDark: "#8dbaf5";
|
|
217
|
+
readonly type: "#76611f";
|
|
218
|
+
readonly typeDark: "#d9b341";
|
|
219
|
+
};
|
|
@@ -128,6 +128,23 @@ export declare const LIGHT_THEME: {
|
|
|
128
128
|
};
|
|
129
129
|
/** KOYU TEMA. */
|
|
130
130
|
export declare const DARK_THEME: Record<keyof typeof LIGHT_THEME, string>;
|
|
131
|
+
/**
|
|
132
|
+
* SÖZDİZİMİ TOKEN'LARI — `CodeBlock`ın vurgulayıcısı. Kategorik tonlar METİN aydınlığında: kod
|
|
133
|
+
* gövdesinde (`surface-inset`) ve üç yüzeyde ≥4,5:1. Yorum `text-3`, noktalama `text-2` — ayrı
|
|
134
|
+
* token değil. `syntax-name`: işlev çağrısı, özellik/anahtar, öznitelik, değişken.
|
|
135
|
+
* ⚠ Temaya bağlı ama ANA TABLODA DEĞİL. Yalnızca sohbet girişi kullanıyor; `LIGHT_THEME`e
|
|
136
|
+
* girdiklerinde çalışma zamanı tablosuyla HER bileşenin paketine biniyorlardı (ölçüldü: yalnızca
|
|
137
|
+
* `Button` alan uygulama 5,12 → 5,28 kB, `styles.css` +0,1 kB). Değişkenleri `chat.css` taşır
|
|
138
|
+
* (`_syntax.generated.scss`); ezme CSS'te (`--hanui-syntax-*`), `HanuiProvider theme`inde değil.
|
|
139
|
+
*/
|
|
140
|
+
export declare const SYNTAX_LIGHT_THEME: {
|
|
141
|
+
readonly 'syntax-keyword': "#a4277a";
|
|
142
|
+
readonly 'syntax-string': "#9d451f";
|
|
143
|
+
readonly 'syntax-number': "#7b2dcd";
|
|
144
|
+
readonly 'syntax-name': "#2063b0";
|
|
145
|
+
readonly 'syntax-type': "#76611f";
|
|
146
|
+
};
|
|
147
|
+
export declare const SYNTAX_DARK_THEME: Record<keyof typeof SYNTAX_LIGHT_THEME, string>;
|
|
131
148
|
/** ÖLÇÜ TOKEN'LARI — temadan bağımsız, çalışma zamanında EZİLEBİLİR. */
|
|
132
149
|
export declare const METRIC_TOKENS: {
|
|
133
150
|
readonly 'radius-xs': "4px";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ahmetilhn/hanui",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.5.0",
|
|
4
4
|
"description": "Accessible, theme-driven React component library built on SCSS Modules. Bootstrap Icons for shell iconography, two built-in themes and a fully overridable design-token contract.",
|
|
5
5
|
"author": "Ahmet ilhan <ahmetilhan.dev@gmail.com>",
|
|
6
6
|
"license": "MIT",
|