सीधे मुख्य कॉन्टेंट पर जाएँ
menumenu tanreiexpand_morecontrasttranslate
tanreiexpand_more
शुरुआत करेंWebReactSwiftUIJetpack ComposeFlutterReact Nativeप्रीसेटआपका अपना डिज़ाइन सिस्टमAI एजेंट के साथ Tanrei का इस्तेमालब्रांडडिज़ाइन टोकनडिज़ाइन सिस्टम और कस्टमाइज़ेशनTheme Studioरंगटाइपोग्राफ़ीआइकनशेपएलिवेशनमोशनइंटरैक्शन स्टेटव्यवहारलेआउटसुलभताशब्दकलर टोकनटाइप स्केल टोकनशेप टोकनएलिवेशन टोकनमोशन टोकनस्टेट टोकनस्पेस और माप के टोकनकंपोनेंटबटनमुख्य ऐक्शन बटनसेगमेंटेड बटनबटन ग्रुपमेन्यू वाला बटनटूलबारकॉपी बटनचेकबॉक्सरेडियो बटनस्विचचिपमेन्यूस्लाइडरस्लाइडर फ़ील्डकैलेंडरDateTimePickerफ़ील्ड ग्रुपरेडियो ग्रुपचेकबॉक्स ग्रुपसिलेक्टसिलेक्ट फ़ील्डमेन्यू बारफ़ाइल अपलोडफ़ाइल पिकर उन्नतड्रॉप ज़ोनटेक्स्ट इनपुट उन्नतटेक्स्ट फ़ील्डचिप फ़ील्डफ़ील्डकॉम्बोबॉक्स उन्नतकॉम्बोबॉक्स फ़ील्डनंबर इनपुट उन्नतनंबर फ़ील्डकलर इनपुट उन्नतकलर फ़ील्डवन-टाइम कोड इनपुट उन्नतवन-टाइम कोड फ़ील्डएम्बेडेड टेक्स्ट इनपुट उन्नतचैट कंपोज़रकार्डडिवाइडरमोडल लेयर उन्नतडायलॉगलिस्टलिस्ट पंक्तिबॉटम शीटसाइड शीटकैरसेलकोड ब्लॉकटेबलपॉपओवरचरणअकॉर्डियनडिस्क्रिप्शन लिस्टफ़िगरऐप शेलपेज हेडरट्री व्यूटाइमलाइनइमेज प्रीव्यूसाइज़ हैंडलसाइज़ बदलने वाला फ़्रेमस्क्रॉल एरियाबैजप्रोग्रेस इंडिकेटरमीटरनंबर टिकरलोडिंग इंडिकेटरस्नैकबारटूलटिपकीबोर्ड शॉर्टकटटैगइनलाइन कोडकॉलआउटअवतारख़ाली स्टेटटैग ग्रुपस्केलेटनफ़ाइल आइटमस्वॉचमार्की टेक्स्टटैबटैब व्यूऐप बारनेविगेशन बारनेविगेशन ड्रॉअरखोजलिंकपेजिनेशनपिछला और अगला लिंकस्टेपरब्रेडक्रंबविषय सूचीलिंक कार्डFAB मेन्यूस्थितिTanrei कैसे बनता हैयोगदानलाइसेंस और श्रेय
होमबुनियादी बातेंव्यवहार

व्यवहार

प्रकार के दो चुनाव — दबाने का जवाब कैसे दिया जाता है और कीबोर्ड फ़ोकस कैसा दिखता है — जिन्हें डिज़ाइन सिस्टम किसी भी दूसरे टोकन की तरह तय करता है।

content_copyMarkdown में देखें

एक डिज़ाइन सिस्टम को दूसरे से अलग करने वाली लगभग हर चीज़ एक मात्रा है: कोई रेडियस, कोई टोन, कोई अवधि। मात्राएँ मान हैं, और लेयर उन्हें बदलती है।

