@jiwambe/components 0.2.0 → 0.3.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.
package/README.md CHANGED
@@ -207,6 +207,35 @@ Single-expansion accordion with keyboard navigation.
207
207
  | `value` | `number` | — | Open item index (controlled). |
208
208
  | `onChange` | `(index: number) => void` | — | Called when the open item changes (controlled). |
209
209
 
210
+ ### FAQ
211
+
212
+ FAQ section with heading, accordion of question/answer pairs, and optional footer link. Supports single or multiple items open (controlled or uncontrolled) and full keyboard navigation. Layout and spacing match the Figma templates (xs+, lg+, xl+ breakpoints): fluid section padding, title-lg heading, title-md questions, text-md answers, and link-md footer link.
213
+
214
+ ```tsx
215
+ <FAQ
216
+ heading="Questions"
217
+ items={[
218
+ { question: 'What is X?', answer: 'X is...' },
219
+ { question: 'How do I Y?', answer: 'You can Y by...', disabled: true },
220
+ ]}
221
+ defaultOpenIndex={0}
222
+ link={{ label: 'View all FAQs', href: '/faq' }}
223
+ linkAs={NextLink}
224
+ />
225
+ ```
226
+
227
+ **Props:**
228
+
229
+ | Prop | Type | Default | Description |
230
+ | --- | --- | --- | --- |
231
+ | `heading` | `string` | `"FAQ"` | Section heading above the list. |
232
+ | `items` | `FAQItem[]` | — | Required. Array of `{ question, answer, disabled? }`. |
233
+ | `defaultOpenIndex` | `number \| number[]` | `[]` | Index(es) open by default (uncontrolled). |
234
+ | `value` | `number \| number[]` | — | Open index(es) (controlled). |
235
+ | `onChange` | `(indices: number[]) => void` | — | Called when open indices change (controlled). |
236
+ | `link` | `{ label: string; href: string }` | — | Optional footer link (e.g. "View all FAQs"). |
237
+ | `linkAs` | `ElementType` | `"a"` | Component for the footer link (e.g. `next/link`). |
238
+
210
239
  ### Tab
211
240
 
212
241
  Horizontal tabs with full ARIA support.
@@ -9,12 +9,12 @@ export interface FAQProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onCha
9
9
  heading?: string;
10
10
  /** Array of question/answer pairs. Each item: question (string), answer (ReactNode), disabled? (boolean). */
11
11
  items: FAQItem[];
12
- /** Index of the item open by default (uncontrolled). -1 = none. @default undefined */
13
- defaultOpenIndex?: number;
14
- /** Currently open index (controlled). Pass -1 for all closed. Use with onChange. @default undefined */
15
- value?: number;
16
- /** Called when the open index changes. @default undefined */
17
- onChange?: (index: number) => void;
12
+ /** Index(es) of the item(s) open by default (uncontrolled). @default [] */
13
+ defaultOpenIndex?: number | number[];
14
+ /** Currently open index(es) (controlled). @default undefined */
15
+ value?: number | number[];
16
+ /** Called when the open indices change. @default undefined */
17
+ onChange?: (indices: number[]) => void;
18
18
  /** Optional link rendered below the list (e.g. "View all FAQs"). @default undefined */
