Lewati ke konten
Citia DS

Referensi

API Razor dan C#

Semua tag helper beserta atributnya, partial view, dan helper C#: Icon, Tone, Fmt, Wib, paging, NavModel, HeadOptions, toast, DsText.

Hasil render nyata API ini ada di halaman Contoh Razor. Namespace: Citia.DesignSystem.Icons, Citia.DesignSystem.Ui, Citia.DesignSystem.Formatting, Citia.DesignSystem.Localization, dan Citia.DesignSystem.TagHelpers. Daftarkan sekali di _ViewImports.cshtml aplikasi (lihat Instalasi):

Razor (.cshtml)
@using Citia.DesignSystem.Icons
@using Citia.DesignSystem.Ui
@using Citia.DesignSystem.Formatting
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Citia.DesignSystem

Tag helper

Ada 99 tag helper. Nama elemen berbentuk ds-<komponen>, atribut memakai kebab-case, dan teks selalu di-encode. Setiap elemen dicantumkan satu kali, dikelompokkan seperti halaman komponen; kolom pertama menaut ke halaman komponennya.

Cara membaca kolom atribut:

  • Atribut bertipe string kecuali tipenya ditulis dalam tanda kurung, misalnya (int, 3) atau (Tone, Info). Nilai bawaan tanpa tipe adalah nilai bawaan string, misalnya (secondary).
  • Flag: memuat atribut bool yang mati secara bawaan. Tulis namanya saja untuk menyalakan (dismissible). Atribut yang nilai bawaannya menyala, seperti show-toggle, ditulis dengan tipenya, dan Anda menulis name="false" untuk mematikannya.
  • Atribut Tone menerima enum Tone (Neutral, Primary, Info, Success, Warning, Error). Atribut tone pada ds-button, ds-icon-button, dan ds-link bertipe string.
  • (wajib) menandai atribut yang dibutuhkan output. Tag helper tidak memvalidasinya; hanya name pada ds-icon yang melempar galat bila ikonnya tidak dikenal.
  • asp-for menerima model expression (ModelExpression) dan menyediakan name, id, value, dan status validasi.
  • Atribut yang tidak tercantum (data-*, aria-*, id, class, style) tetap berada pada elemen output. Pengecualian dicatat di bawah tabel.
  • "Anak dari" berarti elemen hanya valid di dalam induk itu. ds-tabs dan ds-breadcrumb juga hanya menerima itemnya sendiri sebagai anak.

Aksi

Elemen Atribut Hasil
<ds-button> variant (secondary), tone, size (md), icon, icon-end, loading-label, disabled-reason, href, type (button), pressed (bool?). Flag: icon-only, loading, full-width, selected, disabled, external button.btn; a.btn bila href diisi
<ds-icon-button /> icon, label (wajib), variant (standard), tone, size (md), badge, disabled-reason, href, type (button), pressed (bool?). Flag: round, badge-dot, loading, disabled button.ds-icon-button; a bila href diisi
<ds-toggle> icon, label, variant (ghost), size (md), disabled-reason. Flag: pressed, disabled, loading button.ds-toggle dengan aria-pressed
<ds-toggle-group> type (single), label (wajib), name, value, size (md), variant (outlined). Flag: spaced, vertical, deselectable div.ds-toggle-group
<ds-toggle-item> value, icon, label, disabled-reason. Flag: selected, disabled. Anak dari ds-toggle-group button.ds-toggle di dalam grup
<ds-fab> icon (plus), label, size (md), variant (primary), disabled-reason, href. Flag: floating, start, hide-on-scroll, loading, disabled button.ds-fab; a bila href diisi
<ds-link> href, tone. Flag: standalone, external, current, disabled, prose a.ds-link
Razor (.cshtml)
<ds-button variant="primary" icon="send" loading-label="Mengirim…" type="submit">Kirim faktur</ds-button>
<ds-icon-button icon="trash" label="Hapus faktur INV-2026-0418" variant="tonal" />
<ds-toggle-group type="single" label="Tampilan" name="view" value="list">
    <ds-toggle-item value="list" icon="list">Daftar</ds-toggle-item>
    <ds-toggle-item value="grid" icon="layout-grid">Kisi</ds-toggle-item>
</ds-toggle-group>

Form

