@motir/design-system 0.20.0 → 0.21.1

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 (36) hide show
  1. package/README.md +150 -5
  2. package/dist/components/theme/AppearancePickers.js +30 -2
  3. package/dist/components/theme/AppearancePickers.js.map +1 -1
  4. package/dist/components/ui/DatePicker.d.ts +31 -0
  5. package/dist/components/ui/DatePicker.js +442 -0
  6. package/dist/components/ui/DatePicker.js.map +1 -0
  7. package/dist/components/ui/DatePickerFormatContext.d.ts +26 -0
  8. package/dist/components/ui/DatePickerFormatContext.js +58 -0
  9. package/dist/components/ui/DatePickerFormatContext.js.map +1 -0
  10. package/dist/components/ui/datePickerFormat.d.ts +40 -0
  11. package/dist/components/ui/datePickerFormat.js +30 -0
  12. package/dist/components/ui/datePickerFormat.js.map +1 -0
  13. package/dist/contexts/theme-context.js +30 -2
  14. package/dist/contexts/theme-context.js.map +1 -1
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.js +5 -0
  17. package/dist/mock/index.js +30 -2
  18. package/dist/mock/index.js.map +1 -1
  19. package/dist/mock/renderMock.js +30 -2
  20. package/dist/mock/renderMock.js.map +1 -1
  21. package/dist/specimen/TokensSpecimen.js +2 -2
  22. package/dist/specimen/TokensSpecimen.js.map +1 -1
  23. package/dist/theme/appearance-resolution.js +30 -2
  24. package/dist/theme/appearance-resolution.js.map +1 -1
  25. package/dist/theme/init-script.js +30 -2
  26. package/dist/theme/init-script.js.map +1 -1
  27. package/dist/theme/styles.d.ts +1 -1
  28. package/dist/theme/styles.js +2 -2
  29. package/dist/theme/styles.js.map +1 -1
  30. package/dist/theme/types.js +2 -2
  31. package/dist/theme/types.js.map +1 -1
  32. package/dist/theme/typography.d.ts +46 -3
  33. package/dist/theme/typography.js +28 -0
  34. package/dist/theme/typography.js.map +1 -1
  35. package/package.json +1 -1
  36. package/theme.css +114 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/ui/datePickerFormat.ts","../../../src/components/ui/DatePickerFormatContext.tsx"],"names":[],"mappings":";;;;AAuCO,IAAM,0BAAA,GAA+C,IAAA;AAM5D,IAAM,aAAA,GAA4C;AAAA,EAChD,QAAA,EAAU,KAAA;AAAA,EACV,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA;AAIA,IAAM,iBAAA,GAAoB,OAAA;AAE1B,SAAS,UAAU,MAAA,EAAkC;AACnD,EAAA,OAAO,MAAA,KAAW,6BAA6B,iBAAA,GAAoB,MAAA;AACrE;AAQO,IAAM,0BAAA,GAAkD,CAAC,OAAA,EAAS,MAAA,KAAW;AAClF,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,OAAO,CAAA;AAC7B,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,MAAM,GAAG,aAAa,CAAA;AAAA,EAC7D,SAAS,KAAA,EAAO;AAGd,IAAA,IAAI,iBAAiB,UAAA,EAAY,OAAO,IAAA,CAAK,cAAA,CAAe,mBAAmB,aAAa,CAAA;AAC5F,IAAA,MAAM,KAAA;AAAA,EACR;AACF,CAAA;AAQO,SAAS,wBACd,KAAA,GAAgC,EAAC,EACjC,QAAA,GAAmC,EAAC,EACV;AAC1B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,QAAA,CAAS,MAAA,IAAU,0BAAA;AAClD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,UAAA,IAAc,QAAA,CAAS,UAAA,IAAc,0BAAA;AAC7D,EAAA,OAAO,EAAE,QAAQ,UAAA,EAAY,CAAC,YAAY,SAAA,CAAU,OAAA,EAAS,MAAM,CAAA,EAAE;AACvE;AC9EA,IAAM,uBAAA,GAA0B,aAAA,CAAsC,EAAE,CAAA;AAgBjE,SAAS,wBAAA,CAAyB;AAAA,EACvC,MAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAChC,EAAA,MAAM,MAAA,GAAS,WAAW,uBAAuB,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,MAAA,EAAQ,UAAU,MAAA,CAAO,MAAA;AAAA,MACzB,UAAA,EAAY,cAAc,MAAA,CAAO;AAAA,KACnC,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,UAAA,EAAY,MAAA,CAAO,MAAA,EAAQ,OAAO,UAAU;AAAA,GACvD;AACA,EAAA,uBACE,GAAA,CAAC,uBAAA,CAAwB,QAAA,EAAxB,EAAiC,OAAe,QAAA,EAAS,CAAA;AAE9D;AAOO,SAAS,mBAAA,CAAoB,KAAA,GAAgC,EAAC,EAA6B;AAChG,EAAA,MAAM,QAAA,GAAW,WAAW,uBAAuB,CAAA;AACnD,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAW,GAAI,KAAA;AAC/B,EAAA,OAAO,OAAA;AAAA,IACL,MAAM,uBAAA,CAAwB,EAAE,MAAA,EAAQ,UAAA,IAAc,QAAQ,CAAA;AAAA,IAC9D,CAAC,MAAA,EAAQ,UAAA,EAAY,QAAQ;AAAA,GAC/B;AACF","file":"DatePickerFormatContext.js","sourcesContent":["// Date-format injection for the package `DatePicker` — the PURE half.\n//\n// The picker formats the chosen date for its trigger with whatever locale and\n// formatter the consuming app hands it, so it needs no i18n library of its own\n// (no `next-intl`, no app path). This module holds the parts a Server Component\n// may import too: the two types, the documented default and the pure resolver.\n// It carries no `'use client'` directive and imports nothing; the React\n// provider + hook live beside it in `DatePickerFormatContext.tsx`.\n//\n// Precedence, resolved for EACH input on its own: a prop beats the provider,\n// and the provider beats the default (locale `en` + `defaultDatePickerFormatter`).\n\n/**\n * The locale the picker formats its trigger date in: a plain BCP-47-style\n * string such as `en` or `zh-CN`. Deliberately opaque — not a closed union — so\n * any consumer can pass its own app locale through unchanged.\n */\nexport type DatePickerLocale = string;\n\n/**\n * Formats an ISO `YYYY-MM-DD` date for display in `locale`. The picker calls it\n * with the selected value and the resolved locale.\n */\nexport type DatePickerFormatter = (isoDate: string, locale: DatePickerLocale) => string;\n\n/** The two injectable inputs, each optional — a prop set or a provider value. */\nexport interface DatePickerFormatInputs {\n locale?: DatePickerLocale;\n formatDate?: DatePickerFormatter;\n}\n\n/** The resolved inputs: the locale in force and a formatter already bound to it. */\nexport interface ResolvedDatePickerFormat {\n locale: DatePickerLocale;\n /** The chosen formatter called with the resolved locale: `formatDate(iso)`. */\n formatDate: (isoDate: string) => string;\n}\n\n/** The locale used when neither a prop nor a provider supplies one. */\nexport const DEFAULT_DATE_PICKER_LOCALE: DatePickerLocale = 'en';\n\n// The exact Intl options motir-core's `formatDate` uses, so the default reads\n// `Jun 3, 2026` for `2026-06-03` byte for byte. The zone is pinned to UTC: an\n// ISO date-only string parses as UTC midnight, so formatting in UTC is what keeps\n// a host west of Greenwich from showing the previous day.\nconst DATE_ONLY_UTC: Intl.DateTimeFormatOptions = {\n timeZone: 'UTC',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n};\n\n// The tag the default falls back to — and the one bare `en` maps to, matching\n// motir-core's `BCP47` `en` row.\nconst FALLBACK_INTL_TAG = 'en-US';\n\nfunction toIntlTag(locale: DatePickerLocale): string {\n return locale === DEFAULT_DATE_PICKER_LOCALE ? FALLBACK_INTL_TAG : locale;\n}\n\n/**\n * The default formatter: `toLocaleString(locale, { timeZone: 'UTC', year:\n * 'numeric', month: 'short', day: 'numeric' })`. Bare `en` maps to `en-US`, any\n * other string reaches Intl unchanged, and a tag Intl rejects as malformed falls\n * back to the `en-US` output instead of throwing.\n */\nexport const defaultDatePickerFormatter: DatePickerFormatter = (isoDate, locale) => {\n const date = new Date(isoDate);\n try {\n return date.toLocaleString(toIntlTag(locale), DATE_ONLY_UTC);\n } catch (error) {\n // Intl signals a malformed language tag with a RangeError; that one case\n // degrades to the default's own locale. Anything else is a real defect.\n if (error instanceof RangeError) return date.toLocaleString(FALLBACK_INTL_TAG, DATE_ONLY_UTC);\n throw error;\n }\n};\n\n/**\n * Resolve the picker's format inputs: for the locale and for the formatter\n * separately, the prop wins, then the provider's value, then the default. An\n * `undefined` prop falls through. The returned `formatDate` is bound to the\n * resolved locale.\n */\nexport function resolveDatePickerFormat(\n props: DatePickerFormatInputs = {},\n provider: DatePickerFormatInputs = {},\n): ResolvedDatePickerFormat {\n const locale = props.locale ?? provider.locale ?? DEFAULT_DATE_PICKER_LOCALE;\n const formatter = props.formatDate ?? provider.formatDate ?? defaultDatePickerFormatter;\n return { locale, formatDate: (isoDate) => formatter(isoDate, locale) };\n}\n","'use client';\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react';\nimport {\n resolveDatePickerFormat,\n type DatePickerFormatInputs,\n type ResolvedDatePickerFormat,\n} from './datePickerFormat';\n\n// The client half of the DatePicker's format injection: a context an app sets\n// once for a subtree, and the hook the picker reads it through. The pure types,\n// default and resolver live in `./datePickerFormat` (no directive, server-safe).\n\nconst DatePickerFormatContext = createContext<DatePickerFormatInputs>({});\n\nexport interface DatePickerFormatProviderProps extends DatePickerFormatInputs {\n children: ReactNode;\n}\n\n/**\n * Sets the `DatePicker`'s locale and/or formatter for everything below it.\n * Each input is optional and merges over an enclosing provider PER FIELD: an\n * inner provider that sets only `locale` keeps the outer `formatDate`.\n *\n * @example\n * <DatePickerFormatProvider locale={appLocale} formatDate={appFormatDate}>\n * <App />\n * </DatePickerFormatProvider>\n */\nexport function DatePickerFormatProvider({\n locale,\n formatDate,\n children,\n}: DatePickerFormatProviderProps) {\n const parent = useContext(DatePickerFormatContext);\n const value = useMemo<DatePickerFormatInputs>(\n () => ({\n locale: locale ?? parent.locale,\n formatDate: formatDate ?? parent.formatDate,\n }),\n [locale, formatDate, parent.locale, parent.formatDate],\n );\n return (\n <DatePickerFormatContext.Provider value={value}>{children}</DatePickerFormatContext.Provider>\n );\n}\n\n/**\n * The resolved format for a picker: `props` (a component's own `locale` /\n * `formatDate`) beat the nearest provider, which beats the default — per field.\n * Called with no argument it resolves the provider over the default.\n */\nexport function useDatePickerFormat(props: DatePickerFormatInputs = {}): ResolvedDatePickerFormat {\n const provider = useContext(DatePickerFormatContext);\n const { locale, formatDate } = props;\n return useMemo(\n () => resolveDatePickerFormat({ locale, formatDate }, provider),\n [locale, formatDate, provider],\n );\n}\n"]}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The locale the picker formats its trigger date in: a plain BCP-47-style