19
19
  link?: {
20
20
  label: string;
@@ -30,6 +30,11 @@ export interface FAQProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onCha
30
30
  * (question, answer, optional disabled). Supports controlled (value/onChange) or uncontrolled
31
31
  * (defaultOpenIndex) expansion. Optional footer link for "View all FAQs" etc.
32
32
  *
33
+ * Layout and spacing match Figma templates across breakpoints:
34
+ * - xs+ (320px): section padding 16px/32px, heading ~25px, item padding 16px, list gap 8px.
35
+ * - lg+ (940px) / xl+ (1392px): section padding 32px/64px, heading 32px, item padding 32px, list gap 8px, content gap 24px.
36
+ * Uses design tokens: bg-fill-bg-secondary, bg-fill-action-inverse, text-title-lg (heading), text-title-md (question), text-text-md (answer), text-link-md (footer link), rad-md, fluid spacing.
37
+ *
33
38
  * @example
34
39
  * <FAQ heading="Questions" items={[{ question: 'What is X?', answer: 'X is...' }]} />
35
40
  *
@@ -1 +1 @@
1
- {"version":3,"file":"FAQ.d.ts","sourceRoot":"","sources":["../../../src/components/FAQ/FAQ.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAqB3C;;;GAGG;AACH,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;IACnF,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6GAA6G;IAC7G,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uGAAuG;IACvG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,uFAAuF;IACvF,IAAI,CAAC,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,4EAA4E;IAC5E,MAAM,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IAC3B,wDAAwD;IACxD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,GAAG,CAAC,EAClB,OAAe,EACf,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,SAAc,EACd,GAAG,EACH,GAAG,IAAI,EACR,EAAE,QAAQ,2CA6IV"}
1
+ {"version":3,"file":"FAQ.d.ts","sourceRoot":"","sources":["../../../src/components/FAQ/FAQ.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAqB3C;;;GAGG;AACH,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;IACnF,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6GAA6G;IAC7G,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACrC,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACvC,uFAAuF;IACvF,IAAI,CAAC,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,4EAA4E;IAC5E,MAAM,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IAC3B,wDAAwD;IACxD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,GAAG,CAAC,EAClB,OAAe,EACf,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,SAAc,EACd,GAAG,EACH,GAAG,IAAI,EACR,EAAE,QAAQ,2CAiJV"}
@@ -33,24 +33,26 @@ function FAQ({
33
33
  }) {
34
34
  const baseId = useId();
35
35
  const isControlled = value !== void 0;
36
- const [internalOpen, setInternalOpen] = useState(defaultOpenIndex ?? -1);
37
- const openIndex = isControlled ? value : internalOpen;
36
+ const controlledIndices = value !== void 0 ? Array.isArray(value) ? value : [value] : void 0;
37
+ const defaultIndices = defaultOpenIndex !== void 0 ? Array.isArray(defaultOpenIndex) ? defaultOpenIndex : [defaultOpenIndex] : [];
38
+ const [internalOpen, setInternalOpen] = useState(defaultIndices);
39
+ const openIndices = isControlled ? controlledIndices || [] : internalOpen;
38
40
  useEffect(() => {
39
41
  if (!isControlled && defaultOpenIndex !== void 0) {
40
- setInternalOpen(defaultOpenIndex);
42
+ setInternalOpen(defaultIndices);
41
43
  }
42
44
  }, [defaultOpenIndex, isControlled]);
43
45
  const triggerRefs = useRef([]);
44
46
  const toggle = useCallback(
45
47
  (index) => {
46
- const next = openIndex === index ? -1 : index;
48
+ const next = openIndices.includes(index) ? openIndices.filter((i) => i !== index) : [...openIndices, index];
47
49
  if (isControlled) {
48
50
  onChange == null ? void 0 : onChange(next);
49
51
  } else {
50
52
  setInternalOpen(next);
51
53
  }
52
54
  },
53
- [openIndex, isControlled, onChange]
55
+ [openIndices, isControlled, onChange]
54
56
  );
55
57
  const focusTrigger = (index) => {
56
58
  var _a;
@@ -92,7 +94,7 @@ function FAQ({
92
94
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-space-fluid-4-5", children: [
93
95
  heading && /* @__PURE__ */ jsx("h2", { className: "text-title-lg text-text-primary", children: heading }),
94
96
  /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-space-2", children: items.map((item, index) => {
95
- const isOpen = openIndex === index;
97
+ const isOpen = openIndices.includes(index);
96
98
  const triggerId = `${baseId}-faq-trigger-${index}`;
97
99
  const panelId = `${baseId}-faq-panel-${index}`;
98
100
  const disabled = !!item.disabled;
@@ -109,7 +111,7 @@ function FAQ({
109
111
  },
110
112
  id: triggerId,
111
113
  type: "button",
112
- className: `flex w-full items-center justify-between gap-space-fluid-4-6 text-title-sm text-left transition-colors outline-none ${disabled ? "text-text-disabled cursor-not-allowed" : "text-text-primary hover:bg-fill-bg-secondary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus cursor-pointer"}`,
114
+ className: `flex w-full items-center justify-between gap-space-fluid-4-6 text-title-md text-left transition-colors outline-none ${disabled ? "text-text-disabled cursor-not-allowed" : "text-text-primary hover:bg-fill-bg-secondary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus cursor-pointer"}`,
113
115
  "aria-expanded": isOpen,
114
116
  "aria-controls": panelId,
115
117
  "aria-disabled": disabled || void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"FAQ.js","sources":["../../../src/components/FAQ/FAQ.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState, useRef, useCallback, useId, useEffect } from 'react';\nimport type { FAQItem } from '../../types';\n\nfunction ChevronIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n );\n}\n\n/**\n * Props for the FAQ component. Each item uses the FAQItem shape: question, answer, disabled?.\n * @see FAQItem\n */\nexport interface FAQProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Section heading displayed above the accordion list. @default 'FAQ' */\n heading?: string;\n /** Array of question/answer pairs. Each item: question (string), answer (ReactNode), disabled? (boolean). */\n items: FAQItem[];\n /** Index of the item open by default (uncontrolled). -1 = none. @default undefined */\n defaultOpenIndex?: number;\n /** Currently open index (controlled). Pass -1 for all closed. Use with onChange. @default undefined */\n value?: number;\n /** Called when the open index changes. @default undefined */\n onChange?: (index: number) => void;\n /** Optional link rendered below the list (e.g. \"View all FAQs\"). @default undefined */\n link?: {\n label: string;\n href: string;\n };\n /** Component to render the footer link as (e.g. next/link). @default 'a' */\n linkAs?: React.ElementType;\n /** Forwarded ref for the section. @default undefined */\n ref?: React.Ref<HTMLElement>;\n}\n\n/**\n * FAQ section: heading plus an accordion of question/answer pairs. Uses FAQItem shape\n * (question, answer, optional disabled). Supports controlled (value/onChange) or uncontrolled\n * (defaultOpenIndex) expansion. Optional footer link for \"View all FAQs\" etc.\n *\n * @example\n * <FAQ heading=\"Questions\" items={[{ question: 'What is X?', answer: 'X is...' }]} />\n *\n * @example\n * <FAQ items={faqItems} defaultOpenIndex={0} link={{ label: 'View all', href: '/faq' }} />\n */\nexport function FAQ({\n heading = 'FAQ',\n items,\n defaultOpenIndex,\n value,\n onChange,\n link,\n linkAs,\n className = '',\n ref,\n ...rest\n}: FAQProps) {\n const baseId = useId();\n const isControlled = value !== undefined;\n\n const [internalOpen, setInternalOpen] = useState<number>(defaultOpenIndex ?? -1);\n const openIndex = isControlled ? value : internalOpen;\n\n useEffect(() => {\n if (!isControlled && defaultOpenIndex !== undefined) {\n setInternalOpen(defaultOpenIndex);\n }\n }, [defaultOpenIndex, isControlled]);\n\n const triggerRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const toggle = useCallback(\n (index: number) => {\n const next = openIndex === index ? -1 : index;\n if (isControlled) {\n onChange?.(next);\n } else {\n setInternalOpen(next);\n }\n },\n [openIndex, isControlled, onChange],\n );\n\n const focusTrigger = (index: number) => {\n triggerRefs.current[index]?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n const enabledIndices = items\n .map((_, i) => i)\n .filter((i) => !items[i].disabled);\n const currentPos = enabledIndices.indexOf(index);\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n focusTrigger(enabledIndices[(currentPos + 1) % enabledIndices.length]);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n focusTrigger(enabledIndices[(currentPos - 1 + enabledIndices.length) % enabledIndices.length]);\n break;\n }\n case 'Home': {\n e.preventDefault();\n focusTrigger(enabledIndices[0]);\n break;\n }\n case 'End': {\n e.preventDefault();\n focusTrigger(enabledIndices[enabledIndices.length - 1]);\n break;\n }\n }\n };\n\n return (\n <section\n ref={ref}\n className={`w-full bg-fill-bg-secondary px-space-fluid-4-8 py-space-fluid-8-16 ${className}`}\n {...rest}\n >\n <div className=\"mx-auto w-full max-w-[1328px]\">\n <div className=\"flex flex-col gap-space-fluid-4-5\">\n {heading && (\n <h2 className=\"text-title-lg text-text-primary\">{heading}</h2>\n )}\n\n <div className=\"flex flex-col gap-space-2\">\n {items.map((item, index) => {\n const isOpen = openIndex === index;\n const triggerId = `${baseId}-faq-trigger-${index}`;\n const panelId = `${baseId}-faq-panel-${index}`;\n const disabled = !!item.disabled;\n\n return (\n <div\n key={index}\n className=\"flex flex-col gap-space-fluid-2-4 rounded-rad-md overflow-hidden bg-fill-action-inverse p-space-fluid-4-8\"\n >\n <h3>\n <button\n ref={(el) => { triggerRefs.current[index] = el; }}\n id={triggerId}\n type=\"button\"\n className={`flex w-full items-center justify-between gap-space-fluid-4-6 text-title-sm text-left transition-colors outline-none ${\n disabled\n ? 'text-text-disabled cursor-not-allowed'\n : 'text-text-primary hover:bg-fill-bg-secondary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus cursor-pointer'\n }`}\n aria-expanded={isOpen}\n aria-controls={panelId}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={() => toggle(index)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n >\n <span>{item.question}</span>\n <ChevronIcon\n className={`h-6 w-6 shrink-0 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n />\n </button>\n </h3>\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n className={`overflow-hidden transition-all duration-200 ease-in-out ${\n isOpen ? 'max-h-[2000px] opacity-100' : 'max-h-0 opacity-0'\n }`}\n >\n <div className=\"text-text-md text-text-primary\">\n {item.answer}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {link && (\n <div className=\"mt-space-fluid-4-6\">\n {React.createElement(\n linkAs || 'a',\n {\n href: link.href,\n className: 'text-link-md text-link-primary underline hover:text-link-primary-hover transition-colors',\n },\n link.label,\n )}\n </div>\n )}\n </div>\n </section>\n );\n}\n"],"names":[],"mappings":";;;AAKA;AACE;AACE;AAAC;AAAA;AACC;AACM;AACC;AACC;AACH;AACE;AACK;AACE;AACC;AACH;AAEW;AAAA;AAG7B;AAuCO;AAAa;AACR;AACV;AACA;AACA;AACA;AACA;AACA;AACY;AACZ;AAEF;AACI;AACA;AAEA;AACA;AAEA;AACE;AACE;AAAgC;AAClC;AAGF;AAEA;AAAe;AAEX;AACA;AACE;AAAW;AAEX;AAAoB;AACtB;AACF;AACkC;AAGpC;;AACE;AAA4B;AAG9B;AACE;AAGA;AAEA;AAAU;AAEN;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAAA;AAIJ;AACE;AAAC;AAAA;AACC;AAC0F;AACtF;AAGF;AACG;AAC0D;AAKvD;AACA;AACA;AACA;AAEA;AACE;AAAC;AAAA;AAEW;AAEV;AACE;AAAC;AAAA;AACgB;AAA6B;AAAI;AAC5C;AACC;AAKL;AACe;AACA;AACY;AAC3B;AAC2B;AACa;AAExC;AAAqB;AACrB;AAAC;AAAA;AAC4F;AAAA;AAAA;AAC7F;AAAA;AAEJ;AACA;AAAC;AAAA;AACK;AACC;AACY;AAGjB;AAIA;AAAA;AAAA;AACF;AAAA;AArCK;AAAA;AAyCb;AACF;AAIW;AACK;AACV;AACa;AACA;AAAA;AAER;AAET;AAEJ;AAAA;AAGR;;;;"}
1
+ {"version":3,"file":"FAQ.js","sources":["../../../src/components/FAQ/FAQ.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState, useRef, useCallback, useId, useEffect } from 'react';\nimport type { FAQItem } from '../../types';\n\nfunction ChevronIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n );\n}\n\n/**\n * Props for the FAQ component. Each item uses the FAQItem shape: question, answer, disabled?.\n * @see FAQItem\n */\nexport interface FAQProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Section heading displayed above the accordion list. @default 'FAQ' */\n heading?: string;\n /** Array of question/answer pairs. Each item: question (string), answer (ReactNode), disabled? (boolean). */\n items: FAQItem[];\n /** Index(es) of the item(s) open by default (uncontrolled). @default [] */\n defaultOpenIndex?: number | number[];\n /** Currently open index(es) (controlled). @default undefined */\n value?: number | number[];\n /** Called when the open indices change. @default undefined */\n onChange?: (indices: number[]) => void;\n /** Optional link rendered below the list (e.g. \"View all FAQs\"). @default undefined */\n link?: {\n label: string;\n href: string;\n };\n /** Component to render the footer link as (e.g. next/link). @default 'a' */\n linkAs?: React.ElementType;\n /** Forwarded ref for the section. @default undefined */\n ref?: React.Ref<HTMLElement>;\n}\n\n/**\n * FAQ section: heading plus an accordion of question/answer pairs. Uses FAQItem shape\n * (question, answer, optional disabled). Supports controlled (value/onChange) or uncontrolled\n * (defaultOpenIndex) expansion. Optional footer link for \"View all FAQs\" etc.\n *\n * Layout and spacing match Figma templates across breakpoints:\n * - xs+ (320px): section padding 16px/32px, heading ~25px, item padding 16px, list gap 8px.\n * - lg+ (940px) / xl+ (1392px): section padding 32px/64px, heading 32px, item padding 32px, list gap 8px, content gap 24px.\n * Uses design tokens: bg-fill-bg-secondary, bg-fill-action-inverse, text-title-lg (heading), text-title-md (question), text-text-md (answer), text-link-md (footer link), rad-md, fluid spacing.\n *\n * @example\n * <FAQ heading=\"Questions\" items={[{ question: 'What is X?', answer: 'X is...' }]} />\n *\n * @example\n * <FAQ items={faqItems} defaultOpenIndex={0} link={{ label: 'View all', href: '/faq' }} />\n */\nexport function FAQ({\n heading = 'FAQ',\n items,\n defaultOpenIndex,\n value,\n onChange,\n link,\n linkAs,\n className = '',\n ref,\n ...rest\n}: FAQProps) {\n const baseId = useId();\n const isControlled = value !== undefined;\n\n const controlledIndices = value !== undefined ? (Array.isArray(value) ? value : [value]) : undefined;\n const defaultIndices = defaultOpenIndex !== undefined ? (Array.isArray(defaultOpenIndex) ? defaultOpenIndex : [defaultOpenIndex]) : [];\n\n const [internalOpen, setInternalOpen] = useState<number[]>(defaultIndices);\n const openIndices = isControlled ? (controlledIndices || []) : internalOpen;\n\n useEffect(() => {\n if (!isControlled && defaultOpenIndex !== undefined) {\n setInternalOpen(defaultIndices);\n }\n }, [defaultOpenIndex, isControlled]);\n\n const triggerRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const toggle = useCallback(\n (index: number) => {\n const next = openIndices.includes(index)\n ? openIndices.filter((i) => i !== index)\n : [...openIndices, index];\n\n if (isControlled) {\n onChange?.(next);\n } else {\n setInternalOpen(next);\n }\n },\n [openIndices, isControlled, onChange],\n );\n\n const focusTrigger = (index: number) => {\n triggerRefs.current[index]?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n const enabledIndices = items\n .map((_, i) => i)\n .filter((i) => !items[i].disabled);\n const currentPos = enabledIndices.indexOf(index);\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n focusTrigger(enabledIndices[(currentPos + 1) % enabledIndices.length]);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n focusTrigger(enabledIndices[(currentPos - 1 + enabledIndices.length) % enabledIndices.length]);\n break;\n }\n case 'Home': {\n e.preventDefault();\n focusTrigger(enabledIndices[0]);\n break;\n }\n case 'End': {\n e.preventDefault();\n focusTrigger(enabledIndices[enabledIndices.length - 1]);\n break;\n }\n }\n };\n\n return (\n <section\n ref={ref}\n className={`w-full bg-fill-bg-secondary px-space-fluid-4-8 py-space-fluid-8-16 ${className}`}\n {...rest}\n >\n <div className=\"mx-auto w-full max-w-[1328px]\">\n <div className=\"flex flex-col gap-space-fluid-4-5\">\n {heading && (\n <h2 className=\"text-title-lg text-text-primary\">{heading}</h2>\n )}\n\n <div className=\"flex flex-col gap-space-2\">\n {items.map((item, index) => {\n const isOpen = openIndices.includes(index);\n const triggerId = `${baseId}-faq-trigger-${index}`;\n const panelId = `${baseId}-faq-panel-${index}`;\n const disabled = !!item.disabled;\n\n return (\n <div\n key={index}\n className=\"flex flex-col gap-space-fluid-2-4 rounded-rad-md overflow-hidden bg-fill-action-inverse p-space-fluid-4-8\"\n >\n <h3>\n <button\n ref={(el) => { triggerRefs.current[index] = el; }}\n id={triggerId}\n type=\"button\"\n className={`flex w-full items-center justify-between gap-space-fluid-4-6 text-title-md text-left transition-colors outline-none ${disabled\n ? 'text-text-disabled cursor-not-allowed'\n : 'text-text-primary hover:bg-fill-bg-secondary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus cursor-pointer'\n }`}\n aria-expanded={isOpen}\n aria-controls={panelId}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={() => toggle(index)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n >\n <span>{item.question}</span>\n <ChevronIcon\n className={`h-6 w-6 shrink-0 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n />\n </button>\n </h3>\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n className={`overflow-hidden transition-all duration-200 ease-in-out ${isOpen ? 'max-h-[2000px] opacity-100' : 'max-h-0 opacity-0'\n }`}\n >\n <div className=\"text-text-md text-text-primary\">\n {item.answer}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {link && (\n <div className=\"mt-space-fluid-4-6\">\n {React.createElement(\n linkAs || 'a',\n {\n href: link.href,\n className: 'text-link-md text-link-primary underline hover:text-link-primary-hover transition-colors',\n },\n link.label,\n )}\n </div>\n )}\n </div>\n </section>\n );\n}\n"],"names":[],"mappings":";;;AAKA;AACE;AACE;AAAC;AAAA;AACC;AACM;AACC;AACC;AACH;AACE;AACK;AACE;AACC;AACH;AAEW;AAAA;AAG7B;AA4CO;AAAa;AACR;AACV;AACA;AACA;AACA;AACA;AACA;AACY;AACZ;AAEF;AACE;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACE;AACE;AAA8B;AAChC;AAGF;AAEA;AAAe;AAEX;AAIA;AACE;AAAW;AAEX;AAAoB;AACtB;AACF;AACoC;AAGtC;;AACE;AAA4B;AAG9B;AACE;AAGA;AAEA;AAAU;AAEN;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAAA;AAIJ;AACE;AAAC;AAAA;AACC;AAC0F;AACtF;AAGF;AACG;AAC0D;AAKvD;AACA;AACA;AACA;AAEA;AACE;AAAC;AAAA;AAEW;AAEV;AACE;AAAC;AAAA;AACgB;AAA6B;AAAI;AAC5C;AACC;AAIH;AACa;AACA;AACY;AAC3B;AAC2B;AACa;AAExC;AAAqB;AACrB;AAAC;AAAA;AAC4F;AAAA;AAAA;AAC7F;AAAA;AAEJ;AACA;AAAC;AAAA;AACK;AACC;AACY;AAEf;AAIF;AAAA;AAAA;AACF;AAAA;AAnCK;AAAA;AAuCb;AACF;AAIW;AACK;AACV;AACa;AACA;AAAA;AAER;AAET;AAEJ;AAAA;AAGN;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"jiwambe-plugin.d.ts","sourceRoot":"","sources":["../../src/plugin/jiwambe-plugin.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IACpD,uDAAuD;IACvD,UAAU,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAmGD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAW7D;AA2cD,QAAA,MAAM,aAAa;;;cAjlBD,CAAC;;;CAuwBlB,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"jiwambe-plugin.d.ts","sourceRoot":"","sources":["../../src/plugin/jiwambe-plugin.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IACpD,uDAAuD;IACvD,UAAU,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAmGD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAW7D;AA2cD,QAAA,MAAM,aAAa;;;cAjlBD,CAAC;;;CAkxBlB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -190,7 +190,7 @@ const fontFamilySecondary = '"Inter", sans-serif';
190
190
  const typographyTokens = {
191
191
  "title-sm": {
192
192
  fontFamily: fontFamilyPrimary,
193
- fontSize: "1.0625rem",
193
+ fontSize: "clamp(0.9375rem, 0.8482rem + 0.4464vw, 1.0625rem)",
194
194
  fontWeight: "600",
195
195
  lineHeight: "1.2",
196
196
  letterSpacing: "-0.005em",
@@ -198,7 +198,7 @@ const typographyTokens = {
198
198
  },
199
199
  "title-md": {
200
200
  fontFamily: fontFamilyPrimary,
201
- fontSize: "1.1875rem",
201
+ fontSize: "clamp(1rem, 0.8661rem + 0.6696vw, 1.1875rem)",
202
202
  fontWeight: "600",
203
203
  lineHeight: "1.2",
204
204
  letterSpacing: "0.02em",
@@ -208,15 +208,15 @@ const typographyTokens = {
208
208
  fontFamily: fontFamilyPrimary,
209
209
  fontSize: "clamp(1.5625rem, 1.4375rem + 0.625vw, 2rem)",
210
210
  fontWeight: "600",
211
- lineHeight: "1.1",
211
+ lineHeight: "1.0",
212
212
  letterSpacing: "-0.005em",
213
213
  textWrap: "balance"
214
214
  },
215
215
  "title-xl": {
216
216
  fontFamily: fontFamilyPrimary,
217
217
  fontSize: "clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)",
218
- fontWeight: "680",
219
- lineHeight: "1.1",
218
+ fontWeight: "800",
219
+ lineHeight: "1.0",
220
220
  letterSpacing: "-0.005em",
221
221
  textWrap: "balance"
222
222
  },
@@ -267,8 +267,8 @@ const typographyTokens = {
267
267
  "text-xl": {
268
268
  fontFamily: fontFamilyPrimary,
269
269
  fontSize: "clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)",
270
- fontWeight: "680",
271
- lineHeight: "1.1",
270
+ fontWeight: "800",
271
+ lineHeight: "1.0",
272
272
  letterSpacing: "-0.005em",
273
273
  textWrap: "pretty"
274
274
  },
@@ -443,18 +443,18 @@ const canonicalTypographyPrimitives = {
443
443
  "font-size-fluid-48-60": "clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)",
444
444
  "font-family-primary": '"Instrument Sans", sans-serif',
445
445
  "font-family-secondary": "'Inter', system-ui, sans-serif",
446
- "font-size-a-sm": "1.0625rem",
447
- "font-size-a-md": "1.1875rem",
448
- "font-size-a-lg-fluid": "var(--font-size-fluid-25-32)",
449
- "font-size-a-xl-fluid": "var(--font-size-fluid-48-60)",
450
- "font-size-b-xs": "0.75rem",
451
- "font-size-b-sm": "1rem",
452
- "font-size-b-md": "1.125rem",
446
+ "font-size-s-sm": "1.0625rem",
447
+ "font-size-s-md": "1.1875rem",
448
+ "font-size-s-lg-fluid": "var(--font-size-fluid-25-32)",
449
+ "font-size-s-xl-fluid": "var(--font-size-fluid-48-60)",
450
+ "font-size-t-xs": "0.75rem",
451
+ "font-size-t-sm": "1rem",
452
+ "font-size-t-md": "1.125rem",
453
453
  "font-weight-xs": "400",
454
454
  "font-weight-sm": "500",
455
455
  "font-weight-md": "600",
456
- "font-weight-lg": "680",
457
- "font-line-tight": "1.1",
456
+ "font-weight-lg": "800",
457
+ "font-line-tight": "1.0",
458
458
  "font-line-normal": "1.2",
459
459
  "font-line-loose": "1.4",
460
460
  "font-ltrspc-xs": "-0.005em",
@@ -526,7 +526,18 @@ const jiwambePlugin = plugin.withOptions(
526
526
  for (const [key, value] of Object.entries(canonicalTypographyPrimitives)) {
527
527
  cssVars[`--${key}`] = value;
528
528
  }
529
- addBase({ ":root": cssVars });
529
+ addBase({
530
+ ":root": cssVars,
531
+ body: {
532
+ "text-rendering": "optimizeLegibility",
533
+ "-webkit-font-smoothing": "antialiased",
534
+ "-moz-osx-font-smoothing": "grayscale",
535
+ "text-size-adjust": "none",
536
+ "-webkit-text-size-adjust": "none",
537
+ "-moz-text-size-adjust": "none",
538
+ "font-optical-sizing": "auto"
539
+ }
540
+ });
530
541
  addBase({
531
542
  "@keyframes jiwambe-shimmer": {
532
543
  "0%": {
@@ -1 +1 @@
1
- {"version":3,"file":"jiwambe-plugin.js","sources":["../../src/plugin/jiwambe-plugin.ts"],"sourcesContent":["import plugin from 'tailwindcss/plugin';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface TypographyDef {\n fontFamily: string;\n fontSize: string;\n fontWeight: string;\n lineHeight: string;\n letterSpacing?: string;\n textWrap?: string;\n}\n\nexport interface JiwambePluginOptions {\n /** Override or extend semantic color token mappings. */\n colors?: Record<string, string>;\n /** Override or extend spacing tokens. */\n spacing?: Record<string, string>;\n /** Override or extend border width tokens. */\n borderWidth?: Record<string, string>;\n /** Override or extend border radius tokens. */\n borderRadius?: Record<string, string>;\n /** Override or extend elevation (box-shadow) tokens. */\n elevation?: Record<string, string>;\n /** Override or extend typography definitions. Partial overrides are merged with defaults. */\n typography?: Record<string, Partial<TypographyDef>>;\n /** Override primary and/or secondary font families. */\n fontFamily?: { primary?: string; secondary?: string };\n}\n\n// ---------------------------------------------------------------------------\n// Base color palette\n// ---------------------------------------------------------------------------\n\nconst baseColors: Record<string, string> = {\n // Neutral\n 'neutral-0': '#FFFFFF',\n 'neutral-25': '#FAFBFB',\n 'neutral-50': '#F5F6F6',\n 'neutral-100': '#E5E8E7',\n 'neutral-150': '#DADEDC',\n 'neutral-200': '#CED3D2',\n 'neutral-250': '#BDC4C3',\n 'neutral-300': '#ABB5B3',\n 'neutral-350': '#97A2A0',\n 'neutral-400': '#828E8C',\n 'neutral-450': '#74817F',\n 'neutral-500': '#667472',\n 'neutral-600': '#586261',\n 'neutral-700': '#4B5353',\n 'neutral-800': '#424847',\n 'neutral-850': '#393F3E',\n 'neutral-900': '#303635',\n 'neutral-950': '#181B1B',\n 'neutral-950--t75': 'rgba(24, 27, 27, 0.75)',\n 'neutral-950--t50': 'rgba(24, 27, 27, 0.50)',\n 'neutral-950--t25': 'rgba(24, 27, 27, 0.25)',\n 'neutral-950--t10': 'rgba(24, 27, 27, 0.10)',\n\n // Green\n 'green-50': '#ECF9F3',\n 'green-100': '#D9F2E7',\n 'green-150': '#C7ECDE',\n 'green-200': '#B4E6D4',\n 'green-250': '#9ADEC8',\n 'green-300': '#80D5BB',\n 'green-350': '#64C9AB',\n 'green-400': '#4DC2A3',\n 'green-450': '#33B897',\n 'green-500': '#19AE8A',\n 'green-600': '#109274',\n 'green-700': '#0D755F',\n 'green-800': '#0B6556',\n 'green-850': '#065E4F',\n 'green-900': '#005748',\n 'green-950': '#00332A',\n 'green-950--t75': 'rgba(0, 51, 42, 0.75)',\n 'green-950--t50': 'rgba(0, 51, 42, 0.50)',\n 'green-950--t25': 'rgba(0, 51, 42, 0.25)',\n 'green-950--t10': 'rgba(0, 51, 42, 0.10)',\n\n // Red\n 'red-50': '#FEF3F1',\n 'red-100': '#FCE6E3',\n 'red-150': '#FAD5D1',\n 'red-200': '#F8C4BF',\n 'red-250': '#F9ADA5',\n 'red-300': '#F9958B',\n 'red-400': '#F67265',\n 'red-500': '#F34F3F',\n 'red-600': '#E52B19',\n 'red-700': '#CF2717',\n 'red-800': '#93251A',\n 'red-850': '#791F16',\n 'red-900': '#5F1811',\n 'red-950': '#340D09',\n 'red-950--t75': 'rgba(52, 13, 9, 0.75)',\n 'red-950--t50': 'rgba(52, 13, 9, 0.50)',\n 'red-950--t25': 'rgba(52, 13, 9, 0.25)',\n 'red-950--t10': 'rgba(52, 13, 9, 0.10)',\n\n // Yellow\n 'yellow-50': '#FEFCF1',\n 'yellow-100': '#FCF8E3',\n 'yellow-150': '#FAF4D1',\n 'yellow-200': '#F8EFBF',\n 'yellow-250': '#F9EBA5',\n 'yellow-300': '#F9E68B',\n 'yellow-350': '#F8E278',\n 'yellow-400': '#F7DE64',\n 'yellow-500': '#F3D53F',\n 'yellow-600': '#EBC714',\n 'yellow-700': '#BC8E10',\n 'yellow-800': '#826217',\n 'yellow-850': '#6D5213',\n 'yellow-900': '#57410F',\n 'yellow-950': '#2B2108',\n 'yellow-950--t75': 'rgba(43, 33, 8, 0.75)',\n 'yellow-950--t50': 'rgba(43, 33, 8, 0.50)',\n 'yellow-950--t25': 'rgba(43, 33, 8, 0.25)',\n 'yellow-950--t10': 'rgba(43, 33, 8, 0.10)',\n};\n\n// ---------------------------------------------------------------------------\n// Helper – resolve a base color reference to its hex, with optional opacity\n// ---------------------------------------------------------------------------\n\nexport function resolve(ref: string, opacity?: number): string {\n const hex = baseColors[ref];\n if (!hex) return ref; // pass through raw hex / css value\n\n if (opacity === undefined || opacity === 100) return hex;\n\n // Convert hex to rgb then apply opacity via rgba()\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${(opacity / 100).toFixed(2)})`;\n}\n\n// ---------------------------------------------------------------------------\n// Default semantic token mappings\n// ---------------------------------------------------------------------------\n\nfunction defaultSemanticColors(): Record<string, string> {\n return {\n // Text\n 'text-primary': resolve('neutral-950'),\n 'text-secondary': resolve('neutral-950', 75),\n 'text-disabled': resolve('neutral-950', 50),\n 'text-primary-inverse': resolve('neutral-0'),\n 'text-secondary-inverse': resolve('neutral-0', 75),\n 'text-inverse-disabled': resolve('neutral-0', 50),\n 'text-action-primary': resolve('neutral-0'),\n 'text-action-primary-disabled': resolve('neutral-0', 50),\n 'text-action-secondary': resolve('neutral-950'),\n 'text-action-secondary-disabled': resolve('neutral-950', 50),\n 'text-action-tertiary': resolve('neutral-0'),\n 'text-action-tertiary-hover': resolve('neutral-0', 75),\n 'text-action-tertiary-disabled': resolve('neutral-0', 50),\n 'text-err': resolve('red-950'),\n 'text-err-disabled': resolve('red-950', 50),\n\n // Link\n 'link-primary': resolve('green-900'),\n 'link-primary-hover': resolve('green-950', 75),\n 'link-primary-disabled': resolve('green-950', 50),\n 'link-secondary': resolve('neutral-950'),\n 'link-secondary-hover': resolve('neutral-950', 75),\n 'link-secondary-disabled': resolve('neutral-950', 50),\n 'link-tertiary': resolve('neutral-950', 50),\n 'link-tertiary-hover': resolve('neutral-950', 25),\n 'link-tertiary-disabled': resolve('neutral-950', 25),\n 'link-inverse': resolve('neutral-0'),\n 'link-inverse-hover': resolve('neutral-0', 75),\n 'link-inverse-disabled': resolve('neutral-0', 50),\n\n // Background fills\n 'fill-bg-primary': resolve('neutral-0'),\n 'fill-bg-secondary': resolve('neutral-50'),\n 'fill-bg-tertiary': resolve('green-900'),\n 'fill-bg-err': resolve('red-100'),\n 'fill-bg-info': resolve('neutral-0'),\n 'fill-bg-dimmer': resolve('neutral-950', 75),\n\n // Action fills\n 'fill-action-primary': resolve('green-900'),\n 'fill-action-primary-hover': resolve('green-950'),\n 'fill-action-primary-active': resolve('green-950'),\n 'fill-action-primary-focus': resolve('green-900'),\n 'fill-action-primary-selected': resolve('green-900'),\n 'fill-action-primary-disabled': resolve('green-900'),\n 'fill-action-secondary': resolve('neutral-100'),\n 'fill-action-secondary-hover': resolve('neutral-200'),\n 'fill-action-secondary-active': resolve('neutral-200'),\n 'fill-action-secondary-focus': resolve('neutral-100'),\n 'fill-action-secondary-selected': resolve('neutral-100'),\n 'fill-action-secondary-disabled': resolve('neutral-100'),\n 'fill-action-inverse': resolve('neutral-0'),\n 'fill-action-inverse-hover': resolve('neutral-0', 90),\n 'fill-action-inverse-active': resolve('neutral-0', 90),\n 'fill-action-inverse-focus': resolve('neutral-0'),\n 'fill-action-inverse-selected': resolve('neutral-0'),\n 'fill-action-inverse-disabled': resolve('neutral-0'),\n 'fill-action-ghost': resolve('neutral-0', 0),\n 'fill-action-ghost-hover': resolve('neutral-0', 10),\n 'fill-action-ghost-active': resolve('neutral-0', 10),\n 'fill-action-ghost-focus': resolve('neutral-0', 0),\n 'fill-action-ghost-selected': resolve('neutral-0', 0),\n 'fill-action-ghost-disabled': resolve('neutral-0', 0),\n\n // Form fills\n 'fill-form-primary': resolve('neutral-0'),\n 'fill-form-primary-hover': resolve('neutral-0'),\n 'fill-form-primary-active': resolve('neutral-0'),\n 'fill-form-primary-focus': resolve('neutral-0'),\n 'fill-form-primary-selected': resolve('neutral-0'),\n 'fill-form-primary-disabled': resolve('neutral-0'),\n\n // Borders\n 'border-light': resolve('neutral-100'),\n 'border-heavy': resolve('neutral-200'),\n 'border-inverse': resolve('neutral-0'),\n 'border-focus': resolve('green-900'),\n 'border-err': resolve('red-800'),\n\n // Form borders\n 'border-form-primary': resolve('neutral-300'),\n 'border-form-primary-hover': resolve('neutral-600'),\n 'border-form-primary-active': resolve('green-900'),\n 'border-form-primary-focus': resolve('green-900'),\n 'border-form-primary-selected': resolve('green-900'),\n 'border-form-primary-disabled': resolve('neutral-200'),\n\n // Icons\n 'icon-primary': resolve('neutral-950'),\n 'icon-primary-disabled': resolve('neutral-950', 50),\n 'icon-inverse': resolve('neutral-0'),\n 'icon-inverse-disabled': resolve('neutral-0', 50),\n 'icon-err': resolve('red-950'),\n 'icon-err-disabled': resolve('red-950', 50),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Typography token definitions\n// ---------------------------------------------------------------------------\n\nconst fontFamilyPrimary = '\"Instrument Sans\", sans-serif';\nconst fontFamilySecondary = '\"Inter\", sans-serif';\n\nconst typographyTokens: Record<string, TypographyDef> = {\n 'title-sm': {\n fontFamily: fontFamilyPrimary,\n fontSize: '1.0625rem',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'title-md': {\n fontFamily: fontFamilyPrimary,\n fontSize: '1.1875rem',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '0.02em',\n textWrap: 'balance',\n },\n 'title-lg': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(1.5625rem, 1.4375rem + 0.625vw, 2rem)',\n fontWeight: '600',\n lineHeight: '1.1',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'title-xl': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)',\n fontWeight: '680',\n lineHeight: '1.1',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'text-xs': {\n fontFamily: fontFamilySecondary,\n fontSize: '0.75rem',\n fontWeight: '400',\n lineHeight: '1.4',\n letterSpacing: '-0.005em',\n textWrap: 'pretty',\n },\n 'text-xs-bold': {\n fontFamily: fontFamilySecondary,\n fontSize: '0.75rem',\n fontWeight: '600',\n lineHeight: '1.4',\n letterSpacing: '-0.005em',\n textWrap: 'pretty',\n },\n 'text-sm': {\n fontFamily: fontFamilySecondary,\n fontSize: '1rem',\n fontWeight: '400',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-sm-bold': {\n fontFamily: fontFamilySecondary,\n fontSize: '1rem',\n fontWeight: '600',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-md': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-md-bold': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '600',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-xl': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)',\n fontWeight: '680',\n lineHeight: '1.1',\n letterSpacing: '-0.005em',\n textWrap: 'pretty',\n },\n 'form-text': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'form-label': {\n fontFamily: fontFamilyPrimary,\n fontSize: '1.1875rem',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'btn-small': {\n fontFamily: fontFamilySecondary,\n fontSize: '1rem',\n fontWeight: '500',\n lineHeight: '1.4',\n },\n 'btn-reg': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '500',\n lineHeight: '1.4',\n },\n 'link-md': {\n fontFamily: fontFamilyPrimary,\n fontSize: '1.1875rem',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '0.02em',\n },\n};\n\n// ---------------------------------------------------------------------------\n// Spacing tokens\n// ---------------------------------------------------------------------------\n\nconst spacingTokens: Record<string, string> = {\n // Fixed\n 'space-0': '0rem',\n 'space-0-25': '0.0625rem',\n 'space-1': '0.25rem',\n 'space-2': '0.5rem',\n 'space-3': '0.75rem',\n 'space-4': '1rem',\n 'space-5': '1.25rem',\n 'space-6': '1.5rem',\n 'space-8': '2rem',\n 'space-9': '2.25rem',\n 'space-12': '3rem',\n 'space-16': '4rem',\n 'space-18': '4.5rem',\n 'space-24': '6rem',\n 'space-30': '7.5rem',\n 'space-36': '9rem',\n 'space-48': '12rem',\n 'space-72': '18rem',\n\n // Fluid\n 'space-fluid-1-2': 'clamp(0.25rem, 0.1706rem + 0.3968vw, 0.5rem)',\n 'space-fluid-2-4': 'clamp(0.5rem, 0.3413rem + 0.7937vw, 1rem)',\n 'space-fluid-4-5': 'clamp(1rem, 0.9206rem + 0.3968vw, 1.25rem)',\n 'space-fluid-4-6': 'clamp(1rem, 0.8413rem + 0.7937vw, 1.5rem)',\n 'space-fluid-4-8': 'clamp(1rem, 0.6825rem + 1.5873vw, 2rem)',\n 'space-fluid-4-9': 'clamp(1rem, 0.6032rem + 1.9841vw, 2.25rem)',\n 'space-fluid-5-6': 'clamp(1.25rem, 1.1706rem + 0.3968vw, 1.5rem)',\n 'space-fluid-6-9': 'clamp(1.5rem, 1.2619rem + 1.1905vw, 2.25rem)',\n 'space-fluid-8-16': 'clamp(2rem, 1.3651rem + 3.1746vw, 4rem)',\n 'space-fluid-16-18': 'clamp(4rem, 3.8413rem + 0.7937vw, 4.5rem)',\n 'space-fluid-30-36': 'clamp(7.5rem, 7.0238rem + 2.381vw, 9rem)',\n 'space-fluid-48-72': 'clamp(12rem, 10.0952rem + 9.5238vw, 18rem)',\n};\n\n// ---------------------------------------------------------------------------\n// Border width tokens\n// ---------------------------------------------------------------------------\n\nconst borderWidthTokens: Record<string, string> = {\n 'border-none': '0',\n 'border-xs': '.0625rem',\n 'border-sm': '.078125rem',\n 'border-md': '.09375rem',\n};\n\n// ---------------------------------------------------------------------------\n// Border radius tokens\n// ---------------------------------------------------------------------------\n\nconst borderRadiusTokens: Record<string, string> = {\n 'rad-none': '0',\n 'rad-xs': '.375rem',\n 'rad-sm': '.75rem',\n 'rad-md': '1rem',\n 'rad-lg': '1.25rem',\n 'rad-xl': '1.5rem',\n 'rad-rounded': '100rem',\n};\n\n// ---------------------------------------------------------------------------\n// Elevation (box-shadow) tokens\n// ---------------------------------------------------------------------------\n\nconst elevationTokens: Record<string, string> = {\n 'elevation-low': '0 2px 8px 0 var(--col-neutral-950--t10)',\n 'elevation-normal': '0 2px 8px 4px var(--col-neutral-950--t10)',\n};\n\n// ---------------------------------------------------------------------------\n// Canonical design token primitives (source of truth)\n// ---------------------------------------------------------------------------\n\nconst canonicalColourPrimitives: Record<string, string> = {\n 'col-neutral-0': 'hsla(0, 0%, 100%, 1)',\n 'col-neutral-0--t0': 'hsla(0, 0%, 100%, 0)',\n 'col-neutral-0--t10': 'hsla(0, 0%, 100%, 0.1)',\n 'col-neutral-0--t25': 'hsla(0, 0%, 100%, 0.25)',\n 'col-neutral-0--t50': 'hsla(0, 0%, 100%, 0.5)',\n 'col-neutral-0--t75': 'hsla(0, 0%, 100%, 0.75)',\n 'col-neutral-0--t90': 'hsla(0, 0%, 100%, 0.9)',\n 'col-neutral-50': 'hsla(180, 5%, 96%, 1)',\n 'col-neutral-100': 'hsla(160, 6%, 90%, 1)',\n 'col-neutral-200': 'hsla(168, 5%, 82%, 1)',\n 'col-neutral-300': 'hsla(168, 6%, 69%, 1)',\n 'col-neutral-400': 'hsla(170, 5%, 53%, 1)',\n 'col-neutral-500': 'hsla(171, 6%, 43%, 1)',\n 'col-neutral-600': 'hsla(174, 5%, 36%, 1)',\n 'col-neutral-700': 'hsla(180, 5%, 31%, 1)',\n 'col-neutral-800': 'hsla(170, 4%, 27%, 1)',\n 'col-neutral-900': 'hsla(170, 6%, 20%, 1)',\n 'col-neutral-950': 'hsla(180, 5%, 10%, 1)',\n 'col-neutral-950--t10': 'hsla(180, 5%, 10%, 0.1)',\n 'col-neutral-950--t25': 'hsla(180, 5%, 10%, 0.25)',\n 'col-neutral-950--t50': 'hsla(180, 5%, 10%, 0.5)',\n 'col-neutral-950--t75': 'hsla(180, 5%, 10%, 0.75)',\n 'col-neutral-950--t90': 'hsla(180, 5%, 10%, 0.9)',\n 'col-green-50': 'hsla(156, 24%, 96%, 1)',\n 'col-green-100': 'hsla(154, 49%, 90%, 1)',\n 'col-green-200': 'hsla(158, 50%, 80%, 1)',\n 'col-green-300': 'hsla(162, 50%, 67%, 1)',\n 'col-green-400': 'hsla(164, 52%, 52%, 1)',\n 'col-green-500': 'hsla(166, 75%, 39%, 1)',\n 'col-green-600': 'hsla(166, 80%, 32%, 1)',\n 'col-green-700': 'hsla(167, 80%, 25%, 1)',\n 'col-green-800': 'hsla(170, 80%, 22%, 1)',\n 'col-green-900': 'hsla(170, 100%, 17%, 1)',\n 'col-green-950': 'hsla(170, 100%, 10%, 1)',\n 'col-green-950--t10': 'hsla(170, 100%, 10%, 0.1)',\n 'col-green-950--t50': 'hsla(170, 100%, 10%, 0.5)',\n 'col-green-950--t75': 'hsla(170, 100%, 10%, 0.75)',\n 'col-green-950--t90': 'hsla(170, 100%, 10%, 0.9)',\n 'col-red-50': 'hsla(7, 60%, 97%, 1)',\n 'col-red-100': 'hsla(7, 81%, 94%, 1)',\n 'col-red-200': 'hsla(5, 80%, 86%, 1)',\n 'col-red-300': 'hsla(5, 90%, 76%, 1)',\n 'col-red-400': 'hsla(5, 90%, 68%, 1)',\n 'col-red-500': 'hsla(5, 88%, 60%, 1)',\n 'col-red-600': 'hsla(5, 80%, 50%, 1)',\n 'col-red-700': 'hsla(5, 80%, 45%, 1)',\n 'col-red-800': 'hsla(5, 70%, 34%, 1)',\n 'col-red-900': 'hsla(5, 70%, 22%, 1)',\n 'col-red-950': 'hsla(5, 70%, 12%, 1)',\n 'col-red-950--t10': 'hsla(5, 70%, 12%, 0.1)',\n 'col-red-950--t50': 'hsla(5, 70%, 12%, 0.5)',\n 'col-red-950--t75': 'hsla(5, 70%, 12%, 0.75)',\n 'col-red-950--t90': 'hsla(5, 70%, 12%, 0.9)',\n 'col-yellow-50': 'hsla(47, 60%, 97%, 1)',\n 'col-yellow-100': 'hsla(50, 81%, 94%, 1)',\n 'col-yellow-200': 'hsla(50, 80%, 86%, 1)',\n 'col-yellow-300': 'hsla(50, 90%, 76%, 1)',\n 'col-yellow-400': 'hsla(50, 90%, 68%, 1)',\n 'col-yellow-500': 'hsla(50, 88%, 60%, 1)',\n 'col-yellow-600': 'hsla(50, 84%, 50%, 1)',\n 'col-yellow-700': 'hsla(44, 84%, 40%, 1)',\n 'col-yellow-800': 'hsla(42, 70%, 30%, 1)',\n 'col-yellow-900': 'hsla(42, 71%, 20%, 1)',\n 'col-yellow-950': 'hsla(42, 69%, 10%, 1)',\n 'col-yellow-950--t10': 'hsla(42, 69%, 10%, 0.1)',\n 'col-yellow-950--t50': 'hsla(42, 69%, 10%, 0.5)',\n 'col-yellow-950--t75': 'hsla(42, 69%, 10%, 0.75)',\n 'col-yellow-950--t90': 'hsla(42, 69%, 10%, 0.9)',\n};\n\nconst canonicalTransitionPrimitives: Record<string, string> = {\n 'trans-timing-light': 'ease-out',\n 'trans-timing-normal': 'ease-out',\n 'trans-timing-heavy': 'ease-in',\n 'trans-duration-snap': '30ms',\n 'trans-duration-normal': '120ms',\n 'trans-duration-slow': '300ms',\n};\n\nconst canonicalTypographyPrimitives: Record<string, string> = {\n 'font-size-fluid-25-32': 'clamp(1.5625rem, 1.4375rem + 0.625vw, 2rem)',\n 'font-size-fluid-48-60': 'clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)',\n 'font-family-primary': '\"Instrument Sans\", sans-serif',\n 'font-family-secondary': \"'Inter', system-ui, sans-serif\",\n 'font-size-a-sm': '1.0625rem',\n 'font-size-a-md': '1.1875rem',\n 'font-size-a-lg-fluid': 'var(--font-size-fluid-25-32)',\n 'font-size-a-xl-fluid': 'var(--font-size-fluid-48-60)',\n 'font-size-b-xs': '0.75rem',\n 'font-size-b-sm': '1rem',\n 'font-size-b-md': '1.125rem',\n 'font-weight-xs': '400',\n 'font-weight-sm': '500',\n 'font-weight-md': '600',\n 'font-weight-lg': '680',\n 'font-line-tight': '1.1',\n 'font-line-normal': '1.2',\n 'font-line-loose': '1.4',\n 'font-ltrspc-xs': '-0.005em',\n 'font-ltrspc-sm': '0.01em',\n 'font-ltrspc-md': '0.02em',\n};\n\n// ---------------------------------------------------------------------------\n// Breakpoints\n// ---------------------------------------------------------------------------\n\nconst screens: Record<string, string> = {\n xs: '0px',\n sm: '600px',\n md: '800px',\n lg: '940px',\n xl: '1440px',\n};\n\n// ---------------------------------------------------------------------------\n// Plugin\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Merge helpers\n// ---------------------------------------------------------------------------\n\nfunction mergeTypography(\n base: Record<string, TypographyDef>,\n overrides: Record<string, Partial<TypographyDef>> | undefined,\n): Record<string, TypographyDef> {\n if (!overrides) return base;\n const merged = { ...base };\n for (const [key, partial] of Object.entries(overrides)) {\n merged[key] = { ...(merged[key] ?? ({} as TypographyDef)), ...partial };\n }\n return merged;\n}\n\nfunction resolvedFontFamilies(options: JiwambePluginOptions | undefined) {\n return {\n primary: options?.fontFamily?.primary ?? fontFamilyPrimary,\n secondary: options?.fontFamily?.secondary ?? fontFamilySecondary,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Plugin\n// ---------------------------------------------------------------------------\n\nconst jiwambePlugin = plugin.withOptions<JiwambePluginOptions | undefined>(\n (options) => {\n return ({ addBase, addUtilities }) => {\n const fonts = resolvedFontFamilies(options);\n const mergedColors = { ...defaultSemanticColors(), ...(options?.colors ?? {}) };\n const mergedSpacing = { ...spacingTokens, ...(options?.spacing ?? {}) };\n const mergedBorderWidth = { ...borderWidthTokens, ...(options?.borderWidth ?? {}) };\n const mergedBorderRadius = { ...borderRadiusTokens, ...(options?.borderRadius ?? {}) };\n const mergedElevation = { ...elevationTokens, ...(options?.elevation ?? {}) };\n const mergedTypography = mergeTypography(typographyTokens, options?.typography);\n\n // -----------------------------------------------------------------\n // 1. Generate CSS custom properties on :root\n // -----------------------------------------------------------------\n\n const cssVars: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(baseColors)) {\n cssVars[`--color-${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedColors)) {\n cssVars[`--color-${key}`] = value;\n }\n // Alias for list marker styling (--col-* naming)\n if (mergedColors['text-secondary']) {\n cssVars['--col-text-secondary'] = mergedColors['text-secondary'];\n }\n for (const [key, value] of Object.entries(mergedSpacing)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedBorderWidth)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedBorderRadius)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedElevation)) {\n cssVars[`--${key}`] = value;\n }\n\n cssVars['--font-family-primary'] = fonts.primary;\n cssVars['--font-family-secondary'] = fonts.secondary;\n\n for (const [key, value] of Object.entries(canonicalColourPrimitives)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(canonicalTransitionPrimitives)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(canonicalTypographyPrimitives)) {\n cssVars[`--${key}`] = value;\n }\n\n addBase({ ':root': cssVars });\n\n // -----------------------------------------------------------------\n // 1b. Skeleton shimmer keyframe and utility class\n // -----------------------------------------------------------------\n\n addBase({\n '@keyframes jiwambe-shimmer': {\n '0%': {\n backgroundPosition: '-200% 0',\n },\n '100%': {\n backgroundPosition: '200% 0',\n },\n },\n '.jiwambe-skeleton': {\n backgroundColor: 'var(--col-neutral-100)',\n backgroundImage: [\n 'linear-gradient(',\n ' 90deg,',\n ' var(--col-neutral-100) 25%,',\n ' var(--col-neutral-50) 50%,',\n ' var(--col-neutral-100) 75%',\n ')',\n ].join(''),\n backgroundSize: '200% 100%',\n backgroundRepeat: 'no-repeat',\n animation: 'jiwambe-shimmer 1.5s ease-in-out infinite',\n },\n });\n\n // -----------------------------------------------------------------\n // 1c. List marker base styles\n // -----------------------------------------------------------------\n\n addBase({\n '.jiwambe-list': {\n paddingLeft: 'var(--space-6)',\n margin: '0',\n },\n '.jiwambe-list--unstyled': {\n paddingLeft: '0',\n listStyle: 'none',\n },\n '.jiwambe-list--disc li::marker': {\n color: 'var(--col-text-secondary)',\n },\n '.jiwambe-list--decimal li::marker': {\n color: 'var(--col-text-secondary)',\n fontVariantNumeric: 'tabular-nums',\n },\n '.jiwambe-list--none': {\n listStyle: 'none',\n paddingLeft: '0',\n },\n '.jiwambe-list-item': {\n paddingLeft: 'var(--space-1)',\n },\n '.jiwambe-list-item + .jiwambe-list-item': {\n marginTop: 'var(--space-0)',\n },\n });\n\n // -----------------------------------------------------------------\n // 2. Typography utility classes\n // -----------------------------------------------------------------\n\n const typographyUtilities: Record<string, Record<string, string>> = {};\n\n for (const [name, def] of Object.entries(mergedTypography)) {\n const styles: Record<string, string> = {\n 'font-family': def.fontFamily,\n 'font-size': def.fontSize,\n 'font-weight': def.fontWeight,\n 'line-height': def.lineHeight,\n };\n if (def.letterSpacing) styles['letter-spacing'] = def.letterSpacing;\n if (def.textWrap) styles['text-wrap'] = def.textWrap;\n\n typographyUtilities[`.text-${name}`] = styles;\n }\n\n addUtilities(typographyUtilities);\n };\n },\n (options) => {\n const fonts = resolvedFontFamilies(options);\n const mergedColors = { ...defaultSemanticColors(), ...(options?.colors ?? {}) };\n const mergedSpacing = { ...spacingTokens, ...(options?.spacing ?? {}) };\n const mergedBorderWidth = { ...borderWidthTokens, ...(options?.borderWidth ?? {}) };\n const mergedBorderRadius = { ...borderRadiusTokens, ...(options?.borderRadius ?? {}) };\n const mergedElevation = { ...elevationTokens, ...(options?.elevation ?? {}) };\n\n const allColors: Record<string, string> = {};\n for (const [key, value] of Object.entries(baseColors)) {\n allColors[key] = value;\n }\n for (const [key, value] of Object.entries(mergedColors)) {\n allColors[key] = value;\n }\n\n // Spacing theme: each token maps to var(--token) so utilities use CSS variables.\n // Add short keys for fluid tokens so px-fluid-4-9 works alongside px-space-fluid-4-9.\n const spacingExtension: Record<string, string> = {};\n for (const key of Object.keys(mergedSpacing)) {\n spacingExtension[key] = `var(--${key})`;\n if (key.startsWith('space-fluid-')) {\n const shortKey = key.replace(/^space-/, '');\n spacingExtension[shortKey] = `var(--${key})`;\n }\n }\n\n return {\n theme: {\n screens,\n extend: {\n colors: allColors,\n spacing: spacingExtension,\n borderWidth: mergedBorderWidth,\n borderRadius: mergedBorderRadius,\n boxShadow: mergedElevation,\n fontFamily: {\n primary: [fonts.primary],\n secondary: [fonts.secondary],\n },\n },\n },\n };\n },\n);\n\nexport default jiwambePlugin;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jiwambe-plugin.js","sources":["../../src/plugin/jiwambe-plugin.ts"],"sourcesContent":["import plugin from 'tailwindcss/plugin';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface TypographyDef {\n fontFamily: string;\n fontSize: string;\n fontWeight: string;\n lineHeight: string;\n letterSpacing?: string;\n textWrap?: string;\n}\n\nexport interface JiwambePluginOptions {\n /** Override or extend semantic color token mappings. */\n colors?: Record<string, string>;\n /** Override or extend spacing tokens. */\n spacing?: Record<string, string>;\n /** Override or extend border width tokens. */\n borderWidth?: Record<string, string>;\n /** Override or extend border radius tokens. */\n borderRadius?: Record<string, string>;\n /** Override or extend elevation (box-shadow) tokens. */\n elevation?: Record<string, string>;\n /** Override or extend typography definitions. Partial overrides are merged with defaults. */\n typography?: Record<string, Partial<TypographyDef>>;\n /** Override primary and/or secondary font families. */\n fontFamily?: { primary?: string; secondary?: string };\n}\n\n// ---------------------------------------------------------------------------\n// Base color palette\n// ---------------------------------------------------------------------------\n\nconst baseColors: Record<string, string> = {\n // Neutral\n 'neutral-0': '#FFFFFF',\n 'neutral-25': '#FAFBFB',\n 'neutral-50': '#F5F6F6',\n 'neutral-100': '#E5E8E7',\n 'neutral-150': '#DADEDC',\n 'neutral-200': '#CED3D2',\n 'neutral-250': '#BDC4C3',\n 'neutral-300': '#ABB5B3',\n 'neutral-350': '#97A2A0',\n 'neutral-400': '#828E8C',\n 'neutral-450': '#74817F',\n 'neutral-500': '#667472',\n 'neutral-600': '#586261',\n 'neutral-700': '#4B5353',\n 'neutral-800': '#424847',\n 'neutral-850': '#393F3E',\n 'neutral-900': '#303635',\n 'neutral-950': '#181B1B',\n 'neutral-950--t75': 'rgba(24, 27, 27, 0.75)',\n 'neutral-950--t50': 'rgba(24, 27, 27, 0.50)',\n 'neutral-950--t25': 'rgba(24, 27, 27, 0.25)',\n 'neutral-950--t10': 'rgba(24, 27, 27, 0.10)',\n\n // Green\n 'green-50': '#ECF9F3',\n 'green-100': '#D9F2E7',\n 'green-150': '#C7ECDE',\n 'green-200': '#B4E6D4',\n 'green-250': '#9ADEC8',\n 'green-300': '#80D5BB',\n 'green-350': '#64C9AB',\n 'green-400': '#4DC2A3',\n 'green-450': '#33B897',\n 'green-500': '#19AE8A',\n 'green-600': '#109274',\n 'green-700': '#0D755F',\n 'green-800': '#0B6556',\n 'green-850': '#065E4F',\n 'green-900': '#005748',\n 'green-950': '#00332A',\n 'green-950--t75': 'rgba(0, 51, 42, 0.75)',\n 'green-950--t50': 'rgba(0, 51, 42, 0.50)',\n 'green-950--t25': 'rgba(0, 51, 42, 0.25)',\n 'green-950--t10': 'rgba(0, 51, 42, 0.10)',\n\n // Red\n 'red-50': '#FEF3F1',\n 'red-100': '#FCE6E3',\n 'red-150': '#FAD5D1',\n 'red-200': '#F8C4BF',\n 'red-250': '#F9ADA5',\n 'red-300': '#F9958B',\n 'red-400': '#F67265',\n 'red-500': '#F34F3F',\n 'red-600': '#E52B19',\n 'red-700': '#CF2717',\n 'red-800': '#93251A',\n 'red-850': '#791F16',\n 'red-900': '#5F1811',\n 'red-950': '#340D09',\n 'red-950--t75': 'rgba(52, 13, 9, 0.75)',\n 'red-950--t50': 'rgba(52, 13, 9, 0.50)',\n 'red-950--t25': 'rgba(52, 13, 9, 0.25)',\n 'red-950--t10': 'rgba(52, 13, 9, 0.10)',\n\n // Yellow\n 'yellow-50': '#FEFCF1',\n 'yellow-100': '#FCF8E3',\n 'yellow-150': '#FAF4D1',\n 'yellow-200': '#F8EFBF',\n 'yellow-250': '#F9EBA5',\n 'yellow-300': '#F9E68B',\n 'yellow-350': '#F8E278',\n 'yellow-400': '#F7DE64',\n 'yellow-500': '#F3D53F',\n 'yellow-600': '#EBC714',\n 'yellow-700': '#BC8E10',\n 'yellow-800': '#826217',\n 'yellow-850': '#6D5213',\n 'yellow-900': '#57410F',\n 'yellow-950': '#2B2108',\n 'yellow-950--t75': 'rgba(43, 33, 8, 0.75)',\n 'yellow-950--t50': 'rgba(43, 33, 8, 0.50)',\n 'yellow-950--t25': 'rgba(43, 33, 8, 0.25)',\n 'yellow-950--t10': 'rgba(43, 33, 8, 0.10)',\n};\n\n// ---------------------------------------------------------------------------\n// Helper – resolve a base color reference to its hex, with optional opacity\n// ---------------------------------------------------------------------------\n\nexport function resolve(ref: string, opacity?: number): string {\n const hex = baseColors[ref];\n if (!hex) return ref; // pass through raw hex / css value\n\n if (opacity === undefined || opacity === 100) return hex;\n\n // Convert hex to rgb then apply opacity via rgba()\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${(opacity / 100).toFixed(2)})`;\n}\n\n// ---------------------------------------------------------------------------\n// Default semantic token mappings\n// ---------------------------------------------------------------------------\n\nfunction defaultSemanticColors(): Record<string, string> {\n return {\n // Text\n 'text-primary': resolve('neutral-950'),\n 'text-secondary': resolve('neutral-950', 75),\n 'text-disabled': resolve('neutral-950', 50),\n 'text-primary-inverse': resolve('neutral-0'),\n 'text-secondary-inverse': resolve('neutral-0', 75),\n 'text-inverse-disabled': resolve('neutral-0', 50),\n 'text-action-primary': resolve('neutral-0'),\n 'text-action-primary-disabled': resolve('neutral-0', 50),\n 'text-action-secondary': resolve('neutral-950'),\n 'text-action-secondary-disabled': resolve('neutral-950', 50),\n 'text-action-tertiary': resolve('neutral-0'),\n 'text-action-tertiary-hover': resolve('neutral-0', 75),\n 'text-action-tertiary-disabled': resolve('neutral-0', 50),\n 'text-err': resolve('red-950'),\n 'text-err-disabled': resolve('red-950', 50),\n\n // Link\n 'link-primary': resolve('green-900'),\n 'link-primary-hover': resolve('green-950', 75),\n 'link-primary-disabled': resolve('green-950', 50),\n 'link-secondary': resolve('neutral-950'),\n 'link-secondary-hover': resolve('neutral-950', 75),\n 'link-secondary-disabled': resolve('neutral-950', 50),\n 'link-tertiary': resolve('neutral-950', 50),\n 'link-tertiary-hover': resolve('neutral-950', 25),\n 'link-tertiary-disabled': resolve('neutral-950', 25),\n 'link-inverse': resolve('neutral-0'),\n 'link-inverse-hover': resolve('neutral-0', 75),\n 'link-inverse-disabled': resolve('neutral-0', 50),\n\n // Background fills\n 'fill-bg-primary': resolve('neutral-0'),\n 'fill-bg-secondary': resolve('neutral-50'),\n 'fill-bg-tertiary': resolve('green-900'),\n 'fill-bg-err': resolve('red-100'),\n 'fill-bg-info': resolve('neutral-0'),\n 'fill-bg-dimmer': resolve('neutral-950', 75),\n\n // Action fills\n 'fill-action-primary': resolve('green-900'),\n 'fill-action-primary-hover': resolve('green-950'),\n 'fill-action-primary-active': resolve('green-950'),\n 'fill-action-primary-focus': resolve('green-900'),\n 'fill-action-primary-selected': resolve('green-900'),\n 'fill-action-primary-disabled': resolve('green-900'),\n 'fill-action-secondary': resolve('neutral-100'),\n 'fill-action-secondary-hover': resolve('neutral-200'),\n 'fill-action-secondary-active': resolve('neutral-200'),\n 'fill-action-secondary-focus': resolve('neutral-100'),\n 'fill-action-secondary-selected': resolve('neutral-100'),\n 'fill-action-secondary-disabled': resolve('neutral-100'),\n 'fill-action-inverse': resolve('neutral-0'),\n 'fill-action-inverse-hover': resolve('neutral-0', 90),\n 'fill-action-inverse-active': resolve('neutral-0', 90),\n 'fill-action-inverse-focus': resolve('neutral-0'),\n 'fill-action-inverse-selected': resolve('neutral-0'),\n 'fill-action-inverse-disabled': resolve('neutral-0'),\n 'fill-action-ghost': resolve('neutral-0', 0),\n 'fill-action-ghost-hover': resolve('neutral-0', 10),\n 'fill-action-ghost-active': resolve('neutral-0', 10),\n 'fill-action-ghost-focus': resolve('neutral-0', 0),\n 'fill-action-ghost-selected': resolve('neutral-0', 0),\n 'fill-action-ghost-disabled': resolve('neutral-0', 0),\n\n // Form fills\n 'fill-form-primary': resolve('neutral-0'),\n 'fill-form-primary-hover': resolve('neutral-0'),\n 'fill-form-primary-active': resolve('neutral-0'),\n 'fill-form-primary-focus': resolve('neutral-0'),\n 'fill-form-primary-selected': resolve('neutral-0'),\n 'fill-form-primary-disabled': resolve('neutral-0'),\n\n // Borders\n 'border-light': resolve('neutral-100'),\n 'border-heavy': resolve('neutral-200'),\n 'border-inverse': resolve('neutral-0'),\n 'border-focus': resolve('green-900'),\n 'border-err': resolve('red-800'),\n\n // Form borders\n 'border-form-primary': resolve('neutral-300'),\n 'border-form-primary-hover': resolve('neutral-600'),\n 'border-form-primary-active': resolve('green-900'),\n 'border-form-primary-focus': resolve('green-900'),\n 'border-form-primary-selected': resolve('green-900'),\n 'border-form-primary-disabled': resolve('neutral-200'),\n\n // Icons\n 'icon-primary': resolve('neutral-950'),\n 'icon-primary-disabled': resolve('neutral-950', 50),\n 'icon-inverse': resolve('neutral-0'),\n 'icon-inverse-disabled': resolve('neutral-0', 50),\n 'icon-err': resolve('red-950'),\n 'icon-err-disabled': resolve('red-950', 50),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Typography token definitions\n// ---------------------------------------------------------------------------\n\nconst fontFamilyPrimary = '\"Instrument Sans\", sans-serif';\nconst fontFamilySecondary = '\"Inter\", sans-serif';\n\nconst typographyTokens: Record<string, TypographyDef> = {\n 'title-sm': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(0.9375rem, 0.8482rem + 0.4464vw, 1.0625rem)',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'title-md': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(1rem, 0.8661rem + 0.6696vw, 1.1875rem)',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '0.02em',\n textWrap: 'balance',\n },\n 'title-lg': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(1.5625rem, 1.4375rem + 0.625vw, 2rem)',\n fontWeight: '600',\n lineHeight: '1.0',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'title-xl': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)',\n fontWeight: '800',\n lineHeight: '1.0',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'text-xs': {\n fontFamily: fontFamilySecondary,\n fontSize: '0.75rem',\n fontWeight: '400',\n lineHeight: '1.4',\n letterSpacing: '-0.005em',\n textWrap: 'pretty',\n },\n 'text-xs-bold': {\n fontFamily: fontFamilySecondary,\n fontSize: '0.75rem',\n fontWeight: '600',\n lineHeight: '1.4',\n letterSpacing: '-0.005em',\n textWrap: 'pretty',\n },\n 'text-sm': {\n fontFamily: fontFamilySecondary,\n fontSize: '1rem',\n fontWeight: '400',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-sm-bold': {\n fontFamily: fontFamilySecondary,\n fontSize: '1rem',\n fontWeight: '600',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-md': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-md-bold': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '600',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-xl': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)',\n fontWeight: '800',\n lineHeight: '1.0',\n letterSpacing: '-0.005em',\n textWrap: 'pretty',\n },\n 'form-text': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'form-label': {\n fontFamily: fontFamilyPrimary,\n fontSize: '1.1875rem',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'btn-small': {\n fontFamily: fontFamilySecondary,\n fontSize: '1rem',\n fontWeight: '500',\n lineHeight: '1.4',\n },\n 'btn-reg': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '500',\n lineHeight: '1.4',\n },\n 'link-md': {\n fontFamily: fontFamilyPrimary,\n fontSize: '1.1875rem',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '0.02em',\n },\n};\n\n// ---------------------------------------------------------------------------\n// Spacing tokens\n// ---------------------------------------------------------------------------\n\nconst spacingTokens: Record<string, string> = {\n // Fixed\n 'space-0': '0rem',\n 'space-0-25': '0.0625rem',\n 'space-1': '0.25rem',\n 'space-2': '0.5rem',\n 'space-3': '0.75rem',\n 'space-4': '1rem',\n 'space-5': '1.25rem',\n 'space-6': '1.5rem',\n 'space-8': '2rem',\n 'space-9': '2.25rem',\n 'space-12': '3rem',\n 'space-16': '4rem',\n 'space-18': '4.5rem',\n 'space-24': '6rem',\n 'space-30': '7.5rem',\n 'space-36': '9rem',\n 'space-48': '12rem',\n 'space-72': '18rem',\n\n // Fluid\n 'space-fluid-1-2': 'clamp(0.25rem, 0.1706rem + 0.3968vw, 0.5rem)',\n 'space-fluid-2-4': 'clamp(0.5rem, 0.3413rem + 0.7937vw, 1rem)',\n 'space-fluid-4-5': 'clamp(1rem, 0.9206rem + 0.3968vw, 1.25rem)',\n 'space-fluid-4-6': 'clamp(1rem, 0.8413rem + 0.7937vw, 1.5rem)',\n 'space-fluid-4-8': 'clamp(1rem, 0.6825rem + 1.5873vw, 2rem)',\n 'space-fluid-4-9': 'clamp(1rem, 0.6032rem + 1.9841vw, 2.25rem)',\n 'space-fluid-5-6': 'clamp(1.25rem, 1.1706rem + 0.3968vw, 1.5rem)',\n 'space-fluid-6-9': 'clamp(1.5rem, 1.2619rem + 1.1905vw, 2.25rem)',\n 'space-fluid-8-16': 'clamp(2rem, 1.3651rem + 3.1746vw, 4rem)',\n 'space-fluid-16-18': 'clamp(4rem, 3.8413rem + 0.7937vw, 4.5rem)',\n 'space-fluid-30-36': 'clamp(7.5rem, 7.0238rem + 2.381vw, 9rem)',\n 'space-fluid-48-72': 'clamp(12rem, 10.0952rem + 9.5238vw, 18rem)',\n};\n\n// ---------------------------------------------------------------------------\n// Border width tokens\n// ---------------------------------------------------------------------------\n\nconst borderWidthTokens: Record<string, string> = {\n 'border-none': '0',\n 'border-xs': '.0625rem',\n 'border-sm': '.078125rem',\n 'border-md': '.09375rem',\n};\n\n// ---------------------------------------------------------------------------\n// Border radius tokens\n// ---------------------------------------------------------------------------\n\nconst borderRadiusTokens: Record<string, string> = {\n 'rad-none': '0',\n 'rad-xs': '.375rem',\n 'rad-sm': '.75rem',\n 'rad-md': '1rem',\n 'rad-lg': '1.25rem',\n 'rad-xl': '1.5rem',\n 'rad-rounded': '100rem',\n};\n\n// ---------------------------------------------------------------------------\n// Elevation (box-shadow) tokens\n// ---------------------------------------------------------------------------\n\nconst elevationTokens: Record<string, string> = {\n 'elevation-low': '0 2px 8px 0 var(--col-neutral-950--t10)',\n 'elevation-normal': '0 2px 8px 4px var(--col-neutral-950--t10)',\n};\n\n// ---------------------------------------------------------------------------\n// Canonical design token primitives (source of truth)\n// ---------------------------------------------------------------------------\n\nconst canonicalColourPrimitives: Record<string, string> = {\n 'col-neutral-0': 'hsla(0, 0%, 100%, 1)',\n 'col-neutral-0--t0': 'hsla(0, 0%, 100%, 0)',\n 'col-neutral-0--t10': 'hsla(0, 0%, 100%, 0.1)',\n 'col-neutral-0--t25': 'hsla(0, 0%, 100%, 0.25)',\n 'col-neutral-0--t50': 'hsla(0, 0%, 100%, 0.5)',\n 'col-neutral-0--t75': 'hsla(0, 0%, 100%, 0.75)',\n 'col-neutral-0--t90': 'hsla(0, 0%, 100%, 0.9)',\n 'col-neutral-50': 'hsla(180, 5%, 96%, 1)',\n 'col-neutral-100': 'hsla(160, 6%, 90%, 1)',\n 'col-neutral-200': 'hsla(168, 5%, 82%, 1)',\n 'col-neutral-300': 'hsla(168, 6%, 69%, 1)',\n 'col-neutral-400': 'hsla(170, 5%, 53%, 1)',\n 'col-neutral-500': 'hsla(171, 6%, 43%, 1)',\n 'col-neutral-600': 'hsla(174, 5%, 36%, 1)',\n 'col-neutral-700': 'hsla(180, 5%, 31%, 1)',\n 'col-neutral-800': 'hsla(170, 4%, 27%, 1)',\n 'col-neutral-900': 'hsla(170, 6%, 20%, 1)',\n 'col-neutral-950': 'hsla(180, 5%, 10%, 1)',\n 'col-neutral-950--t10': 'hsla(180, 5%, 10%, 0.1)',\n 'col-neutral-950--t25': 'hsla(180, 5%, 10%, 0.25)',\n 'col-neutral-950--t50': 'hsla(180, 5%, 10%, 0.5)',\n 'col-neutral-950--t75': 'hsla(180, 5%, 10%, 0.75)',\n 'col-neutral-950--t90': 'hsla(180, 5%, 10%, 0.9)',\n 'col-green-50': 'hsla(156, 24%, 96%, 1)',\n 'col-green-100': 'hsla(154, 49%, 90%, 1)',\n 'col-green-200': 'hsla(158, 50%, 80%, 1)',\n 'col-green-300': 'hsla(162, 50%, 67%, 1)',\n 'col-green-400': 'hsla(164, 52%, 52%, 1)',\n 'col-green-500': 'hsla(166, 75%, 39%, 1)',\n 'col-green-600': 'hsla(166, 80%, 32%, 1)',\n 'col-green-700': 'hsla(167, 80%, 25%, 1)',\n 'col-green-800': 'hsla(170, 80%, 22%, 1)',\n 'col-green-900': 'hsla(170, 100%, 17%, 1)',\n 'col-green-950': 'hsla(170, 100%, 10%, 1)',\n 'col-green-950--t10': 'hsla(170, 100%, 10%, 0.1)',\n 'col-green-950--t50': 'hsla(170, 100%, 10%, 0.5)',\n 'col-green-950--t75': 'hsla(170, 100%, 10%, 0.75)',\n 'col-green-950--t90': 'hsla(170, 100%, 10%, 0.9)',\n 'col-red-50': 'hsla(7, 60%, 97%, 1)',\n 'col-red-100': 'hsla(7, 81%, 94%, 1)',\n 'col-red-200': 'hsla(5, 80%, 86%, 1)',\n 'col-red-300': 'hsla(5, 90%, 76%, 1)',\n 'col-red-400': 'hsla(5, 90%, 68%, 1)',\n 'col-red-500': 'hsla(5, 88%, 60%, 1)',\n 'col-red-600': 'hsla(5, 80%, 50%, 1)',\n 'col-red-700': 'hsla(5, 80%, 45%, 1)',\n 'col-red-800': 'hsla(5, 70%, 34%, 1)',\n 'col-red-900': 'hsla(5, 70%, 22%, 1)',\n 'col-red-950': 'hsla(5, 70%, 12%, 1)',\n 'col-red-950--t10': 'hsla(5, 70%, 12%, 0.1)',\n 'col-red-950--t50': 'hsla(5, 70%, 12%, 0.5)',\n 'col-red-950--t75': 'hsla(5, 70%, 12%, 0.75)',\n 'col-red-950--t90': 'hsla(5, 70%, 12%, 0.9)',\n 'col-yellow-50': 'hsla(47, 60%, 97%, 1)',\n 'col-yellow-100': 'hsla(50, 81%, 94%, 1)',\n 'col-yellow-200': 'hsla(50, 80%, 86%, 1)',\n 'col-yellow-300': 'hsla(50, 90%, 76%, 1)',\n 'col-yellow-400': 'hsla(50, 90%, 68%, 1)',\n 'col-yellow-500': 'hsla(50, 88%, 60%, 1)',\n 'col-yellow-600': 'hsla(50, 84%, 50%, 1)',\n 'col-yellow-700': 'hsla(44, 84%, 40%, 1)',\n 'col-yellow-800': 'hsla(42, 70%, 30%, 1)',\n 'col-yellow-900': 'hsla(42, 71%, 20%, 1)',\n 'col-yellow-950': 'hsla(42, 69%, 10%, 1)',\n 'col-yellow-950--t10': 'hsla(42, 69%, 10%, 0.1)',\n 'col-yellow-950--t50': 'hsla(42, 69%, 10%, 0.5)',\n 'col-yellow-950--t75': 'hsla(42, 69%, 10%, 0.75)',\n 'col-yellow-950--t90': 'hsla(42, 69%, 10%, 0.9)',\n};\n\nconst canonicalTransitionPrimitives: Record<string, string> = {\n 'trans-timing-light': 'ease-out',\n 'trans-timing-normal': 'ease-out',\n 'trans-timing-heavy': 'ease-in',\n 'trans-duration-snap': '30ms',\n 'trans-duration-normal': '120ms',\n 'trans-duration-slow': '300ms',\n};\n\nconst canonicalTypographyPrimitives: Record<string, string> = {\n 'font-size-fluid-25-32': 'clamp(1.5625rem, 1.4375rem + 0.625vw, 2rem)',\n 'font-size-fluid-48-60': 'clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)',\n 'font-family-primary': '\"Instrument Sans\", sans-serif',\n 'font-family-secondary': \"'Inter', system-ui, sans-serif\",\n 'font-size-s-sm': '1.0625rem',\n 'font-size-s-md': '1.1875rem',\n 'font-size-s-lg-fluid': 'var(--font-size-fluid-25-32)',\n 'font-size-s-xl-fluid': 'var(--font-size-fluid-48-60)',\n 'font-size-t-xs': '0.75rem',\n 'font-size-t-sm': '1rem',\n 'font-size-t-md': '1.125rem',\n 'font-weight-xs': '400',\n 'font-weight-sm': '500',\n 'font-weight-md': '600',\n 'font-weight-lg': '800',\n 'font-line-tight': '1.0',\n 'font-line-normal': '1.2',\n 'font-line-loose': '1.4',\n 'font-ltrspc-xs': '-0.005em',\n 'font-ltrspc-sm': '0.01em',\n 'font-ltrspc-md': '0.02em',\n};\n\n// ---------------------------------------------------------------------------\n// Breakpoints\n// ---------------------------------------------------------------------------\n\nconst screens: Record<string, string> = {\n xs: '0px',\n sm: '600px',\n md: '800px',\n lg: '940px',\n xl: '1440px',\n};\n\n// ---------------------------------------------------------------------------\n// Plugin\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Merge helpers\n// ---------------------------------------------------------------------------\n\nfunction mergeTypography(\n base: Record<string, TypographyDef>,\n overrides: Record<string, Partial<TypographyDef>> | undefined,\n): Record<string, TypographyDef> {\n if (!overrides) return base;\n const merged = { ...base };\n for (const [key, partial] of Object.entries(overrides)) {\n merged[key] = { ...(merged[key] ?? ({} as TypographyDef)), ...partial };\n }\n return merged;\n}\n\nfunction resolvedFontFamilies(options: JiwambePluginOptions | undefined) {\n return {\n primary: options?.fontFamily?.primary ?? fontFamilyPrimary,\n secondary: options?.fontFamily?.secondary ?? fontFamilySecondary,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Plugin\n// ---------------------------------------------------------------------------\n\nconst jiwambePlugin = plugin.withOptions<JiwambePluginOptions | undefined>(\n (options) => {\n return ({ addBase, addUtilities }) => {\n const fonts = resolvedFontFamilies(options);\n const mergedColors = { ...defaultSemanticColors(), ...(options?.colors ?? {}) };\n const mergedSpacing = { ...spacingTokens, ...(options?.spacing ?? {}) };\n const mergedBorderWidth = { ...borderWidthTokens, ...(options?.borderWidth ?? {}) };\n const mergedBorderRadius = { ...borderRadiusTokens, ...(options?.borderRadius ?? {}) };\n const mergedElevation = { ...elevationTokens, ...(options?.elevation ?? {}) };\n const mergedTypography = mergeTypography(typographyTokens, options?.typography);\n\n // -----------------------------------------------------------------\n // 1. Generate CSS custom properties on :root\n // -----------------------------------------------------------------\n\n const cssVars: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(baseColors)) {\n cssVars[`--color-${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedColors)) {\n cssVars[`--color-${key}`] = value;\n }\n // Alias for list marker styling (--col-* naming)\n if (mergedColors['text-secondary']) {\n cssVars['--col-text-secondary'] = mergedColors['text-secondary'];\n }\n for (const [key, value] of Object.entries(mergedSpacing)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedBorderWidth)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedBorderRadius)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedElevation)) {\n cssVars[`--${key}`] = value;\n }\n\n cssVars['--font-family-primary'] = fonts.primary;\n cssVars['--font-family-secondary'] = fonts.secondary;\n\n for (const [key, value] of Object.entries(canonicalColourPrimitives)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(canonicalTransitionPrimitives)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(canonicalTypographyPrimitives)) {\n cssVars[`--${key}`] = value;\n }\n\n addBase({\n ':root': cssVars,\n body: {\n 'text-rendering': 'optimizeLegibility',\n '-webkit-font-smoothing': 'antialiased',\n '-moz-osx-font-smoothing': 'grayscale',\n 'text-size-adjust': 'none',\n '-webkit-text-size-adjust': 'none',\n '-moz-text-size-adjust': 'none',\n 'font-optical-sizing': 'auto',\n },\n });\n\n // -----------------------------------------------------------------\n // 1b. Skeleton shimmer keyframe and utility class\n // -----------------------------------------------------------------\n\n addBase({\n '@keyframes jiwambe-shimmer': {\n '0%': {\n backgroundPosition: '-200% 0',\n },\n '100%': {\n backgroundPosition: '200% 0',\n },\n },\n '.jiwambe-skeleton': {\n backgroundColor: 'var(--col-neutral-100)',\n backgroundImage: [\n 'linear-gradient(',\n ' 90deg,',\n ' var(--col-neutral-100) 25%,',\n ' var(--col-neutral-50) 50%,',\n ' var(--col-neutral-100) 75%',\n ')',\n ].join(''),\n backgroundSize: '200% 100%',\n backgroundRepeat: 'no-repeat',\n animation: 'jiwambe-shimmer 1.5s ease-in-out infinite',\n },\n });\n\n // -----------------------------------------------------------------\n // 1c. List marker base styles\n // -----------------------------------------------------------------\n\n addBase({\n '.jiwambe-list': {\n paddingLeft: 'var(--space-6)',\n margin: '0',\n },\n '.jiwambe-list--unstyled': {\n paddingLeft: '0',\n listStyle: 'none',\n },\n '.jiwambe-list--disc li::marker': {\n color: 'var(--col-text-secondary)',\n },\n '.jiwambe-list--decimal li::marker': {\n color: 'var(--col-text-secondary)',\n fontVariantNumeric: 'tabular-nums',\n },\n '.jiwambe-list--none': {\n listStyle: 'none',\n paddingLeft: '0',\n },\n '.jiwambe-list-item': {\n paddingLeft: 'var(--space-1)',\n },\n '.jiwambe-list-item + .jiwambe-list-item': {\n marginTop: 'var(--space-0)',\n },\n });\n\n // -----------------------------------------------------------------\n // 2. Typography utility classes\n // -----------------------------------------------------------------\n\n const typographyUtilities: Record<string, Record<string, string>> = {};\n\n for (const [name, def] of Object.entries(mergedTypography)) {\n const styles: Record<string, string> = {\n 'font-family': def.fontFamily,\n 'font-size': def.fontSize,\n 'font-weight': def.fontWeight,\n 'line-height': def.lineHeight,\n };\n if (def.letterSpacing) styles['letter-spacing'] = def.letterSpacing;\n if (def.textWrap) styles['text-wrap'] = def.textWrap;\n\n typographyUtilities[`.text-${name}`] = styles;\n }\n\n addUtilities(typographyUtilities);\n };\n },\n (options) => {\n const fonts = resolvedFontFamilies(options);\n const mergedColors = { ...defaultSemanticColors(), ...(options?.colors ?? {}) };\n const mergedSpacing = { ...spacingTokens, ...(options?.spacing ?? {}) };\n const mergedBorderWidth = { ...borderWidthTokens, ...(options?.borderWidth ?? {}) };\n const mergedBorderRadius = { ...borderRadiusTokens, ...(options?.borderRadius ?? {}) };\n const mergedElevation = { ...elevationTokens, ...(options?.elevation ?? {}) };\n\n const allColors: Record<string, string> = {};\n for (const [key, value] of Object.entries(baseColors)) {\n allColors[key] = value;\n }\n for (const [key, value] of Object.entries(mergedColors)) {\n allColors[key] = value;\n }\n\n // Spacing theme: each token maps to var(--token) so utilities use CSS variables.\n // Add short keys for fluid tokens so px-fluid-4-9 works alongside px-space-fluid-4-9.\n const spacingExtension: Record<string, string> = {};\n for (const key of Object.keys(mergedSpacing)) {\n spacingExtension[key] = `var(--${key})`;\n if (key.startsWith('space-fluid-')) {\n const shortKey = key.replace(/^space-/, '');\n spacingExtension[shortKey] = `var(--${key})`;\n }\n }\n\n return {\n theme: {\n screens,\n extend: {\n colors: allColors,\n spacing: spacingExtension,\n borderWidth: mergedBorderWidth,\n borderRadius: mergedBorderRadius,\n boxShadow: mergedElevation,\n fontFamily: {\n primary: [fonts.primary],\n secondary: [fonts.secondary],\n },\n },\n },\n };\n },\n);\n\nexport default jiwambePlugin;\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jiwambe/components",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },