@franco_roura/module-01 0.0.0-stage → 1.0.0

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 (222) hide show
  1. package/LICENSE-APACHE +202 -0
  2. package/LICENSE-MIT +21 -0
  3. package/README.md +64 -2
  4. package/dist/charts.d.ts +3 -0
  5. package/dist/charts.js +3 -0
  6. package/dist/components/alert-dialog.d.ts +19 -0
  7. package/dist/components/alert-dialog.js +101 -0
  8. package/dist/components/alert-dialog.js.map +1 -0
  9. package/dist/components/amount.d.ts +24 -0
  10. package/dist/components/amount.js +27 -0
  11. package/dist/components/amount.js.map +1 -0
  12. package/dist/components/appearance-pickers.d.ts +9 -0
  13. package/dist/components/appearance-pickers.js +65 -0
  14. package/dist/components/appearance-pickers.js.map +1 -0
  15. package/dist/components/badge.d.ts +10 -0
  16. package/dist/components/badge.js +28 -0
  17. package/dist/components/badge.js.map +1 -0
  18. package/dist/components/budget-meter.d.ts +18 -0
  19. package/dist/components/budget-meter.js +38 -0
  20. package/dist/components/budget-meter.js.map +1 -0
  21. package/dist/components/button.d.ts +13 -0
  22. package/dist/components/button.js +54 -0
  23. package/dist/components/button.js.map +1 -0
  24. package/dist/components/calendar.d.ts +7 -0
  25. package/dist/components/calendar.js +52 -0
  26. package/dist/components/calendar.js.map +1 -0
  27. package/dist/components/category-icon.d.ts +33 -0
  28. package/dist/components/category-icon.js +49 -0
  29. package/dist/components/category-icon.js.map +1 -0
  30. package/dist/components/chart.d.ts +44 -0
  31. package/dist/components/chart.js +147 -0
  32. package/dist/components/chart.js.map +1 -0
  33. package/dist/components/charts.d.ts +52 -0
  34. package/dist/components/charts.js +482 -0
  35. package/dist/components/charts.js.map +1 -0
  36. package/dist/components/checkbox.d.ts +5 -0
  37. package/dist/components/checkbox.js +21 -0
  38. package/dist/components/checkbox.js.map +1 -0
  39. package/dist/components/combobox.d.ts +32 -0
  40. package/dist/components/combobox.js +100 -0
  41. package/dist/components/combobox.js.map +1 -0
  42. package/dist/components/command.d.ts +19 -0
  43. package/dist/components/command.js +86 -0
  44. package/dist/components/command.js.map +1 -0
  45. package/dist/components/cta-banner.d.ts +14 -0
  46. package/dist/components/cta-banner.js +39 -0
  47. package/dist/components/cta-banner.js.map +1 -0
  48. package/dist/components/date-picker.d.ts +19 -0
  49. package/dist/components/date-picker.js +107 -0
  50. package/dist/components/date-picker.js.map +1 -0
  51. package/dist/components/dialog.d.ts +18 -0
  52. package/dist/components/dialog.js +99 -0
  53. package/dist/components/dialog.js.map +1 -0
  54. package/dist/components/dropdown-menu.d.ts +26 -0
  55. package/dist/components/dropdown-menu.js +123 -0
  56. package/dist/components/dropdown-menu.js.map +1 -0
  57. package/dist/components/field.d.ts +30 -0
  58. package/dist/components/field.js +53 -0
  59. package/dist/components/field.js.map +1 -0
  60. package/dist/components/footer.d.ts +18 -0
  61. package/dist/components/footer.js +40 -0
  62. package/dist/components/footer.js.map +1 -0
  63. package/dist/components/fx-converter.d.ts +22 -0
  64. package/dist/components/fx-converter.js +91 -0
  65. package/dist/components/fx-converter.js.map +1 -0
  66. package/dist/components/hero.d.ts +28 -0
  67. package/dist/components/hero.js +83 -0
  68. package/dist/components/hero.js.map +1 -0
  69. package/dist/components/hud.d.ts +41 -0
  70. package/dist/components/hud.js +108 -0
  71. package/dist/components/hud.js.map +1 -0
  72. package/dist/components/input.d.ts +4 -0
  73. package/dist/components/input.js +14 -0
  74. package/dist/components/input.js.map +1 -0
  75. package/dist/components/label.d.ts +5 -0
  76. package/dist/components/label.js +15 -0
  77. package/dist/components/label.js.map +1 -0
  78. package/dist/components/media-card.d.ts +29 -0
  79. package/dist/components/media-card.js +80 -0
  80. package/dist/components/media-card.js.map +1 -0
  81. package/dist/components/money-input.d.ts +10 -0
  82. package/dist/components/money-input.js +30 -0
  83. package/dist/components/money-input.js.map +1 -0
  84. package/dist/components/multi-combobox.d.ts +27 -0
  85. package/dist/components/multi-combobox.js +101 -0
  86. package/dist/components/multi-combobox.js.map +1 -0
  87. package/dist/components/nav-bar.d.ts +21 -0
  88. package/dist/components/nav-bar.js +44 -0
  89. package/dist/components/nav-bar.js.map +1 -0
  90. package/dist/components/panel.d.ts +27 -0
  91. package/dist/components/panel.js +49 -0
  92. package/dist/components/panel.js.map +1 -0
  93. package/dist/components/popover.d.ts +11 -0
  94. package/dist/components/popover.js +56 -0
  95. package/dist/components/popover.js.map +1 -0
  96. package/dist/components/select.d.ts +16 -0
  97. package/dist/components/select.js +128 -0
  98. package/dist/components/select.js.map +1 -0
  99. package/dist/components/separator.d.ts +5 -0
  100. package/dist/components/separator.js +17 -0
  101. package/dist/components/separator.js.map +1 -0
  102. package/dist/components/sheet.d.ts +15 -0
  103. package/dist/components/sheet.js +87 -0
  104. package/dist/components/sheet.js.map +1 -0
  105. package/dist/components/skeleton.d.ts +3 -0
  106. package/dist/components/skeleton.js +13 -0
  107. package/dist/components/skeleton.js.map +1 -0
  108. package/dist/components/sonner.d.ts +5 -0
  109. package/dist/components/sonner.js +44 -0
  110. package/dist/components/sonner.js.map +1 -0
  111. package/dist/components/spec-readout.d.ts +11 -0
  112. package/dist/components/spec-readout.js +25 -0
  113. package/dist/components/spec-readout.js.map +1 -0
  114. package/dist/components/split-flap.d.ts +12 -0
  115. package/dist/components/split-flap.js +77 -0
  116. package/dist/components/split-flap.js.map +1 -0
  117. package/dist/components/tabs.d.ts +12 -0
  118. package/dist/components/tabs.js +47 -0
  119. package/dist/components/tabs.js.map +1 -0
  120. package/dist/components/tag.d.ts +16 -0
  121. package/dist/components/tag.js +26 -0
  122. package/dist/components/tag.js.map +1 -0
  123. package/dist/components/terminal.d.ts +10 -0
  124. package/dist/components/terminal.js +20 -0
  125. package/dist/components/terminal.js.map +1 -0
  126. package/dist/components/textarea.d.ts +4 -0
  127. package/dist/components/textarea.js +13 -0
  128. package/dist/components/textarea.js.map +1 -0
  129. package/dist/components/timeline-entry.d.ts +26 -0
  130. package/dist/components/timeline-entry.js +63 -0
  131. package/dist/components/timeline-entry.js.map +1 -0
  132. package/dist/components/toggle-group.d.ts +10 -0
  133. package/dist/components/toggle-group.js +49 -0
  134. package/dist/components/toggle-group.js.map +1 -0
  135. package/dist/components/toggle.d.ts +10 -0
  136. package/dist/components/toggle.js +37 -0
  137. package/dist/components/toggle.js.map +1 -0
  138. package/dist/components/tooltip.d.ts +8 -0
  139. package/dist/components/tooltip.js +36 -0
  140. package/dist/components/tooltip.js.map +1 -0
  141. package/dist/finance.d.ts +10 -0
  142. package/dist/finance.js +10 -0
  143. package/dist/index.d.ts +33 -0
  144. package/dist/index.js +33 -0
  145. package/dist/lib/category-icons.d.ts +80 -0
  146. package/dist/lib/category-icons.js +102 -0
  147. package/dist/lib/category-icons.js.map +1 -0
  148. package/dist/lib/fault.d.ts +7 -0
  149. package/dist/lib/fault.js +28 -0
  150. package/dist/lib/fault.js.map +1 -0
  151. package/dist/lib/form-flow.d.ts +15 -0
  152. package/dist/lib/form-flow.js +50 -0
  153. package/dist/lib/form-flow.js.map +1 -0
  154. package/dist/lib/fx.d.ts +39 -0
  155. package/dist/lib/fx.js +98 -0
  156. package/dist/lib/fx.js.map +1 -0
  157. package/dist/lib/money.d.ts +19 -0
  158. package/dist/lib/money.js +55 -0
  159. package/dist/lib/money.js.map +1 -0
  160. package/dist/lib/use-media-query.d.ts +3 -0
  161. package/dist/lib/use-media-query.js +15 -0
  162. package/dist/lib/use-media-query.js.map +1 -0
  163. package/dist/lib/utils.d.ts +3 -0
  164. package/dist/lib/utils.js +26 -0
  165. package/dist/lib/utils.js.map +1 -0
  166. package/dist/site.d.ts +10 -0
  167. package/dist/site.js +10 -0
  168. package/dist/styles.css +2 -0
  169. package/dist/theme.css +391 -0
  170. package/dist/tokens.css +181 -0
  171. package/guidelines/AlertDialog.md +9 -0
  172. package/guidelines/Amount.md +10 -0
  173. package/guidelines/AppearancePickers.md +8 -0
  174. package/guidelines/Badge.md +11 -0
  175. package/guidelines/BudgetMeter.md +11 -0
  176. package/guidelines/Button.md +16 -0
  177. package/guidelines/Calendar.md +8 -0
  178. package/guidelines/CategoryIcon.md +10 -0
  179. package/guidelines/Charts.md +12 -0
  180. package/guidelines/Checkbox.md +8 -0
  181. package/guidelines/Combobox.md +18 -0
  182. package/guidelines/Command.md +8 -0
  183. package/guidelines/Crosshair.md +7 -0
  184. package/guidelines/CtaBanner.md +8 -0
  185. package/guidelines/DatePicker.md +11 -0
  186. package/guidelines/Dialog.md +9 -0
  187. package/guidelines/DropdownMenu.md +9 -0
  188. package/guidelines/Field.md +22 -0
  189. package/guidelines/Footer.md +7 -0
  190. package/guidelines/FxConverter.md +12 -0
  191. package/guidelines/GlassPanel.md +8 -0
  192. package/guidelines/Grill.md +7 -0
  193. package/guidelines/Hero.md +9 -0
  194. package/guidelines/HudLabel.md +8 -0
  195. package/guidelines/Input.md +9 -0
  196. package/guidelines/Label.md +7 -0
  197. package/guidelines/MediaCard.md +8 -0
  198. package/guidelines/MoneyInput.md +10 -0
  199. package/guidelines/MultiCombobox.md +11 -0
  200. package/guidelines/NavBar.md +10 -0
  201. package/guidelines/Panel.md +10 -0
  202. package/guidelines/Popover.md +8 -0
  203. package/guidelines/README.md +100 -0
  204. package/guidelines/SectionHeader.md +9 -0
  205. package/guidelines/Select.md +9 -0
  206. package/guidelines/Separator.md +8 -0
  207. package/guidelines/Sheet.md +9 -0
  208. package/guidelines/Skeleton.md +8 -0
  209. package/guidelines/SpecReadout.md +7 -0
  210. package/guidelines/SplitFlap.md +9 -0
  211. package/guidelines/StatusLed.md +8 -0
  212. package/guidelines/Tabs.md +9 -0
  213. package/guidelines/Tag.md +9 -0
  214. package/guidelines/Terminal.md +7 -0
  215. package/guidelines/Textarea.md +8 -0
  216. package/guidelines/TickRuler.md +8 -0
  217. package/guidelines/TimelineEntry.md +8 -0
  218. package/guidelines/Toaster.md +9 -0
  219. package/guidelines/Toggle.md +9 -0
  220. package/guidelines/Tooltip.md +8 -0
  221. package/package.json +103 -4
  222. package/tokens/tokens.json +739 -0