कुछ अंतर मात्रा के नहीं होते। एक सिस्टम दबाने का जवाब रिपल से देता है और दूसरा कंट्रोल को धुँधला कर देता है; एक फ़ोकस वाले कंट्रोल के चारों ओर सख़्त रिंग बनाता है और दूसरा नरम चमक। किसी मौजूदा टोकन पर कोई भी संख्या एक को दूसरे में नहीं बदल सकती। Tanrei इन्हें प्रकार के चुनाव कहता है और sys.behavior के अंतर्गत दो टोकन के रूप में रखता है। हर टोकन व्यवहार के तरीक़ों की एक छोटी, बंद सूची देता है, और डिज़ाइन सिस्टम उनमें से एक चुनता है।

डिज़ाइन सिस्टम pressed-feedback focus-style
tanrei overlay ring
cupertino dim ring
m3-expressive-like ripple ring
m3-like ripple ring

इससे जनरेट किया गया: tokens/systems/*.system.json, design/tokens/<system>/tanrei.light.tokens.json

कंपोनेंट ये टोकन पढ़ते हैं। वे कभी यह नहीं देखते कि कौन-सा डिज़ाइन सिस्टम सक्रिय है।

दबाने पर फ़ीडबैक

tanrei.sys.behavior.pressed-feedback

How a press is answered. overlay: the pressed tokens apply to the whole container at once. ripple: the pressed state layer grows from the point of contact. dim: the pressed opacity applies to the whole control and no state layer is drawn. none: no visual answer to a press (focus and hover still apply).

— डिफ़ॉल्ट, और उस प्लैटफ़ॉर्म का फ़ॉलबैक जो यह विकल्प नहीं बना सकता

इससे जनरेट किया गया: tokens/sys/behavior.tokens.json

मान दबाए जाने के दौरान कंपोनेंट क्या बनाता है
overlay दबाए हुए स्टेट के टोकन पूरे कंटेनर पर एक साथ लागू होते हैं।
ripple दबाए हुए स्टेट की स्टेट लेयर संपर्क के बिंदु से फैलती है — दबाना कीबोर्ड से हो तो केंद्र से — और कंटेनर के शेप में क्लिप होती है।
dim कंपोनेंट की दबाए हुए स्टेट की ओपैसिटी पूरे कंट्रोल पर लागू होती है। कोई स्टेट लेयर नहीं बनती।
none कुछ नहीं। होवर और फ़ोकस फिर भी दिखते हैं।

यह चुनाव सिर्फ़ यह तय करता है कि दबाए हुए स्टेट की लेयर कैसे प्रकट होती है। उसका रंग और ओपैसिटी अब भी कंपोनेंट के हर स्टेट के टोकन से आते हैं, जिनके मान लेयर पहले की तरह तय करती है।

चुनाव जो भी हो, दबाया हुआ स्टेट बिना देरी के प्रकट होता है और कम से कम sys.motion.duration.press-hold तक दिखता रहता है (डिफ़ॉल्ट रूप से 100ms, जो मोशन डायल के अनुसार चलता है)। एक टैप या कुंजी का दबना एक फ़्रेम के भीतर ख़त्म हो जाता है; इस न्यूनतम अवधि के बिना जवाब दिख ही नहीं पाता। Button इसे आवश्यकता BTN-8 और BTN-9 के रूप में कहता है।

जो चुनाव नहीं है: कोना कैसे मुड़ता है

कोना सीधे किनारे में कैसे ढलता है, यह प्रकार का चुनाव लगता है — गोलाकार या सतत — पर यह एक मात्रा है: Figma की कॉर्नर स्मूदिंग, 0 से 1 तक, जिसमें 0.6 iOS का कोना है। यह उन्हीं रेडियस के साथ रहती है जिन्हें यह आकार देती है, sys.shape.corner-smoothing के रूप में, और इसका वर्णन शेप पेज पर है।

फ़ोकस स्टाइल

tanrei.sys.behavior.focus-style

How keyboard focus is shown. ring: the two-tone focus ring at sys.focus offset and width. glow: the same colors as a soft halo (blurred by the ring width) instead of a hard line. Both must meet the focus contrast invariants.

— डिफ़ॉल्ट, और उस प्लैटफ़ॉर्म का फ़ॉलबैक जो यह विकल्प नहीं बना सकता

इससे जनरेट किया गया: tokens/sys/behavior.tokens.json

glow उन्हीं दो फ़ोकस रंगों, ऑफ़सेट और चौड़ाई से बनता है जिनसे रिंग बनती है, इसलिए फ़ोकस के कंट्रास्ट इनवेरिएंट उस पर बिना बदलाव के लागू होते हैं। यह इंडिकेटर के किनारे को बदलता है, इस बात को नहीं कि इंडिकेटर है या नहीं।

साथ आने वाले सिस्टम

हर सिस्टम के अंतर्गत वही Button, जिसे इंस्टॉल किया गया वेब बिल्ड बनाता है। हर एक को दबाएँ, फिर Tab से उस तक पहुँचें।

दबाएँ, फिर Tab दबाएँ

tanrei overlay · ring

FilledOutlined

cupertino dim · ring

FilledOutlined

m3-expressive-like ripple · ring

FilledOutlined

m3-like ripple · ring

FilledOutlined

लेयर में चुनाव तय करना

चुनाव किसी भी मान की तरह बदला जाता है: tokens के अंतर्गत, एक reason के साथ।

{
  "id": "acme",
  "extends": "tanrei",
  "tokens": {
    "tanrei.sys.behavior.pressed-feedback": { "$value": 1, "reason": "Acme दबाने का जवाब रिपल से देता है।" },
    "tanrei.sys.behavior.focus-style":      { "$value": 1, "reason": "Acme कीबोर्ड फ़ोकस को चमक के रूप में दिखाता है।" }
  }
}

$value एक संख्या है: टोकन की सूची में उस नाम की जगह, 0 से गिनकर। pressed-feedback के लिए सूची overlay, ripple, dim, none है, इसलिए 1 का मतलब ripple है। Tanrei की टोकन फ़ाइलें जिस फ़ॉर्मैट में हैं (DTCG 2025.10), उसमें स्ट्रिंग टाइप नहीं है, इसीलिए फ़ाइल में इंडेक्स रखा जाता है। सूची से बाहर का इंडेक्स बिल्ड अस्वीकार कर देता है।

संख्या लेयर फ़ाइल में ही रहती है। जनरेट की गई CSS में नाम होता है (--tanrei-sys-behavior-pressed-feedback: ripple), और SwiftUI, Compose, Flutter और React Native को सिस्टम इंस्टेंस पर एक टाइप किया हुआ एन्यूमरेशन मिलता है।

सूचियाँ ख़ुद कोर शब्दावली का हिस्सा हैं। लेयर नामों में से चुनती है; वह कोई नाम जोड़ नहीं सकती। व्यवहार का नया तरीक़ा हर प्लैटफ़ॉर्म को बनाना पड़ता है, इसलिए शब्दावली के किसी भी दूसरे बदलाव की तरह उसका प्रस्ताव कोर के लिए रखा जाता है।

जब कोई प्लैटफ़ॉर्म कोई चुनाव नहीं बना सकता

हर सूची का पहला नाम डिफ़ॉल्ट है, और वही फ़ॉलबैक भी है। जो प्लैटफ़ॉर्म कोई चुनाव नहीं बना सकता, वह उसकी जगह पहला मान बनाता है और अपने पैकेज के README में यह बात लिखता है।

टिप्पणी

इंडेक्स हाथ से लिखना अटपटा है, इसलिए Theme Studio (Behaviour ग्रुप), tanrei explain और MCP सर्वर नाम दिखाते और स्वीकार करते हैं।