Elemen Atribut Hasil
<ds-field> asp-for, asp-items (IEnumerable<SelectListItem>), name, id, value, label, hint, help, placeholder, type (text), icon, prefix, suffix, unit, size, success-text, error, marker (optional), autocomplete, inputmode, shortcut, maxlength (int?), rows (int, 3), min, max, step (double?), recent (int?), show-toggle (bool, true), caps-warning (bool, true), stepper (bool, true). Flag: clearable, loading, success, counter, horizontal, wide, readonly, disabled, required, autogrow, strength, trailing, locale div.ds-field berisi label, kontrol, hint, help, counter, dan galat
<ds-fieldset> legend, help, error, id. Flag: disabled, boxed fieldset.ds-fieldset
<ds-checkbox> asp-for, name, id, label, description, value (true), checked (bool?), size. Flag: indeterminate, card, end, disabled, required label.ds-check-row (.ds-choice dengan card) di sekitar input.checkbox
<ds-checkbox-group /> Sama dengan ds-radio-group fieldset.ds-checkbox-group
<ds-switch> Semua atribut ds-checkbox, ditambah label-position, action, method. Flag: icons label.ds-check-row di sekitar input.toggle[role=switch]; action dan method mengirim perubahan
<ds-radio-group /> asp-for, name, id, label, description, asp-items (IEnumerable<SelectListItem>), items (IEnumerable<ChoiceItem>), value, columns (int, 0), size. Flag: horizontal, card, disabled, required fieldset.ds-radio-group
<ds-slider /> asp-for, asp-for-end, name, name-end, id, min (decimal, 0), max (decimal, 100), step (decimal, 1), value (decimal?), value-end (decimal?), label, format, marks, output (bool, true), bubble (bool, true), size. Flag: vertical, disabled, required div.ds-slider; asp-for-end atau name-end menjadikannya range
<ds-rating /> asp-for, name, id, label, max (int, 5), value (int?), size. Flag: clearable, show-value, disabled, required fieldset.ds-rating
<ds-rating-display /> value (double), max (int, 5), count (int?), show-value (bool, true), size span.ds-rating-summary, hanya baca, nilai pecahan
<ds-otp /> asp-for, name, id, length (int, 6), label, hint, group (int, 0), size, value. Flag: alphanumeric, autosubmit, disabled, required div.ds-otp
<ds-tags-input /> asp-for, name, id, max (int, 0), max-length (int, 0), pattern, placeholder, separator (,), value, size. Flag: disabled, required input.input[data-ds-tags]; ds.js membangun chip
<ds-date-picker /> asp-for, name, id, value, min, max, disabled-dates, time-zone, size, placeholder. Flag: disable-weekends, required, disabled, readonly div.ds-date-picker di sekitar input[type=date]
<ds-date-range-picker /> start-for, end-for, start-name, end-name, start-value, end-value, legend, hint, min, max, presets, time-zone. Flag: autosubmit, required, disabled fieldset.ds-fieldset.ds-date-range dengan dua input tanggal
<ds-time-picker /> asp-for, name, id, value, min, max, step (int?, detik), hour-cycle, size. Flag: seconds, required, disabled, readonly div.ds-time-picker di sekitar input[type=time]
<ds-color-picker /> asp-for, name, id, value, swatches, contrast-against. Flag: no-eyedropper, disabled div.ds-color-picker di sekitar input[type=color]
<ds-file-upload /> asp-for, name, id, accept, max-size, max-files (int?), upload-url, upload-field, upload-param, title, hint, icon (cloud-upload). Flag: multiple, paste-page, compact, required, disabled div.ds-file-upload dengan label.ds-dropzone
<ds-avatar-upload /> asp-for, name, id, src, initials, title, hint, accept (image/jpeg,image/png,image/webp), max-size (2 MB), remove-name. Flag: large, disabled div.ds-avatar-upload
<ds-error-summary /> title. Flag: exclude-model-errors div.ds-error-summary, tersembunyi selama model valid
<ds-form-section> title (wajib), description, level (int, 2, heading 2 sampai 4). Flag: card, stacked, grid section.ds-form-section
<ds-form-bar> dirty-text. Flag: dirty-only, floating div.ds-form-bar; isi elemen menjadi area aksi

Aturan penerusan atribut. ds-field meneruskan atribut yang tidak tercantum (pattern, data-*) ke kontrol dan class ke pembungkus; isi elemen menggantikan kontrol yang dibuat otomatis. Tag helper pilihan memindahkan data-* dan aria-* ke input. Tag helper tanggal, waktu, warna, dan unggah meneruskan atribut lain ke input dan membiarkan class pada pembungkus. ds-checkbox dan ds-switch memakai isi elemen sebagai label bila label kosong. Tanpa asp-for, isi name (dan value).