3
+ * string such as `en` or `zh-CN`. Deliberately opaque — not a closed union — so
4
+ * any consumer can pass its own app locale through unchanged.
5
+ */
6
+ type DatePickerLocale = string;
7
+ /**
8
+ * Formats an ISO `YYYY-MM-DD` date for display in `locale`. The picker calls it
9
+ * with the selected value and the resolved locale.
10
+ */
11
+ type DatePickerFormatter = (isoDate: string, locale: DatePickerLocale) => string;
12
+ /** The two injectable inputs, each optional — a prop set or a provider value. */
13
+ interface DatePickerFormatInputs {
14
+ locale?: DatePickerLocale;
15
+ formatDate?: DatePickerFormatter;
16
+ }
17
+ /** The resolved inputs: the locale in force and a formatter already bound to it. */
18
+ interface ResolvedDatePickerFormat {
19
+ locale: DatePickerLocale;
20
+ /** The chosen formatter called with the resolved locale: `formatDate(iso)`. */
21
+ formatDate: (isoDate: string) => string;
22
+ }
23
+ /** The locale used when neither a prop nor a provider supplies one. */
24
+ declare const DEFAULT_DATE_PICKER_LOCALE: DatePickerLocale;
25
+ /**
26
+ * The default formatter: `toLocaleString(locale, { timeZone: 'UTC', year:
27
+ * 'numeric', month: 'short', day: 'numeric' })`. Bare `en` maps to `en-US`, any
28
+ * other string reaches Intl unchanged, and a tag Intl rejects as malformed falls
29
+ * back to the `en-US` output instead of throwing.
30
+ */
31
+ declare const defaultDatePickerFormatter: DatePickerFormatter;
32
+ /**
33
+ * Resolve the picker's format inputs: for the locale and for the formatter
34
+ * separately, the prop wins, then the provider's value, then the default. An
35
+ * `undefined` prop falls through. The returned `formatDate` is bound to the
36
+ * resolved locale.
37
+ */
38
+ declare function resolveDatePickerFormat(props?: DatePickerFormatInputs, provider?: DatePickerFormatInputs): ResolvedDatePickerFormat;
39
+
40
+ export { DEFAULT_DATE_PICKER_LOCALE, type DatePickerFormatInputs, type DatePickerFormatter, type DatePickerLocale, type ResolvedDatePickerFormat, defaultDatePickerFormatter, resolveDatePickerFormat };
@@ -0,0 +1,30 @@
1
+ // src/components/ui/datePickerFormat.ts
2
+ var DEFAULT_DATE_PICKER_LOCALE = "en";
3
+ var DATE_ONLY_UTC = {
4
+ timeZone: "UTC",
5
+ year: "numeric",
6
+ month: "short",
7
+ day: "numeric"
8
+ };
9
+ var FALLBACK_INTL_TAG = "en-US";
10
+ function toIntlTag(locale) {
11
+ return locale === DEFAULT_DATE_PICKER_LOCALE ? FALLBACK_INTL_TAG : locale;
12
+ }
13
+ var defaultDatePickerFormatter = (isoDate, locale) => {
14
+ const date = new Date(isoDate);
15
+ try {
16
+ return date.toLocaleString(toIntlTag(locale), DATE_ONLY_UTC);
17
+ } catch (error) {
18
+ if (error instanceof RangeError) return date.toLocaleString(FALLBACK_INTL_TAG, DATE_ONLY_UTC);
19
+ throw error;
20
+ }
21
+ };
22
+ function resolveDatePickerFormat(props = {}, provider = {}) {
23
+ const locale = props.locale ?? provider.locale ?? DEFAULT_DATE_PICKER_LOCALE;
24
+ const formatter = props.formatDate ?? provider.formatDate ?? defaultDatePickerFormatter;
25
+ return { locale, formatDate: (isoDate) => formatter(isoDate, locale) };
26
+ }
27
+
28
+ export { DEFAULT_DATE_PICKER_LOCALE, defaultDatePickerFormatter, resolveDatePickerFormat };
29
+ //# sourceMappingURL=datePickerFormat.js.map
30
+ //# sourceMappingURL=datePickerFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/ui/datePickerFormat.ts"],"names":[],"mappings":";AAuCO,IAAM,0BAAA,GAA+C;AAM5D,IAAM,aAAA,GAA4C;AAAA,EAChD,QAAA,EAAU,KAAA;AAAA,EACV,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA;AAIA,IAAM,iBAAA,GAAoB,OAAA;AAE1B,SAAS,UAAU,MAAA,EAAkC;AACnD,EAAA,OAAO,MAAA,KAAW,6BAA6B,iBAAA,GAAoB,MAAA;AACrE;AAQO,IAAM,0BAAA,GAAkD,CAAC,OAAA,EAAS,MAAA,KAAW;AAClF,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,OAAO,CAAA;AAC7B,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,MAAM,GAAG,aAAa,CAAA;AAAA,EAC7D,SAAS,KAAA,EAAO;AAGd,IAAA,IAAI,iBAAiB,UAAA,EAAY,OAAO,IAAA,CAAK,cAAA,CAAe,mBAAmB,aAAa,CAAA;AAC5F,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAQO,SAAS,wBACd,KAAA,GAAgC,EAAC,EACjC,QAAA,GAAmC,EAAC,EACV;AAC1B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,QAAA,CAAS,MAAA,IAAU,0BAAA;AAClD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,UAAA,IAAc,QAAA,CAAS,UAAA,IAAc,0BAAA;AAC7D,EAAA,OAAO,EAAE,QAAQ,UAAA,EAAY,CAAC,YAAY,SAAA,CAAU,OAAA,EAAS,MAAM,CAAA,EAAE;AACvE","file":"datePickerFormat.js","sourcesContent":["// Date-format injection for the package `DatePicker` — the PURE half.\n//\n// The picker formats the chosen date for its trigger with whatever locale and\n// formatter the consuming app hands it, so it needs no i18n library of its own\n// (no `next-intl`, no app path). This module holds the parts a Server Component\n// may import too: the two types, the documented default and the pure resolver.\n// It carries no `'use client'` directive and imports nothing; the React\n// provider + hook live beside it in `DatePickerFormatContext.tsx`.\n//\n// Precedence, resolved for EACH input on its own: a prop beats the provider,\n// and the provider beats the default (locale `en` + `defaultDatePickerFormatter`).\n\n/**\n * The locale the picker formats its trigger date in: a plain BCP-47-style\n * string such as `en` or `zh-CN`. Deliberately opaque — not a closed union — so\n * any consumer can pass its own app locale through unchanged.\n */\nexport type DatePickerLocale = string;\n\n/**\n * Formats an ISO `YYYY-MM-DD` date for display in `locale`. The picker calls it\n * with the selected value and the resolved locale.\n */\nexport type DatePickerFormatter = (isoDate: string, locale: DatePickerLocale) => string;\n\n/** The two injectable inputs, each optional — a prop set or a provider value. */\nexport interface DatePickerFormatInputs {\n locale?: DatePickerLocale;\n formatDate?: DatePickerFormatter;\n}\n\n/** The resolved inputs: the locale in force and a formatter already bound to it. */\nexport interface ResolvedDatePickerFormat {\n locale: DatePickerLocale;\n /** The chosen formatter called with the resolved locale: `formatDate(iso)`. */\n formatDate: (isoDate: string) => string;\n}\n\n/** The locale used when neither a prop nor a provider supplies one. */\nexport const DEFAULT_DATE_PICKER_LOCALE: DatePickerLocale = 'en';\n\n// The exact Intl options motir-core's `formatDate` uses, so the default reads\n// `Jun 3, 2026` for `2026-06-03` byte for byte. The zone is pinned to UTC: an\n// ISO date-only string parses as UTC midnight, so formatting in UTC is what keeps\n// a host west of Greenwich from showing the previous day.\nconst DATE_ONLY_UTC: Intl.DateTimeFormatOptions = {\n timeZone: 'UTC',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n};\n\n// The tag the default falls back to — and the one bare `en` maps to, matching\n// motir-core's `BCP47` `en` row.\nconst FALLBACK_INTL_TAG = 'en-US';\n\nfunction toIntlTag(locale: DatePickerLocale): string {\n return locale === DEFAULT_DATE_PICKER_LOCALE ? FALLBACK_INTL_TAG : locale;\n}\n\n/**\n * The default formatter: `toLocaleString(locale, { timeZone: 'UTC', year:\n * 'numeric', month: 'short', day: 'numeric' })`. Bare `en` maps to `en-US`, any\n * other string reaches Intl unchanged, and a tag Intl rejects as malformed falls\n * back to the `en-US` output instead of throwing.\n */\nexport const defaultDatePickerFormatter: DatePickerFormatter = (isoDate, locale) => {\n const date = new Date(isoDate);\n try {\n return date.toLocaleString(toIntlTag(locale), DATE_ONLY_UTC);\n } catch (error) {\n // Intl signals a malformed language tag with a RangeError; that one case\n // degrades to the default's own locale. Anything else is a real defect.\n if (error instanceof RangeError) return date.toLocaleString(FALLBACK_INTL_TAG, DATE_ONLY_UTC);\n throw error;\n }\n};\n\n/**\n * Resolve the picker's format inputs: for the locale and for the formatter\n * separately, the prop wins, then the provider's value, then the default. An\n * `undefined` prop falls through. The returned `formatDate` is bound to the\n * resolved locale.\n */\nexport function resolveDatePickerFormat(\n props: DatePickerFormatInputs = {},\n provider: DatePickerFormatInputs = {},\n): ResolvedDatePickerFormat {\n const locale = props.locale ?? provider.locale ?? DEFAULT_DATE_PICKER_LOCALE;\n const formatter = props.formatDate ?? provider.formatDate ?? defaultDatePickerFormatter;\n return { locale, formatDate: (isoDate) => formatter(isoDate, locale) };\n}\n"]}
@@ -45,6 +45,34 @@ var TYPE_REGISTRY = {
45
45
  tagline: "IBM Plex Mono throughout \u2014 a precise, developer-grade UI.",
46
46
  faces: "IBM Plex Mono headlines + body/UI + meta/code.",
47
47
  designDoc: "docs/typography/mono-technical.md"
48
+ },
49
+ marker: {
50
+ id: "marker",
51
+ name: "Marker",
52
+ tagline: "Hand-lettered marker headlines over a clean sans body \u2014 sketchy, friendly, human.",
53
+ faces: "Caveat marker headlines \xB7 Inter body \xB7 JetBrains Mono meta.",
54
+ designDoc: "docs/typography/marker.md"
55
+ },
56
+ rounded: {
57
+ id: "rounded",
58
+ name: "Rounded",
59
+ tagline: "A soft rounded sans across the whole UI \u2014 friendly and approachable.",
60
+ faces: "Nunito headlines + body/UI \xB7 JetBrains Mono meta.",
61
+ designDoc: "docs/typography/rounded.md"
62
+ },
63
+ slab: {
64
+ id: "slab",
65
+ name: "Slab",
66
+ tagline: "Sturdy slab-serif headlines over a clean sans body \u2014 confident, print-like.",
67
+ faces: "Roboto Slab headlines \xB7 Inter body \xB7 JetBrains Mono meta.",
68
+ designDoc: "docs/typography/slab.md"
69
+ },
70
+ humanist: {
71
+ id: "humanist",
72
+ name: "Humanist",
73
+ tagline: "A warm humanist sans across the whole UI \u2014 open and readable.",
74
+ faces: "Fira Sans headlines + body/UI \xB7 JetBrains Mono meta.",
75
+ designDoc: "docs/typography/humanist.md"
48
76
  }
