Skip to content
← Server-side Sorting
Edit Server-side Sorting
Name
Also known as (comma separated)
Brief definition
Sorting performed by the backend.
Notes
Tier
Core
Useful
Reference
Deleted
Controls schema (JSON array)
[ { "id": "caption", "type": "text", "label": "Caption", "default": "Customer orders" }, { "id": "accent", "type": "color", "label": "Accent", "default": "#241430", "presets": [ "#241430", "#A8E6C1", "#F5C2E0", "#BFD9F2", "#D9C8F0", "#E8A020" ] }, { "id": "direction", "type": "select", "label": "Total column sort", "default": "ascending", "options": [ "ascending", "descending", "none" ] }, { "id": "loading", "type": "toggle", "label": "Server request in flight", "default": false }, { "id": "latency", "type": "number", "label": "Round-trip (ms)", "default": 180, "min": 80, "max": 600, "step": 20 } ]
Templates (JSON object keyed by format)
{ "html": "<div class=\"sss{{#if loading}} sss--loading{{/if}}\" style=\"--accent:{{accent}};\">\n <div class=\"sss__scroll\">\n <table class=\"sss__table\">\n <caption>{{caption}} <span class=\"sss__status\" role=\"status\">{{#if loading}}<span class=\"sss__spinner\" aria-hidden=\"true\"></span> Sorting…{{/if}}{{#unless loading}}· {{latency}}ms{{/unless}}</span></caption>\n <thead><tr>\n <th scope=\"col\">Order</th><th scope=\"col\">Customer</th><th scope=\"col\">Status</th>\n <th scope=\"col\" aria-sort=\"{{direction}}\"><button type=\"button\" class=\"sss__sortbtn\">Total <span class=\"sss__arrow\" aria-hidden=\"true\">{{#if direction}}▲{{/if}}</span></button></th>\n </tr></thead>\n <tbody>\n <tr><td>#1042</td><td>A. Whitfield</td><td>Shipped</td><td>£22.00</td></tr>\n <tr><td>#1041</td><td>R. Okafor</td><td>Processing</td><td>£40.00</td></tr>\n <tr><td>#1040</td><td>M. Iqbal</td><td>Shipped</td><td>£64.00</td></tr>\n <tr><td>#1039</td><td>S. Novak</td><td>Refunded</td><td>£128.50</td></tr>\n </tbody>\n </table>\n </div>\n</div>\n<style>\n.sss { font: 14px system-ui, sans-serif; color: #241430; background: #FAF7F2; max-width: 480px; border: 1px solid #24143020; border-radius: 10px; overflow: hidden; }\n.sss__scroll { overflow-x: auto; }\n.sss--loading .sss__scroll { opacity: .55; }\n.sss__table { border-collapse: collapse; width: 100%; }\n.sss__table caption { text-align: left; font-weight: 600; padding: 10px 14px; }\n.sss__status { font-weight: 400; font-size: 12px; color: #241430a0; margin-left: 6px; display: inline-flex; align-items: center; gap: 6px; }\n.sss__spinner { width: 10px; height: 10px; border-radius: 50%; border: 2px solid #24143030; border-top-color: var(--accent); }\n@keyframes sss-spin { to { transform: rotate(360deg); } }\n@media (prefers-reduced-motion: no-preference) {\n .sss__scroll { transition: opacity .15s; }\n .sss__spinner { animation: sss-spin .2s linear infinite; }\n}\n.sss__table th, .sss__table td { padding: 10px 14px; text-align: left; border-bottom: 1px solid #24143020; white-space: nowrap; }\n.sss__table th { background: var(--accent); color: #FAF7F2; }\n.sss__sortbtn { background: none; border: 0; font: inherit; color: inherit; cursor: pointer; display: inline-flex; gap: 4px; align-items: center; padding: 0; }\n.sss__sortbtn:hover { text-decoration: underline; }\n.sss__sortbtn:focus-visible { outline: 2px solid #FAF7F2; outline-offset: 2px; }\n.sss[aria-sort] { }\nth[aria-sort=\"descending\"] .sss__arrow { transform: rotate(180deg); display: inline-block; }\n</style>", "tailwind": "<div class=\"max-w-[480px] rounded-[10px] border border-[#24143020] font-sans text-sm text-[#241430] bg-[#FAF7F2] overflow-hidden\" style=\"--accent:{{accent}};\">\n <div class=\"overflow-x-auto motion-safe:transition-opacity{{#if loading}} opacity-55{{/if}}\">\n <table class=\"border-collapse w-full\">\n <caption class=\"text-left font-semibold px-3.5 py-2.5\">{{caption}} <span role=\"status\" class=\"font-normal text-xs text-[#241430a0] ml-1.5 inline-flex items-center gap-1.5\">{{#if loading}}<span aria-hidden=\"true\" class=\"w-2.5 h-2.5 rounded-full border-2 border-[#24143030] motion-safe:animate-spin\" style=\"border-top-color:{{accent}}\"></span> Sorting…{{/if}}{{#unless loading}}· {{latency}}ms{{/unless}}</span></caption>\n <thead><tr class=\"text-[#FAF7F2]\" style=\"background:{{accent}}\">\n <th scope=\"col\" class=\"p-3.5 text-left whitespace-nowrap\">Order</th>\n <th scope=\"col\" class=\"p-3.5 text-left whitespace-nowrap\">Customer</th>\n <th scope=\"col\" class=\"p-3.5 text-left whitespace-nowrap\">Status</th>\n <th scope=\"col\" class=\"sss__th p-3.5 text-left whitespace-nowrap\" aria-sort=\"{{direction}}\"><button type=\"button\" class=\"bg-transparent border-0 font-inherit text-inherit cursor-pointer inline-flex gap-1 items-center p-0 hover:underline\">Total <span aria-hidden=\"true\" class=\"sss__arrow inline-block\">{{#if direction}}▲{{/if}}</span></button></th>\n </tr></thead>\n <tbody>\n <tr><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">#1042</td><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">A. Whitfield</td><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">Shipped</td><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">£22.00</td></tr>\n <tr><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">#1041</td><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">R. Okafor</td><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">Processing</td><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">£40.00</td></tr>\n <tr><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">#1040</td><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">M. Iqbal</td><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">Shipped</td><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">£64.00</td></tr>\n <tr><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">#1039</td><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">S. Novak</td><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">Refunded</td><td class=\"p-3.5 border-b border-[#24143020] whitespace-nowrap\">£128.50</td></tr>\n </tbody>\n </table>\n </div>\n</div>\n<style>\nth[aria-sort=\"descending\"] .sss__arrow { transform: rotate(180deg); display: inline-block; }\n</style>", "react": "function ServerSideSorting({\n caption = \"{{caption}}\",\n accent = \"{{accent}}\",\n direction = \"{{direction}}\",\n loading = {{loading}},\n latency = {{latency}},\n}) {\n const rows = [\n [\"#1042\", \"A. Whitfield\", \"Shipped\", \"£22.00\"],\n [\"#1041\", \"R. Okafor\", \"Processing\", \"£40.00\"],\n [\"#1040\", \"M. Iqbal\", \"Shipped\", \"£64.00\"],\n [\"#1039\", \"S. Novak\", \"Refunded\", \"£128.50\"],\n ];\n const cell = { padding: \"10px 14px\", borderBottom: \"1px solid #24143020\", whiteSpace: \"nowrap\" };\n return (\n <div style={{ maxWidth: 480, borderRadius: 10, border: \"1px solid #24143020\", overflow: \"hidden\", font: \"14px system-ui, sans-serif\", color: \"#241430\", background: \"#FAF7F2\" }}>\n <div className=\"sss-table-wrap\" style={{ overflowX: \"auto\", opacity: loading ? .55 : 1 }}>\n <table style={{ borderCollapse: \"collapse\", width: \"100%\" }}>\n <caption style={{ textAlign: \"left\", fontWeight: 600, padding: \"10px 14px\" }}>\n {caption}{\" \"}\n <span role=\"status\" style={{ fontWeight: 400, fontSize: 12, color: \"#241430a0\", marginLeft: 6, display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n {loading ? <>Sorting…</> : <>· {latency}ms</>}\n </span>\n </caption>\n <thead>\n <tr style={{ background: accent, color: \"#FAF7F2\" }}>\n <th scope=\"col\" style={cell}>Order</th>\n <th scope=\"col\" style={cell}>Customer</th>\n <th scope=\"col\" style={cell}>Status</th>\n <th scope=\"col\" style={cell} aria-sort={direction}>\n <button type=\"button\" style={{ background: \"none\", border: 0, font: \"inherit\", color: \"inherit\", cursor: \"pointer\", display: \"inline-flex\", gap: 4, alignItems: \"center\", padding: 0 }}>\n Total <span aria-hidden=\"true\" style={{ display: \"inline-block\", transform: direction === \"descending\" ? \"rotate(180deg)\" : \"none\" }}>{direction !== \"none\" && \"▲\"}</span>\n </button>\n </th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row[0]}>{row.map((c, j) => <td key={j} style={cell}>{c}</td>)}</tr>\n ))}\n </tbody>\n </table>\n </div>\n <style>{`\n @media (prefers-reduced-motion: no-preference) {\n .sss-table-wrap { transition: opacity .15s; }\n }\n `}</style>\n </div>\n );\n}" }
Save
History