Razor (.cshtml)
<ds-field asp-for="Name" label="Nama proyek" hint="Tampil di daftar dan faktur." />
<ds-field asp-for="Budget" type="number" label="Anggaran" prefix="Rp" step="0.01" />
<ds-field asp-for="Owner" type="select" asp-items="Model.Owners" label="Penanggung jawab" />
<ds-checkbox asp-for="AcceptTerms" label="Saya menyetujui ketentuan" />
<ds-radio-group asp-for="Plan" asp-items="Model.Plans" label="Paket" card columns="2" />
<ds-slider asp-for="Volume" label="Volume" min="0" max="100" step="5" format="{value}%" />
<ds-date-range-picker start-for="From" end-for="To" legend="Periode tagihan" presets="last7,last30,thisMonth" />

Tampilan data

Elemen Atribut Hasil
<ds-avatar /> name, src, icon, size, shape (square), presence, label span.ds-avatar dengan class warna yang stabil
<ds-avatar-group /> names (IEnumerable<string>), max (int, 4), size, shape (circle), label div.ds-avatar-group dengan avatar "+N"
<ds-badge /> count (int, 0), max (int, 99), tone (Tone, Primary), size, label. Flag: dot, show-zero, soft, outline, live span.ds-badge; tersembunyi pada 0 kecuali show-zero
<ds-status> tone (Tone, Neutral), size. Flag: live, outline, no-dot span.ds-status
<ds-pill> tone (Tone, Neutral), size. Flag: live, outline, plain span.ds-pill
<ds-tag> tone (Tone, Neutral), size, icon. Flag: outline, removable span.ds-tag; removable menambah tombol hapus, aplikasi yang menangani kliknya
<ds-chip> variant (ChipVariant, Filter; juga Input, Assist, Suggestion), icon, count (int?), href, size, remove-label. Flag: pressed, disabled, error button.ds-chip; a untuk Assist dan Suggestion dengan href; span untuk Input
<ds-chip-set> label, mode (multiple; single membuat chip yang ditekan saling eksklusif), max (int?). Flag: nowrap div.ds-chips[role=group]
<ds-card> title, eyebrow, description, href, image, image-alt (kosong), input-type (checkbox), name, value, level (int, 3). Flag: horizontal, selectable, checked, disabled, loading, danger article.ds-card; label.ds-card bila selectable
<ds-card-actions> tidak ada. Anak dari ds-card div.ds-card__actions di header kartu
<ds-card-footer> tidak ada. Anak dari ds-card footer.ds-card__footer
<ds-stat> label (wajib), value (wajib), unit, delta, trend (Trend, None; juga Up, Down, Flat), delta-tone (Tone?), delta-text, compare, sub, icon, href, tone (Tone, Primary). Flag: loading, bar div.ds-stat; a dengan href; isi elemen adalah slot sparkline
<ds-data-table-toolbar> action, search-name (q), search-value, search-label, search-placeholder, density-value (comfortable), export-href, export-label, export-kind (Excel), reset-href, hidden-columns, keep (sort,direction,size), column-* (column-status="Status" menghasilkan key status, label Status). Flag: client, density form.ds-table-toolbar (GET); div dengan client
<ds-kbd> keys, size. Flag: ghost kbd.ds-kbd; span.ds-kbd-group untuk kombinasi
<ds-code-block> language, title, code, highlight, collapsible (double?, rem), pre-id. Flag: line-numbers, diff, wrap, wrap-toggle, no-copy figure.ds-code dengan pre.ds-code-block
<ds-image /> src, alt, width (int?), height (int?), srcset, sizes, ratio, radius, fit, caption, zoom-src, placeholder, blur. Flag: zoom, priority figure.ds-figure
<ds-aspect-ratio> ratio (16/9). Flag: flat div.ds-aspect
<ds-carousel> label, per-view (int, 1), autoplay (int, 0, milidetik), indicators (CarouselIndicators, Dots; juga Thumbs, Count, None). Flag: loop section.ds-carousel
<ds-slide> tidak ada. Anak dari ds-carousel div.ds-carousel__slide
<ds-sparkline /> values (IEnumerable<double>), label, tone (Tone, Primary). Flag: area, large svg.ds-sparkline[role=img]
Razor (.cshtml)
<ds-avatar name="Ayu Lestari" size="md" shape="circle" presence="online" />
<ds-status tone="Warning">Menunggu persetujuan</ds-status>
<ds-chip variant="Filter" pressed count="12">Terlambat</ds-chip>
<ds-stat label="Proyek berjalan" value="24" delta="+3" trend="Up" icon="briefcase" />
<ds-card title="Redesain situs web" eyebrow="PRJ-1024" href="/projects/1024">
    Diperbarui 2 Nov 2026.
    <ds-card-footer><ds-status tone="Success">Aktif</ds-status></ds-card-footer>