@@ -0,0 +1,100 @@
1
+ A gadget you'd want on your desk: glossy white plastic parts, signal orange hardware, soft corners with one hard notch, and full HUD markings, like model codes, tick rulers, crosshairs and grill slots. Retro space-age product design meets an engineer's spec sheet. Module/01 is a kit for any app or website: landing pages, product and docs sites, dashboards, tools and data-dense apps. The rules below hold everywhere; Site surfaces and App surfaces add the patterns for each kind of screen.
2
+
3
+ ## Content fundamentals
4
+
5
+ - Headings are plain words that name the thing: "Overview", "Pricing", "Reports", "Settings". Don't write them in character ("Mission log", "Operator profile").
6
+ - The sci-fi lives in the labels around the copy: section codes (`S-02`), entry codes (`P-01`, `W-03`), serials (`UNIT-01 · REV.2026`), coordinates, build stamps. Keep codes short and consistent: letter, dash, two digits. Each product picks its own letters and uses them the same way on every screen.
7
+ - Codes are decoration. Never make a code the only label for something; the plain heading or name always sits next to it.
8
+ - Short and concrete. Speak to the reader in second person with plain verbs ("Start free trial", "Add member", "No results in this period"). Use first person only on a site about one person. Bullets start with a verb and carry one point.
9
+ - Sentence case for headings and buttons; UPPERCASE only in the mono HUD styles. No emoji.
10
+
11
+ ## Color
12
+
13
+ - The page is `canvas` (glossy white with a cool cast). Parts are `shell`, sunken areas `shell-recess`, joints `seam`.
14
+ - `signal` is generous, like the trim on a product: primary buttons, hinge tabs on cards, HUD code chips, meter fills, grill accents, timeline nodes and feature blocks. Text on `signal` is always `ink`, never white.
15
+ - Orange as text uses `signal-ink` (links, active nav, focus ring, emphasized lines); `signal` itself is too light for text on white.
16
+ - `studio` (lavender-grey) is the backdrop behind every image, screenshot and portrait, as in a product shoot.
17
+ - `visor` is black glass for terminal snippets and dark inset screens, with `shell` text and `visor-mark` microprint.
18
+ - `glass` is frosted clear plastic: the nav bar, sticky bars and one or two `GlassPanel`s placed over color.
19
+ - `led-on` green marks "available" and "live", always next to a word.
20
+ - `hud-mark` is for decorative markings. Microprint that people need to read uses `ink-soft`.
21
+ - `danger` fills destructive buttons (with `shell` text) and colors error text; `danger-tint` is the invalid input well.
22
+ - `overlay` is the scrim behind dialogs and sheets.
23
+ - Domain tokens are shared but only used where they apply: `income-ink`/`expense-ink` for signed money, `cat-red` … `cat-slate` (16 colors) for categories and labels, `chart-*` for chart series. See App surfaces.
24
+
25
+ ## Typography
26
+
27
+ - Michroma (`--font-display`) for display only: the one hero title on a page, like a name or product name (`display-xl`), section and page headings (`display-lg`), feature block headlines (`display-md`), card and entry titles and the nav mark (`display-sm`). It's wide; keep headings short.
28
+ - Manrope (`--font-sans`) for all reading: `body-lg` intros, `body-md` paragraphs and bullets, `body-sm` descriptions and captions, `label` (700) on buttons and nav.
29
+ - Space Mono (`--font-mono`) for the HUD: `hud` labels and tags (uppercase, 0.12em), `hud-sm` microprint (uppercase, 0.16em), `hud-num` dates and small figures, `code` on visor.
30
+ - Space Mono also sets numbers that matter: `amount-xl` headline figures, `amount-lg` tile and card figures, `amount-md` (700) row figures. Use tabular figures.
31
+ - All three load from Google Fonts.
32
+
33
+ ## Shape
34
+
35
+ - Soft parts with hard notches. Panels and cards are `radius-lg`; hero and feature blocks are `radius-xl`; media frames and inputs are `radius-md`. Each takes one chamfered corner, top-right: `notch-md` on panels and cards, `notch-lg` on hero and feature blocks, `notch-sm` on chips and small tiles.
36
+ - Everything you press is a stadium (`radius-full`): buttons, tags, nav bar, grill slots, hinge tabs.
37
+ - Hinge tabs are small `signal` stadiums sitting on a card's top edge, like the cube's hinges. Use one per card, and vary the position.
38
+
39
+ ## Depth and material
40
+
41
+ - Parts float on `shadow-float` (applied as a drop-shadow so the notch keeps it). Buttons are molded with `shadow-mold`; pressed or sunken things use `shadow-press`.
42
+ - Glass uses `shadow-glass` plus a 16px backdrop blur. It needs color behind it to read.
43
+
44
+ ## HUD markings
45
+
46
+ - Every marking must sit on a structure: a code chip on each section label, a tick ruler under each section heading and above the footer, a serial in each panel's top-left corner, a crosshair in its bottom-right corner, two crosshairs on each media frame, and grill slots on hero and feature blocks.
47
+ - One crosshair per panel corner pair, never a scatter. Rulers never run through text.
48
+ - Sites go loud with markings. Apps keep the same structures but stay calmer where data is dense: lists and forms carry no decoration inside them, only on the panel around them.
49
+ - Number in a stable order: sections `S-01`…, entries by a letter for their kind (`F-01` features, `R-01` records), nav links `01`…
50
+
51
+ ## Layout
52
+
53
+ - Content max `content-max` (1120px), side padding `space-12` (`space-6` on mobile). Sections are `space-24` apart; a section header sits `space-12` above its content.
54
+ - The glass NavBar floats over `canvas` and stays sticky. Grids of cards run 2–3 across with `space-8` gaps.
55
+
56
+ ## Imagery and iconography
57
+
58
+ - Photos and renders go on a `studio` backdrop inside a `radius-md` frame. Use object shots and screenshots as product photos.
59
+ - Markings are built from type and simple geometry: plus marks, brackets, ticks, slots, the → arrow in mono.
60
+ - Interface icons come from Lucide at a 1.25px stroke, in `ink` or `signal-ink`.
61
+ - Products have no logo by default. Set the product's name in Michroma wherever a mark would go, with a short form for tight spaces (`M/01`).
62
+
63
+ ## Site surfaces
64
+
65
+ Sites (a landing page, a product or docs site, a portfolio) are editorial: few pages, big type, loud markings.
66
+
67
+ - Page order: NavBar → Hero → Features (Panels) → Timeline (TimelineEntry stack) → Cards (MediaCard grid) → CtaBanner → Footer. Leave out what the page doesn't need.
68
+ - The hero title is the page or product name in `display-xl`, with one image on `studio`.
69
+ - `signal` carries the timeline nodes and the whole call-to-action block; `signal-ink` sets the hero subtitle.
70
+ - Numbering: timeline `R-01`… (oldest first), cards `C-01`….
71
+
72
+ ## App surfaces
73
+
74
+ Apps use the same parts for data-dense screens. Pages are a SectionHeader, then Panels.
75
+
76
+ - Lists live in one Panel with no padding: a mono group header (a day, say) with its total, then rows. Rows hover to `shell-recess`.
77
+ - Summary tiles are small Panels (`notch-sm`) with a `hud-sm` label over an `amount-lg` figure.
78
+ - Inputs are sunken wells: `shell-recess`, `shadow-press`, `radius-md`, `control-height`. Wrap each in a Field. Dates use DatePicker; choices use Select, Combobox or MultiCombobox.
79
+ - Forms flow on their own: dialogs and sheets open on the first field, Select, Combobox and DatePicker move focus to the next field after a pick, and typing on a combobox opens its search (see Combobox). MultiCombobox stays open while toggling and leaves with Tab.
80
+ - A rejected input faults like a refusing part: a short stepped servo jitter, one thin `danger` ping leaving its outline, and its label turns `danger` with a blinking fault LED. Never a glow, never longer than a second (see Field).
81
+ - Editors open in a sheet: from the right on desktop, from the bottom on phones. A signal stadium FAB opens quick-add on phones.
82
+ - Bulk actions sit in a sticky glass stadium bar.
83
+ - Serials label panels with the entity's code and one key fact (`R-01 · EU-WEST`).
84
+
85
+ ### Money and categories
86
+
87
+ For products that handle money or categorized records.
88
+
89
+ - Money as text: `income-ink` for positive amounts and balances, `expense-ink` for negative ones. Both always come with their sign. Every amount is integer minor units under the hood and shows its sign and currency (see Amount). Amounts are entered with MoneyInput; cross-currency transfers use FxConverter.
90
+ - `cat-red` … `cat-slate` are the category and label palette: the disc behind a category glyph and the dot beside a label. Decorative fills; glyphs on them are `ink`. Category glyphs are Lucide icons on a palette disc (CategoryIcon).
91
+ - Reports: a row of summary tiles, then chart Panels (balance, cash flow, category donuts with ranked lists). Series colors come from `chart-line`, `chart-income`, `chart-expense` and the category palette (see Charts).
92
+ - Budgets: a grid of budget Panels (name, spent of budgeted, BudgetMeter, "left" or "over by", per-day allowance, period). The detail adds the meter with a today caption, category and account donuts, a history of periods with small meters, and the period's expenses.
93
+
94
+ ## Don'ts
95
+
96
+ - Don't put white text on `signal`, and don't use `signal` as small text on white.
97
+ - Don't show an amount without its sign, and don't rely on `income-ink`/`expense-ink` alone.
98
+ - Don't put more than one notch on a part, and don't notch a stadium.
99
+ - Don't use gradients, neon glows or dark mode. This system is lit like a white studio.
100
+ - Don't write headings in character, and don't let a HUD code stand in for a heading. Keep the copy plain.
@@ -0,0 +1,9 @@
1
+ # SectionHeader
2
+
3
+ Section opener: HUD label with code, a plain display heading, and an optional tick ruler.
4
+
5
+ Provide `title` (plain words: "Overview", "Settings"). Optional `code` (`S-02`), `label` (overline text), `aside` (a button or link at the right), `ruler`, and `as` (`h1` default, `h2`, `h3`).
6
+
7
+ - Heading in `display-lg` (Michroma), `ink`; `display-md` on phones. Copy stays plain; the codes and ticks carry the sci-fi.
8
+ - Leave `space-12` between the header and the content of the section.
9
+ - One `h1` per page; use `as` for the sections under it.
@@ -0,0 +1,9 @@
1
+ # Select
2
+
3
+ A single choice from a short list, on Radix Select.
4
+
5
+ Compose `Select`, `SelectTrigger` with a `SelectValue`, and `SelectContent` with `SelectItem`s. `SelectGroup`, `SelectLabel` and `SelectSeparator` structure longer lists.
6
+
7
+ - For up to about eight options. A longer or searchable list is a Combobox.
8
+ - The trigger is a sunken well like Input; the list is a `shell` popover with `shadow-float`.
9
+ - Picking an option moves focus to the next field (see Combobox, Form flow).
@@ -0,0 +1,8 @@
1
+ # Separator
2
+
3
+ A one-pixel `seam` line between groups, on Radix Separator.
4
+
5
+ Optional `orientation` (`horizontal` default, `vertical`) and `decorative`.
6
+
7
+ - Seams divide molded parts; they're never text and never thicker than a pixel.
8
+ - Prefer spacing first. Add a seam when two groups would otherwise read as one.
@@ -0,0 +1,9 @@
1
+ # Sheet
2
+
3
+ A panel that slides in from an edge, for editors and filters. Built on Radix Dialog.
4
+
5
+ Compose `Sheet`, `SheetTrigger` and `SheetContent` (`side`: `right` default, `left`, `top`, `bottom`) with a `SheetHeader`, your form, and a `SheetFooter`.
6
+
7
+ - From the right on desktop at `sheet-max` (560px) wide; from the bottom on phones.
8
+ - Like Dialog, it opens on its first field and keeps focus inside.
9
+ - The footer holds the main action; keep it visible while the body scrolls.
@@ -0,0 +1,8 @@
1
+ # Skeleton
2
+
3
+ A pulsing `shell-recess` block that holds the place of loading content.
4
+
5
+ Size it with classes (`h-6 w-40`) to match what it replaces.
6
+
7
+ - Mirror the shape of the real content: a line for text, a disc for a CategoryIcon, a block for a chart.
8
+ - Show it only when loading takes long enough to notice.
@@ -0,0 +1,7 @@
1
+ # SpecReadout
2
+
3
+ A row of label/value pairs separated by seams, like a spec sheet.
4
+
5
+ Provide `items`: `[{label, value}]` (3–5 items: location, focus, years, languages).
6
+
7
+ - Labels in `hud` / `ink-soft`, values in `label` weight / `ink`. Seams in `seam`.
@@ -0,0 +1,9 @@
1
+ # SplitFlap
2
+
3
+ Text whose characters flip through random glyphs before landing, like a station departure board.
4
+
5
+ Provide `text`. Optional `start` (hold the first flap until true, e.g. when scrolled into view).
6
+
7
+ - Use it on HUD microprint: a status line, a clock, a code. Never on headings or body text.
8
+ - It flaps again whenever `text` changes; unchanged characters stay still.
9
+ - Screen readers get the final text only. Reduced motion skips the flipping.
@@ -0,0 +1,8 @@
1
+ # StatusLed
2
+
3
+ A small LED dot with a mono label, for availability and live states.
4
+
5
+ Provide `children` (the status in words: "Online", "Synced"). Optional `tone` (`on` default green `led-on`, `signal`, `off`).
6
+
7
+ - Always a word next to the dot; color alone never carries the meaning.
8
+ - One per area: the nav and the hero.
@@ -0,0 +1,9 @@
1
+ # Tabs
2
+
3
+ A row of stadium tabs that switch the view under them, on Radix Tabs.
4
+
5
+ Compose `Tabs` (`value` or `defaultValue`) with a `TabsList` of `TabsTrigger`s and one `TabsContent` per tab. `TabsList` takes `variant` `default` or `line`.
6
+
7
+ - The list is a sunken `shell-recess` track; the active tab is a raised `shell` stadium with `shadow-mold`.
8
+ - Two to five tabs with one-word labels. More than that is a Select.
9
+ - In a form, tabs that switch its kind ("Expense", "Income", "Transfer") sit above the first field.
@@ -0,0 +1,9 @@
1
+ # Tag
2
+
3
+ Small stadium chip in mono uppercase for skills, stacks and status.
4
+
5
+ Provide `children` (one or two words). Optional `tone` (`signal`, `tint`, `outline`; recessed by default), `led` (adds a green LED dot, for "Live"), and `interactive` with `pressed` and `onClick` to render a keycap button.
6
+
7
+ - Default: `shell-recess` fill, like a slot molded into the part. `outline` on shell cards; `signal` for the one tag that matters most; `tint` for in-progress states.
8
+ - Text is always uppercase `hud` at 12px.
9
+ - In an app, use Badge; Tag adds the LED and the keycap for sites.
@@ -0,0 +1,7 @@
1
+ # Terminal
2
+
3
+ Black-glass visor screen for a few lines of code or commands.
4
+
5
+ Provide `lines` (array of strings, shown after a `signal` `$` prompt) and optional `title` (microprint).
6
+
7
+ - `visor` fill, `shell` text, `code` style, `radius-md`. Use for an install command or a fun one-liner; keep to 1–4 lines.
@@ -0,0 +1,8 @@
1
+ # Textarea
2
+
3
+ A multi-line well for notes and descriptions.
4
+
5
+ Takes every native `<textarea>` prop. Wrap it in a Field.
6
+
7
+ - It grows with its content from a 64px minimum.
8
+ - Same focus ring and invalid treatment as Input.
@@ -0,0 +1,8 @@
1
+ # TickRuler
2
+
3
+ Measurement-tape strip of minor and major ticks, with optional microprint numbers.
4
+
5
+ Optional `labels` (array of short strings spread evenly under the ticks).
6
+
7
+ - Major ticks every 40px in `hud-mark`, minor every 8px in `seam`.
8
+ - Decorative: hidden from assistive tech. Use under section headings and above the footer, not inside paragraphs.
@@ -0,0 +1,8 @@
1
+ # TimelineEntry
2
+
3
+ One entry on a timeline track: a job, a release, a milestone. Date range and code, title, subtitle, bullet points and tags.
4
+
5
+ Provide `title`, `start`, and optional `subtitle` (a company, team or product), `end` (defaults to "Now"), `current` (orange node; past entries get a hollow node), `code` (`R-03`), `detail` (a place or a version), `points` (2–4 short bullets), `tags`.
6
+
7
+ - Dates in `hud-num`; title in `display-sm`; subtitle in `body-sm` `ink-soft`; bullets in `body-md` with `signal-ink` markers.
8
+ - Stack entries newest first; the track line runs between them in `seam`.
@@ -0,0 +1,9 @@
1
+ # Toaster
2
+
3
+ Toasts on sonner, in Module/01 colors.
4
+
5
+ Mount `<Toaster />` once at the root, then call `toast()`, `toast.success()` or `toast.error()` from `sonner`.
6
+
7
+ - A toast confirms what just happened ("Changes saved") or reports a problem. One short sentence, no period.
8
+ - When a form field is rejected, fault the field as well (see Field); the toast carries the message.
9
+ - Never put the only copy of important information in a toast: it leaves.
@@ -0,0 +1,9 @@
1
+ # Toggle
2
+
3
+ A button that stays pressed, on Radix Toggle. `ToggleGroup` holds a set of them.
4
+
5
+ `Toggle` takes `pressed`, `onPressedChange`, `variant` (`default`, `outline`) and `size`. `ToggleGroup` takes `type` (`single` or `multiple`), `value`, `onValueChange`, and `ToggleGroupItem`s.
6
+
7
+ - Pressed is a sunken state: `shell-recess` with `shadow-press`.
8
+ - For view options that apply at once (a chart mode, bold). An option saved with a form is a Checkbox.
9
+ - Give icon-only toggles an `aria-label`.
@@ -0,0 +1,8 @@
1
+ # Tooltip
2
+
3
+ A short `ink` label that names a control on hover and focus, on Radix Tooltip.
4
+
5
+ Wrap the app once in `TooltipProvider`, then compose `Tooltip`, `TooltipTrigger` and `TooltipContent`.
6
+
7
+ - For icon buttons and truncated text. One short phrase, no punctuation.
8
+ - Never put information there that people need to finish a task: touch screens have no hover.
package/package.json CHANGED
@@ -1,6 +1,105 @@
1
1
  {
2
2
  "name": "@franco_roura/module-01",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "Module/01: React components for a design system of glossy white parts, signal orange trim and HUD markings.",
5
+ "keywords": [
6
+ "components",
7
+ "design-system",
8
+ "module-01",
9
+ "radix-ui",
10
+ "react",
11
+ "tailwindcss"
12
+ ],
13
+ "homepage": "https://franco-roura.github.io/module-01/",
14
+ "bugs": "https://github.com/franco-roura/module-01/issues",
15
+ "license": "(MIT OR Apache-2.0)",
16
+ "author": "Franco Roura",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/franco-roura/module-01.git",
20
+ "directory": "packages/module-01"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "tokens",
25
+ "guidelines",
26
+ "LICENSE-MIT",
27
+ "LICENSE-APACHE"
28
+ ],
29
+ "type": "module",
30
+ "sideEffects": [
31
+ "**/*.css"
32
+ ],
33
+ "exports": {
34
+ ".": {
35
+ "types": "./dist/index.d.ts",
36
+ "default": "./dist/index.js"
37
+ },
38
+ "./finance": {
39
+ "types": "./dist/finance.d.ts",
40
+ "default": "./dist/finance.js"
41
+ },
42
+ "./charts": {
43
+ "types": "./dist/charts.d.ts",
44
+ "default": "./dist/charts.js"
45
+ },
46
+ "./site": {
47
+ "types": "./dist/site.d.ts",
48
+ "default": "./dist/site.js"
49
+ },
50
+ "./theme.css": "./dist/theme.css",
51
+ "./styles.css": "./dist/styles.css",
52
+ "./tokens.css": "./dist/tokens.css",
53
+ "./tokens.json": "./tokens/tokens.json",
54
+ "./package.json": "./package.json"
55
+ },
56
+ "publishConfig": {
57
+ "access": "public"
58
+ },
59
+ "scripts": {
60
+ "tokens": "node scripts/build-tokens.ts",
61
+ "build": "node scripts/build-tokens.ts && vp pack && node scripts/build-css.ts",
62
+ "test": "vp test run",
63
+ "typecheck": "tsc --noEmit",
64
+ "size": "size-limit",
65
+ "lint:package": "publint && attw --pack . --profile esm-only --exclude-entrypoints theme.css styles.css tokens.css"
66
+ },
67
+ "dependencies": {
68
+ "class-variance-authority": "0.7.1",
69
+ "clsx": "2.1.1",
70
+ "cmdk": "1.1.1",
71
+ "date-fns": "4.4.0",
72
+ "lucide-react": "1.65.0",
73
+ "radix-ui": "1.8.1",
74
+ "react-day-picker": "10.0.2",
75
+ "sonner": "2.0.8",
76
+ "tailwind-merge": "3.7.0",
77
+ "tw-animate-css": "1.4.0"
78
+ },
79
+ "devDependencies": {
80
+ "@arethetypeswrong/cli": "0.18.5",
81
+ "@size-limit/preset-small-lib": "14.3.0",
82
+ "@tailwindcss/cli": "4.3.3",
83
+ "@testing-library/react": "16.3.3",
84
+ "@types/node": "26.6.6",
85
+ "@types/react": "19.3.0",
86
+ "@types/react-dom": "19.3.0",
87
+ "happy-dom": "21.0.4",
88
+ "publint": "0.3.25",
89
+ "react": "19.3.1",
90
+ "react-dom": "19.3.1",
91
+ "recharts": "3.10.1",
92
+ "size-limit": "14.3.0",
93
+ "tailwindcss": "4.3.3"
94
+ },
95
+ "peerDependencies": {
96
+ "react": "^19.0.0",
97
+ "react-dom": "^19.0.0",
98
+ "recharts": "^3.10.1"
99
+ },
100
+ "peerDependenciesMeta": {
101
+ "recharts": {
102
+ "optional": true
103
+ }
104
+ }
105
+ }