@logosphere-ui/core 0.0.0-alpha.5 → 0.0.0-alpha.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/AGENTS.md +1204 -0
  2. package/dist/AGENTS.md +1204 -0
  3. package/dist/accordion-CYuCj7nB.cjs +21 -0
  4. package/dist/accordion-cDabqwu6.js +96 -0
  5. package/dist/accordion.cjs +1 -0
  6. package/dist/accordion.js +4 -0
  7. package/dist/atoms/Badge/badge.d.ts +1 -1
  8. package/dist/atoms/Button/button.d.ts +5 -3
  9. package/dist/atoms/Checkbox/checkbox.d.ts +13 -3
  10. package/dist/atoms/FormField/formfield.d.ts +12 -0
  11. package/dist/atoms/Slider/index.d.ts +1 -0
  12. package/dist/atoms/Slider/slider.d.ts +54 -0
  13. package/dist/badge-BhINg1p5.js +72 -0
  14. package/dist/badge-CKSG_MyA.cjs +13 -0
  15. package/dist/badge.cjs +1 -1
  16. package/dist/badge.js +1 -1
  17. package/dist/breadcrumb-BOuCLUJh.cjs +12 -0
  18. package/dist/breadcrumb-BeJqq-5C.js +41 -0
  19. package/dist/breadcrumb.cjs +1 -1
  20. package/dist/breadcrumb.js +1 -1
  21. package/dist/button-CVkIa7M0.js +58 -0
  22. package/dist/button-vdNReBMi.cjs +10 -0
  23. package/dist/button.cjs +1 -1
  24. package/dist/button.js +1 -1
  25. package/dist/calendar-C71sj3Ki.js +652 -0
  26. package/dist/calendar-DZJM5Tyu.cjs +88 -0
  27. package/dist/calendar.cjs +1 -0
  28. package/dist/calendar.js +4 -0
  29. package/dist/{card-CUhlTJyJ.js → card-C7xXMV3h.js} +26 -25
  30. package/dist/card-DmQRNKtk.cjs +43 -0
  31. package/dist/card.cjs +1 -1
  32. package/dist/card.js +1 -1
  33. package/dist/chatbot-BAou4THb.cjs +183 -0
  34. package/dist/chatbot-BRfqXYYt.js +564 -0
  35. package/dist/chatbot.cjs +1 -1
  36. package/dist/chatbot.js +2 -2
  37. package/dist/checkbox-BAbPDN6x.cjs +53 -0
  38. package/dist/checkbox-CTfbav6M.js +152 -0
  39. package/dist/checkbox.cjs +1 -1
  40. package/dist/checkbox.js +1 -1
  41. package/dist/chip-group-D4DwnC37.cjs +26 -0
  42. package/dist/chip-group-DzfOd6Vw.js +89 -0
  43. package/dist/chip-group.cjs +1 -0
  44. package/dist/chip-group.js +4 -0
  45. package/dist/collapse-CbRE8ABx.cjs +47 -0
  46. package/dist/collapse-DY6SJ9jS.js +141 -0
  47. package/dist/collapse.cjs +1 -0
  48. package/dist/collapse.js +4 -0
  49. package/dist/combobox-BAa3UAQs.cjs +113 -0
  50. package/dist/combobox-BR05Tgfd.js +460 -0
  51. package/dist/combobox.cjs +1 -1
  52. package/dist/combobox.js +1 -1
  53. package/dist/datepicker-BFYWQRrJ.js +382 -0
  54. package/dist/datepicker-BWE4qDJM.cjs +85 -0
  55. package/dist/datepicker.cjs +1 -1
  56. package/dist/datepicker.js +2 -2
  57. package/dist/{download-manager-A4fOxGWJ.js → download-manager-BPg-6Qfg.js} +4 -4
  58. package/dist/download-manager-DDeTYRPs.cjs +97 -0
  59. package/dist/download-manager.cjs +1 -1
  60. package/dist/download-manager.js +1 -1
  61. package/dist/drawer-CRu4G2zu.cjs +32 -0
  62. package/dist/drawer-DhuBPWHP.js +114 -0
  63. package/dist/drawer.cjs +1 -0
  64. package/dist/drawer.js +4 -0
  65. package/dist/formfield-JXiv9mvJ.cjs +33 -0
  66. package/dist/formfield-ss2mFweu.js +161 -0
  67. package/dist/formfield.cjs +1 -1
  68. package/dist/formfield.js +1 -1
  69. package/dist/icon.cjs +1 -0
  70. package/dist/icon.js +4 -0
  71. package/dist/index.cjs +1 -1
  72. package/dist/index.d.ts +15 -0
  73. package/dist/index.js +65 -32
  74. package/dist/index.umd.js +1613 -521
  75. package/dist/input-DyLKo7h6.cjs +60 -0
  76. package/dist/input-N3Z8D7q1.js +278 -0
  77. package/dist/input-group-C6sA1lzj.cjs +5 -0
  78. package/dist/input-group-DUPlrpug.js +66 -0
  79. package/dist/input-group.cjs +1 -0
  80. package/dist/input-group.js +4 -0
  81. package/dist/input.cjs +1 -1
  82. package/dist/input.js +1 -1
  83. package/dist/left-menu.cjs +1 -0
  84. package/dist/left-menu.js +5 -0
  85. package/dist/leftmenu-DiKo8iud.cjs +120 -0
  86. package/dist/leftmenu-DlU_G4Sj.js +373 -0
  87. package/dist/modal-g3KbWncV.cjs +84 -0
  88. package/dist/modal-vSjEpYrG.js +250 -0
  89. package/dist/modal.cjs +1 -1
  90. package/dist/modal.js +1 -1
  91. package/dist/molecules/Accordion/accordion.d.ts +42 -0
  92. package/dist/molecules/Accordion/index.d.ts +2 -0
  93. package/dist/molecules/Chip/chip-group.d.ts +29 -0
  94. package/dist/molecules/Chip/index.d.ts +2 -0
  95. package/dist/molecules/Collapse/collapse.d.ts +42 -0
  96. package/dist/molecules/Collapse/index.d.ts +2 -0
  97. package/dist/molecules/Input/input.d.ts +24 -1
  98. package/dist/molecules/InputGroup/index.d.ts +1 -0
  99. package/dist/molecules/InputGroup/input-group.d.ts +40 -0
  100. package/dist/molecules/Pagination/index.d.ts +1 -0
  101. package/dist/molecules/Pagination/pagination.d.ts +60 -0
  102. package/dist/molecules/Popover/popover.d.ts +5 -0
  103. package/dist/molecules/SplitButton/index.d.ts +2 -0
  104. package/dist/molecules/SplitButton/split-button.d.ts +53 -0
  105. package/dist/molecules/Stepper/index.d.ts +2 -0
  106. package/dist/molecules/Stepper/stepper.d.ts +34 -0
  107. package/dist/molecules/Textarea/text-area.d.ts +5 -2
  108. package/dist/molecules/TimePicker/index.d.ts +2 -0
  109. package/dist/molecules/TimePicker/timepicker.d.ts +62 -0
  110. package/dist/organisms/Calendar/calendar.d.ts +54 -0
  111. package/dist/organisms/Calendar/index.d.ts +1 -0
  112. package/dist/organisms/Calendar/shared.d.ts +9 -0
  113. package/dist/organisms/Chatbot/chatbot.d.ts +10 -1
  114. package/dist/organisms/Chatbot/index.d.ts +1 -1
  115. package/dist/organisms/Combobox/combobox.d.ts +39 -0
  116. package/dist/organisms/DatePicker/datepicker.d.ts +35 -33
  117. package/dist/organisms/Drawer/drawer.d.ts +30 -0
  118. package/dist/organisms/Drawer/index.d.ts +1 -0
  119. package/dist/organisms/LeftMenu/index.d.ts +2 -0
  120. package/dist/organisms/LeftMenu/leftmenu-types.d.ts +24 -0
  121. package/dist/organisms/LeftMenu/leftmenu.d.ts +60 -0
  122. package/dist/organisms/Modal/modal.d.ts +29 -4
  123. package/dist/organisms/Tab/tab.d.ts +13 -1
  124. package/dist/organisms/Toast/index.d.ts +2 -0
  125. package/dist/organisms/Toast/toast-container.d.ts +42 -0
  126. package/dist/organisms/Toast/toast.d.ts +48 -0
  127. package/dist/organisms/TreeMenu/index.d.ts +1 -0
  128. package/dist/organisms/TreeMenu/tree-menu.d.ts +59 -0
  129. package/dist/pagination-CjXvpE2j.js +360 -0
  130. package/dist/pagination-Nnzacqdo.cjs +169 -0
  131. package/dist/pagination.cjs +1 -0
  132. package/dist/pagination.js +4 -0
  133. package/dist/popover-CrXUbUR-.cjs +30 -0
  134. package/dist/popover-M5ZcS5rj.js +161 -0
  135. package/dist/popover.cjs +1 -1
  136. package/dist/popover.js +1 -1
  137. package/dist/shared/icons/index.d.ts +1 -0
  138. package/dist/shared/types/button.types.d.ts +7 -0
  139. package/dist/slider-DSRs5uhl.cjs +108 -0
  140. package/dist/slider-ntLRajQa.js +280 -0
  141. package/dist/slider.cjs +1 -0
  142. package/dist/slider.js +4 -0
  143. package/dist/split-button-BdBweoip.js +177 -0
  144. package/dist/split-button-BpffPlVg.cjs +63 -0
  145. package/dist/split-button.cjs +1 -0
  146. package/dist/split-button.js +4 -0
  147. package/dist/stepper-CZhwgLNp.js +122 -0
  148. package/dist/stepper-ZOMaU6aZ.cjs +52 -0
  149. package/dist/stepper.cjs +1 -0
  150. package/dist/stepper.js +4 -0
  151. package/dist/styles/main.css +186 -182
  152. package/dist/switch-Do6SCkPJ.cjs +17 -0
  153. package/dist/switch-uYVuohJ-.js +68 -0
  154. package/dist/switch.cjs +1 -1
  155. package/dist/switch.js +1 -1
  156. package/dist/tab-BvRVHpWs.cjs +41 -0
  157. package/dist/tab-Byh4UgFB.js +204 -0
  158. package/dist/tab.cjs +1 -1
  159. package/dist/tab.js +1 -1
  160. package/dist/text-area-1rALZ0iy.js +239 -0
  161. package/dist/text-area-D_TYL4_q.cjs +51 -0
  162. package/dist/textarea.cjs +1 -1
  163. package/dist/textarea.js +1 -1
  164. package/dist/timepicker-B9l6HN-d.js +320 -0
  165. package/dist/timepicker-Bpf2d4Nn.cjs +119 -0
  166. package/dist/timepicker.cjs +1 -0
  167. package/dist/timepicker.js +4 -0
  168. package/dist/toast-container-C5qYjInG.js +274 -0
  169. package/dist/toast-container-D2dyP20J.cjs +64 -0
  170. package/dist/toast.cjs +1 -0
  171. package/dist/toast.js +6 -0
  172. package/dist/tree-menu-BZ7aBC7R.js +237 -0
  173. package/dist/tree-menu-DDQ_DYl7.cjs +78 -0
  174. package/dist/tree-menu.cjs +1 -0
  175. package/dist/tree-menu.js +4 -0
  176. package/dist/ui-icon-BeR-PaPg.js +75 -0
  177. package/dist/ui-icon-DWl7I5BQ.cjs +22 -0
  178. package/package.json +104 -15
  179. package/dist/badge-BbhaO73N.cjs +0 -13
  180. package/dist/badge-DE7Tgd8Z.js +0 -71
  181. package/dist/breadcrumb-B-4yqoJZ.js +0 -41
  182. package/dist/breadcrumb-Cop-B1J7.cjs +0 -12
  183. package/dist/button-C1EwOosO.js +0 -58
  184. package/dist/button-CDRccsk9.cjs +0 -10
  185. package/dist/card-n8ka8Zk-.cjs +0 -43
  186. package/dist/chatbot-Da_itUdJ.cjs +0 -160
  187. package/dist/chatbot-zkxngMRH.js +0 -481
  188. package/dist/checkbox-7Rb3WKGx.js +0 -119
  189. package/dist/checkbox-CdDTRdKV.cjs +0 -37
  190. package/dist/combobox-BJbI-Tgi.js +0 -268
  191. package/dist/combobox-pmE7bgEL.cjs +0 -99
  192. package/dist/datepicker-DFJx45C-.js +0 -750
  193. package/dist/datepicker-b9JGTTMx.cjs +0 -115
  194. package/dist/download-manager-BSIMTGaK.cjs +0 -97
  195. package/dist/formfield-D_7NFFoe.cjs +0 -27
  196. package/dist/formfield-d8fp9FTV.js +0 -118
  197. package/dist/input-BcnI1w3_.cjs +0 -46
  198. package/dist/input-Bj_7u8Iv.js +0 -192
  199. package/dist/modal-Bfc6WQSL.js +0 -110
  200. package/dist/modal-DQ8VFL-P.cjs +0 -39
  201. package/dist/popover-B7tCqk3R.js +0 -140
  202. package/dist/popover-C2p5Pmts.cjs +0 -30
  203. package/dist/switch-Cpl53nRW.js +0 -64
  204. package/dist/switch-Rnnn10bn.cjs +0 -17
  205. package/dist/tab-BKdN4xAz.js +0 -176
  206. package/dist/tab-DcjAlXzU.cjs +0 -40
  207. package/dist/text-area-BkHdLnZj.cjs +0 -44
  208. package/dist/text-area-CC24lj8v.js +0 -204