</ds-card>
<ds-sparkline values="@(new double[] { 12, 14, 13, 18, 21 })" label="Pesanan, 5 hari terakhir: dari 12 ke 21" />

Umpan balik

Elemen Atribut Hasil
<ds-alert> tone (Tone, Info), title, icon, role, dismiss-label. Flag: dismissible, compact div.ds-alert; role="alert" untuk Error, selain itu status
<ds-alert-actions> tidak ada. Anak dari ds-alert Area aksi alert
<ds-banner> tone (Tone, Info), title, icon, status-label, key, remember (local; juga session, none), days (int?), dismiss-label. Flag: dismissible, sticky, bar, critical, system div.ds-banner; key menyimpan penutupan
<ds-banner-actions> tidak ada. Anak dari ds-banner Area aksi banner
ds-tooltip="…" (atribut pada elemen apa pun) ds-tooltip (teks), ds-tooltip-title, ds-tooltip-placement, ds-tooltip-kbd, ds-tooltip-delay (int?, ms) Menambahkan data-ds-tooltip dan atribut data-ds-tooltip-* terkait
<ds-tooltip> text (wajib), title, placement, kbd span.ds-tooltip-wrap, pembungkus yang dapat difokus untuk membawa tooltip kontrol yang disabled
<ds-empty> icon (info), title (wajib), action-label, action-href, action-icon (plus), variant (first-use, no-results, error, permission, compact), secondary-label, secondary-href, level (int, 2, dibatasi 2 sampai 4). Flag: boxed div.ds-empty; isi elemen menjadi kalimat penjelas
<ds-progress /> value (double?; kosong berarti indeterminate), max (double, 100), buffer (double?), label, value-text, tone (Tone, Primary), size, steps (int, 0). Flag: show-value, visible-label, circular .ds-progress[role=progressbar], .ds-progress-circle dengan circular, .ds-progress-steps dengan steps; dibungkus div.ds-meter bila label atau nilai ditampilkan
<ds-skeleton /> shape (Text; juga Heading, Avatar, Rect, Image, Button, Pill), lines (int, 1). Flag: delayed span.ds-skeleton; div.ds-skeleton-stack bila lines lebih dari 1
<ds-spinner /> label, size, tone (Tone, Neutral). Flag: block, quiet-label, delayed span.ds-loading[role=status]
<ds-stepper> current (int, 0, mulai dari 1), orientation (StepperOrientation, Vertical; juga Horizontal), label. Flag: centered div.ds-stepper
<ds-step> title (wajib), description, href, state (StepState, Auto; juga Complete, Current, Upcoming, Error). Flag: optional, disabled. Anak dari ds-stepper Satu langkah; tautan bila href diisi
Razor (.cshtml)
<ds-alert tone="Warning" title="Penyimpanan hampir penuh" dismissible>
    Anda sudah memakai 92% dari 50 GB.
    <ds-alert-actions><a class="btn btn-sm" href="/billing">Tingkatkan</a></ds-alert-actions>
</ds-alert>
<button class="btn" ds-tooltip="Hapus" ds-tooltip-placement="bottom">Hapus</button>
<ds-progress value="62" label="Impor" show-value tone="Success" />
<ds-empty icon="receipt" title="Belum ada faktur" action-label="Buat faktur" action-href="/Invoices/Create" boxed>
    Faktur yang Anda buat tampil di sini.
</ds-empty>

Overlay