49
77
  };
50
78
  function isTypeId(value) {
@@ -221,7 +249,7 @@ var STYLE_REGISTRY = {
221
249
  tagline: "Sketchy and friendly \u2014 rough hand-inked edges, wonky corners, soft offset shadows, a playful bounce.",
222
250
  inspiration: "Indie / zine + hand-drawn web design \u2014 Excalidraw\u2019s rough hand-sketched strokes and doodled notebook UIs: warm, imperfect, human.",
223
251
  designDoc: "docs/styles/hand-drawn-indie.md",
224
- defaultTypeId: "editorial",
252
+ defaultTypeId: "marker",
225
253
  dimensions: {
226
254
  silhouette: "Wonky hand-drawn corners \u2014 every surface gets a strongly asymmetric multi-value radius (one corner near-sharp, the opposite generously round, no two alike) so cards/buttons/inputs read as DRAWN boxes, never machined rectangles.",
227
255
  stroke: "Genuinely ROUGH, wavy ink edges \u2014 a turbulence-displacement filter (Excalidraw / rough.js style) warps each outline into a hand-inked wobble, drawn on a content-safe pseudo-border so the lines are sketchy but the text stays crisp.",
@@ -229,7 +257,7 @@ var STYLE_REGISTRY = {
229
257
  surface: "Opaque, warm, paper-like panels \u2014 colour stays the palette axis; the personality is in the rough wavy outline + the soft shadow, not a tint or a wash.",
230
258
  density: "Roomy and relaxed \u2014 generous 20\xD712 buttons, 26px card padding, taller 38px controls; the hand-drawn feel wants air, like margins round a sketch.",
231
259
  motion: "Springy and playful \u2014 gentle 200ms transitions with a bouncy hover lift (1.02) and a deeper press squish (0.97); the UI has a friendly wobble.",
232
- typography: "Ships the Editorial pairing (Fraunces display headlines + Inter body) \u2014 the warmest, most characterful registered face, its soft optical wonk echoing the hand-drawn shapes; an actual marker/script face is a future data-type addition.",
260
+ typography: "Ships the Marker pairing (Caveat hand-lettered marker headlines + Inter body) \u2014 the headlines read as if written with the same pen that inked the rough strokes, while the Inter body stays fully legible.",
233
261
  components: "Wonky-cornered buttons/inputs/cards/modals, irregular (non-pill) status chips, rough wavy-ink-bordered surfaces with soft hand-placed shadows."
234
262
  }
235
263
  },