package/AGENTS.md ADDED
@@ -0,0 +1,1204 @@
1
+ # Logosphere UI — Agent Reference
2
+
3
+ > **Bu dosya AI agent'lar için yazılmıştır.**
4
+ > Bir kullanıcı sana ekran görüntüsü/Figma/wireframe verip "bu sayfayı logosphere kullanarak yap" dediğinde, bu dosyadaki bileşenleri, property'leri ve örnekleri kullanarak layout'u oluştur.
5
+
6
+ ---
7
+
8
+ ## Kurulum ve İçe Aktarım
9
+
10
+ ```html
11
+ <!-- CDN (tek dosya, tüm bileşenler) -->
12
+ <script type="module" src="node_modules/@logosphere-ui/core/dist/index.js"></script>
13
+
14
+ <!-- Veya yalnızca ihtiyaç duyulan bileşenler -->
15
+ <script type="module" src="node_modules/@logosphere-ui/core/dist/button.js"></script>
16
+ <script type="module" src="node_modules/@logosphere-ui/core/dist/input.js"></script>
17
+ ```
18
+
19
+ ```ts
20
+ // ES modül import
21
+ import "@logosphere-ui/core";
22
+ // Ya da tekil:
23
+ import "@logosphere-ui/core/button";
24
+ import "@logosphere-ui/core/input";
25
+ ```
26
+
27
+ ---
28
+
29
+ ## Genel Kurallar
30
+
31
+ | Kural | Açıklama |
32
+ |-------|----------|
33
+ | **Property bağlama** | Nesne/dizi/boolean prop'ları `.propName=${value}` ile bağla (Lit); HTML attribute için `propname="value"` |
34
+ | **Boyut değerleri** | `size="default"` veya `size="large"` (bileşene göre `"sm"/"md"/"lg"` de olabilir) |
35
+ | **Variant değerleri** | `variant="default"` veya `variant="subtle"` |
36
+ | **Hata/yardım** | `error="..."` ve `helper="..."` prop'ları tüm form bileşenlerinde mevcuttur |
37
+ | **Disabled/Readonly** | Tüm form bileşenlerinde `disabled` ve `readonly` boolean prop'ları bulunur |
38
+ | **Event dinleme** | `element.addEventListener("change", handler)` veya inline `@change=${handler}` (Lit) |
39
+ | **Birleşik event** | Form bileşenleri (Input, Textarea, Checkbox, Switch, Combobox, DatePicker, TimePicker) ek olarak **`lgsChange`** yayınlar → `detail: { value?, checked?, selected? }`. Bileşene özel eski event'ler aynen korunur |
40
+
41
+ ---
42
+
43
+ ## Tema: Bileşen Token Katmanı
44
+
45
+ Global token'ları (`--color-secondary`, `--spacing-4` vb.) `:root`'ta ezmek **tüm** bileşenleri etkiler. Tek bir bileşeni tema'lamak için aşağıdaki bileşen token'larını kullanın — hepsi ilgili global token'a fallback yapar; hiçbirini tanımlamazsanız davranış değişmez.
46
+
47
+ ```css
48
+ /* Örnek: sadece pagination'ı tema'la, diğer bileşenlere dokunma */
49
+ logosphere-pagination {
50
+ --pagination-color: #0a58ca;
51
+ --pagination-padding: 8px 12px;
52
+ }
53
+
54
+ /* Örnek: eski tasarımın 36px form alanı */
55
+ logosphere-input { --formfield-min-height: 36px; --input-field-height: 20px; }
56
+
57
+ /* Örnek: focus'ta border rengi değişmesin */
58
+ logosphere-input { --formfield-border-color-focus: var(--color-border); }
59
+
60
+ /* Örnek: alan koyu, takvim popup'ı beyaz kalsın */
61
+ logosphere-datepicker { --color-body-bg: #1e1e1e; --datepicker-popup-bg: #ffffff; }
62
+ ```
63
+
64
+ | Bileşen | Token | Fallback |
65
+ |---------|-------|----------|
66
+ | FormField | `--formfield-min-height` / `--formfield-min-height-large` | `32px` / `40px` |
67
+ | FormField | `--formfield-border-color` / `--formfield-border-color-focus` | `--color-border` / `--color-body-text` |
68
+ | FormField | `--formfield-border-radius`, `--formfield-border-{top,right,bottom,left}[-width]` | `--radius-base`, `1px solid` |
69
+ | Input | `--input-field-height` / `--input-field-height-large` | `16px` / `24px` |
70
+ | DatePicker | `--datepicker-popup-bg` / `--datepicker-popup-border-color` | `--color-body-bg` / `--color-border` |
71
+ | Pagination | `--pagination-color` / `--pagination-color-disabled` | `--color-secondary` / `--color-secondary-disabled` |
72
+ | Pagination | `--pagination-bg` / `--pagination-item-bg` / `--pagination-item-bg-hover` | `--color-body-bg` / `--color-body-bg` / `--color-body-bg-hover` |
73
+ | Pagination | `--pagination-active-bg` / `--pagination-active-color` | `--color-secondary` / `white` |
74
+ | Pagination | `--pagination-padding` | `--spacing-4 --spacing-6` (mobil: `--spacing-3 --spacing-4`) |
75
+ | Badge (default varyant) | `--badge-bg` / `--badge-color` | `--color-light-bg-2` / `--color-secondary` |
76
+ | Chatbot | `--chatbot-bg` / `--chatbot-color` | `--color-body-bg` / `--color-secondary` |
77
+ | Combobox | `--combobox-tag-bg` / `--combobox-tag-color` / `--combobox-clear-color` | `--color-light` / `--color-body-text` / `--color-secondary` |
78
+
79
+ ---
80
+
81
+ ## Bileşen Kataloğu
82
+
83
+ ### ATOMS
84
+
85
+ ---
86
+
87
+ ### `<logosphere-button>`
88
+
89
+ Varyant, boyut ve tema destekli buton.
90
+
91
+ **Properties**
92
+
93
+ | Property | Tip | Varsayılan | Açıklama |
94
+ |----------|-----|-----------|---------|
95
+ | `variant` | `"solid" \| "outline" \| "text"` | `"solid"` | Görsel stil |
96
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | Boyut |
97
+ | `theme` | `"primary" \| "success" \| "danger" \| "info" \| "warning" \| "light" \| "dark"` | `"primary"` | Renk teması |
98
+ | `iconOnly` | `boolean` | `false` | Yalnızca ikon göster (metin gizlenir) |
99
+ | `disabled` | `boolean` | `false` | Devre dışı bırak |
100
+
101
+ **Slots:** varsayılan (etiket metni), `prefix` (sol ikon), `suffix` (sağ ikon)
102
+
103
+ ```html
104
+ <!-- Temel kullanım -->
105
+ <logosphere-button>Kaydet</logosphere-button>
106
+
107
+ <!-- Varyantlar -->
108
+ <logosphere-button variant="outline" theme="danger">Sil</logosphere-button>
109
+ <logosphere-button variant="text" theme="primary">İptal</logosphere-button>
110
+
111
+ <!-- İkon ile -->
112
+ <logosphere-button size="sm">
113
+ <ui-icon slot="prefix" name="uil-check" size="16"></ui-icon>
114
+ Onayla
115
+ </logosphere-button>
116
+
117
+ <!-- Yalnızca ikon -->
118
+ <logosphere-button iconOnly variant="outline">
119
+ <ui-icon name="uil-trash" size="16"></ui-icon>
120
+ </logosphere-button>
121
+ ```
122
+
123
+ ---
124
+
125
+ ### `<logosphere-badge>`
126
+
127
+ Etiket/chip bileşeni; kapatılabilir veya yuvarlak.
128
+
129
+ **Properties**
130
+
131
+ | Property | Tip | Varsayılan | Açıklama |
132
+ |----------|-----|-----------|---------|
133
+ | `text` | `string` | `""` | Badge metni |
134
+ | `variant` | `BadgeVariant` | `"default"` | Renk varyantı |
135
+ | `size` | `BadgeSize` | `"default"` | Boyut |
136
+ | `closeable` | `boolean` | `false` | Kapatma (×) butonu göster |
137
+ | `isRound` | `boolean` | `false` | Tam yuvarlak şekil |
138
+ | `onClose` | `() => void` | — | Kapatma callback'i (attribute değil) |
139
+
140
+ **Events:** `close`
141
+
142
+ **Slots:** varsayılan (isteğe bağlı içerik)
143
+
144
+ ```html
145
+ <logosphere-badge text="Yeni"></logosphere-badge>
146
+ <logosphere-badge text="Aktif" variant="success" isRound></logosphere-badge>
147
+ <logosphere-badge text="Hata" variant="danger" closeable></logosphere-badge>
148
+ ```
149
+
150
+ ---
151
+
152
+ ### `<logosphere-checkbox>`
153
+
154
+ Onay kutusu, toggle switch veya radio buton.
155
+
156
+ **Properties**
157
+
158
+ | Property | Tip | Varsayılan | Açıklama |
159
+ |----------|-----|-----------|---------|
160
+ | `label` | `string` | `""` | Etiket metni |
161
+ | `value` | `string` | `""` | Form değeri |
162
+ | `checked` | `boolean` | `false` | İşaretli mi |
163
+ | `type` | `"checkbox" \| "switch" \| "radio"` | `"checkbox"` | Görünüm tipi |
164
+ | `disabled` | `boolean` | `false` | Devre dışı |
165
+ | `indeterminate` | `boolean` | `false` | Belirsiz durum |
166
+
167
+ **Events:** `lgsChange` → `detail: { checked, indeterminate, value }`
168
+
169
+ > **Kontrollü kullanım:** `checked` property'sine yapılan her dış atama — değer öncekiyle aynı olsa bile — görsel state'i prop'a senkronlar. Parent bir seçimi reddederse (`lgsChange` sonrası `checked`'ı değişmeyen değerle yeniden atarsa) bileşen görsel olarak geri döner; iki radio'nun birden seçili kalması engellenir.
170
+
171
+ ```html
172
+ <logosphere-checkbox label="Beni hatırla" value="remember"></logosphere-checkbox>
173
+
174
+ <!-- Switch görünümü -->
175
+ <logosphere-checkbox type="switch" label="Bildirimleri etkinleştir" checked></logosphere-checkbox>
176
+
177
+ <!-- Radio görünümü: tıklanınca işaretlenir, tekrar tıklamayla kapanmaz.
178
+ Grup davranışı consumer'da yönetilir (lgsChange ile diğerlerinin checked'i kapatılır) -->
179
+ <logosphere-checkbox type="radio" label="Seçenek 1" value="1" checked></logosphere-checkbox>
180
+ <logosphere-checkbox type="radio" label="Seçenek 2" value="2"></logosphere-checkbox>
181
+
182
+ <!-- Event dinleme -->
183
+ <script>
184
+ document.querySelector("logosphere-checkbox")
185
+ .addEventListener("lgsChange", e => console.log(e.detail.checked));
186
+ </script>
187
+ ```
188
+
189
+ ---
190
+
191
+ ### `<logosphere-switch>`
192
+
193
+ Bağımsız toggle switch.
194
+
195
+ **Properties**
196
+
197
+ | Property | Tip | Varsayılan | Açıklama |
198
+ |----------|-----|-----------|---------|
199
+ | `checked` | `boolean` | `false` | Açık mı |
200
+ | `disabled` | `boolean` | `false` | Devre dışı |
201
+ | `size` | `"sm" \| "md"` | `"md"` | Boyut |
202
+
203
+ **Events:** `change` → `detail: { checked }`, `lgsChange` → `detail: { checked }`
204
+
205
+ ```html
206
+ <logosphere-switch></logosphere-switch>
207
+ <logosphere-switch checked size="sm"></logosphere-switch>
208
+ ```
209
+
210
+ ---
211
+
212
+ ### `<logosphere-formfield>`
213
+
214
+ Tüm form kontrolleri için temel sarmalayıcı; etiket, hata/yardım, kenarlıklı konteyner.
215
+
216
+ > Genellikle doğrudan kullanılmaz; `logosphere-input`, `logosphere-textarea` gibi bileşenler içinde otomatik kullanılır. Özel kontrol oluştururken işe yarar.
217
+
218
+ **Properties**
219
+
220
+ | Property | Tip | Varsayılan | Açıklama |
221
+ |----------|-----|-----------|---------|
222
+ | `label` | `string` | `""` | Alan etiketi |
223
+ | `helper` | `string` | `""` | Yardım metni (altında gösterilir) |
224
+ | `error` | `string` | `""` | Hata mesajı (kırmızı, helper'ın yerini alır) |
225
+ | `required` | `boolean` | `false` | Zorunlu alan işareti (*) |
226
+ | `disabled` | `boolean` | `false` | Soluklaştır |
227
+ | `readonly` | `boolean` | `false` | Salt okunur stili |
228
+ | `size` | `"default" \| "large"` | `"default"` | Boyut |
229
+ | `variant` | `"default" \| "subtle"` | `"default"` | Stil varyantı |
230
+ | `cursor` | `"text" \| "pointer"` | `"text"` | İmleç tipi |
231
+ | `multiline` | `boolean` | `false` | Textarea modu (daha yüksek) |
232
+ | `forceFocused` | `boolean` | `false` | Odak stilini zorla (TimePicker/DatePicker için) |
233
+
234
+ **Slots:** varsayılan (kontrol), `prefix` (sol), `clear` (temizle butonu), `suffix` (sağ)
235
+
236
+ **Events:** `field-focus`, `field-blur` → `detail: { originalEvent }`
237
+
238
+ ---
239
+
240
+ ### MOLECULES
241
+
242
+ ---
243
+
244
+ ### `<logosphere-input>`
245
+
246
+ Metin girişi; maske, parola, temizle ve tüm formfield özellikleri.
247
+
248
+ **Properties**
249
+
250
+ | Property | Tip | Varsayılan | Açıklama |
251
+ |----------|-----|-----------|---------|
252
+ | `value` | `string` | `""` | Geçerli değer |
253
+ | `type` | `"text" \| "password" \| "email" \| "number" \| "tel" \| "url" \| "search" \| "date" \| "time"` | `"text"` | Input tipi |
254
+ | `placeholder` | `string` | `""` | Yer tutucu |
255
+ | `name` | `string` | `""` | Form adı |
256
+ | `mask` | `string` | `""` | Giriş maskesi: `0`=rakam, `a`=harf, `*`=rakam/harf, diğerleri literal. Örn: `"(000) 000-0000"`, `"00/00/0000"`, `"00:00"` |
257
+ | `showPasswordToggle` | `boolean` | `true` | `type="password"` iken göster/gizle butonunu render et (attribute: `show-password-toggle`). Şifrenin hiç gösterilmemesi gereken ekranlarda `false` verin |
258
+ | `suppressNativeValidation` | `boolean` | `false` | Tarayıcının yerel (dil bağımlı) `validationMessage`'ının iç hata olarak gösterilmesini kapatır (attribute: `suppress-native-validation`). Uygulama kendi hata metnini yönetiyorsa açın |
259
+ | `errorDisplay` | `"always" \| "on-invalid"` | `"always"` | Hata gösterim modu (attribute: `error-display`). `"on-invalid"`: hata yalnızca alan geçersizken görünür — blur/change'de doğrulanır, yazarken temizlenir (vaadin semantiği) |
260
+ | `label` | `string` | `""` | Etiket |
261
+ | `helper` | `string` | `""` | Yardım metni |
262
+ | `error` | `string` | `""` | Hata mesajı |
263
+ | `required` | `boolean` | `false` | Zorunlu |
264
+ | `disabled` | `boolean` | `false` | Devre dışı |
265
+ | `readonly` | `boolean` | `false` | Salt okunur |
266
+ | `size` | `"default" \| "large"` | `"default"` | Boyut |
267
+ | `variant` | `"default" \| "subtle"` | `"default"` | Stil |
268
+ | `minlength` | `number` | — | Min karakter |
269
+ | `maxlength` | `number` | — | Maks karakter |
270
+ | `min` / `max` | `number` | — | Sayısal sınırlar |
271
+ | `pattern` | `string` | `""` | Regex doğrulama |
272
+ | `autocomplete` | `string` | `""` | Tarayıcı otomatik doldurma |
273
+
274
+ **Public Metotlar:** `focus()`, `blur()`, `select()`, `setSelectionRange(start, end)`, `checkValidity()`, `reportValidity()`, `setCustomValidity(msg)`
275
+
276
+ **Events:**
277
+ - `input` → `detail: { value, rawValue, originalEvent }`
278
+ - `change` → `detail: { value, originalEvent }`
279
+ - `clear` (temizle butonuna tıklanınca)
280
+ - `keydown` / `keyup` → `detail: { key, originalEvent }`
281
+
282
+ **Slots:** `prefix` (sol ikon/metin), `suffix` (sağ ikon/buton)
283
+
284
+ ```html
285
+ <!-- Temel kullanım -->
286
+ <logosphere-input label="Ad Soyad" placeholder="Adınızı girin"></logosphere-input>
287
+
288
+ <!-- Email, zorunlu, hata -->
289
+ <logosphere-input
290
+ type="email"
291
+ label="E-posta"
292
+ required
293
+ error="Geçersiz e-posta adresi"
294
+ ></logosphere-input>
295
+
296
+ <!-- Telefon maskesi -->
297
+ <logosphere-input
298
+ label="Telefon"
299
+ mask="(000) 000-0000"
300
+ placeholder="(555) 000-0000"
301
+ ></logosphere-input>
302
+
303
+ <!-- Tarih maskesi -->
304
+ <logosphere-input label="Doğum Tarihi" mask="00/00/0000" placeholder="GG/AA/YYYY"></logosphere-input>
305
+
306
+ <!-- Parola -->
307
+ <logosphere-input type="password" label="Şifre"></logosphere-input>
308
+
309
+ <!-- Prefix/suffix ikon ile -->
310
+ <logosphere-input label="Arama" placeholder="Ara...">
311
+ <ui-icon slot="prefix" name="uil-search" size="16"></ui-icon>
312
+ </logosphere-input>
313
+
314
+ <!-- Subtle varyant (kenarsız, arka plan yok) -->
315
+ <logosphere-input variant="subtle" placeholder="Hızlı arama..."></logosphere-input>
316
+
317
+ <!-- Büyük boyut -->
318
+ <logosphere-input size="large" label="Başlık" placeholder="Başlık girin"></logosphere-input>
319
+ ```
320
+
321
+ ---
322
+
323
+ ### `<logosphere-textarea>`
324
+
325
+ Çok satırlı metin girişi; otomatik boyutlandırma, karakter sayacı.
326
+
327
+ **Properties**
328
+
329
+ | Property | Tip | Varsayılan | Açıklama |
330
+ |----------|-----|-----------|---------|
331
+ | `value` | `string` | `""` | Metin değeri |
332
+ | `placeholder` | `string` | `""` | Yer tutucu |
333
+ | `rows` | `number` | `3` | Başlangıç satır sayısı |
334
+ | `maxRows` | `number` | `8` | autoResize için max satır (sonra scroll) |
335
+ | `maxlength` | `number` | — | Maks karakter (sayaç gösterir) |
336
+ | `autoResize` | `boolean` | `true` | İçeriğe göre otomatik yükseklik |
337
+ | `resize` | `"none" \| "vertical" \| "horizontal" \| "both"` | `"vertical"` | Manuel yeniden boyutlandırma (autoResize=false iken) |
338
+ | `label` | `string` | `""` | Etiket |
339
+ | `helper` | `string` | `""` | Yardım metni |
340
+ | `error` | `string` | `""` | Hata mesajı |
341
+ | `required` | `boolean` | `false` | Zorunlu |
342
+ | `disabled` | `boolean` | `false` | Devre dışı |
343
+ | `readonly` | `boolean` | `false` | Salt okunur |
344
+ | `size` | `"default" \| "large"` | `"default"` | Boyut |
345
+ | `variant` | `"default" \| "subtle"` | `"default"` | Stil |
346
+
347
+ **Events:** `input`, `change`, `clear`, `keydown`, `keyup`, `lgsChange` → `detail: { value }`
348
+
349
+ ```html
350
+ <!-- Temel kullanım -->
351
+ <logosphere-textarea label="Açıklama" placeholder="Açıklama girin..."></logosphere-textarea>
352
+
353
+ <!-- Karakter sayacı ile -->
354
+ <logosphere-textarea label="Yorum" maxlength="500" rows="4"></logosphere-textarea>
355
+
356
+ <!-- Manuel resize, auto kapalı -->
357
+ <logosphere-textarea .autoResize=${false} resize="vertical" rows="6"></logosphere-textarea>
358
+
359
+ <!-- Max satır sınırı -->
360
+ <logosphere-textarea label="Not" maxRows="5"></logosphere-textarea>
361
+ ```
362
+
363
+ ---
364
+
365
+ ### `<logosphere-breadcrumb>`
366
+
367
+ Navigasyon izleri.
368
+
369
+ **Properties**
370
+
371
+ | Property | Tip | Varsayılan | Açıklama |
372
+ |----------|-----|-----------|---------|
373
+ | `items` | `{ label: string; href?: string; active?: boolean }[]` | `[]` | Navigasyon öğeleri |
374
+
375
+ ```html
376
+ <logosphere-breadcrumb
377
+ .items=${[
378
+ { label: "Ana Sayfa", href: "/" },
379
+ { label: "Ürünler", href: "/products" },
380
+ { label: "Laptop", active: true }
381
+ ]}
382
+ ></logosphere-breadcrumb>
383
+ ```
384
+
385
+ ---
386
+
387
+ ### `<logosphere-card>`
388
+
389
+ Başlık, içerik ve ayak bölümü olan kart.
390
+
391
+ **Properties**
392
+
393
+ | Property | Tip | Varsayılan | Açıklama |
394
+ |----------|-----|-----------|---------|
395
+ | `title` | `string` | `""` | Kart başlığı |
396
+ | `description` | `string` | `""` | Başlık altı açıklama |
397
+ | `header` | `boolean` | `true` | Başlık bölümünü göster |
398
+ | `footer` | `boolean` | `true` | Ayak bölümünü göster |
399
+ | `okLabel` | `string` | `"Tamam"` | Onay butonu etiketi |
400
+ | `cancelLabel` | `string` | `"İptal"` | İptal butonu etiketi |
401
+ | `onOk` | `() => void` | — | Onay callback'i |
402
+ | `onCancel` | `() => void` | — | İptal callback'i |
403
+
404
+ **Events:** `ok`, `cancel`
405
+
406
+ **Slots:** `header` (özel başlık), varsayılan (gövde), `footer` (özel ayak)
407
+
408
+ ```html
409
+ <!-- Temel kart -->
410
+ <logosphere-card title="Kullanıcı Bilgileri" description="Profil bilgilerinizi güncelleyin">
411
+ <logosphere-input label="Ad" placeholder="Adınızı girin"></logosphere-input>
412
+ <logosphere-input label="E-posta" type="email"></logosphere-input>
413
+ </logosphere-card>
414
+
415
+ <!-- Onay diyaloğu gibi -->
416
+ <logosphere-card title="Emin misiniz?" okLabel="Evet, Sil" cancelLabel="Hayır">
417
+ Bu işlem geri alınamaz.
418
+ </logosphere-card>
419
+
420
+ <!-- Sadece gövde -->
421
+ <logosphere-card .header=${false} .footer=${false}>
422
+ İçerik buraya
423
+ </logosphere-card>
424
+ ```
425
+
426
+ ---
427
+
428
+ ### `<logosphere-popover>`
429
+
430
+ Tetikleyici elemana konumlanmış açılır panel.
431
+
432
+ **Properties**
433
+
434
+ | Property | Tip | Varsayılan | Açıklama |
435
+ |----------|-----|-----------|---------|
436
+ | `title` | `string` | `""` | Popover başlığı |
437
+ | `trigger` | `"click" \| "hover"` | `"click"` | Açılma tetikleyicisi |
438
+ | `placement` | Popper Placement | `"bottom"` | Konum (`"top"`, `"bottom"`, `"left"`, `"right"`, `"bottom-start"` vb.) |
439
+ | `offset` | `number` | `8` | Tetikleyiciden mesafe (px) |
440
+ | `open` | `boolean` | `false` | Açık mı (reflect) |
441
+ | `closeOnOutsideClick` | `boolean` | `true` | Dışarı tıklayınca kapat |
442
+
443
+ **Events:** `popover-open`, `popover-close`
444
+
445
+ **Slots:** `trigger` (tetikleyici element), varsayılan (panel içeriği)
446
+
447
+ ```html
448
+ <logosphere-popover title="Yardım">
449
+ <logosphere-button slot="trigger" variant="outline">?</logosphere-button>
450
+ Bu alan, kullanıcının tam adını içermelidir.
451
+ </logosphere-popover>
452
+ ```
453
+
454
+ ---
455
+
456
+ ### `<logosphere-timepicker>`
457
+
458
+ `HH:MM` formatında saat seçici; hem yazarak hem spinner ile kullanım.
459
+
460
+ **Properties**
461
+
462
+ | Property | Tip | Varsayılan | Açıklama |
463
+ |----------|-----|-----------|---------|
464
+ | `value` | `string` | `""` | `"HH:MM"` formatında değer |
465
+ | `label` | `string` | `""` | Etiket |
466
+ | `helper` | `string` | `""` | Yardım metni |
467
+ | `error` | `string` | `""` | Hata mesajı |
468
+ | `placeholder` | `string` | `"__:__"` | Yer tutucu |
469
+ | `required` | `boolean` | `false` | Zorunlu |
470
+ | `disabled` | `boolean` | `false` | Devre dışı |
471
+ | `readonly` | `boolean` | `false` | Salt okunur |
472
+ | `size` | `"default" \| "large"` | `"default"` | Boyut |
473
+ | `variant` | `"default" \| "subtle"` | `"default"` | Stil |
474
+ | `onChange` | `(value: string) => void` | — | Değişim callback'i (attribute değil) |
475
+
476
+ **Events:** `change` → `detail: { value }`, `clear`, `lgsChange` → `detail: { value }`
477
+
478
+ ```html
479
+ <!-- Temel kullanım -->
480
+ <logosphere-timepicker label="Başlangıç Saati"></logosphere-timepicker>
481
+
482
+ <!-- Değer ile -->
483
+ <logosphere-timepicker label="Bitiş Saati" value="17:30"></logosphere-timepicker>
484
+
485
+ <!-- Zorunlu, hata ile -->
486
+ <logosphere-timepicker
487
+ label="Toplantı Saati"
488
+ required
489
+ error="Saat seçimi zorunludur"
490
+ ></logosphere-timepicker>
491
+
492
+ <!-- Event -->
493
+ <script>
494
+ document.querySelector("logosphere-timepicker")
495
+ .addEventListener("change", e => console.log(e.detail.value)); // "14:30"
496
+ </script>
497
+ ```
498
+
499
+ ---
500
+
501
+ ### ORGANISMS
502
+
503
+ ---
504
+
505
+ ### `<logosphere-combobox>`
506
+
507
+ Seçim kutusu: tekli/çoklu seçim, filtreleme, tag desteği.
508
+
509
+ **Properties**
510
+
511
+ | Property | Tip | Varsayılan | Açıklama |
512
+ |----------|-----|-----------|---------|
513
+ | `items` | `Record<string, unknown>[]` | `[]` | Seçenek listesi |
514
+ | `label` | `string` | `""` | Etiket |
515
+ | `helper` | `string` | `""` | Yardım metni |
516
+ | `error` | `string` | `""` | Hata mesajı |
517
+ | `placeholder` | `string` | `"Seçim yapınız"` | Yer tutucu |
518
+ | `multiple` | `boolean` | `false` | Çoklu seçim |
519
+ | `filterable` | `boolean` | `false` | Arama/filtreleme |
520
+ | `required` | `boolean` | `false` | Zorunlu |
521
+ | `disabled` | `boolean` | `false` | Devre dışı |
522
+ | `readOnly` | `boolean` | `false` | Salt okunur |
523
+ | `size` | `"default" \| "large"` | `"default"` | Boyut |
524
+ | `variant` | `"default" \| "subtle"` | `"default"` | Stil |
525
+ | `optionLabel` | `string` | `"label"` | Seçenek nesnesindeki etiket alanı |
526
+ | `optionValue` | `string` | `"value"` | Seçenek nesnesindeki değer alanı |
527
+ | `emptyMessage` | `string` | `"Sonuç yok"` | Sonuç yokken gösterilecek mesaj |
528
+
529
+ **Public Metotlar:** `selectedItems()` → seçili öğe dizisi, `isSelected(item)`, `setSelected(items[])`
530
+
531
+ **Events:** `selected` → `detail: { selected }`, `change` → `detail: { value }`, `lgsChange` → `detail: { value, selected }` (value = primitive `optionValue` değer(ler)i)
532
+
533
+ ```html
534
+ <logosphere-combobox
535
+ label="Şehir"
536
+ placeholder="Şehir seçin"
537
+ .items=${[
538
+ { label: "İstanbul", value: "ist" },
539
+ { label: "Ankara", value: "ank" },
540
+ { label: "İzmir", value: "izm" }
541
+ ]}
542
+ ></logosphere-combobox>
543
+
544
+ <!-- Çoklu, filtrelenebilir -->
545
+ <logosphere-combobox
546
+ label="Etiketler"
547
+ multiple
548
+ filterable
549
+ .items=${tags}
550
+ ></logosphere-combobox>
551
+
552
+ <!-- Özel alan adları -->
553
+ <logosphere-combobox
554
+ optionLabel="name"
555
+ optionValue="id"
556
+ .items=${users}
557
+ ></logosphere-combobox>
558
+ ```
559
+
560
+ ---
561
+
562
+ ### `<logosphere-datepicker>`
563
+
564
+ Tarih seçici; manuel yazma ve takvim popup'ı. `dayjs` tabanlı.
565
+
566
+ **Properties**
567
+
568
+ | Property | Tip | Varsayılan | Açıklama |
569
+ |----------|-----|-----------|---------|
570
+ | `value` | `string \| null` | `null` | `"YYYY-MM-DD"` formatında değer |
571
+ | `min` | `string \| null` | `null` | En erken tarih (`"YYYY-MM-DD"`) |
572
+ | `max` | `string \| null` | `null` | En geç tarih |
573
+ | `label` | `string` | `""` | Etiket |
574
+ | `helper` | `string` | `""` | Yardım |
575
+ | `error` | `string` | `""` | Hata |
576
+ | `placeholder` | `string` | `"GG/AA/YYYY"` | Yer tutucu |
577
+ | `required` | `boolean` | `false` | Zorunlu |
578
+ | `disabled` | `boolean` | `false` | Devre dışı |
579
+ | `readonly` | `boolean` | `false` | Salt okunur |
580
+ | `rangeMode` | `boolean` | `false` | Aralık seçimi modu |
581
+ | `rangeStart` | `string \| null` | `null` | Aralık başlangıcı |
582
+ | `rangeEnd` | `string \| null` | `null` | Aralık bitişi |
583
+ | `disabledDays` | `number[]` | `[]` | Devre dışı haftanın günleri (0=Pazar…6=Cumartesi) |
584
+ | `expandFactor` | `number` | `1.05` | Popup genişlik çarpanı |
585
+ | `onChange` | `(value: string) => void` | — | Değişim callback'i |
586
+ | `onRangeChange` | `(range) => void` | — | Aralık callback'i |
587
+
588
+ **Events:** `change` → `detail: { value }`, `rangeChange` → `detail: { start, end }`, `lgsChange` → `detail: { value }`
589
+
590
+ ```html
591
+ <!-- Temel kullanım -->
592
+ <logosphere-datepicker label="Tarih"></logosphere-datepicker>
593
+
594
+ <!-- Min/max sınırları -->
595
+ <logosphere-datepicker
596
+ label="Başlangıç Tarihi"
597
+ min="2024-01-01"
598
+ max="2026-12-31"
599
+ value="2025-06-15"
600
+ ></logosphere-datepicker>
601
+
602
+ <!-- Aralık modu -->
603
+ <logosphere-datepicker
604
+ label="Tarih Aralığı"
605
+ .rangeMode=${true}
606
+ ></logosphere-datepicker>
607
+
608
+ <!-- Hafta sonu kapalı -->
609
+ <logosphere-datepicker
610
+ label="İş Günü"
611
+ .disabledDays=${[0, 6]}
612
+ ></logosphere-datepicker>
613
+ ```
614
+
615
+ ---
616
+
617
+ ### `<logosphere-calendar>`
618
+
619
+ Bağımsız takvim bileşeni; ay/yıl görünümü, aralık seçimi.
620
+
621
+ **Properties**
622
+
623
+ | Property | Tip | Varsayılan | Açıklama |
624
+ |----------|-----|-----------|---------|
625
+ | `value` | `string \| null` | `null` | Seçili tarih (`"YYYY-MM-DD"`) |
626
+ | `min` / `max` | `string \| null` | `null` | Sınır tarihleri |
627
+ | `disabled` | `boolean` | `false` | Tüm takvim devre dışı |
628
+ | `rangeMode` | `boolean` | `false` | Aralık seçimi |
629
+ | `rangeStart` / `rangeEnd` | `string \| null` | `null` | Aralık uçları |
630
+ | `disabledDays` | `number[]` | `[]` | Devre dışı günler |
631
+ | `closable` | `boolean` | `false` | Kapat butonu göster |
632
+
633
+ **Events:** `change`, `rangeChange`, `calendar-state-change`, `close-request`
634
+
635
+ **Public Metotlar:** `focusGrid()`
636
+
637
+ ```html
638
+ <logosphere-calendar value="2025-06-15"></logosphere-calendar>
639
+ ```
640
+
641
+ ---
642
+
643
+ ### `<logosphere-modal>`
644
+
645
+ Tam ekran arka planlı modal diyalog.
646
+
647
+ **Properties**
648
+
649
+ | Property | Tip | Varsayılan | Açıklama |
650
+ |----------|-----|-----------|---------|
651
+ | `open` | `boolean` | `false` | Açık mı (reflect) |
652
+ | `title` | `string` | `""` | Modal başlığı |
653
+ | `closeOnEsc` | `boolean` | `true` | Esc ile kapat |
654
+ | `closeOnBackdrop` | `boolean` | `true` | Arka plana tıklayınca kapat |
655
+ | `showBack` | `boolean` | `false` | Geri butonu göster |
656
+ | `showClose` | `boolean` | `false` | Kapat (×) butonu göster |
657
+
658
+ **Public Metotlar:** `openModal()`, `closeModal()`
659
+
660
+ **Events:** `modal-open`, `modal-close`
661
+
662
+ **Slots:** `header`, varsayılan (gövde), `footer`
663
+
664
+ ```html
665
+ <logosphere-modal id="my-modal" title="Düzenle" showClose>
666
+ <logosphere-input label="Ad"></logosphere-input>
667
+ <div slot="footer">
668
+ <logosphere-button variant="outline" id="cancel-btn">İptal</logosphere-button>
669
+ <logosphere-button>Kaydet</logosphere-button>
670
+ </div>
671
+ </logosphere-modal>
672
+
673
+ <logosphere-button onclick="document.getElementById('my-modal').openModal()">
674
+ Modal Aç
675
+ </logosphere-button>
676
+ ```
677
+
678
+ ---
679
+
680
+ ### `<logosphere-drawer>`
681
+
682
+ Yan panel; sağdan veya soldan açılır.
683
+
684
+ **Properties**
685
+
686
+ | Property | Tip | Varsayılan | Açıklama |
687
+ |----------|-----|-----------|---------|
688
+ | `open` | `boolean` | `false` | Açık mı (reflect) |
689
+ | `title` | `string` | `""` | Panel başlığı |
690
+ | `position` | `"left" \| "right"` | `"right"` | Hangi taraftan açılsın |
691
+ | `width` | `number` | `360` | Genişlik (px) |
692
+ | `closeOnEsc` | `boolean` | `true` | Esc ile kapat |
693
+ | `containerSelector` | `string` | `""` | CSS selector; panel bu eleman içinde konumlanır |
694
+
695
+ **Public Metotlar:** `openDrawer()`, `closeDrawer()`
696
+
697
+ **Events:** `drawer-open`, `drawer-close`
698
+
699
+ **Slots:** `trigger` (açma butonu), varsayılan (panel gövdesi)
700
+
701
+ ```html
702
+ <logosphere-drawer title="Filtreler" position="right" width="400">
703
+ <logosphere-button slot="trigger" variant="outline">
704
+ Filtreleri Aç
705
+ </logosphere-button>
706
+
707
+ <logosphere-combobox label="Durum" .items=${statusOptions}></logosphere-combobox>
708
+ <logosphere-datepicker label="Tarih"></logosphere-datepicker>
709
+ <logosphere-button style="width:100%; margin-top:16px">Uygula</logosphere-button>
710
+ </logosphere-drawer>
711
+ ```
712
+
713
+ ---
714
+
715
+ ### `<logosphere-toast>` ve `ToastService`
716
+
717
+ Bildirim mesajı. Genellikle doğrudan kullanmak yerine `ToastService` kullanılır.
718
+
719
+ **`logosphere-toast` Properties**
720
+
721
+ | Property | Tip | Varsayılan | Açıklama |
722
+ |----------|-----|-----------|---------|
723
+ | `type` | `"info" \| "success" \| "warning" \| "danger"` | `"info"` | Ikon/renk tipi |
724
+ | `title` | `string` | `""` | Başlık |
725
+ | `text` | `string` | `""` | Açıklama metni |
726
+ | `icon` | `string` | `""` | Özel ikon adı |
727
+ | `closeable` | `boolean` | `true` | Manuel kapatma butonu |
728
+ | `duration` | `number` | `6000` | Otomatik kapanma süresi (ms) |
729
+ | `autoDismiss` | `boolean` | `true` | Otomatik kapat |
730
+ | `action` | `ToastActionConfig` | — | Aksiyon butonu konfigürasyonu |
731
+
732
+ **Events:** `toast-close` → `detail: { reason: "manual" | "auto" }`
733
+
734
+ **`logosphere-toast-container`** — HTML'e ekle, sonra `ToastService` ile kullan:
735
+
736
+ ```html
737
+ <!-- Sayfa başına bir kere ekle -->
738
+ <logosphere-toast-container></logosphere-toast-container>
739
+ ```
740
+
741
+ ```ts
742
+ import { ToastService } from "@logosphere-ui/core";
743
+
744
+ // Kullanım
745
+ ToastService.success("Başarılı", "Kayıt oluşturuldu.");
746
+ ToastService.danger("Hata", "Bir sorun oluştu.");
747
+ ToastService.warning("Uyarı", "Dikkat ediniz.");
748
+ ToastService.info("Bilgi", "Güncelleme mevcut.");
749
+
750
+ // Özel seçenekler
751
+ ToastService.show({
752
+ type: "success",
753
+ title: "Dosya yüklendi",
754
+ text: "belge.pdf başarıyla yüklendi.",
755
+ duration: 4000,
756
+ autoDismiss: true,
757
+ });
758
+ ```
759
+
760
+ ---
761
+
762
+ ### `<logosphere-tab>`
763
+
764
+ Sekme gezinmesi; lazy yükleme desteği.
765
+
766
+ **Properties**
767
+
768
+ | Property | Tip | Varsayılan | Açıklama |
769
+ |----------|-----|-----------|---------|
770
+ | `tabs` | `TabItem[]` | `[]` | Sekme konfigürasyonu |
771
+ | `activeTab` | `string` | `""` | Aktif sekme id'si |
772
+ | `lazy` | `boolean` | `true` | İçerikleri lazy yükle |
773
+ | `variant` | `"default" \| "card"` | `"default"` | Görünüm |
774
+
775
+ **`TabItem` yapısı:**
776
+
777
+ ```ts
778
+ interface TabItem {
779
+ id: string;
780
+ label: string;
781
+ disabled?: boolean;
782
+ icon?: string; // ui-icon adı
783
+ }
784
+ ```
785
+
786
+ **Events:** `tab-change` → `detail: { oldTab, newTab }`
787
+
788
+ **Slots:** Her sekme için `panel-${tab.id}` adlı slot
789
+
790
+ ```html
791
+ <logosphere-tab
792
+ .tabs=${[
793
+ { id: "genel", label: "Genel", icon: "uil-info-circle" },
794
+ { id: "guvenlik", label: "Güvenlik", icon: "uil-check-circle" },
795
+ { id: "fatura", label: "Fatura", disabled: true }
796
+ ]}
797
+ activeTab="genel"
798
+ >
799
+ <div slot="panel-genel">
800
+ <logosphere-input label="Ad Soyad"></logosphere-input>
801
+ </div>
802
+ <div slot="panel-guvenlik">
803
+ <logosphere-input type="password" label="Mevcut Şifre"></logosphere-input>
804
+ </div>
805
+ </logosphere-tab>
806
+ ```
807
+
808
+ ---
809
+
810
+ ### `<logosphere-leftmenu>`
811
+
812
+ Daraltılabilir kenar çubuğu; data-driven menü ağacı, arama, logo slotları.
813
+
814
+ **Properties**
815
+
816
+ | Property | Tip | Varsayılan | Açıklama |
817
+ |----------|-----|-----------|---------|
818
+ | `open` | `boolean` | `false` | Genişletilmiş mi (reflect) |
819
+ | `openWidth` | `number` | `248` | Açık genişlik (px) |
820
+ | `storageKey` | `string` | `"logosphere-leftmenu-state"` | localStorage anahtarı |
821
+ | `items` | `LeftMenuEntry[]` | `[]` | Menü verisi (attribute değil, `.items=${...}`) |
822
+ | `leading` | `boolean` | `true` | Derinlik göstergeleri (bullet / 2px çizgi); menü açıkken geçerli |
823
+ | `defaultExpandedIds` | `string[]` | `[]` | İlk render'da açık node id'leri |
824
+
825
+ **Events:** `item-click` → `detail: { item }`, `width-change` → `detail: { width }`, `toggle-change` → `detail: { open, width, openWidth, closedWidth }`
826
+
827
+ **Slots:** `logo-open`, `toggle-closed`, `custom-open`, `custom-closed`, `icon-<itemId>` (özel ikon — `iconName` yoksa)
828
+
829
+ **Veri modeli:**
830
+
831
+ ```ts
832
+ interface MenuBadge {
833
+ text: string;
834
+ variant?: "default" | "primary" | "success" | "warning" | "danger" | "info" | "purple";
835
+ size?: "default" | "small";
836
+ isRound?: boolean;
837
+ }
838
+
839
+ interface LeftMenuItem {
840
+ id: string;
841
+ label: string;
842
+ iconName?: string; // dahili ui-icon; yoksa slot="icon-${id}" kullanılır
843
+ badges?: MenuBadge[];
844
+ active?: boolean;
845
+ disabled?: boolean;
846
+ children?: LeftMenuItem[];
847
+ data?: unknown;
848
+ }
849
+
850
+ interface LeftMenuGroup {
851
+ id: string;
852
+ label?: string;
853
+ items: LeftMenuItem[];
854
+ }
855
+
856
+ type LeftMenuEntry = LeftMenuItem | LeftMenuGroup;
857
+ ```
858
+
859
+ > **Gruplama:** `.items` dizisine doğrudan `LeftMenuItem` veya `LeftMenuGroup` koy. Grup objesinde `items` alanı vardır; düz item'da `children` alt menü içindir. Ardışık düz item'lar otomatik tek başlıksız grupta toplanır. Gruplar arasında ince border ayraç vardır.
860
+
861
+ ```html
862
+ <logosphere-leftmenu open .items=${[
863
+ {
864
+ id: "genel", label: "Genel",
865
+ items: [
866
+ { id: "home", label: "Ana Sayfa", iconName: "uil-home", active: true },
867
+ { id: "search", label: "Arama", iconName: "uil-search" }
868
+ ]
869
+ },
870
+ {
871
+ id: "yonetim", label: "Yönetim",
872
+ items: [
873
+ {
874
+ id: "reports", label: "Raporlar",
875
+ badges: [
876
+ { text: "New", variant: "success", size: "small" },
877
+ { text: "12", variant: "primary", size: "small", isRound: true }
878
+ ]
879
+ },
880
+ {
881
+ id: "users", label: "Kullanıcılar",
882
+ children: [
883
+ { id: "users-list", label: "Liste" },
884
+ { id: "users-create", label: "Yeni Ekle" }
885
+ ]
886
+ }
887
+ ]
888
+ }
889
+ ]}>
890
+ <img slot="logo-open" src="/logo-full.svg" alt="Logo" />
891
+ <img slot="toggle-closed" src="/logo-icon.svg" alt="L" />
892
+
893
+ <!-- iconName yoksa: React/Angular kendi ikon bileşenini basar -->
894
+ <svg slot="icon-reports" width="16" height="16">...</svg>
895
+ </logosphere-leftmenu>
896
+ ```
897
+
898
+ ---
899
+
900
+ ### `<logosphere-tree-menu>`
901
+
902
+ Özyinelemeli ağaç menü (veri tabanlı).
903
+
904
+ **Properties**
905
+
906
+ | Property | Tip | Varsayılan | Açıklama |
907
+ |----------|-----|-----------|---------|
908
+ | `items` | `TreeMenuItem[]` | — | Ağaç verisi (attribute değil, `.items=${...}`) |
909
+ | `expandedIds` | `string[]` | `[]` | Açık düğüm id'leri |
910
+ | `expandOnLabelClick` | `boolean` | `true` | Etikete tıklayınca aç/kapa |
911
+ | `chevronPosition` | `"left" \| "right"` | `"left"` | Ok konumu |
912
+ | `showLabels` | `boolean` | `true` | Etiketleri göster |
913
+ | `leading` | `boolean` | `true` | Derinlik göstergeleri (seviye 2: bullet, seviye 3: 2px çizgi; seviye 1 ikon kalır) |
914
+ | `iconSize` | `number` | `16` | İkon boyutu |
915
+
916
+ **`TreeMenuItem` yapısı:**
917
+
918
+ ```ts
919
+ interface TreeMenuItem {
920
+ id: string;
921
+ label: string;
922
+ iconName?: string; // dahili ui-icon; yoksa slot="icon-${id}"
923
+ badges?: MenuBadge[];
924
+ children?: TreeMenuItem[];
925
+ disabled?: boolean;
926
+ active?: boolean;
927
+ data?: unknown;
928
+ }
929
+ ```
930
+
931
+ **Events:** `toggle`, `item-click`, `node-click` — her biri `detail: { item, ... }`
932
+
933
+ ```html
934
+ <logosphere-tree-menu
935
+ .items=${[
936
+ {
937
+ id: "1", label: "Belgeler",
938
+ children: [
939
+ { id: "1-1", label: "Raporlar" },
940
+ { id: "1-2", label: "Sözleşmeler" }
941
+ ]
942
+ },
943
+ { id: "2", label: "Resimler" }
944
+ ]}
945
+ ></logosphere-tree-menu>
946
+ ```
947
+
948
+ ---
949
+
950
+ ### `<ui-icon>`
951
+
952
+ SVG ikon bileşeni. `icon-map.ts`'deki kayıtlı ikonları isimle render eder.
953
+
954
+ **Properties**
955
+
956
+ | Property | Tip | Açıklama |
957
+ |----------|-----|---------|
958
+ | `name` | `string` | İkon adı (aşağıdaki tabloya bak) |
959
+ | `size` | `number \| string` | Piksel boyutu (varsayılan: `16`) |
960
+
961
+ **Mevcut İkon İsimleri**
962
+
963
+ | İkon Adı | Kullanım Yeri |
964
+ |----------|--------------|
965
+ | `uil-times` | Kapatma/temizle |
966
+ | `uil-clock` | Saat/zaman |
967
+ | `uil-check` | Onay |
968
+ | `uil-check-circle` | Başarı |
969
+ | `uil-calendar` | Takvim |
970
+ | `uil-calendar-alt` | Takvim (alternatif) |
971
+ | `uil-arrow-left` | Sol ok |
972
+ | `uil-arrow-right` | Sağ ok |
973
+ | `uil-arrow-up` | Yukarı ok |
974
+ | `uil-arrow-down` | Aşağı ok |
975
+ | `uil-trash` | Silme |
976
+ | `uil-compress-alt` | Küçült |
977
+ | `uil-expand-alt` | Büyüt |
978
+ | `uil-copy` | Kopyala |
979
+ | `uil-thumbs-up` | Beğeni |
980
+ | `uil-thumbs-down` | Beğenmeme |
981
+ | `uil-arrow-circle-right` | Gönder |
982
+ | `uil-eye` | Göster |
983
+ | `uil-eye-slash` | Gizle |
984
+ | `uil-search` | Arama |
985
+ | `uil-left-arrow-to-left` | Sola sabitle |
986
+ | `uil-right-arrow-to-right` | Sağa sabitle |
987
+ | `uil-pin` | Sabitle |
988
+ | `uil-exclamation-triangle` | Uyarı |
989
+ | `uil-exclamation-octagon` | Hata |
990
+ | `uil-info-circle` | Bilgi |
991
+ | `uil-angle-up` | Yukarı köşeli |
992
+ | `uil-angle-down` | Aşağı köşeli |
993
+
994
+ ```html
995
+ <ui-icon name="uil-check" size="20"></ui-icon>
996
+ <ui-icon name="uil-trash" size="16"></ui-icon>
997
+ ```
998
+
999
+ ---
1000
+
1001
+ ## Sayfa Katmanları: Örnek Kompozisyonlar
1002
+
1003
+ ### Giriş Sayfası (Login Form)
1004
+
1005
+ ```html
1006
+ <div style="min-height:100vh; display:flex; align-items:center; justify-content:center; background:var(--color-body-bg)">
1007
+ <logosphere-card title="Giriş Yap" description="Hesabınıza erişin" style="width:400px">
1008
+ <div style="display:flex; flex-direction:column; gap:16px">
1009
+ <logosphere-input
1010
+ type="email"
1011
+ label="E-posta"
1012
+ placeholder="ornek@sirket.com"
1013
+ required
1014
+ ></logosphere-input>
1015
+
1016
+ <logosphere-input
1017
+ type="password"
1018
+ label="Şifre"
1019
+ required
1020
+ ></logosphere-input>
1021
+
1022
+ <logosphere-checkbox label="Beni hatırla" value="remember"></logosphere-checkbox>
1023
+
1024
+ <logosphere-button style="width:100%">Giriş Yap</logosphere-button>
1025
+ </div>
1026
+ </logosphere-card>
1027
+ </div>
1028
+ ```
1029
+
1030
+ ---
1031
+
1032
+ ### Filtreli Liste Sayfası (Drawer filtreli)
1033
+
1034
+ ```html
1035
+ <!-- Üst çubuk -->
1036
+ <div style="display:flex; gap:12px; align-items:center; padding:16px">
1037
+ <logosphere-input placeholder="Ara..." style="flex:1">
1038
+ <ui-icon slot="prefix" name="uil-search" size="16"></ui-icon>
1039
+ </logosphere-input>
1040
+
1041
+ <logosphere-drawer title="Filtreler" position="right">
1042
+ <logosphere-button slot="trigger" variant="outline">Filtre</logosphere-button>
1043
+
1044
+ <div style="display:flex; flex-direction:column; gap:12px; padding:16px">
1045
+ <logosphere-combobox label="Durum" .items=${statusItems}></logosphere-combobox>
1046
+ <logosphere-combobox label="Kategori" .items=${categoryItems} multiple filterable></logosphere-combobox>
1047
+ <logosphere-datepicker label="Tarih Aralığı" .rangeMode=${true}></logosphere-datepicker>
1048
+ <logosphere-button style="width:100%">Uygula</logosphere-button>
1049
+ </div>
1050
+ </logosphere-drawer>
1051
+ </div>
1052
+ ```
1053
+
1054
+ ---
1055
+
1056
+ ### Ayarlar Sayfası (Tab'lı form)
1057
+
1058
+ ```html
1059
+ <logosphere-tab
1060
+ .tabs=${[
1061
+ { id: "profil", label: "Profil" },
1062
+ { id: "hesap", label: "Hesap" },
1063
+ { id: "bildirim", label: "Bildirimler" }
1064
+ ]}
1065
+ activeTab="profil"
1066
+ >
1067
+ <div slot="panel-profil" style="display:flex; flex-direction:column; gap:16px; padding:16px">
1068
+ <logosphere-input label="Ad" placeholder="Adınız"></logosphere-input>
1069
+ <logosphere-input label="Soyad" placeholder="Soyadınız"></logosphere-input>
1070
+ <logosphere-input type="email" label="E-posta"></logosphere-input>
1071
+ <logosphere-textarea label="Biyografi" maxlength="300"></logosphere-textarea>
1072
+ <logosphere-button>Kaydet</logosphere-button>
1073
+ </div>
1074
+
1075
+ <div slot="panel-hesap" style="display:flex; flex-direction:column; gap:16px; padding:16px">
1076
+ <logosphere-input type="password" label="Mevcut Şifre"></logosphere-input>
1077
+ <logosphere-input type="password" label="Yeni Şifre"></logosphere-input>
1078
+ <logosphere-input type="password" label="Şifreyi Onayla"></logosphere-input>
1079
+ <logosphere-button theme="danger">Şifreyi Değiştir</logosphere-button>
1080
+ </div>
1081
+
1082
+ <div slot="panel-bildirim" style="display:flex; flex-direction:column; gap:12px; padding:16px">
1083
+ <logosphere-checkbox type="switch" label="E-posta bildirimleri" checked></logosphere-checkbox>
1084
+ <logosphere-checkbox type="switch" label="SMS bildirimleri"></logosphere-checkbox>
1085
+ <logosphere-checkbox type="switch" label="Tarayıcı bildirimleri"></logosphere-checkbox>
1086
+ </div>
1087
+ </logosphere-tab>
1088
+ ```
1089
+
1090
+ ---
1091
+
1092
+ ### Admin Paneli Layout (Sol menü + içerik)
1093
+
1094
+ ```html
1095
+ <div style="display:flex; height:100vh; overflow:hidden">
1096
+ <!-- Kenar çubuğu -->
1097
+ <logosphere-leftmenu open style="flex-shrink:0" .items=${[
1098
+ { id: "dashboard", label: "Panel", iconName: "uil-info-circle", active: true },
1099
+ { id: "users", label: "Kullanıcılar", iconName: "uil-check-circle" },
1100
+ { id: "reports", label: "Raporlar", iconName: "uil-calendar" }
1101
+ ]}>
1102
+ <img slot="logo-open" src="/logo.svg" alt="Logo" style="height:32px"/>
1103
+ <img slot="toggle-closed" src="/icon.svg" alt="L" style="height:32px"/>
1104
+ </logosphere-leftmenu>
1105
+
1106
+ <!-- Ana içerik -->
1107
+ <main style="flex:1; overflow:auto; padding:24px">
1108
+ <logosphere-breadcrumb
1109
+ .items=${[{ label: "Panel", href: "/" }, { label: "Kullanıcılar", active: true }]}
1110
+ ></logosphere-breadcrumb>
1111
+
1112
+ <!-- İçerik buraya -->
1113
+ </main>
1114
+ </div>
1115
+
1116
+ <!-- Toast container (sayfa başında bir kere) -->
1117
+ <logosphere-toast-container></logosphere-toast-container>
1118
+ ```
1119
+
1120
+ ---
1121
+
1122
+ ### Silme Onay Modalı
1123
+
1124
+ ```html
1125
+ <logosphere-modal id="delete-modal" title="Kaydı Sil" showClose closeOnEsc>
1126
+ <p>Bu kaydı silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.</p>
1127
+
1128
+ <div slot="footer" style="display:flex; gap:8px; justify-content:flex-end">
1129
+ <logosphere-button
1130
+ variant="outline"
1131
+ onclick="document.getElementById('delete-modal').closeModal()"
1132
+ >İptal</logosphere-button>
1133
+ <logosphere-button theme="danger" id="confirm-delete">Evet, Sil</logosphere-button>
1134
+ </div>
1135
+ </logosphere-modal>
1136
+
1137
+ <script>
1138
+ document.getElementById("confirm-delete").addEventListener("click", () => {
1139
+ // silme işlemi
1140
+ ToastService.success("Silindi", "Kayıt başarıyla silindi.");
1141
+ document.getElementById("delete-modal").closeModal();
1142
+ });
1143
+ </script>
1144
+ ```
1145
+
1146
+ ---
1147
+
1148
+ ## Design Tokens (CSS Değişkenleri)
1149
+
1150
+ Bileşenler bu token'ları kullanır; tema özelleştirmek için `:root` üzerinde override et.
1151
+
1152
+ ```css
1153
+ :root {
1154
+ /* Renkler */
1155
+ --color-primary: #your-brand;
1156
+ --color-body-bg: #ffffff;
1157
+ --color-body-bg-hover: #f5f5f5;
1158
+ --color-body-text: #1a1a1a;
1159
+ --color-secondary: #6b7280;
1160
+ --color-tertiary: #9ca3af;
1161
+ --color-border: #e5e7eb;
1162
+
1163
+ /* Durum renkleri */
1164
+ --color-success: #22c55e;
1165
+ --color-warning: #f59e0b;
1166
+ --color-danger: #ef4444;
1167
+ --color-info: #3b82f6;
1168
+
1169
+ /* Tipografi */
1170
+ --font-family-base: "Inter", sans-serif;
1171
+ --font-size-sm: 0.875rem; /* 14px */
1172
+ --font-size-base: 1rem; /* 16px */
1173
+ --font-weight-regular: 400;
1174
+ --font-weight-medium: 500;
1175
+ --font-weight-semibold: 600;
1176
+
1177
+ /* Spacing */
1178
+ --spacing-1: 0.25rem; /* 4px */
1179
+ --spacing-2: 0.5rem; /* 8px */
1180
+ --spacing-3: 0.75rem; /* 12px */
1181
+ --spacing-4: 1rem; /* 16px */
1182
+ --spacing-5: 1.25rem; /* 20px */
1183
+ --spacing-6: 1.5rem; /* 24px */
1184
+
1185
+ /* Border radius */
1186
+ --radius-sm: 0.25rem; /* 4px */
1187
+ --radius-base: 0.5rem; /* 8px */
1188
+ --radius-md: 0.75rem; /* 12px */
1189
+ --radius-full: 9999px;
1190
+
1191
+ /* Gölge */
1192
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.1);
1193
+ --shadow-md: 0px 4px 8px -2px rgba(0,0,0,0.1);
1194
+
1195
+ /* Geçiş */
1196
+ --transition-speed-fast: 150ms;
1197
+ --transition-timing: ease;
1198
+
1199
+ /* Z-index */
1200
+ --z-index-dropdown: 1000;
1201
+ --z-index-modal: 1050;
1202
+ --z-index-toast: 1100;
1203
+ }
1204
+ ```