Elemen Atribut Hasil
<ds-dialog> id, title, description, size, icon, icon-tone, close-label, closable (bool?). Flag: dismissible, full-mobile, alert, open-on-load dialog.modal; alert menghasilkan role="alertdialog" (lihat Alert dialog)
<ds-dialog-footer> tidak ada. Anak dari ds-dialog Aksi setelah isi, aksi utama paling akhir
<ds-sheet> id, side (end; juga start, top, bottom), size, title, description, snap, close-label, handle (bool?), dismissible (bool, true) dialog.ds-sheet.is-<side>
<ds-sheet-footer> tidak ada. Anak dari ds-sheet Aksi yang disematkan di bawah isi
<ds-popover> id, title, description, side (bottom), align (start), size, label. Flag: arrow, closable div.ds-popover[popover]
<ds-hover-card> id, side (bottom), align (center). Flag: arrow div.ds-hover-card
<ds-menu> id, label, side, align, size div.ds-menu[popover][role=menu]
<ds-menu-item> type (item; juga checkbox, radio), icon, shortcut, description, href, value, submenu. Flag: checked, disabled, danger button.ds-menu__item; a dengan href
<ds-menu-sub> tidak ada div.ds-menu__sub di sekitar item submenu dan ds-menu bersarangnya
<ds-menu-group> label div.ds-menu__group[role=group]
<ds-menu-label> tidak ada div.ds-menu__label, tidak dapat difokus
<ds-menu-separator /> tidak ada div.ds-menu__separator
<ds-command> id, placeholder, label, shortcut, source, min-length (int?), hints (bool?). Flag: palette dialog.ds-command-dialog dengan palette; selain itu div.ds-command.is-inline
<ds-command-group> label div.ds-command__group
<ds-command-item> icon, description, shortcut, href, value, keywords. Flag: disabled, danger div.ds-command__item[role=option]; a dengan href

Overlay yang menerima id membuat id unik sendiri bila id kosong. Isi id bila pemicu harus menunjuk elemennya (data-ds-dialog-open, popovertarget, data-ds-sheet-open).

Razor (.cshtml)
<button class="btn" data-ds-dialog-open="invite">Undang</button>
<ds-dialog id="invite" title="Undang anggota tim" size="md" dismissible>
    <ds-field name="email" type="email" label="Email" />
    <ds-dialog-footer>
        <button class="btn" data-ds-dialog-close>Batal</button>
        <button class="btn btn-primary">Kirim undangan</button>
    </ds-dialog-footer>
</ds-dialog>
<ds-menu id="row-menu" label="Aksi untuk INV-2026-0418" align="end">
    <ds-menu-item icon="pencil" shortcut="E">Ubah</ds-menu-item>
    <ds-menu-separator />
    <ds-menu-item icon="trash" danger>Hapus</ds-menu-item>
</ds-menu>
Elemen Atribut Hasil
<ds-tabs> label, variant (underline; juga pill, boxed), size (md), selected. Flag: vertical, manual, full, hash. Hanya menerima ds-tab sebagai anak div.ds-tabs[data-ds-tabs]; nav bila tab berupa tautan
<ds-tab> id, label, icon, count, href. Flag: current, disabled. Anak dari ds-tabs Satu tab; isi elemen adalah panelnya, tab dengan href tidak punya panel
<ds-breadcrumb> label, separator (slash; juga chevron), collapse (bool, true). Hanya menerima ds-breadcrumb-item sebagai anak nav.ds-breadcrumb
<ds-breadcrumb-item> href, icon. Anak dari ds-breadcrumb Satu tingkat; tanpa href berarti halaman saat ini
<ds-pagination> page (int, 1), page-count (int, 1), href-template, siblings (int, 1), boundaries (int, 1), size, label. Flag: edges, simple, outline nav.ds-pagination; tidak menampilkan apa pun bila page-count 1 atau kurang
<ds-theme-switcher /> variant (segmented; juga labels, toggle), size, label div.ds-segmented.ds-theme-switcher; button.ds-theme-toggle untuk toggle
<ds-language-switcher /> languages (en,id), current, href-template, action, return-url, variant (segmented; juga code, menu), label. Flag: remember nav.ds-language-switcher; form dengan action; details untuk menu
Razor (.cshtml)
<ds-tabs label="Bagian proyek">
    <ds-tab id="overview" label="Ringkasan" icon="home">Panel ringkasan.</ds-tab>
    <ds-tab id="files" label="Berkas" count="12">Panel berkas.</ds-tab>
</ds-tabs>
<ds-breadcrumb>
    <ds-breadcrumb-item href="/" icon="home">Beranda</ds-breadcrumb-item>
    <ds-breadcrumb-item href="/projects">Proyek</ds-breadcrumb-item>
    <ds-breadcrumb-item>PRJ-1024</ds-breadcrumb-item>
