@siyahi/ui 0.1.9-next.3 → 0.1.9-next.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DESIGN.md +251 -0
- package/README.md +94 -177
- package/THIRD_PARTY_NOTICES.md +11 -11
- package/agents/examples/accordion.tsx +39 -0
- package/agents/examples/alert.tsx +24 -0
- package/agents/examples/app-sidebar.tsx +40 -0
- package/agents/examples/avatar.tsx +24 -0
- package/agents/examples/badge.tsx +26 -0
- package/agents/examples/bar-list-labels.tsx +22 -0
- package/agents/examples/bar-list-sides.tsx +40 -0
- package/agents/examples/bar-list.tsx +24 -0
- package/agents/examples/breadcrumb.tsx +28 -0
- package/agents/examples/button-states.tsx +23 -0
- package/agents/examples/button.tsx +21 -0
- package/agents/examples/calendar.tsx +11 -0
- package/agents/examples/callout.tsx +33 -0
- package/agents/examples/card.tsx +36 -0
- package/agents/examples/change-bar.tsx +104 -0
- package/agents/examples/change-grid-money.tsx +36 -0
- package/agents/examples/change-grid.tsx +43 -0
- package/agents/examples/chart-area-log.tsx +45 -0
- package/agents/examples/chart-area.tsx +39 -0
- package/agents/examples/chart-bar-flows.tsx +32 -0
- package/agents/examples/chart-bar-hourly.tsx +28 -0
- package/agents/examples/chart-bar-losses.tsx +29 -0
- package/agents/examples/chart-bar-teams.tsx +72 -0
- package/agents/examples/chart-bar-years.tsx +42 -0
- package/agents/examples/chart-bar.tsx +56 -0
- package/agents/examples/chart-category-ticks.tsx +50 -0
- package/agents/examples/chart-line-events.tsx +47 -0
- package/agents/examples/chart-line-forecast.tsx +36 -0
- package/agents/examples/chart-line-log.tsx +39 -0
- package/agents/examples/chart-line-quiet.tsx +114 -0
- package/agents/examples/chart-line-timeline.tsx +41 -0
- package/agents/examples/chart-line.tsx +57 -0
- package/agents/examples/chart-panels.tsx +94 -0
- package/agents/examples/code-block.tsx +40 -0
- package/agents/examples/collapsible.tsx +18 -0
- package/agents/examples/command.tsx +29 -0
- package/agents/examples/context-menu.tsx +17 -0
- package/agents/examples/copy-button.tsx +8 -0
- package/agents/examples/data-bar.tsx +114 -0
- package/agents/examples/data-table-compact.tsx +93 -0
- package/agents/examples/data-table-filters.tsx +103 -0
- package/agents/examples/data-table.tsx +96 -0
- package/agents/examples/delta.tsx +18 -0
- package/agents/examples/dialog.tsx +28 -0
- package/agents/examples/distribution-bar-budget.tsx +30 -0
- package/agents/examples/distribution-bar-tug.tsx +74 -0
- package/agents/examples/drawdown-chart.tsx +35 -0
- package/agents/examples/dropdown-menu.tsx +31 -0
- package/agents/examples/field.tsx +108 -0
- package/agents/examples/formatters.tsx +42 -0
- package/agents/examples/heatmap-calendar-signed.tsx +67 -0
- package/agents/examples/heatmap-calendar.tsx +62 -0
- package/agents/examples/heatmap-status.tsx +61 -0
- package/agents/examples/heatmap-weekday.tsx +72 -0
- package/agents/examples/histogram-chart.tsx +28 -0
- package/agents/examples/input-states.tsx +23 -0
- package/agents/examples/input.tsx +17 -0
- package/agents/examples/local-time.tsx +14 -0
- package/agents/examples/metric-strip.tsx +46 -0
- package/agents/examples/overview-dashboard.tsx +180 -0
- package/agents/examples/page-hero.tsx +38 -0
- package/agents/examples/page-section.tsx +52 -0
- package/agents/examples/popover.tsx +23 -0
- package/agents/examples/price-chart.tsx +32 -0
- package/agents/examples/progress-tone.tsx +29 -0
- package/agents/examples/progress.tsx +10 -0
- package/agents/examples/range-position-table.tsx +113 -0
- package/agents/examples/range-position.tsx +55 -0
- package/agents/examples/scatter-chart-quadrants.tsx +63 -0
- package/agents/examples/scatter-chart-scales.tsx +46 -0
- package/agents/examples/scatter-chart.tsx +78 -0
- package/agents/examples/scroll-area.tsx +22 -0
- package/agents/examples/section-cards-select.tsx +28 -0
- package/agents/examples/section-cards-trend.tsx +32 -0
- package/agents/examples/section-cards.tsx +48 -0
- package/agents/examples/select.tsx +27 -0
- package/agents/examples/separator.tsx +13 -0
- package/agents/examples/sheet.tsx +15 -0
- package/agents/examples/skeleton.tsx +11 -0
- package/agents/examples/slider.tsx +5 -0
- package/agents/examples/slope-chart-market.tsx +33 -0
- package/agents/examples/slope-chart.tsx +26 -0
- package/agents/examples/stale-blocks.tsx +56 -0
- package/agents/examples/surfaces.tsx +116 -0
- package/agents/examples/table.tsx +60 -0
- package/agents/examples/tabs.tsx +16 -0
- package/agents/examples/target-rows.tsx +74 -0
- package/agents/examples/toggle-group.tsx +12 -0
- package/agents/examples/toggle.tsx +11 -0
- package/agents/examples/tooltip.tsx +13 -0
- package/agents/examples/treemap.tsx +93 -0
- package/agents/examples/waterfall-chart-stores.tsx +27 -0
- package/agents/examples/waterfall-chart.tsx +37 -0
- package/agents/manifest.json +1391 -0
- package/agents/report-rules.json +7 -0
- package/dist/components/registry/charts/area-chart-card.d.ts +7 -3
- package/dist/components/registry/charts/area-chart-card.js +56 -10
- package/dist/components/registry/charts/bar-chart-card.d.ts +1 -1
- package/dist/components/registry/charts/bar-chart-card.js +20 -22
- package/dist/components/registry/charts/line-chart-card.d.ts +3 -3
- package/dist/components/registry/charts/line-chart-card.js +44 -9
- package/dist/components/registry/dashboard-01/section-cards.d.ts +6 -0
- package/dist/components/registry/dashboard-01/section-cards.js +51 -35
- package/dist/components/registry/dashboardcn/bar-list.js +17 -10
- package/dist/components/registry/dashboardcn/distribution-bar.js +6 -4
- package/dist/components/registry/dashboardcn/kpi-row-card.d.ts +29 -0
- package/dist/components/registry/dashboardcn/kpi-row-card.js +81 -0
- package/dist/components/registry/dashboardcn/sparkline.d.ts +22 -0
- package/dist/components/registry/dashboardcn/sparkline.js +117 -0
- package/dist/components/registry/heatmap/calendar-heatmap.d.ts +11 -3
- package/dist/components/registry/heatmap/calendar-heatmap.js +164 -45
- package/dist/components/registry/heatmap/status-heatmap.d.ts +5 -3
- package/dist/components/registry/heatmap/status-heatmap.js +115 -54
- package/dist/components/registry/heatmap/weekday-heatmap.d.ts +9 -3
- package/dist/components/registry/heatmap/weekday-heatmap.js +83 -53
- package/dist/components/registry/niko-table/core/data-table-context.d.ts +18 -1
- package/dist/components/registry/niko-table/core/data-table-context.js +7 -1
- package/dist/components/registry/niko-table/core/data-table-grouped-row.js +3 -1
- package/dist/components/registry/niko-table/core/data-table-root.js +39 -4
- package/dist/components/registry/niko-table/core/data-table-structure.js +17 -12
- package/dist/components/registry/niko-table/core/data-table.d.ts +2 -2
- package/dist/components/registry/niko-table/core/data-table.js +5 -1
- package/dist/components/registry/niko-table/filters/table-faceted-filter.js +5 -5
- package/dist/components/registry/niko-table/filters/table-search-filter.js +1 -1
- package/dist/components/registry/niko-table/lib/flex-columns.d.ts +1 -1
- package/dist/components/registry/niko-table/lib/flex-columns.js +3 -3
- package/dist/components/registry/niko-table/lib/styles.d.ts +1 -1
- package/dist/components/registry/niko-table/lib/styles.js +3 -3
- package/dist/components/registry/niko-table/types/index.d.ts +9 -0
- package/dist/components/registry/niko-table/ui/table.js +2 -2
- package/dist/components/registry/sidebar-07/app-sidebar.d.ts +1 -1
- package/dist/components/registry/sidebar-07/app-sidebar.js +3 -1
- package/dist/components/registry/sidebar-07/nav-main.d.ts +2 -1
- package/dist/components/registry/sidebar-07/nav-main.js +16 -3
- package/dist/components/siyahi/callout.d.ts +17 -0
- package/dist/components/siyahi/callout.js +34 -0
- package/dist/components/siyahi/change-bar.d.ts +21 -0
- package/dist/components/siyahi/change-bar.js +35 -0
- package/dist/components/siyahi/change-grid.d.ts +31 -0
- package/dist/components/siyahi/change-grid.js +74 -0
- package/dist/components/siyahi/data-bar.d.ts +19 -0
- package/dist/components/siyahi/data-bar.js +29 -0
- package/dist/components/siyahi/data-table-compact-columns-toggle.d.ts +4 -0
- package/dist/components/siyahi/data-table-compact-columns-toggle.js +19 -0
- package/dist/components/siyahi/data-table-footnote.d.ts +12 -0
- package/dist/components/siyahi/data-table-footnote.js +35 -0
- package/dist/components/siyahi/default-sidebar-open.d.ts +8 -0
- package/dist/components/siyahi/default-sidebar-open.js +13 -0
- package/dist/components/siyahi/delta.d.ts +5 -1
- package/dist/components/siyahi/delta.js +14 -9
- package/dist/components/siyahi/drawdown-chart.d.ts +34 -0
- package/dist/components/siyahi/drawdown-chart.js +102 -0
- package/dist/components/siyahi/histogram-chart.d.ts +57 -0
- package/dist/components/siyahi/histogram-chart.js +134 -0
- package/dist/components/siyahi/page-hero.d.ts +23 -0
- package/dist/components/siyahi/page-hero.js +43 -0
- package/dist/components/siyahi/page-section.d.ts +4 -1
- package/dist/components/siyahi/page-section.js +6 -3
- package/dist/components/siyahi/page-toc.d.ts +20 -0
- package/dist/components/siyahi/page-toc.js +76 -0
- package/dist/components/siyahi/panel-grid.d.ts +24 -0
- package/dist/components/siyahi/panel-grid.js +37 -0
- package/dist/components/siyahi/quote.d.ts +12 -0
- package/dist/components/siyahi/quote.js +23 -0
- package/dist/components/siyahi/range-position.d.ts +24 -0
- package/dist/components/siyahi/range-position.js +105 -0
- package/dist/components/siyahi/scale-toggle.d.ts +32 -0
- package/dist/components/siyahi/scale-toggle.js +61 -0
- package/dist/components/siyahi/scatter-chart.d.ts +69 -0
- package/dist/components/siyahi/scatter-chart.js +395 -0
- package/dist/components/siyahi/siyahi-provider.d.ts +15 -2
- package/dist/components/siyahi/siyahi-provider.js +17 -4
- package/dist/components/siyahi/slope-chart.d.ts +35 -0
- package/dist/components/siyahi/slope-chart.js +159 -0
- package/dist/components/siyahi/stale-note.d.ts +9 -0
- package/dist/components/siyahi/stale-note.js +12 -0
- package/dist/components/siyahi/status-alert.d.ts +15 -0
- package/dist/components/siyahi/status-alert.js +29 -0
- package/dist/components/siyahi/status-badge.d.ts +15 -0
- package/dist/components/siyahi/status-badge.js +24 -0
- package/dist/components/siyahi/target-rows.d.ts +34 -0
- package/dist/components/siyahi/target-rows.js +97 -0
- package/dist/components/siyahi/tone-progress.d.ts +1 -1
- package/dist/components/siyahi/tone-progress.js +1 -1
- package/dist/components/siyahi/treemap.d.ts +8 -5
- package/dist/components/siyahi/treemap.js +80 -34
- package/dist/components/siyahi/waterfall-chart.d.ts +51 -0
- package/dist/components/siyahi/waterfall-chart.js +147 -0
- package/dist/components/ui/accordion.js +5 -5
- package/dist/components/ui/alert.js +2 -2
- package/dist/components/ui/badge.js +1 -1
- package/dist/components/ui/breadcrumb.js +2 -2
- package/dist/components/ui/button.js +10 -10
- package/dist/components/ui/calendar.js +1 -1
- package/dist/components/ui/card.js +4 -4
- package/dist/components/ui/chart.js +1 -1
- package/dist/components/ui/code-block.js +13 -12
- package/dist/components/ui/command.js +7 -6
- package/dist/components/ui/context-menu.js +7 -7
- package/dist/components/ui/dialog.js +5 -5
- package/dist/components/ui/dropdown-menu.js +8 -8
- package/dist/components/ui/field.d.ts +26 -0
- package/dist/components/ui/field.js +109 -0
- package/dist/components/ui/input-group.js +11 -11
- package/dist/components/ui/input.js +1 -1
- package/dist/components/ui/label.d.ts +5 -0
- package/dist/components/ui/label.js +13 -0
- package/dist/components/ui/popover.js +3 -3
- package/dist/components/ui/progress.js +1 -1
- package/dist/components/ui/select.js +6 -6
- package/dist/components/ui/sheet.js +5 -5
- package/dist/components/ui/sidebar.js +17 -18
- package/dist/components/ui/skeleton.js +1 -1
- package/dist/components/ui/slider.js +2 -2
- package/dist/components/ui/table.js +2 -2
- package/dist/components/ui/tabs.js +2 -2
- package/dist/components/ui/textarea.js +1 -1
- package/dist/components/ui/toggle-group.js +2 -2
- package/dist/components/ui/toggle.js +4 -4
- package/dist/components/ui/tooltip.js +2 -2
- package/dist/index.d.ts +35 -8
- package/dist/index.js +30 -4
- package/dist/lib/chart-frame.d.ts +51 -7
- package/dist/lib/chart-frame.js +390 -133
- package/dist/lib/chart-marks.d.ts +83 -0
- package/dist/lib/chart-marks.js +216 -0
- package/dist/lib/chart-series.d.ts +42 -10
- package/dist/lib/compact-columns.d.ts +19 -0
- package/dist/lib/compact-columns.js +55 -0
- package/dist/lib/fit-text.d.ts +6 -0
- package/dist/lib/fit-text.js +11 -0
- package/dist/lib/format.d.ts +8 -3
- package/dist/lib/format.js +55 -17
- package/dist/lib/heat.d.ts +7 -0
- package/dist/lib/heat.js +14 -0
- package/dist/lib/heatmap-navigation.d.ts +8 -0
- package/dist/lib/heatmap-navigation.js +49 -0
- package/dist/lib/scatter.d.ts +88 -0
- package/dist/lib/scatter.js +179 -0
- package/dist/lib/ticks.d.ts +27 -0
- package/dist/lib/ticks.js +67 -0
- package/dist/lib/tone.d.ts +36 -0
- package/dist/lib/tone.js +35 -0
- package/dist/lib/treemap.d.ts +0 -5
- package/dist/lib/treemap.js +1 -11
- package/dist/lib/use-element-width.d.ts +5 -0
- package/dist/lib/use-element-width.js +15 -0
- package/package.json +5 -1
- package/registry.lock.json +16 -0
- package/report.css +63 -47
- package/styles/siyahi.css +708 -55
package/DESIGN.md
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# Siyahi design guidelines
|
|
2
|
+
|
|
3
|
+
These rules bind every page built on `@siyahi/ui`: The Book, Dash and any other
|
|
4
|
+
app. Agents must follow them when designing or changing UI; a reviewer treats a
|
|
5
|
+
breach as a defect. The catalogue (https://siyahi.jatinbansal.com) shows each
|
|
6
|
+
component; this file says how to use them.
|
|
7
|
+
|
|
8
|
+
## Colour
|
|
9
|
+
|
|
10
|
+
Colour is placed, not spread. A page is neutral greys plus colour that carries
|
|
11
|
+
a meaning:
|
|
12
|
+
|
|
13
|
+
- **Ink indigo** is the accent: links, the selected sidebar item, the first
|
|
14
|
+
chart series, a chart's "today" rule and an `accent` `Callout`. Buttons, badges, toggles and focus
|
|
15
|
+
stay monochrome.
|
|
16
|
+
- **Green and red** mean a gain and a loss. A signed figure is `Delta`: the figure in the text colour with its
|
|
17
|
+
`+` or `−`, and only a small trend icon in green or red. In plain text (labels, tooltips) write the sign; never
|
|
18
|
+
colour a run of figures green and red.
|
|
19
|
+
**Amber** means caution. None of them decorates.
|
|
20
|
+
- **Emphasis tints the whole surface.** A notice is `StatusAlert` in its tone (an
|
|
21
|
+
error reads like a warning, only red); a state is `StatusBadge`; a point set
|
|
22
|
+
apart is `Callout` (`neutral`, `accent`, `warning`, `positive`,
|
|
23
|
+
`negative`); a quotation is `Quote`. Each takes a faint wash of its colour
|
|
24
|
+
inside a 1px border of the same colour all round. Large marks follow the same
|
|
25
|
+
rule: every bar is a tint inside a 1px full-colour edge, not a solid slab.
|
|
26
|
+
A bar is read by its edge, which reaches 3:1 against the card; the tint is a
|
|
27
|
+
fill carried by that edge.
|
|
28
|
+
- **Never a stripe down one side.** Do not mark a notice, card, row or quote
|
|
29
|
+
with a left (or any single-side) coloured border; tint the box or add an
|
|
30
|
+
icon. 1px neutral dividers between columns are separators, not accents, and
|
|
31
|
+
are fine.
|
|
32
|
+
- **Edges that matter reach 3:1; the rest are hairlines.** A field's edge (input,
|
|
33
|
+
textarea, select, input group, the command search) is `--input`, at 3:1 on the
|
|
34
|
+
canvas and the card; dividers, card rings, gridlines and the outlines of
|
|
35
|
+
buttons, toggles and code blocks are the `--border` hairline (the text colour
|
|
36
|
+
at 18% in light, white at 20% in dark), firm enough to carry the page's
|
|
37
|
+
structure. Focus is drawn inside the control, so no neighbour or clipping box
|
|
38
|
+
covers it: a 2px ring in the text colour (`--ring`) on its edge with a 2px
|
|
39
|
+
ring of the page colour inside, which reads on a black, white or hovered
|
|
40
|
+
fill alike. A field shows it as its own edge, 2px in the text colour; a chart
|
|
41
|
+
mark as a dashed stroke, apart from a picked mark's solid one. A destructive
|
|
42
|
+
control and an invalid field focus in the destructive red. Menu items show
|
|
43
|
+
focus as their highlight. A selected
|
|
44
|
+
toggle or pill tab fills with the foreground. A chart bar that a selection
|
|
45
|
+
dims keeps its full-colour outline and fades only inside.
|
|
46
|
+
- **Destructive is not loss.** `--destructive` (delete, an invalid field) is a
|
|
47
|
+
deeper red than `--negative` (a loss figure), so its label reads on its own
|
|
48
|
+
tint; never use one for the other.
|
|
49
|
+
- Categories (a team, a region, a product line) stay neutral: outline badges,
|
|
50
|
+
never a hue each. Ordered buckets (largest 5, next 5, rest) use steps of one
|
|
51
|
+
colour, not separate hues.
|
|
52
|
+
- **Colour marks exceptions.** The one stat tile or table row that needs a look
|
|
53
|
+
is marked by the page: `tone: "negative"` or `"warning"` on a `SectionCards`
|
|
54
|
+
item, `data-tone="negative"` or `"warning"` on a `TableRow`. It takes a faint
|
|
55
|
+
wash of the colour over the card (7% in light, 12% in dark), and a tile an
|
|
56
|
+
outline of it. The page decides, never the sign: a falling cost is good news.
|
|
57
|
+
Mark one or two; a page where every row is washed marks nothing.
|
|
58
|
+
|
|
59
|
+
## Surfaces
|
|
60
|
+
|
|
61
|
+
`SiyahiProvider`'s `surface` sets how a data block sits on the page. The page
|
|
62
|
+
and card colours are fixed: never tint the canvas.
|
|
63
|
+
|
|
64
|
+
- **`ruled`** (the default, with or without a provider): ruled on white. The
|
|
65
|
+
blocks of a `PanelGrid`, the tiles of a `SectionCards` row and the figures
|
|
66
|
+
of a `MetricStrip` are filled with the card colour and parted by hairlines,
|
|
67
|
+
with a rule above and below the group and none on its left and right edges.
|
|
68
|
+
A card standing alone (a `MetricStrip`, a table's card) takes the same rules
|
|
69
|
+
above and below itself. A short last row ends in a blank cell, ruled off
|
|
70
|
+
like the rest. A stat tile keeps its footer's top rule and faint band. Set
|
|
71
|
+
nothing to get it.
|
|
72
|
+
- **`card`**: tight square cards, for a page of separate blocks, such as an
|
|
73
|
+
index of links. Each block is filled with the card colour inside a hairline
|
|
74
|
+
ring, with no shadow, 8px from the next in a `PanelGrid` or a row of
|
|
75
|
+
`SectionCards`. Ask for it with `surface="card"`.
|
|
76
|
+
- **`open`**: no fill, no lines and no padding, so a block sits level with the
|
|
77
|
+
page's text, for pages read top to bottom.
|
|
78
|
+
|
|
79
|
+
Every `PanelGrid` numbers its blocks 01, 02 before their card title, in the
|
|
80
|
+
mono face and the link colour, so the text can point to one.
|
|
81
|
+
|
|
82
|
+
## Shape
|
|
83
|
+
|
|
84
|
+
- **Square corners everywhere**: panels, cards, buttons, fields, badges,
|
|
85
|
+
toggles, menus, and bars and tracks (data bars, progress) alike (`--radius`
|
|
86
|
+
is 0). Only a dot, an avatar, a slider, a spinner or a scrollbar is round;
|
|
87
|
+
the stock chart tooltip's colour chips keep shadcn's 2px. Never add a
|
|
88
|
+
`rounded-*` class to a box.
|
|
89
|
+
- **Joined toggles.** The items of a `ToggleGroup` sit flush and share their
|
|
90
|
+
borders, one control; the pressed item fills with the foreground.
|
|
91
|
+
- **A code block's copy button sits in a header row** (`CodeBlockHeader`),
|
|
92
|
+
beside its title or alone, never floating over the code, where it would
|
|
93
|
+
cover the end of a line. An untitled snippet takes the extra row.
|
|
94
|
+
- Badges stay boxed (an outline), the primary button and the pressed toggle
|
|
95
|
+
black (white in dark), titles in the sans face, at normal spacing.
|
|
96
|
+
|
|
97
|
+
## Page header
|
|
98
|
+
|
|
99
|
+
An app page opens on its masthead, `PageHero`: a small mark and eyebrow in the
|
|
100
|
+
mono face and link colour, the title, one muted line saying what the page is,
|
|
101
|
+
the actions at the right, and a hairline under it. One per page; no hero card.
|
|
102
|
+
|
|
103
|
+
## Words
|
|
104
|
+
|
|
105
|
+
A page is read by someone who acts on its figures. Its words are plain English,
|
|
106
|
+
in sentence case, and explain themselves: a reader needs no other page to know
|
|
107
|
+
what a figure is, where it came from and what to do next. These rules bind what
|
|
108
|
+
a page's reader sees. The catalogue's own notes (the text that introduces a
|
|
109
|
+
component, its rules and its captions) teach the package and are exempt from
|
|
110
|
+
them, and so are the words in a demo that only name a component's variant or API
|
|
111
|
+
("Ghost", "moneyCompact") or show a bare state (a field disabled with no reason
|
|
112
|
+
given). Everything else in an example is bound like any app's copy, including
|
|
113
|
+
the error, empty, loading and busy text of a state demo. Each rule's example is
|
|
114
|
+
from the catalogue.
|
|
115
|
+
|
|
116
|
+
- **A title states the finding** when the block makes one point: "Search is
|
|
117
|
+
near its slowest of the month, login near its fastest". In an app, work its
|
|
118
|
+
figures out from the data the block draws, so it cannot go stale. When the
|
|
119
|
+
finding changes with the reader's choice (a toggle, a filter, a pick), the
|
|
120
|
+
title names the topic instead: "Revenue by channel and quarter". No full
|
|
121
|
+
stop, no pun or metaphor.
|
|
122
|
+
- **A description says what the figures are**: the measure, its scope and
|
|
123
|
+
period, how it was counted, whatever the title left out. A single fragment
|
|
124
|
+
takes no full stop: "Each month's revenue against its target". Once there are
|
|
125
|
+
two parts, each ends with one: "Each week's balance against the highest it
|
|
126
|
+
had been so far. At zero the bakery was at a new high." Page copy never names
|
|
127
|
+
a component, a token or a prop.
|
|
128
|
+
- **Explain what the reader cannot guess.** Say how to read a mark that is not
|
|
129
|
+
obvious ("Money in above the line, money out below it"), and define a term
|
|
130
|
+
on first use, in the description, a tooltip or a popover: "Churn counts
|
|
131
|
+
customers who did not renew this month."
|
|
132
|
+
- **Say where the figures come from and how fresh they are**: the system or
|
|
133
|
+
report they are read from, "From sar -r", and when, "Prices as of the last
|
|
134
|
+
market close."
|
|
135
|
+
- **Labels and column heads are short nouns, written in full.** The theme sets
|
|
136
|
+
them in small mono capitals, so write them in sentence case and never
|
|
137
|
+
abbreviate to fit: no "vs", "p95", "Qty". Name what the figure is, then its
|
|
138
|
+
period if the block has several: "Cash flow this year". A note on a plot or
|
|
139
|
+
beside a figure is lowercase: "new limit, 50%", "new this year".
|
|
140
|
+
- **Units.** A figure from the formatters carries its unit (₹2.4L, 14.2%,
|
|
141
|
+
14:30 IST). Any other unit is named once: after a label in brackets, "Hour of
|
|
142
|
+
day (IST)", or after a title with a comma, "Memory in use, GiB". Keep the
|
|
143
|
+
symbols readers know (%, ₹, ms, s, GiB); anything else is a word. A
|
|
144
|
+
difference between two percentages is in points, to one decimal, as no
|
|
145
|
+
formatter writes them: "Sales is 5.6 points under its budget".
|
|
146
|
+
- **Numbers** go through `useFormat()` and `Delta`. In the default locale that
|
|
147
|
+
is Indian grouping (1,53,110), compact rupees (₹3.1Cr) and amounts under a
|
|
148
|
+
lakh in full; a page under another locale keeps its forms. A figure on its
|
|
149
|
+
own (a cell, a tick, a tooltip) carries its sign, as Colour says; a sign you
|
|
150
|
+
write is `+` or the minus `−`, never a hyphen: "+₹21,300", "−₹18,400". In a
|
|
151
|
+
phrase a word may carry the direction instead: "5.6 points under". A range
|
|
152
|
+
takes an en dash, "0–12 GiB"; a multiple takes ×, "about 1.5× a month". A
|
|
153
|
+
missing figure is —, and a page that leaves items out says how many.
|
|
154
|
+
- **Dates and times** read as the formatters write them, in the default locale
|
|
155
|
+
day before month: "20 Oct 2026, 14:30 IST". Every block says its time zone
|
|
156
|
+
once, on its axis title, its description or each time: "Hour of day (IST)". A
|
|
157
|
+
period is in words, "Last 30 days", "April to March"; a financial year is
|
|
158
|
+
"FY26", with the block saying when it ends: "FY26 ends in March 2026". A
|
|
159
|
+
tooltip's heading says more than the tick under it: "Week ending 1 Nov 2026"
|
|
160
|
+
against "Nov".
|
|
161
|
+
- **A status names a state, not a task**, in a few words that match its tone:
|
|
162
|
+
"Paid", "Out for delivery", "Needs review".
|
|
163
|
+
- **The components write the chart and staleness notes**: FORECAST, TODAY and
|
|
164
|
+
"Stale · 3 Nov". The page passes the point or the date and nothing more, and
|
|
165
|
+
says in its description which stretch is a forecast: "November and December
|
|
166
|
+
are a forecast". It never writes a note of its own for the same thing.
|
|
167
|
+
- **A button or menu item says what happens**, as a verb, in one to three
|
|
168
|
+
words: "Export CSV", "Copy order number". A busy button keeps its label as
|
|
169
|
+
"Saving"; a finished one says so briefly, "Copied". An icon-only button names
|
|
170
|
+
its action in `aria-label`: "Refresh". A toggle names its options in words
|
|
171
|
+
("Cumulative growth", "Last year"); only a range toggle in a card's header
|
|
172
|
+
shortens them, to 1M, 6M, 1Y and All. A control disabled for a reason the
|
|
173
|
+
page does not show says why beside it, as a chart's Log button does.
|
|
174
|
+
- **Empty, loading and error states say what happened and what to do.** Empty
|
|
175
|
+
names what is missing and why: "No holding matches the search." Loading is
|
|
176
|
+
a `Skeleton` in the block's shape; long work names itself, "Orders imported",
|
|
177
|
+
with its progress, and a waiting line ends in one "…". An error's title says
|
|
178
|
+
what happened, "Import failed"; its line says why and what the reader can
|
|
179
|
+
do: "The CSV could not be read. Export it again and retry." A field's error
|
|
180
|
+
states the rule with an example: "A PIN code is six digits, such as 560001".
|
|
181
|
+
- **Address the reader as you and the business as we**: "What you own, what it
|
|
182
|
+
is worth today", "Our store".
|
|
183
|
+
|
|
184
|
+
## Labels and totals
|
|
185
|
+
|
|
186
|
+
- **Labels are small monospaced capitals**: a stat tile's label and footer
|
|
187
|
+
lines, a `MetricStrip` label, a table's column heads, a sidebar group's
|
|
188
|
+
label, and a form field's label (muted, above the field). The components and
|
|
189
|
+
the theme set them; never set a label in this style by hand elsewhere, and
|
|
190
|
+
never set a figure or a title in it.
|
|
191
|
+
- **A total row reads as a ledger's**: in `TableFooter`, one rule above it and
|
|
192
|
+
a double rule under it in the text colour, no band.
|
|
193
|
+
|
|
194
|
+
## Charts
|
|
195
|
+
|
|
196
|
+
- **Names at the line ends.** A line chart and overlapping areas name each
|
|
197
|
+
series at its line's end, in the text colour beside a square of its colour,
|
|
198
|
+
in a gutter after the last point; ends that crowd are spread 14px apart with
|
|
199
|
+
a short leader. A legend goes below instead on a card under 400px wide (a
|
|
200
|
+
phone), where the names would take more than 30% of it or not fit the
|
|
201
|
+
plot's height, and where a line ends short of the plot's right edge (a
|
|
202
|
+
missing last reading, a single point, an x axis running past the data). Bars and stacks
|
|
203
|
+
keep a legend.
|
|
204
|
+
- **Five colours, then grey.** Past five series, the page names the few it is
|
|
205
|
+
about in chart colours and gives the rest `var(--muted-foreground)`: they
|
|
206
|
+
draw first, in grey. Every line is still named: a grey one's name at its end
|
|
207
|
+
is muted with no square, and its place says which line it is. Never a count
|
|
208
|
+
standing in for names. In the legend a grey name is a button that raises its
|
|
209
|
+
line in the text colour, since a shared grey square cannot tell lines apart;
|
|
210
|
+
a stack's grey bands read in the legend's order, bottom to top.
|
|
211
|
+
- **No fill under overlapping areas**: from three series on, fills bury each
|
|
212
|
+
other. A stack fills each band with a flat tint, never a gradient.
|
|
213
|
+
- **Forecast and today.** `forecastFrom` dashes every line from that point,
|
|
214
|
+
hatches the stretch faintly behind lines on card-coloured halos, labels it
|
|
215
|
+
FORECAST and hollows the end dots (a stack keeps solid edges and no hatching:
|
|
216
|
+
its fills cover the stretch);
|
|
217
|
+
`today` is a 1px rule in the link colour, labelled TODAY.
|
|
218
|
+
- Gridlines are solid hairlines. Lines draw in left to right over 1.3s on
|
|
219
|
+
first draw, a stack's fills revealed with them; then the names fade in, and
|
|
220
|
+
each end dot as its line finishes; bars fade in rather than grow. Reduced
|
|
221
|
+
motion shows them at once.
|
|
222
|
+
- **Stale data is marked by the page**: `stale` on a chart card or a
|
|
223
|
+
`SectionCards` tile, with since when ("3 Nov"). The block greys and its
|
|
224
|
+
chart or sparkline draws at about 65% strength, a tile's figure and badge
|
|
225
|
+
turn muted, and a small "Stale · 3 Nov" note says so. A stale block is meant
|
|
226
|
+
to be harder to read, so its marks are exempt from the 3:1 mark bar; the
|
|
227
|
+
note and the figure keep their text contrast. Never infer it from dates.
|
|
228
|
+
|
|
229
|
+
## Tables
|
|
230
|
+
|
|
231
|
+
Tables are dense, as a ledger is: compact rows, a 1px rule in the text colour
|
|
232
|
+
under the column heads, the first column (what the row is) in medium weight,
|
|
233
|
+
and figures in the mono face. A figure is a cell marked `data-numeric`, which
|
|
234
|
+
also right-aligns it (the data table marks its number columns; a plain
|
|
235
|
+
`TableCell` or `TableHead` takes the attribute), and any `Delta` in a cell.
|
|
236
|
+
Alignment alone is not a figure. Row hairlines stay; never stripes, never
|
|
237
|
+
column rules.
|
|
238
|
+
|
|
239
|
+
## Forms
|
|
240
|
+
|
|
241
|
+
- Every field is a `Field` with a `FieldLabel` above the control, a
|
|
242
|
+
`FieldDescription` hint or a `FieldError` under it. Never write a bare
|
|
243
|
+
`<label>` with its own styles.
|
|
244
|
+
- An invalid field (`aria-invalid` on the control, `data-invalid` on its
|
|
245
|
+
`Field`) keeps its red edge and takes a faint red wash.
|
|
246
|
+
|
|
247
|
+
## Sidebar
|
|
248
|
+
|
|
249
|
+
The sidebar is parted from the page by a hairline on its page-side edge, its
|
|
250
|
+
group labels are small monospaced capitals and its rows are compact. Its fill,
|
|
251
|
+
icons and the current page's mark stay as shadcn draws them.
|
package/README.md
CHANGED
|
@@ -2,20 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
# Siyahi
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
light and dark, a few finance components, locale-aware formatters, a lint that
|
|
10
|
-
keeps pages on the theme, and a catalogue site that is the documentation.
|
|
5
|
+
A design system for data-heavy React apps: [shadcn/ui](https://ui.shadcn.com)
|
|
6
|
+
on [Base UI](https://base-ui.com) and Tailwind CSS v4, with a shared theme,
|
|
7
|
+
charts, tables and locale-aware formatters. Components ship in `@siyahi/ui`;
|
|
8
|
+
checks and build helpers ship in `@siyahi/tools`.
|
|
11
9
|
|
|
12
|
-
**
|
|
10
|
+
**[Browse the catalogue](https://siyahi.jatinbansal.com)** for components and live examples.
|
|
11
|
+
|
|
12
|
+
## For agents
|
|
13
|
+
|
|
14
|
+
Install the public [Siyahi skill](https://github.com/jatinbansal1998/siyahi/blob/main/skills/siyahi/SKILL.md):
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
npx skills add jatinbansal1998/siyahi --skill siyahi --agent claude-code --agent codex
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Read the installed package's `agents/manifest.json` to select components and
|
|
21
|
+
recipes, then only the matching `agents/examples/*.tsx`. Exact prop types are in
|
|
22
|
+
`dist/index.d.ts`. The skill guides reuse and verification; page structure and
|
|
23
|
+
interactions remain yours. No other skill or local Siyahi checkout is required.
|
|
13
24
|
|
|
14
25
|
## Install
|
|
15
26
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
27
|
+
Releases use the `next` tag until 1.0. Siyahi needs React 19 and Tailwind CSS v4.
|
|
28
|
+
Compile its stylesheet with the Tailwind Vite plugin; a plain CSS import leaves
|
|
29
|
+
components unstyled.
|
|
19
30
|
|
|
20
31
|
```sh
|
|
21
32
|
npm install @siyahi/ui@next tailwindcss @tailwindcss/vite
|
|
@@ -23,7 +34,7 @@ npm install --save-dev @siyahi/tools@next
|
|
|
23
34
|
```
|
|
24
35
|
|
|
25
36
|
```ts
|
|
26
|
-
// vite.config.ts
|
|
37
|
+
// vite.config.ts: add to your existing plugins
|
|
27
38
|
import tailwindcss from "@tailwindcss/vite";
|
|
28
39
|
import { preloadFonts } from "@siyahi/tools/vite";
|
|
29
40
|
export default defineConfig({ plugins: [react(), tailwindcss(), preloadFonts()] });
|
|
@@ -45,198 +56,104 @@ createRoot(root).render(
|
|
|
45
56
|
);
|
|
46
57
|
```
|
|
47
58
|
|
|
48
|
-
`preloadFonts()`
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
Geist swaps in. An app that renders its own HTML adds the tags itself, with
|
|
53
|
-
the hashed URLs of `geist-latin-wght-normal.woff2`,
|
|
54
|
-
`geist-latin-ext-wght-normal.woff2` and `geist-mono-latin-wght-normal.woff2`.
|
|
55
|
-
|
|
56
|
-
Everything comes from `@siyahi/ui`: the shadcn components, the registry
|
|
57
|
-
add-ons (chart cards, data table, heatmaps, stat tiles, sidebar) and Siyahi's
|
|
58
|
-
own components. Add `lucide-react` only if your
|
|
59
|
-
own code imports icons. A Next.js app compiles the same stylesheet through
|
|
60
|
-
`@tailwindcss/postcss` instead of the Vite plugin.
|
|
61
|
-
|
|
62
|
-
### Also on GitHub releases
|
|
63
|
-
|
|
64
|
-
Every merge to `main` also attaches both tarballs to a GitHub release
|
|
65
|
-
(`v<version>`, plus a rolling `next`). They are a fallback if npm is unreachable:
|
|
66
|
-
`npm install --allow-remote=root https://github.com/jatinbansal1998/siyahi/releases/download/v<version>/siyahi-ui-<version>.tgz`.
|
|
67
|
-
|
|
68
|
-
## What is in it
|
|
69
|
-
|
|
70
|
-
- **shadcn/ui components** in the `base-luma` style, installed with the shadcn
|
|
71
|
-
CLI and never edited.
|
|
72
|
-
- **Registry add-ons**, copied once with their origin and licence recorded:
|
|
73
|
-
bar, area and line chart cards from shadcn's chart blocks, a data table on
|
|
74
|
-
TanStack Table, calendar, weekday and status heatmaps, a ranked
|
|
75
|
-
bar list, the `SectionCards` stat tile and the `sidebar-07` app shell.
|
|
76
|
-
- **Siyahi components**: `Delta` (a signed figure with ▲ ▼), `PriceChart`
|
|
77
|
-
(TradingView Lightweight Charts in theme colours), `Treemap` (holdings heat
|
|
78
|
-
map; hover or tap a tile for its figures) with `TreemapLegend` (its colour
|
|
79
|
-
scale), `LocalTime` (a time in the configured zone with the viewer's own clock
|
|
80
|
-
in a tooltip), `ToneProgress` (Progress in a meaning colour), the page parts
|
|
81
|
-
`PageSection`, `PageSubheading`, `DataList` and `InlineCode`, the data table
|
|
82
|
-
parts `DataTableSortHeader` (sorts on one click) and `DataTableRowCount`
|
|
83
|
-
("12 of 48"), and `SiyahiProvider`.
|
|
84
|
-
- **Cards and badges as installed**: every `Card`, stat tiles included, keeps
|
|
85
|
-
luma's `rounded-4xl`, `shadow-md` and faint ring. A category (a sector, a
|
|
86
|
-
broker, a unit's kind) is an outline `Badge`: categories stay neutral, and
|
|
87
|
-
colour is left to the four meaning colours and the charts. On a narrow card
|
|
88
|
-
(header under 24rem, so any phone) a header action such as a toggle drops
|
|
89
|
-
under the title and description, left-aligned; a stat tile's badge stays
|
|
90
|
-
top right.
|
|
91
|
-
- **Formatters**: `count`, `money`, `moneyCompact`, `pct` and `time`, or `useFormat()`
|
|
92
|
-
for the same bound to the provider's locale.
|
|
93
|
-
`useFormat().time(value, { withDate: true })` (or
|
|
94
|
-
`time(value, locale, { withDate: true })`) and `<LocalTime withDate>` write
|
|
95
|
-
the date first: `20 Oct 2026, 14:30 IST`.
|
|
96
|
-
- **`report.css`** for static HTML reports that do not use React: the theme as
|
|
97
|
-
plain CSS variables plus base body styles, with no network requests.
|
|
98
|
-
|
|
99
|
-
## Which component
|
|
100
|
-
|
|
101
|
-
| Need | Component |
|
|
102
|
-
| ----------------------------------------------------------------------- | ------------------------------------------------------------------- |
|
|
103
|
-
| Values over time or another ordered axis (months, hours, price buckets) | `BarChartCard`, `AreaChartCard` or `LineChartCard` |
|
|
104
|
-
| Counts or amounts per period, one series or several | `BarChartCard`; `stacked` when the series add up to a total |
|
|
105
|
-
| A running level, such as a portfolio's value against money put in | `AreaChartCard` |
|
|
106
|
-
| Series compared point by point, such as a return against an index | `LineChartCard` |
|
|
107
|
-
| Samples in time with limits and events marked | `LineChartCard` with `xDomain`, `xTicks` and `referenceLines` |
|
|
108
|
-
| Long category names, such as sectors | `BarChartCard` with `horizontal` |
|
|
109
|
-
| A gain above zero and a loss below it | a series with `color` and `negativeColor` |
|
|
110
|
-
| Ranked counts or amounts by category (a name, a bar and a figure) | `BarList`; give two lists one `max` to share a scale |
|
|
111
|
-
| Where a budget sits, a split of a whole, or losses against gains | `DistributionBar` |
|
|
112
|
-
| Headline figures with their change | `SectionCards`, with a `Delta` in each badge |
|
|
113
|
-
| One instrument's price history | `PriceChart` |
|
|
114
|
-
| Holdings sized by weight and coloured by change | `Treemap` |
|
|
115
|
-
| Activity by day, by weekday and hour, or a status over time | `CalendarHeatmap`, `WeekdayHeatmap`, `StatusHeatmap` |
|
|
116
|
-
| Rows to sort and filter | `DataTable`, inside a `Card` |
|
|
117
|
-
| A column that sorts on one click; a search and an "n of m" count | `DataTableSortHeader`; `DataTableSearchFilter`, `DataTableRowCount` |
|
|
118
|
-
| Stat tiles that pick a scope for the page | `SectionCards` with `selected` and `onSelect` |
|
|
119
|
-
| A share or a part of a whole, coloured as a gain or a loss | `ToneProgress` |
|
|
120
|
-
| The colour scale under a `Treemap` | `TreemapLegend`, with the map's `range` |
|
|
121
|
-
| One part of a long page: rule, eyebrow, heading, lead, action | `PageSection`, with `PageSubheading` inside |
|
|
122
|
-
| Label and value pairs, such as a record's fields | `DataList` and `DataListItem` |
|
|
123
|
-
| A command or file to copy, wrapped or scrolling | `CodeBlock` with `CodeBlockCopyButton` |
|
|
124
|
-
| A labelled copy action, such as "Copy all" for a section | `CopyButton` |
|
|
125
|
-
| A command, file or identifier inside prose | `InlineCode` |
|
|
126
|
-
| A signed figure (a gain, a loss, a change) | `Delta` |
|
|
127
|
-
| A time, with the viewer's own clock on hover | `LocalTime` |
|
|
128
|
-
|
|
129
|
-
The three chart cards take the rows, the field the x axis reads and the series,
|
|
130
|
-
and own everything else: the card and its header action (a range or mode
|
|
131
|
-
toggle), the axes, the dashed horizontal grid, Geist Mono ticks, a tooltip that
|
|
132
|
-
names the hovered point and gives each series' formatted value, and the legend
|
|
133
|
-
below. Props cover the rest: a footer, a placeholder while data loads,
|
|
134
|
-
reference lines, a numeric x axis, a fixed value axis, axis titles, a second
|
|
135
|
-
line under each tick, a picked category, sideways bars and straight segments.
|
|
136
|
-
A page never puts Recharts axes, grids or tooltips together itself.
|
|
59
|
+
`preloadFonts()` loads Geist and Geist Mono with the scripts. Add `lucide-react`
|
|
60
|
+
only when your own code imports icons. Next.js compiles the stylesheet through
|
|
61
|
+
`@tailwindcss/postcss` instead of the Vite plugin. Static HTML reports inline the
|
|
62
|
+
package's `report.css` and follow `agents/report-rules.json`.
|
|
137
63
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
title="Orders by hour"
|
|
141
|
-
data={[
|
|
142
|
-
{ hour: 9, orders: 42 },
|
|
143
|
-
{ hour: 10, orders: 31 },
|
|
144
|
-
]}
|
|
145
|
-
xKey="hour"
|
|
146
|
-
xFormatter={(hour) => `${String(hour).padStart(2, "0")}:00`}
|
|
147
|
-
series={[{ key: "orders", label: "Orders", color: "var(--chart-1)" }]}
|
|
148
|
-
height={256}
|
|
149
|
-
/>
|
|
150
|
-
```
|
|
64
|
+
If npm is unreachable, both package tarballs are attached to
|
|
65
|
+
[GitHub releases](https://github.com/jatinbansal1998/siyahi/releases).
|
|
151
66
|
|
|
152
67
|
## Locale
|
|
153
68
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
follows:
|
|
69
|
+
`useFormat()` provides `count`, `money`, `moneyCompact`, `pct` and `time`,
|
|
70
|
+
bound to the provider's locale. Defaults are Indian English, rupees and India
|
|
71
|
+
Standard Time: `₹1,53,110`, `₹2.4L`, `14:30 IST`. Use `Delta` for signed changes.
|
|
72
|
+
Override the locale for a whole app or a nested section:
|
|
159
73
|
|
|
160
74
|
```tsx
|
|
161
75
|
<SiyahiProvider locale={{ numberLocale: "en-US", currency: "USD", timeZone: "America/New_York" }}>
|
|
162
76
|
```
|
|
163
77
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
78
|
+
## Responsive behavior
|
|
79
|
+
|
|
80
|
+
Data tables suspend horizontal freezing below 40rem of their own available
|
|
81
|
+
space, including narrow panels on a laptop. Pinning preferences, search, sort,
|
|
82
|
+
selection and expansion stay intact. All columns remain reachable by scrolling;
|
|
83
|
+
the scrolling region also accepts keyboard focus. For page-specific compact
|
|
84
|
+
records, choose essential columns and keep every other field in accessible
|
|
85
|
+
details or an explicit full-table view.
|
|
86
|
+
|
|
87
|
+
The shipped `data-table-filters` recipe moves secondary filters into a `Sheet`
|
|
88
|
+
using `useDataTable().isCompact`. Configure filtering explicitly when its
|
|
89
|
+
controls render conditionally. Keep search and the active-filter count visible.
|
|
90
|
+
Use container queries for layout and pointer capability for touch targets;
|
|
91
|
+
a touch laptop needs the same reachable controls as a phone.
|
|
92
|
+
|
|
93
|
+
Ranked lists wrap long labels in narrow panels. Horizontal charts reserve space
|
|
94
|
+
for bars and wrap their category labels; exact axis ticks keep their normal
|
|
95
|
+
text size and scroll when necessary. Heatmap examples expose values on selection
|
|
96
|
+
and support one keyboard entry with arrow navigation. `WeekdayHeatmap` accepts
|
|
97
|
+
`hours` and `weekdays` to show a relevant domain without changing data labels.
|
|
98
|
+
|
|
99
|
+
## Surfaces
|
|
100
|
+
|
|
101
|
+
`SiyahiProvider` sets how data blocks sit on the page:
|
|
102
|
+
|
|
103
|
+
- `surface="ruled"` (default, even outside a provider): ruled on white.
|
|
104
|
+
`PanelGrid`, `SectionCards` and `MetricStrip` fill their blocks with the card
|
|
105
|
+
colour and part them with hairlines, with a rule above and below each group
|
|
106
|
+
and none on the sides; a card standing alone takes the rules above and below
|
|
107
|
+
itself.
|
|
108
|
+
- `surface="card"`: tight square cards, each filled inside a hairline, 8px
|
|
109
|
+
apart, no shadow, for a page of separate blocks.
|
|
110
|
+
- `surface="open"`: no fill, boxes or rules; card padding is removed.
|
|
111
|
+
|
|
112
|
+
`DESIGN.md` has the rest of the look: square corners, mono capital labels,
|
|
113
|
+
ledger totals, the masthead and exception tones.
|
|
114
|
+
|
|
115
|
+
Nest a provider to change one section. A dialog, sheet or popover renders
|
|
116
|
+
outside the page's provider element: `PanelGrid` and `SectionCards` carry
|
|
117
|
+
their surface into it, but a lone `Card` there is ruled unless the popup's
|
|
118
|
+
content sits in its own provider with an explicit surface, such as
|
|
119
|
+
`<SiyahiProvider surface="card">`; a provider without one draws no element. Stack `PageSection` blocks with
|
|
120
|
+
`flex flex-col gap-6`; use `PanelGrid` for blocks side by side. Categories use
|
|
121
|
+
neutral outline badges, leaving colour for meaning and chart series.
|
|
168
122
|
|
|
169
123
|
## Dark mode
|
|
170
124
|
|
|
171
|
-
The
|
|
172
|
-
toggle
|
|
173
|
-
|
|
174
|
-
line after the import and sets the `dark` class on `<html>`:
|
|
125
|
+
The theme follows the device through `prefers-color-scheme`. For an app-owned
|
|
126
|
+
toggle, override the variant after the stylesheet import and set the `dark`
|
|
127
|
+
class on `<html>`:
|
|
175
128
|
|
|
176
129
|
```css
|
|
177
130
|
@import "@siyahi/ui/styles.css";
|
|
178
131
|
@custom-variant dark (&:where(.dark, .dark *));
|
|
179
132
|
```
|
|
180
133
|
|
|
181
|
-
|
|
182
|
-
`<html>` yourself as well, so scrollbars and form controls match.
|
|
183
|
-
|
|
184
|
-
## Lint
|
|
185
|
-
|
|
186
|
-
`@siyahi/tools` ships an [oxlint](https://oxc.rs) plugin. Its rules run only in
|
|
187
|
-
files that import `@siyahi/ui`, so older pages are left alone. They reject
|
|
188
|
-
colour literals (hex, `rgb()`, `oklch()`), Tailwind palette colours, Tailwind
|
|
189
|
-
arbitrary values such as `text-[13px]`, `dark:` and `light:` variants,
|
|
190
|
-
numeric font sizes, and chart configs with a per-scheme `theme` map (shadcn's
|
|
191
|
-
chart applies its dark half under a `.dark` class Siyahi never sets; name a
|
|
192
|
-
chart token with `color: "var(--chart-1)"` instead). Two of the rules are
|
|
193
|
-
[`@shadcn/lint`](https://github.com/shadcn-ui/lint)'s, scoped the same way.
|
|
194
|
-
|
|
195
|
-
```sh
|
|
196
|
-
npm install --save-dev @siyahi/tools@next oxlint
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
```json
|
|
200
|
-
{
|
|
201
|
-
"jsPlugins": ["@siyahi/tools/lint"],
|
|
202
|
-
"settings": { "shadcn": { "ui": "@siyahi/ui", "themeImports": ["^@siyahi/ui/"] } },
|
|
203
|
-
"rules": {
|
|
204
|
-
"siyahi/no-color-literal": "error",
|
|
205
|
-
"siyahi/no-scheme-variant": "error",
|
|
206
|
-
"siyahi/no-numeric-font-size": "error",
|
|
207
|
-
"siyahi/no-chart-theme-map": "error",
|
|
208
|
-
"siyahi/no-raw-colors": "error",
|
|
209
|
-
"siyahi/no-arbitrary-values": "error"
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
`@siyahi/tools` also has `siyahi-shots` (screenshots of a page at 1920 and 390
|
|
215
|
-
pixels wide in both schemes, with layout checks), `siyahi-cls` (how far a page
|
|
216
|
-
moves after its first paint on a slow network) and `siyahi-contrast` (the
|
|
217
|
-
theme contrast check). See [packages/tools](packages/tools/README.md).
|
|
134
|
+
Set `color-scheme` on `<html>` as well so native controls match.
|
|
218
135
|
|
|
219
|
-
##
|
|
136
|
+
## Tools
|
|
220
137
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
| `assets/icon.svg` | The mark. |
|
|
138
|
+
`@siyahi/tools` provides theme lint rules, font preload, layout screenshots
|
|
139
|
+
(`siyahi-shots`), loading-shift checks (`siyahi-cls`) and contrast checks
|
|
140
|
+
(`siyahi-contrast`). See the
|
|
141
|
+
[tools guide](https://github.com/jatinbansal1998/siyahi/blob/main/packages/tools/README.md)
|
|
142
|
+
for configuration and commands.
|
|
227
143
|
|
|
228
|
-
Development
|
|
144
|
+
## Development
|
|
229
145
|
|
|
230
146
|
```sh
|
|
231
147
|
pnpm install
|
|
232
|
-
pnpm --filter @siyahi/tools exec playwright install chromium
|
|
233
|
-
pnpm check
|
|
234
|
-
pnpm dev
|
|
148
|
+
pnpm --filter @siyahi/tools exec playwright install chromium
|
|
149
|
+
pnpm check
|
|
150
|
+
pnpm dev
|
|
235
151
|
```
|
|
236
152
|
|
|
237
|
-
|
|
153
|
+
Read [CONTRIBUTING.md](https://github.com/jatinbansal1998/siyahi/blob/main/CONTRIBUTING.md)
|
|
154
|
+
before adding components. Source lives in `packages/ui`, `packages/tools` and
|
|
155
|
+
`apps/catalogue`; the catalogue is the visual documentation.
|
|
238
156
|
|
|
239
157
|
## Licence
|
|
240
158
|
|
|
241
|
-
MIT
|
|
242
|
-
notice; see [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
|
|
159
|
+
MIT. See [LICENSE](LICENSE) and [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -8,17 +8,17 @@ file as copied; `packages/ui/registry.lock.json` lists them all and
|
|
|
8
8
|
|
|
9
9
|
## Copied into `@siyahi/ui`
|
|
10
10
|
|
|
11
|
-
| What
|
|
12
|
-
|
|
|
13
|
-
| shadcn/ui core components (installed with `shadcn add`, never edited)
|
|
14
|
-
| shadcn `tailwind.css` (variants and utilities the components use)
|
|
15
|
-
| shadcn block `sidebar-07`
|
|
16
|
-
| shadcn block `dashboard-01`, `SectionCards` only
|
|
17
|
-
| Heatmaps: calendar, weekday by hour, status timeline
|
|
18
|
-
| niko-table data table on TanStack Table
|
|
19
|
-
| shadcn chart blocks `chart-bar-multiple`, `chart-area-stacked`, `chart-line-multiple`
|
|
20
|
-
| dashboardcn ranked list (`BarList`)
|
|
21
|
-
| MiniDev copy button (`CopyButton`)
|
|
11
|
+
| What | Where in the package | Origin | Licence |
|
|
12
|
+
| --------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
|
|
13
|
+
| shadcn/ui core components (installed with `shadcn add`, never edited) | `src/components/ui/*`, `src/hooks/use-mobile.ts` | https://github.com/shadcn-ui/ui | MIT, Copyright (c) 2023 shadcn |
|
|
14
|
+
| shadcn `tailwind.css` (variants and utilities the components use) | `styles/shadcn.css` | https://github.com/shadcn-ui/ui/tree/main/packages/shadcn | MIT, Copyright (c) 2023 shadcn |
|
|
15
|
+
| shadcn block `sidebar-07` | `src/components/registry/sidebar-07/*` | https://ui.shadcn.com/r/styles/base-vega/sidebar-07.json | MIT, Copyright (c) 2023 shadcn |
|
|
16
|
+
| shadcn block `dashboard-01`, `SectionCards` only | `src/components/registry/dashboard-01/section-cards.tsx` | https://ui.shadcn.com/r/styles/base-vega/dashboard-01.json | MIT, Copyright (c) 2023 shadcn |
|
|
17
|
+
| Heatmaps: calendar, weekday by hour, status timeline | `src/components/registry/heatmap/*` | https://shadcn-heatmap.pages.dev/r/calendar-heatmap.json, https://shadcn-heatmap.pages.dev/r/weekday-heatmap.json, https://shadcn-heatmap.pages.dev/r/status-heatmap.json (source: https://github.com/rutopio/shadcn-heatmap) | MIT, Copyright (c) 2026 ChingRu |
|
|
18
|
+
| niko-table data table on TanStack Table | `src/components/registry/niko-table/*` | https://niko-table.com/r/data-table.json, https://niko-table.com/r/data-table-core.json, https://niko-table.com/r/data-table-ui.json, https://niko-table.com/r/data-table-faceted-filter.json, https://niko-table.com/r/data-table-column-sort.json, https://niko-table.com/r/data-table-search-filter.json (source: https://github.com/Semkoo/niko-table-registry) | MIT, Copyright (c) 2025 Semir N.; original work Copyright (c) 2025 WebDevSimplified |
|
|
19
|
+
| shadcn chart blocks `chart-bar-multiple`, `chart-area-stacked`, `chart-line-multiple` | `src/components/registry/charts/*` | https://ui.shadcn.com/r/styles/new-york-v4/chart-bar-multiple.json, https://ui.shadcn.com/r/styles/new-york-v4/chart-area-stacked.json, https://ui.shadcn.com/r/styles/new-york-v4/chart-line-multiple.json | MIT, Copyright (c) 2023 shadcn |
|
|
20
|
+
| dashboardcn ranked list (`BarList`), stacked bar (`DistributionBar`), `Sparkline` and `MetricStrip` | `src/components/registry/dashboardcn/*` | https://dashboardcn.com/r/bar-list.json, https://dashboardcn.com/r/distribution-bar.json, https://dashboardcn.com/r/sparkline.json, https://dashboardcn.com/r/kpi-row-card.json (source: https://github.com/NoahGdev/dashboardcn) | MIT, Copyright (c) 2026 dashboardcn contributors |
|
|
21
|
+
| MiniDev copy button (`CopyButton`) | `src/components/registry/minidev/copy-button.tsx` | https://ui.minidev.pro/r/copy-button.json (source: https://github.com/amankaushik481/minidev-ui) | MIT, Copyright (c) 2026 MiniDev |
|
|
22
22
|
|
|
23
23
|
## Runtime dependencies with attribution terms
|
|
24
24
|
|