</ds-breadcrumb>
<ds-pagination page="3" page-count="12" />
<ds-language-switcher languages="en,id" current="@lang" href-template="/{0}/pricing" />

Tata letak

Elemen Atribut Hasil
<ds-container> size (sm, md, lg, xl, prose, full). Flag: flush div.ds-container
<ds-page-header> title, description, heading-level (int, 1). Flag: sticky, compact header.ds-page-header
<ds-page-header-breadcrumb> tidak ada. Anak dari ds-page-header Memindahkan isinya ke slot breadcrumb
<ds-page-header-meta> tidak ada. Anak dari ds-page-header Memindahkan isinya ke slot meta
<ds-page-header-actions> tidak ada. Anak dari ds-page-header Memindahkan isinya ke slot aksi; aksi utama paling akhir
<ds-page-header-tabs> tidak ada. Anak dari ds-page-header Memindahkan isinya ke slot tab
<ds-toolbar> label. Flag: overflow, vertical, flat div.ds-toolbar[role=toolbar]
<ds-toolbar-group> label. Anak dari ds-toolbar div.ds-toolbar__group[role=group]
<ds-toolbar-separator /> tidak ada div.ds-toolbar__separator
<ds-toolbar-spacer /> tidak ada div.ds-toolbar__spacer
<ds-resizable> orientation (horizontal; juga vertical), persist, height, step (int?). Flag: bare div.ds-resizable
<ds-resizable-panel> size (double?), min (double?), max (double?). Flag: collapsible. Anak dari ds-resizable div.ds-resizable__panel; ukuran berupa persentase
<ds-resizable-handle /> label. Anak dari ds-resizable div.ds-resizable__handle[role=separator]
<ds-separator> label, align (start atau end, dengan label). Flag: vertical, decorative, inset, strong, dashed, flush hr.ds-separator; div bila ada label, vertical, atau decorative
<ds-accordion> name. Flag: single, card, separated div.ds-accordion
<ds-accordion-item> title (wajib), hint, meta, icon. Flag: open, disabled. Anak dari ds-accordion details.ds-accordion__item
<ds-collapsible> title (wajib). Flag: open details.ds-collapsible
Razor (.cshtml)
<ds-container size="lg">
    <ds-page-header title="Faktur" description="Terkirim, lunas, dan terlambat." sticky>
        <ds-page-header-actions>
            <ds-button variant="primary" icon="plus" href="/Invoices/Create">Faktur baru</ds-button>
        </ds-page-header-actions>
    </ds-page-header>
    <ds-accordion single>
        <ds-accordion-item title="Penagihan" open>Rincian penagihan.</ds-accordion-item>
        <ds-accordion-item title="Pengiriman">Rincian pengiriman.</ds-accordion-item>
    </ds-accordion>
</ds-container>

Umum

Elemen Atribut Hasil
<ds-icon /> name (wajib), size (xs sampai xl), label svg.ds-icon inline, aria-hidden kecuali label diisi; atribut lain, termasuk class, diteruskan ke <svg>. name yang tidak dikenal melempar ArgumentException
Razor (.cshtml)
<ds-icon name="briefcase" size="lg" />
<ds-icon name="alert" label="Peringatan" />

Partial view

Render _DsHead di dalam <head>, _DsIconSprite tepat setelah <body>, serta _DsScripts, _DsToast, _DsConfirmDialog, dan _DsLeaveDialog satu kali per layout. Letakkan _DsSortHeader, _DsPager, dan _DsPageSize di tempat header tabel, pager, dan form filter berada.

Partial Model Hasil
_DsHead HeadOptions? Meta color-scheme dan theme-color, preload font, skrip tema sebelum paint pertama, stylesheet
_DsScripts tidak ada ds.js sebagai modul (auto-init)
_DsIconSprite tidak ada Sprite SVG semua ikon untuk <use href="#ds-icon-…">
_DsToast tidak ada div.ds-toast-region dan toast yang diantrekan di TempData
_DsConfirmDialog tidak ada dialog#ds-confirm untuk data-ds-confirm dan DS.confirm()
_DsLeaveDialog tidak ada dialog#ds-leave untuk form[data-ds-guard]
_DsPager PagerModel footer.ds-pager: teks rentang dan Sebelumnya, Halaman n / N, Berikutnya
_DsSortHeader SortHeaderModel <th> dengan tautan urut (a.ds-sort) dan aria-sort
_DsPageSize int label.ds-page-size dengan pilihan data per halaman (10, 20, 50, 100), dikirim saat berubah
_DsSidebarNav NavModel nav.ds-sidebar-nav, navigasi sidebar dua tingkat

Record model dijelaskan di bawah: HeadOptions pada Kepala halaman, PagerModel dan SortHeaderModel pada Daftar dan paging, serta NavModel dengan NavGroup dan NavItem pada Navigasi.

Razor (.cshtml)
<partial name="_DsHead" model='new HeadOptions(Stylesheet: "~/css/app.css", Storage: "app")' />
<partial name="_DsSortHeader" model='new SortHeaderModel("Anggaran", "budget", Model.Rows.Sort, Numeric: true)' />
<partial name="_DsPager" model='Model.Rows.Pager("proyek")' />
<partial name="_DsSidebarNav" model="Model.Nav" />

Ikon: Icon

Anggota Keterangan
IHtmlContent Svg(string name, string css = "ds-icon", string? label = null) Satu ikon; nama tak dikenal melempar ArgumentException
IHtmlContent Sprite() Seluruh set sebagai <symbol id="ds-icon-…">
IEnumerable<string> Names Semua nama ikon
bool Exists(string name) Cek nama

Nada: Tone

enum Tone { Neutral, Primary, Info, Success, Warning, Error } dengan ekstensi:

Metode Contoh
Css() Tone.Success.Css() menghasilkan is-success
ToastName() Tone.Primary.ToastName() menghasilkan info
IconName() Tone.Error.IconName() menghasilkan x-circle

Petakan status domain ke nada dalam satu switch di aplikasi Anda:

C#
public static (string Label, Tone Tone) Status(InvoiceStatus s) => s switch
{
    InvoiceStatus.Draft => ("Draf", Tone.Neutral),
    InvoiceStatus.Sent => ("Menunggu pembayaran", Tone.Warning),
    InvoiceStatus.Paid => ("Lunas", Tone.Success),
    InvoiceStatus.Overdue => ("Lewat tempo", Tone.Error),
    _ => ("Tidak diketahui", Tone.Neutral),
};

Toast: ToastMessage, ToastExtensions

Anggota Keterangan
record ToastMessage(Tone Tone, string Title, string? Text = null) Isi toast
controller.Toast(Tone, title, text?) Dari MVC controller
pageModel.Toast(Tone, title, text?) Dari Razor Page
tempData.SetToast(message), TakeToast() Akses langsung; kunci ds.toast
C#
[HttpPost, ValidateAntiForgeryToken]
public async Task<IActionResult> Save(ProjectForm form)
{
    if (!ModelState.IsValid) return View("Form", form);
    await _projects.SaveAsync(form);
    this.Toast(Tone.Success, "Proyek tersimpan", $"{form.Code} siap dipakai.");
    return RedirectToAction(nameof(Index));
}

Daftar dan paging

Tipe Anggota
record ListSort(string Key, bool Descending, bool Chosen) Direction; static Parse(sort, direction, allowed, defaultKey, defaultDescending = false) menolak kunci di luar daftar putih
static class PageSizes All adalah 10, 20, 50, 100; Normalize(int? size, int fallback = 10)
record ListPage<T>(Rows, Query, Page, PageSize, Total, Sort) PageCount, From, To, Pager(string? noun = null)
record PagerModel(Page, PageCount, Total, From, To, Noun = null) Model _DsPager
record SortHeaderModel(Label, Key, Current, Numeric = false, Class = null) Active, NextDirection, AriaSort
static class QueryUrl With(request, ("page", "2"), ("sort", null)) mempertahankan kunci query lain; nilai null menghapus kunci
C#
static readonly string[] Sortable = ["code", "name", "budget"];

public async Task OnGetAsync(string? q, string? sort, string? direction, int page = 1, int? size = null)
{
    var order = ListSort.Parse(sort, direction, Sortable, defaultKey: "code");
    var pageSize = PageSizes.Normalize(size);
    var (rows, total) = await _projects.SearchAsync(q, order, page, pageSize);
    Rows = new ListPage<ProjectRow>(rows, q, page, pageSize, total, order);
}
Tipe Keterangan
record NavItem(Label, Href, Icon, Active = false, Badge = null, BadgeTone = null, Disabled = false) Tautan sidebar; Badge adalah angka atau kata pendek, BadgeTone adalah primary atau error, Disabled menghasilkan aria-disabled tanpa tujuan tautan
record NavGroup(Key, Label, Items, DefaultOpen = true) Grup; HasActive memaksanya terbuka; Key menyimpan status buka
record NavModel(Top, Groups, Bottom = null, Label = null) Model _DsSidebarNav: item tanpa grup, grup, lalu item penutup; Label bawaan adalah "Navigasi utama" yang dilokalkan
NavActive.Matches(HttpContext, href, exact = false) True bila path sama dengan atau di bawah href

Avatar: Avatar

Anggota Contoh
Avatar.Initials(text) "Ayu Lestari" menghasilkan AL; "ACME1" menghasilkan AC; kosong menghasilkan ?
Avatar.ColorClass(text) c0 sampai c7, jumlah kode karakter modulo 8, stabil per nama
Razor (.cshtml)
<span class="ds-avatar @Avatar.ColorClass(user.Name)">@Avatar.Initials(user.Name)</span>

Format: Fmt, Wib

Angka dan tanggal untuk manusia mengikuti CultureInfo.CurrentCulture; angka mesin tidak bergantung culture. Nilai kosong ditampilkan sebagai en dash.

Metode Hasil
Fmt.Number(20.0400m) 20.04 (titik desimal, tanpa pemisah ribuan, maksimal 4 desimal), untuk berkas dan URL
Fmt.Decimal(1574782.5m) en 1,574,782.5, id 1.574.782,5
Fmt.Qty(1574782m, "kg") 1574782 kg; null menghasilkan –
Fmt.Diff(-746m) -746; nol menghasilkan 0, tidak pernah -0
Fmt.Percent(-0.00075m) -0.075%
Fmt.TryParseNumber("20.040", out v) true, 20.04; "1,574,782" menghasilkan false
Fmt.Date(new DateOnly(2026, 1, 25)) 25 Jan 2026 (bulan id: Jan Feb Mar Apr Mei Jun Jul Agu Sep Okt Nov Des)
Fmt.DateTime(dt) en 01 Nov 2026 14:30, id 01 Nov 2026 14.30
Fmt.DateTimeSeconds(dt) dengan detik
Fmt.InZone(utc, zone, "WIB") Waktu UTC di suatu zona dengan label: 01 Nov 2026 21:30 WIB
Fmt.Range(1, 20, 57, "proyek") en 1–20 of 57 proyek, id 1–20 dari 57 proyek (kata bendanya dari Anda)
Fmt.Text(null) –
Wib.Format(utc) 01 Nov 2026 21:30 WIB (UTC+7, tanpa DST); juga Wib.Now, Today, FromUtc, ToUtc

Kepala halaman: HeadOptions

record HeadOptions(string? Stylesheet = null, string Light = "light", string Dark = "dark", string Storage = "ds", bool PreloadFont = true)

  • Stylesheet kosong memakai ~/_content/Citia.DesignSystem/css/ds.css.
  • Storage adalah awalan kunci localStorage; harus sama dengan DS.configure({ storage }) bila diatur lewat JavaScript.
  • Berikan Light: "tps", Dark: "tps-dark" hanya bila stylesheet Anda sendiri mendefinisikan nama versi 1; selebihnya alias membuatnya tidak perlu.

String: DsText

String UI untuk partial, tag helper, dan formatter. Bahasa mengikuti CultureInfo.CurrentUICulture (pakai request localization ASP.NET Core); bahasa Inggris sebagai cadangan.

Anggota Keterangan
DsText.T(string key, params object?[] args) String terjemahan; placeholder {0} memakai culture saat ini; key yang hilang kembali ke bahasa Inggris, lalu ke key
DsText.Add(string language, IEnumerable<KeyValuePair<string,string>> entries) Menambah atau menimpa string, atau menambah bahasa utuh
DsText.Language Bahasa dua huruf pada request, atau en
C#
// Program.cs
DsText.Add("id", new Dictionary<string, string> { ["pager.next"] = "Lanjut" });
DsText.Add("ms", new Dictionary<string, string> { ["pager.next"] = "Seterusnya" });

builder.Services.Configure<RequestLocalizationOptions>(o =>
{
    o.SetDefaultCulture("en");
    o.AddSupportedCultures("en", "id").AddSupportedUICultures("en", "id");
});
app.UseRequestLocalization();

Citia Design System 2.0.2 · Citia Engineering Indonesia. Diturunkan dari INTEGRA TPS Integration; dibuat untuk semua aplikasi web Citia.