@philosaether/chipper 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +778 -0
  3. package/dist/base.css +1 -0
  4. package/dist/headless.d.ts +16 -0
  5. package/dist/headless.d.ts.map +1 -0
  6. package/dist/headless.js +18 -0
  7. package/dist/index.js +1445 -0
  8. package/dist/src/builder/index.d.ts +82 -0
  9. package/dist/src/builder/index.d.ts.map +1 -0
  10. package/dist/src/builder/predicates.d.ts +18 -0
  11. package/dist/src/builder/predicates.d.ts.map +1 -0
  12. package/dist/src/components/Chip.d.ts +15 -0
  13. package/dist/src/components/Chip.d.ts.map +1 -0
  14. package/dist/src/components/ChipInfoPopup.d.ts +12 -0
  15. package/dist/src/components/ChipInfoPopup.d.ts.map +1 -0
  16. package/dist/src/components/ChipPopup.d.ts +20 -0
  17. package/dist/src/components/ChipPopup.d.ts.map +1 -0
  18. package/dist/src/components/Chipper.d.ts +25 -0
  19. package/dist/src/components/Chipper.d.ts.map +1 -0
  20. package/dist/src/components/Clause.d.ts +13 -0
  21. package/dist/src/components/Clause.d.ts.map +1 -0
  22. package/dist/src/components/Sentence.d.ts +15 -0
  23. package/dist/src/components/Sentence.d.ts.map +1 -0
  24. package/dist/src/components/index.d.ts +12 -0
  25. package/dist/src/components/index.d.ts.map +1 -0
  26. package/dist/src/components/popups/AlternativeCoordinatePopup.d.ts +16 -0
  27. package/dist/src/components/popups/AlternativeCoordinatePopup.d.ts.map +1 -0
  28. package/dist/src/components/popups/KeywordGroupList.d.ts +29 -0
  29. package/dist/src/components/popups/KeywordGroupList.d.ts.map +1 -0
  30. package/dist/src/components/popups/KeywordOrExpressionPopup.d.ts +30 -0
  31. package/dist/src/components/popups/KeywordOrExpressionPopup.d.ts.map +1 -0
  32. package/dist/src/components/popups/MultiSelectPopup.d.ts +20 -0
  33. package/dist/src/components/popups/MultiSelectPopup.d.ts.map +1 -0
  34. package/dist/src/components/popups/NumericInput.d.ts +16 -0
  35. package/dist/src/components/popups/NumericInput.d.ts.map +1 -0
  36. package/dist/src/components/popups/ReferencePopup.d.ts +20 -0
  37. package/dist/src/components/popups/ReferencePopup.d.ts.map +1 -0
  38. package/dist/src/core/actions/set-chip-value.d.ts +17 -0
  39. package/dist/src/core/actions/set-chip-value.d.ts.map +1 -0
  40. package/dist/src/core/actions/set-context.d.ts +18 -0
  41. package/dist/src/core/actions/set-context.d.ts.map +1 -0
  42. package/dist/src/core/actions/set-display-value.d.ts +18 -0
  43. package/dist/src/core/actions/set-display-value.d.ts.map +1 -0
  44. package/dist/src/core/actions/toggle-clause.d.ts +15 -0
  45. package/dist/src/core/actions/toggle-clause.d.ts.map +1 -0
  46. package/dist/src/core/context-resolution.d.ts +36 -0
  47. package/dist/src/core/context-resolution.d.ts.map +1 -0
  48. package/dist/src/core/initialize.d.ts +43 -0
  49. package/dist/src/core/initialize.d.ts.map +1 -0
  50. package/dist/src/core/mode-switching.d.ts +10 -0
  51. package/dist/src/core/mode-switching.d.ts.map +1 -0
  52. package/dist/src/core/reducer.d.ts +16 -0
  53. package/dist/src/core/reducer.d.ts.map +1 -0
  54. package/dist/src/core/resolve-keyword-label.d.ts +7 -0
  55. package/dist/src/core/resolve-keyword-label.d.ts.map +1 -0
  56. package/dist/src/core/serialize.d.ts +34 -0
  57. package/dist/src/core/serialize.d.ts.map +1 -0
  58. package/dist/src/core/state.d.ts +59 -0
  59. package/dist/src/core/state.d.ts.map +1 -0
  60. package/dist/src/core/store.d.ts +23 -0
  61. package/dist/src/core/store.d.ts.map +1 -0
  62. package/dist/src/core/types.d.ts +242 -0
  63. package/dist/src/core/types.d.ts.map +1 -0
  64. package/dist/src/domains/alternative-coordinate.d.ts +110 -0
  65. package/dist/src/domains/alternative-coordinate.d.ts.map +1 -0
  66. package/dist/src/domains/create-domain.d.ts +30 -0
  67. package/dist/src/domains/create-domain.d.ts.map +1 -0
  68. package/dist/src/domains/facades.d.ts +134 -0
  69. package/dist/src/domains/facades.d.ts.map +1 -0
  70. package/dist/src/domains/index.d.ts +14 -0
  71. package/dist/src/domains/index.d.ts.map +1 -0
  72. package/dist/src/domains/keyword-or-expression.d.ts +148 -0
  73. package/dist/src/domains/keyword-or-expression.d.ts.map +1 -0
  74. package/dist/src/domains/multi-select.d.ts +68 -0
  75. package/dist/src/domains/multi-select.d.ts.map +1 -0
  76. package/dist/src/domains/normalize-keywords.d.ts +83 -0
  77. package/dist/src/domains/normalize-keywords.d.ts.map +1 -0
  78. package/dist/src/domains/reference.d.ts +89 -0
  79. package/dist/src/domains/reference.d.ts.map +1 -0
  80. package/dist/src/hooks/SentenceProvider.d.ts +17 -0
  81. package/dist/src/hooks/SentenceProvider.d.ts.map +1 -0
  82. package/dist/src/hooks/context.d.ts +31 -0
  83. package/dist/src/hooks/context.d.ts.map +1 -0
  84. package/dist/src/hooks/index.d.ts +13 -0
  85. package/dist/src/hooks/index.d.ts.map +1 -0
  86. package/dist/src/hooks/useChip.d.ts +21 -0
  87. package/dist/src/hooks/useChip.d.ts.map +1 -0
  88. package/dist/src/hooks/useDisplaySource.d.ts +16 -0
  89. package/dist/src/hooks/useDisplaySource.d.ts.map +1 -0
  90. package/dist/src/hooks/useKeyboardNavigation.d.ts +44 -0
  91. package/dist/src/hooks/useKeyboardNavigation.d.ts.map +1 -0
  92. package/dist/src/hooks/usePopup.d.ts +13 -0
  93. package/dist/src/hooks/usePopup.d.ts.map +1 -0
  94. package/dist/src/hooks/useReferenceDisplay.d.ts +22 -0
  95. package/dist/src/hooks/useReferenceDisplay.d.ts.map +1 -0
  96. package/dist/src/hooks/useSentence.d.ts +14 -0
  97. package/dist/src/hooks/useSentence.d.ts.map +1 -0
  98. package/dist/src/index.d.ts +25 -0
  99. package/dist/src/index.d.ts.map +1 -0
  100. package/dist/src/palette/index.d.ts +29 -0
  101. package/dist/src/palette/index.d.ts.map +1 -0
  102. package/dist/src/themes/apply-theme.d.ts +34 -0
  103. package/dist/src/themes/apply-theme.d.ts.map +1 -0
  104. package/dist/src/themes/create-hue.d.ts +23 -0
  105. package/dist/src/themes/create-hue.d.ts.map +1 -0
  106. package/dist/src/themes/index.d.ts +13 -0
  107. package/dist/src/themes/index.d.ts.map +1 -0
  108. package/dist/src/themes/midnight.d.ts +11 -0
  109. package/dist/src/themes/midnight.d.ts.map +1 -0
  110. package/dist/src/themes/praxis.d.ts +11 -0
  111. package/dist/src/themes/praxis.d.ts.map +1 -0
  112. package/dist/src/themes/terminal.d.ts +9 -0
  113. package/dist/src/themes/terminal.d.ts.map +1 -0
  114. package/dist/src/themes/types.d.ts +72 -0
  115. package/dist/src/themes/types.d.ts.map +1 -0
  116. package/dist/styles.css +1 -0
  117. package/dist/themes/index.js +256 -0
  118. package/dist/themes/midnight.css +1 -0
  119. package/dist/themes/praxis.css +1 -0
  120. package/dist/themes/terminal.css +1 -0
  121. package/dist/usePopup-Of6OHa1_.js +653 -0
  122. package/package.json +75 -0
@@ -0,0 +1,21 @@
1
+ /**
2
+ * useChip — chip-level state access + setValue dispatch.
3
+ *
4
+ * Every Chip component calls this. Returns the chip's current state,
5
+ * its domain (for popup rendering), and a setValue callback that
6
+ * dispatches SET_CHIP_VALUE.
7
+ */
8
+ export declare function useChip(clauseId: string, chipId: string): {
9
+ domain: import("..").Domain<any>;
10
+ chipDefinition: import("..").ChipDefinition;
11
+ setValue: (value: unknown) => void;
12
+ value: unknown;
13
+ displayValue: string;
14
+ valid: boolean;
15
+ dirty: boolean;
16
+ expressionMode?: boolean;
17
+ loading?: boolean;
18
+ error?: string;
19
+ lastUpdated?: number;
20
+ };
21
+ //# sourceMappingURL=useChip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChip.d.ts","sourceRoot":"","sources":["../../../src/hooks/useChip.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;sBAqB5C,OAAO;;;;;;;;;EAYlB"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * useDisplaySource — manages display chip value resolution.
3
+ *
4
+ * Handles all four source strategies:
5
+ * - static: no-op (value set during initialization)
6
+ * - derived: recomputes on sentence state changes, memoized
7
+ * - remote: fetches from URL, optional polling
8
+ * - external: subscribes to consumer-managed data stream
9
+ */
10
+ import type { ChipDefinition, ClauseDefinition } from '../core/types';
11
+ import type { SentenceState } from '../core/state';
12
+ import type { SentenceAction } from '../core/reducer';
13
+ type Dispatch = (action: SentenceAction) => void;
14
+ export declare function useDisplaySource(chipDefinition: ChipDefinition, clauseId: string, state: SentenceState, clauseById: Map<string, ClauseDefinition>, dispatch: Dispatch): void;
15
+ export {};
16
+ //# sourceMappingURL=useDisplaySource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDisplaySource.d.ts","sourceRoot":"","sources":["../../../src/hooks/useDisplaySource.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,KAAK,QAAQ,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;AAEjD,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACzC,QAAQ,EAAE,QAAQ,GACjB,IAAI,CAuDN"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * useKeyboardNavigation — shared keyboard navigation for popup option lists.
3
+ *
4
+ * Manages active-descendant index tracking, arrow/Home/End navigation,
5
+ * Enter/Escape delegation, and mouse hover sync. Used by all popup types.
6
+ *
7
+ * Uses aria-activedescendant pattern (not roving tabindex) so that
8
+ * DOM focus can remain on an input element while arrows navigate options.
9
+ */
10
+ export interface KeyboardNavigationOptions {
11
+ /** Total number of navigable options */
12
+ itemCount: number;
13
+ /** Called when the user presses Enter on the active item */
14
+ onSelect: (index: number) => void;
15
+ /** Called when the user presses Escape */
16
+ onClose: () => void;
17
+ /** Initial active index (-1 = nothing active) */
18
+ initialIndex?: number;
19
+ /** Does selecting an item close the popup? (default true) */
20
+ closeOnSelect?: boolean;
21
+ /** Unique prefix for generating option IDs */
22
+ idPrefix?: string;
23
+ }
24
+ export interface KeyboardNavigationResult {
25
+ /** Currently highlighted option index (-1 = none) */
26
+ activeIndex: number;
27
+ /** Set active index imperatively (e.g., on mouse hover) */
28
+ setActiveIndex: (index: number) => void;
29
+ /** Attach to the popup container's onKeyDown */
30
+ handleKeyDown: (event: React.KeyboardEvent) => void;
31
+ /** Generate props for each option element */
32
+ getOptionProps: (index: number) => {
33
+ id: string;
34
+ role: 'option';
35
+ 'aria-selected': boolean;
36
+ className: string;
37
+ onMouseEnter: () => void;
38
+ onClick: () => void;
39
+ };
40
+ /** The ID of the currently active option (for aria-activedescendant) */
41
+ activeDescendantId: string | undefined;
42
+ }
43
+ export declare function useKeyboardNavigation({ itemCount, onSelect, onClose, initialIndex, closeOnSelect, idPrefix, }: KeyboardNavigationOptions): KeyboardNavigationResult;
44
+ //# sourceMappingURL=useKeyboardNavigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useKeyboardNavigation.d.ts","sourceRoot":"","sources":["../../../src/hooks/useKeyboardNavigation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,yBAAyB;IACxC,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,gDAAgD;IAChD,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;IACpD,6CAA6C;IAC7C,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;QACjC,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,eAAe,EAAE,OAAO,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,IAAI,CAAC;QACzB,OAAO,EAAE,MAAM,IAAI,CAAC;KACrB,CAAC;IACF,wEAAwE;IACxE,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,OAAO,EACP,YAAiB,EACjB,aAAoB,EACpB,QAA2B,GAC5B,EAAE,yBAAyB,GAAG,wBAAwB,CAuGtD"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * usePopup — singleton popup management.
3
+ *
4
+ * Only one chip popup can be open at a time per sentence.
5
+ * Opening a new popup closes the previous one automatically.
6
+ */
7
+ export declare function usePopup(): {
8
+ popup: import("./context").PopupState;
9
+ open: (clauseId: string, chipId: string, anchorElement: HTMLElement) => void;
10
+ close: () => void;
11
+ isOpen: (chipId: string) => boolean;
12
+ };
13
+ //# sourceMappingURL=usePopup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePopup.d.ts","sourceRoot":"","sources":["../../../src/hooks/usePopup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,wBAAgB,QAAQ;;qBAST,MAAM,UAAU,MAAM,iBAAiB,WAAW;;qBAWpD,MAAM;EAKlB"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * useReferenceDisplay — eager display resolution for reference domain chips.
3
+ *
4
+ * On mount, if the chip holds a non-keyword reference ID, calls
5
+ * source.resolveDisplay() to populate the domain's displayCache.
6
+ * Then re-dispatches SET_CHIP_VALUE with the same value to trigger
7
+ * a re-render with the resolved display text.
8
+ *
9
+ * Internal hook — not exported from chipper/headless.
10
+ */
11
+ import type { Domain } from '../core/types';
12
+ /**
13
+ * Resolve display text for a reference chip's current value on mount.
14
+ * No-ops for non-reference domains, empty values, or keyword values.
15
+ */
16
+ export declare function useReferenceDisplay(domain: Domain, value: unknown, clauseId: string, chipId: string, dispatch: React.Dispatch<{
17
+ type: 'SET_CHIP_VALUE';
18
+ clauseId: string;
19
+ chipId: string;
20
+ value: unknown;
21
+ }>): void;
22
+ //# sourceMappingURL=useReferenceDisplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useReferenceDisplay.d.ts","sourceRoot":"","sources":["../../../src/hooks/useReferenceDisplay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,GACrG,IAAI,CAmCN"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * useSentence — sentence-level state access.
3
+ *
4
+ * Returns the full sentence state, dispatch, definition, and resolved domains.
5
+ * Used by components that need the big picture and by other hooks internally.
6
+ */
7
+ export declare function useSentence(): {
8
+ state: import("..").SentenceState;
9
+ dispatch: import("react").Dispatch<import("..").SentenceAction>;
10
+ definition: import("..").SentenceDefinition;
11
+ domains: import("..").ResolvedDomains;
12
+ clauseById: Map<string, import("..").ClauseDefinition>;
13
+ };
14
+ //# sourceMappingURL=useSentence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSentence.d.ts","sourceRoot":"","sources":["../../../src/hooks/useSentence.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,wBAAgB,WAAW;;;;;;EAY1B"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Chipper — Plain-English editing interfaces for complex configuration.
3
+ *
4
+ * Public API surface. Everything exported here is part of the library contract.
5
+ */
6
+ export type { Domain, Keyword, ExpressionMode, ChipMode, DisplaySource, StaticDisplaySource, DerivedDisplaySource, RemoteDisplaySource, ExternalDisplaySource, DisplayConfig, ChipDefinition, TextSegment, ChipSegment, ClauseSegment, ClauseDefinition, ContingencyConfig, ClauseOverrides, RepeatingClauseConfig, LineDefinition, SentenceDefinition, SentenceContext, Palette, ClauseTemplate, } from './core/types';
7
+ export type { ChipState, ClauseState, ContextScope, SentenceState, } from './core/state';
8
+ export type { SentenceStore, ResolvedDomains } from './core/store';
9
+ export { initializeSentenceState } from './core/initialize';
10
+ export { sentenceReducer, type SentenceAction } from './core/reducer';
11
+ export { serialize, deserialize, type SerializedSentence } from './core/serialize';
12
+ export type { SetChipValueAction } from './core/actions/set-chip-value';
13
+ export type { ToggleClauseAction } from './core/actions/toggle-clause';
14
+ export type { SetContextAction } from './core/actions/set-context';
15
+ export type { SetDisplayValueAction } from './core/actions/set-display-value';
16
+ export { textDomain, numberDomain, dateDomain, keywordDomain, type TextDomainConfig, type NumberDomainConfig, type DateDomainConfig, type KeywordDomainConfig, } from './domains';
17
+ export { keywordOrExpressionDomain, expressionDomain, textExpression, numericExpression, dateExpression, type KeywordOrExpressionDomainConfig, type ExpressionDomainConfig, type ExpressionConfig, type ExpressionTrigger, type KeywordConfig, type KeywordGroup, type KeywordGroupItem, type NormalizedKeywordGroup, multiSelectDomain, type MultiSelectDomainConfig, alternativeCoordinateDomain, type AlternativeCoordinateDomainConfig, type AlternativeCoordinateMode, type ModeSlot, referenceDomain, type ReferenceDomainConfig, type ReferenceSource, type ReferenceItem, } from './domains';
18
+ export { createPalette, extendPalette, type PaletteConfig } from './palette';
19
+ export { sentence, builder, chip, repeating } from './builder';
20
+ export type { ClauseBuilder, ChipOptions, TextOptions, PuncOptions } from './builder';
21
+ export { isNumeric, isOneOf } from './builder/predicates';
22
+ export { SentenceProvider, type SentenceProviderProps, useSentence, useChip, usePopup, type SentenceContextValue, type PopupState, } from './hooks';
23
+ export { Chipper, type ChipperProps, Sentence, Clause, type ClauseProps, Chip, type ChipProps, ChipPopup, type ChipPopupProps, KeywordOrExpressionPopup, type KeywordOrExpressionPopupProps, MultiSelectPopup, type MultiSelectPopupProps, AlternativeCoordinatePopup, type AlternativeCoordinatePopupProps, ReferencePopup, type ReferencePopupProps, } from './components';
24
+ export type { ChipperTheme, Hue } from './themes/types';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,MAAM,EACN,OAAO,EACP,cAAc,EACd,QAAQ,EACR,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,OAAO,EACP,cAAc,GACf,MAAM,cAAc,CAAC;AAGtB,YAAY,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,aAAa,GACd,MAAM,cAAc,CAAC;AAGtB,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACnF,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,YAAY,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAG9E,OAAO,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,KAAK,+BAA+B,EACpC,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,iBAAiB,EACjB,KAAK,uBAAuB,EAC5B,2BAA2B,EAC3B,KAAK,iCAAiC,EACtC,KAAK,yBAAyB,EAC9B,KAAK,QAAQ,EACb,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAG7E,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGtF,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,WAAW,EACX,OAAO,EACP,QAAQ,EACR,KAAK,oBAAoB,EACzB,KAAK,UAAU,GAChB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,OAAO,EACP,KAAK,YAAY,EACjB,QAAQ,EACR,MAAM,EACN,KAAK,WAAW,EAChB,IAAI,EACJ,KAAK,SAAS,EACd,SAAS,EACT,KAAK,cAAc,EACnB,wBAAwB,EACxB,KAAK,6BAA6B,EAClC,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,0BAA0B,EAC1B,KAAK,+BAA+B,EACpC,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AAGtB,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Palette creation and extension.
3
+ *
4
+ * The palette is the bridge between Chipper's generic machinery and
5
+ * a consumer application's specific vocabulary. See chipper-architecture.md §3.
6
+ *
7
+ * Consumer-facing API uses { chips, patterns }. Internal Palette type
8
+ * uses { domains, clauseTemplates }. See builder-dx.md §6.
9
+ */
10
+ import type { Domain, ClauseTemplate, Palette } from '../core/types';
11
+ /** Consumer-facing palette config. Maps to internal Palette shape. */
12
+ export interface PaletteConfig {
13
+ /** Named chip domain configurations */
14
+ chips?: Record<string, Domain>;
15
+ /** Named clause patterns (reusable clause templates) */
16
+ patterns?: Record<string, ClauseTemplate>;
17
+ }
18
+ /** The built-in default palette. Extended by consumers via extendPalette(). */
19
+ export declare const chipperPalette: Palette;
20
+ /**
21
+ * Create a palette from scratch. Most consumers should use extendPalette() instead.
22
+ */
23
+ export declare function createPalette(definition: Palette): Palette;
24
+ /**
25
+ * Extend an existing palette with additional chip domains and clause patterns.
26
+ * If no base palette is provided, extends the built-in chipperPalette.
27
+ */
28
+ export declare function extendPalette(baseOrConfig: Palette | PaletteConfig, config?: PaletteConfig): Palette;
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/palette/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAErE,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC3C;AAED,+EAA+E;AAC/E,eAAO,MAAM,cAAc,EAAE,OAG5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAE1D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,OAAO,GAAG,aAAa,EACrC,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAgBT"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Runtime theme switching — applyTheme(), clearTheme(), themeToProperties().
3
+ *
4
+ * Sets CSS custom properties on a container element to override the
5
+ * SCSS cascade. Framework-agnostic — no React dependency.
6
+ */
7
+ import type { ChipperTheme } from './types';
8
+ /**
9
+ * Convert a complete theme to a flat CSS custom property map.
10
+ * Useful for inspection, testing, or custom application logic.
11
+ */
12
+ export declare function themeToProperties(theme: ChipperTheme, hueRoles?: string[]): Record<string, string>;
13
+ export interface ApplyThemeOptions {
14
+ /** DOM element to apply tokens to. Defaults to document.documentElement. */
15
+ container?: HTMLElement;
16
+ /** Hue role names used by the consumer's palette. Enables fallback
17
+ for roles not explicitly defined in the theme. */
18
+ hueRoles?: string[];
19
+ }
20
+ /**
21
+ * Apply a Chipper theme by setting CSS custom properties on a container.
22
+ *
23
+ * Clears the previous theme's tokens first, then applies the new theme.
24
+ * Container defaults to `document.documentElement` (`:root`).
25
+ */
26
+ export declare function applyTheme(theme: ChipperTheme, options?: ApplyThemeOptions): void;
27
+ /**
28
+ * Clear all chipper theme overrides, restoring the SCSS cascade.
29
+ *
30
+ * Equivalent to switching back to the SCSS-compiled default theme (praxis)
31
+ * without needing the praxis theme object.
32
+ */
33
+ export declare function clearTheme(container?: HTMLElement): void;
34
+ //# sourceMappingURL=apply-theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-theme.d.ts","sourceRoot":"","sources":["../../../src/themes/apply-theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAO,MAAM,SAAS,CAAC;AA6DjD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsCxB;AAED,MAAM,WAAW,iBAAiB;IAChC,4EAA4E;IAC5E,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB;yDACqD;IACrD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,IAAI,CAWN;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,WAAW,GAAG,IAAI,CAexD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * createHue — convenience factory for Hue objects.
3
+ *
4
+ * Auto-computes hover by mixing 12% of text into background (same formula
5
+ * as the SASS chip-colors() mixin). Color mixing uses simple sRGB channel
6
+ * interpolation — no external color library needed.
7
+ */
8
+ import type { Hue } from './types';
9
+ /**
10
+ * Create a Hue with auto-computed hover color.
11
+ *
12
+ * Hover is computed by mixing 12% of text into background — the same
13
+ * formula the SASS `chip-colors()` mixin uses.
14
+ *
15
+ * @param name - Hue role name (matches domain's `color` key)
16
+ * @param text - Dark text color (hex)
17
+ * @param background - Pastel background color (hex)
18
+ * @param options - Optional glow color for dark themes
19
+ */
20
+ export declare function createHue(name: string, text: string, background: string, options?: {
21
+ glow?: string;
22
+ }): Hue;
23
+ //# sourceMappingURL=create-hue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-hue.d.ts","sourceRoot":"","sources":["../../../src/themes/create-hue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAgDnC;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1B,GAAG,CAQL"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Chipper themes — runtime theme switching and built-in themes.
3
+ *
4
+ * Entry point for `chipper/themes` package export.
5
+ */
6
+ export type { ChipperTheme, Hue } from './types';
7
+ export { createHue } from './create-hue';
8
+ export { applyTheme, clearTheme, themeToProperties } from './apply-theme';
9
+ export type { ApplyThemeOptions } from './apply-theme';
10
+ export { praxisTheme } from './praxis';
11
+ export { midnightTheme } from './midnight';
12
+ export { terminalTheme } from './terminal';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/themes/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC1E,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Midnight theme — cool dark surfaces, blue accents.
3
+ *
4
+ * Ten hue roles matching praxis's vocabulary, rendered as desaturated
5
+ * cool variants on dark pastel backgrounds. Each hue includes a glow
6
+ * color for the expanded-chip state — neutral shadows disappear on
7
+ * dark backgrounds, so chips glow in their own hue.
8
+ */
9
+ import type { ChipperTheme } from './types';
10
+ export declare const midnightTheme: ChipperTheme;
11
+ //# sourceMappingURL=midnight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"midnight.d.ts","sourceRoot":"","sources":["../../../src/themes/midnight.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,aAAa,EAAE,YAmD3B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Praxis theme — The Alchemist's Folio.
3
+ *
4
+ * Warm parchment surfaces, gold accents, ten classification hues.
5
+ * This is the default theme — SCSS provides these values via the cascade.
6
+ * The JS object enables runtime switching back to praxis after applying
7
+ * another theme, and serves as the reference implementation for theme authors.
8
+ */
9
+ import type { ChipperTheme } from './types';
10
+ export declare const praxisTheme: ChipperTheme;
11
+ //# sourceMappingURL=praxis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"praxis.d.ts","sourceRoot":"","sources":["../../../src/themes/praxis.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,eAAO,MAAM,WAAW,EAAE,YAmDzB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Terminal theme — black surfaces, green everything, monospace font.
3
+ *
4
+ * Single hue with fallback — every domain renders in terminal green
5
+ * regardless of its declared color role.
6
+ */
7
+ import type { ChipperTheme } from './types';
8
+ export declare const terminalTheme: ChipperTheme;
9
+ //# sourceMappingURL=terminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../../src/themes/terminal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,aAAa,EAAE,YAkD3B,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Chipper theme type definitions.
3
+ *
4
+ * A Hue is the minimum color set for a chip domain.
5
+ * A ChipperTheme is a complete visual configuration.
6
+ */
7
+ /** Minimum set of colors needed to fully style a chip of any domain. */
8
+ export interface Hue {
9
+ /** Hue role name — matches the domain's `color` key. */
10
+ readonly name: string;
11
+ /** Dark text color for use on the pastel background. */
12
+ readonly text: string;
13
+ /** Pastel background color. */
14
+ readonly background: string;
15
+ /** Hover background — slightly darker/richer than background. */
16
+ readonly hover: string;
17
+ /**
18
+ * Glow color for expanded/focused state on dark themes.
19
+ * When omitted, components fall back to a neutral shadow.
20
+ */
21
+ readonly glow?: string;
22
+ }
23
+ /** Complete visual configuration for Chipper components. */
24
+ export interface ChipperTheme {
25
+ readonly name: string;
26
+ /** Surface colors. */
27
+ readonly surface: {
28
+ readonly bgPrimary: string;
29
+ readonly bgSecondary: string;
30
+ readonly bgTertiary: string;
31
+ readonly bgElevated: string;
32
+ readonly textPrimary: string;
33
+ readonly textSecondary: string;
34
+ readonly textMuted: string;
35
+ readonly border: string;
36
+ readonly borderSubtle: string;
37
+ };
38
+ /** Accent colors — the primary interactive color family. */
39
+ readonly accent: {
40
+ readonly base: string;
41
+ readonly bright: string;
42
+ readonly dim: string;
43
+ readonly glow: string;
44
+ };
45
+ /** Semantic colors. */
46
+ readonly semantic: {
47
+ readonly success: string;
48
+ readonly warning: string;
49
+ readonly error: string;
50
+ readonly info: string;
51
+ };
52
+ /** Structural tokens. */
53
+ readonly structure: {
54
+ readonly radius: string;
55
+ readonly radiusLarge: string;
56
+ readonly font: string;
57
+ readonly fontMono: string;
58
+ readonly focusRing: string;
59
+ readonly popupShadow: string;
60
+ readonly transition: string;
61
+ };
62
+ /** Chip color hues. Keyed by hue role name. */
63
+ readonly hues: Record<string, Hue>;
64
+ /**
65
+ * Fallback hue name. When a domain references a hue role not in this
66
+ * theme's hues map, this hue is used instead. Defaults to the first
67
+ * hue in the hues map — a misconfigured palette gets "wrong color"
68
+ * rather than "no color."
69
+ */
70
+ readonly fallbackHue?: string;
71
+ }
72
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/themes/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wEAAwE;AACxE,MAAM,WAAW,GAAG;IAClB,wDAAwD;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,sBAAsB;IACtB,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;KAC/B,CAAC;IAEF,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;IAEF,uBAAuB;IACvB,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;IAEF,yBAAyB;IACzB,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;KAC7B,CAAC;IAEF,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEnC;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B"}
@@ -0,0 +1 @@
1
+ :root{--chipper-bg-primary: #f5f5f5;--chipper-bg-secondary: #eeeeee;--chipper-bg-tertiary: #e0e0e0;--chipper-bg-elevated: #ffffff;--chipper-text-primary: #212121;--chipper-text-secondary: #616161;--chipper-text-muted: #9e9e9e;--chipper-border: #bdbdbd;--chipper-border-subtle: rgba(189, 189, 189, 0.4);--chipper-accent: #424242;--chipper-accent-bright: #757575;--chipper-accent-dim: #212121;--chipper-accent-glow: #e0e0e0;--chipper-success: #2e7d32;--chipper-warning: #f57c00;--chipper-error: #c62828;--chipper-info: #1565c0;--chipper-radius: 4px;--chipper-radius-lg: 6px;--chipper-font: inherit;--chipper-font-mono: 'SF Mono', 'Fira Code', 'Fira Mono', Menlo, monospace;--chipper-focus-ring: 0 0 0 2px rgba(66, 66, 66, 0.3);--chipper-popup-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);--chipper-popup-font-size: 0.875rem;--chipper-popup-max-width: 20rem;--chipper-transition: 0.15s}.chipper-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.chipper-sentence{display:flex;flex-direction:column;gap:.25rem}.chipper-line{display:flex;flex-wrap:wrap;align-items:baseline;gap:.25rem}.chipper-line--indent{padding-left:1.5rem}.chipper-clause{display:inline-flex;flex-wrap:wrap;align-items:baseline;gap:.25rem}.chipper-clause__lead,.chipper-clause__text{white-space:nowrap}.chipper-clause__toggle{background:none;border:none;cursor:pointer;padding:0;font-size:.875rem}.chipper-chip{position:relative;display:inline-flex}.chipper-chip-trigger{display:inline-flex;align-items:center;padding:.25rem .5rem;font-size:inherit;line-height:1.2;cursor:pointer}.chipper-chip-trigger--display{cursor:default}.chipper-chip-trigger--loading{cursor:wait}.chipper-chip-info{position:absolute;top:calc(100% + .5rem);left:0;z-index:100;padding:.5rem .75rem;font-size:var(--chipper-popup-font-size, 0.875rem);width:max-content;max-width:var(--chipper-popup-max-width, 20rem)}.chipper-chip-info__caret{position:absolute;top:-6px;left:1rem;width:10px;height:10px;transform:rotate(45deg)}.chipper-popup{position:absolute;top:calc(100% + .5rem);left:0;z-index:100;display:none;max-width:var(--chipper-popup-max-width)}.chipper-popup--open{display:block}.chipper-popup::before{content:"";position:absolute;top:-6px;left:1rem;width:10px;height:10px;transform:rotate(45deg)}.chipper-popup-option{padding:.25rem .5rem;min-height:1.5rem;border:none;background:rgba(0,0,0,0);text-align:left;cursor:pointer}.chipper-koe-popup{display:flex;flex-direction:column;gap:.5rem;min-width:12rem}.chipper-koe-popup__separator{border:none;border-top:1px solid;margin:0}.chipper-koe-popup__input-row{display:flex;align-items:center;gap:.375rem}.chipper-koe-popup__input{width:100%;padding:.375rem .5rem;font-size:inherit}.chipper-koe-popup__keywords{display:flex;flex-wrap:wrap;gap:.375rem}.chipper-koe-popup__keywords--grouped{flex-direction:column;flex-wrap:nowrap}.chipper-keyword-group{display:flex;flex-direction:column;gap:.25rem}.chipper-keyword-group__separator{border:none;border-top:1px solid;margin:0}.chipper-keyword-group__label{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em}.chipper-keyword-group__prefix{white-space:nowrap;align-self:center}.chipper-keyword-group__items--flow{display:flex;flex-wrap:wrap;gap:.375rem}.chipper-keyword-group__items--grid{display:grid;grid-template-columns:repeat(var(--chipper-group-columns, 7), 1fr);gap:.25rem}.chipper-multi-select-popup__keywords{display:flex;flex-wrap:wrap;gap:.375rem}.chipper-multi-select-popup{display:flex;flex-direction:column;gap:.5rem;min-width:12rem}.chipper-multi-select-popup__grid{display:flex;flex-wrap:wrap;gap:.375rem}.chipper-multi-select-popup__grid>*{flex:0 0 auto}.chipper-reference-popup{display:flex;flex-direction:column;gap:.5rem;min-width:14rem}.chipper-reference-popup__keywords{display:flex;flex-wrap:wrap;gap:.375rem}.chipper-reference-popup__breadcrumb{display:flex;align-items:baseline;flex-wrap:wrap;gap:0}.chipper-reference-popup__breadcrumb-segment{background:none;border:none;padding:0;cursor:pointer;font-size:inherit}.chipper-reference-popup__items{display:flex;flex-direction:column;gap:.125rem;max-height:16rem;overflow-y:auto}.chipper-reference-popup__item{display:flex;align-items:center;gap:.25rem}.chipper-reference-popup__item--non-selectable{display:flex;align-items:center;gap:.25rem;width:100%;background:none;border:none;padding:0;cursor:pointer;font-size:inherit;text-align:left}.chipper-reference-popup__item-label{flex:1;padding:.25rem .5rem;min-height:1.5rem;border:1px solid rgba(0,0,0,0);text-align:left;cursor:pointer;font-size:inherit}.chipper-reference-popup__item-label--inert{cursor:default}.chipper-reference-popup__item-drill{background:none;border:1px solid rgba(0,0,0,0);padding:.25rem .375rem;cursor:pointer;font-size:inherit;flex-shrink:0}.chipper-reference-popup__search-row{display:flex}.chipper-reference-popup__search{width:100%;padding:.375rem .5rem;font-size:inherit}.chipper-reference-popup__loading,.chipper-reference-popup__empty{padding:.5rem;text-align:center}.chipper-reference-popup__retry{background:none;border:none;padding:.25rem .5rem;cursor:pointer;font-size:inherit}.chipper-sentence{font-family:var(--chipper-font);color:var(--chipper-text-primary)}.chipper-clause__lead,.chipper-clause__text{color:var(--chipper-text-primary)}.chipper-clause__toggle{color:var(--chipper-text-muted)}.chipper-clause__toggle:hover{color:var(--chipper-accent)}.chipper-clause__toggle:focus-visible{outline:none;color:var(--chipper-accent);box-shadow:var(--chipper-focus-ring)}.chipper-clause--dormant .chipper-clause__text{color:var(--chipper-text-muted);font-style:italic}.chipper-clause__terminator{color:var(--chipper-border)}.chipper-chip-trigger{border:1px solid var(--chip-trigger-color-text, var(--chipper-border));border-radius:.5rem;background:var(--chip-trigger-color-bg, var(--chipper-bg-tertiary));color:var(--chip-trigger-color-text, var(--chipper-text-primary));font-family:var(--chipper-font);transition:all .2s ease}.chipper-chip-trigger:hover{border-color:var(--chip-trigger-color-text, var(--chipper-border));background:var(--chip-trigger-color-hover, var(--chipper-bg-tertiary))}.chipper-chip-trigger:focus-visible{outline:none;border-color:var(--chipper-accent);box-shadow:var(--chipper-focus-ring)}.chipper-chip-trigger--placeholder{border-style:dashed;border-color:var(--chip-trigger-color-text, var(--chipper-border))}.chipper-chip-trigger--expanded{border-color:var(--chip-trigger-color-text, var(--chipper-border));box-shadow:0 4px 12px var(--chip-trigger-color-glow, rgba(0, 0, 0, 0.12)),0 1px 3px rgba(0,0,0,.08)}.chipper-chip-trigger--display{border-color:rgba(0,0,0,0);background:var(--chip-trigger-color-bg, var(--chipper-bg-secondary))}.chipper-chip-trigger--display:hover{background:var(--chip-trigger-color-bg, var(--chipper-bg-secondary))}.chipper-chip-trigger--loading{animation:chipper-pulse 1.5s ease-in-out infinite}.chipper-chip-trigger--error{border-color:var(--chipper-error);border-style:solid}@keyframes chipper-pulse{0%,100%{opacity:1}50%{opacity:.6}}.chipper-chip-info{background:var(--chip-trigger-color-bg, var(--chipper-bg-elevated));border:none;border-radius:.75rem;box-shadow:0 4px 12px var(--chip-trigger-color-glow, rgba(0, 0, 0, 0.12)),0 1px 3px rgba(0,0,0,.08);color:var(--chip-trigger-color-text, var(--chipper-text-secondary))}.chipper-chip-info__caret{background:var(--chip-trigger-color-bg, var(--chipper-bg-elevated))}.chipper-popup{background:var(--chipper-bg-elevated);border:1px solid var(--chipper-border);border-radius:1rem;box-shadow:0 4px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.08);padding:.75rem;font-size:var(--chipper-popup-font-size)}.chipper-popup::before{background:var(--chipper-bg-elevated);border-left:1px solid var(--chipper-border);border-top:1px solid var(--chipper-border)}.chipper-popup-option{border:1px solid rgba(0,0,0,0);border-radius:.5rem;background:var(--chip-trigger-color-bg, var(--chipper-bg-secondary));color:var(--chip-trigger-color-text, var(--chipper-text-primary));font-family:var(--chipper-font);font-size:inherit;transition:all .2s ease}.chipper-popup-option:hover{border-color:var(--chip-trigger-color-text, var(--chipper-accent));background:var(--chip-trigger-color-bg, var(--chipper-accent-glow));color:var(--chip-trigger-color-text, var(--chipper-accent))}.chipper-popup-option--active{border-color:var(--chip-trigger-color-text, var(--chipper-accent));background:var(--chip-trigger-color-bg, var(--chipper-accent-glow));color:var(--chip-trigger-color-text, var(--chipper-accent))}.chipper-popup-option--selected{background:var(--chip-trigger-color-text, var(--chipper-accent));color:var(--chip-trigger-color-bg, var(--chipper-bg-elevated));border-color:var(--chip-trigger-color-text, var(--chipper-accent));font-weight:500}.chipper-popup-option:focus-visible{outline:none;box-shadow:var(--chipper-focus-ring)}.chipper-koe-popup__input{border:1px solid var(--chipper-border);border-radius:.5rem;background:var(--chipper-bg-elevated);color:var(--chipper-text-primary);font-family:var(--chipper-font);transition:border-color .2s ease}.chipper-koe-popup__input:focus{outline:none;border-color:var(--chip-trigger-color-bg, var(--chipper-accent));box-shadow:0 0 0 2px var(--chip-trigger-color-bg, var(--chipper-accent-glow))}.chipper-koe-popup__input::placeholder{color:var(--chipper-text-muted)}.chipper-koe-popup__separator{border-top-color:var(--chipper-border-subtle)}.chipper-keyword-group__separator{border-top-color:var(--chipper-border-subtle)}.chipper-keyword-group__label{color:var(--chipper-text-muted)}.chipper-keyword-group__prefix{color:var(--chipper-text-muted)}.chipper-koe-popup__affix{color:var(--chipper-text-muted);white-space:nowrap}.chipper-numeric-input{display:flex;align-items:center;gap:.25rem}.chipper-numeric-input__button{display:flex;align-items:center;justify-content:center;min-width:1.5rem;min-height:1.5rem;width:2rem;height:2rem;border:1px solid rgba(0,0,0,0);border-radius:.5rem;background:var(--chip-trigger-color-bg, var(--chipper-bg-secondary));color:var(--chip-trigger-color-text, var(--chipper-text-primary));font-family:var(--chipper-font);font-size:1.1em;transition:all .2s ease}.chipper-numeric-input__button:hover:not(:disabled){border-color:var(--chip-trigger-color-text, var(--chipper-accent))}.chipper-numeric-input__button:disabled{opacity:.3}.chipper-numeric-input__value{width:3rem;text-align:center;border:1px solid var(--chipper-border);border-radius:.5rem;background:var(--chipper-bg-elevated);color:var(--chipper-text-primary);font-family:var(--chipper-font-mono, var(--chipper-font));font-size:inherit;padding:.25rem}.chipper-numeric-input__value:focus{outline:none;border-color:var(--chip-trigger-color-bg, var(--chipper-accent));box-shadow:0 0 0 2px var(--chip-trigger-color-bg, var(--chipper-accent-glow))}.chipper-multi-select-popup__keywords{gap:.375rem;padding-bottom:.5rem;border-bottom:1px solid var(--chipper-border-subtle);margin-bottom:.5rem}.chipper-multi-select-popup__grid{gap:.375rem}.chipper-multi-select-popup__grid .chipper-popup-option:disabled{opacity:.4}.chipper-alt-coord-popup__tabs{display:flex;gap:0;border-bottom:1px solid var(--chipper-border-subtle);margin-bottom:.5rem}.chipper-alt-coord-popup__tab{border:none;border-bottom:2px solid rgba(0,0,0,0);background:none;color:var(--chipper-text-muted);font-family:var(--chipper-font);font-size:inherit;min-height:1.5rem;padding:.375rem .75rem;transition:all .2s ease}.chipper-alt-coord-popup__tab:hover{color:var(--chipper-text-primary)}.chipper-alt-coord-popup__tab:focus-visible{outline:none;box-shadow:var(--chipper-focus-ring)}.chipper-alt-coord-popup__tab--active{color:var(--chipper-text-primary);border-bottom-color:var(--chipper-accent);font-weight:500}.chipper-alt-coord-popup__slot{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem;padding-bottom:.375rem}.chipper-alt-coord-popup__slot:not(:last-child){border-bottom:1px solid var(--chipper-border-subtle);margin-bottom:.375rem}.chipper-alt-coord-popup__slot-prefix{color:var(--chipper-text-muted);font-style:italic}.chipper-alt-coord-popup__slot-keywords{display:flex;flex-wrap:wrap;gap:.375rem}.chipper-alt-coord-popup__expression{margin-top:.5rem;padding-top:.5rem;border-top:1px solid var(--chipper-border-subtle)}.chipper-reference-popup__keywords{padding-bottom:.5rem;border-bottom:1px solid var(--chipper-border-subtle)}.chipper-reference-popup__breadcrumb{color:var(--chipper-text-muted);font-size:.8125em;padding-bottom:.375rem;border-bottom:1px solid var(--chipper-border-subtle)}.chipper-reference-popup__breadcrumb-segment{color:var(--chipper-accent);font-family:var(--chipper-font);transition:color .2s ease}.chipper-reference-popup__breadcrumb-segment:hover{color:var(--chipper-accent-bright, var(--chipper-accent));text-decoration:underline}.chipper-reference-popup__breadcrumb-separator{color:var(--chipper-text-muted);padding:0 .375rem}.chipper-reference-popup__breadcrumb-current{color:var(--chipper-text-primary);font-weight:500}.chipper-reference-popup__item-label{border-radius:.375rem;background:var(--chip-trigger-color-bg, var(--chipper-bg-secondary));color:var(--chip-trigger-color-text, var(--chipper-text-primary));font-family:var(--chipper-font);transition:all .15s ease}.chipper-reference-popup__item-label:hover{border-color:var(--chip-trigger-color-text, var(--chipper-accent))}.chipper-reference-popup__item-label--selected{background:var(--chip-trigger-color-text, var(--chipper-accent));color:var(--chip-trigger-color-bg, var(--chipper-bg-elevated));font-weight:500}.chipper-reference-popup__item-label--inert{background:rgba(0,0,0,0);color:var(--chipper-text-muted);cursor:default}.chipper-reference-popup__item-label--inert:hover{border-color:rgba(0,0,0,0)}.chipper-reference-popup__item-drill{color:var(--chipper-text-muted);font-family:var(--chipper-font);border-radius:.375rem;transition:all .15s ease}.chipper-reference-popup__item-drill:hover{color:var(--chip-trigger-color-text, var(--chipper-text-primary));border-color:var(--chip-trigger-color-text, var(--chipper-border))}.chipper-reference-popup__item--non-selectable.chipper-popup-option{border-radius:.375rem;font-family:var(--chipper-font);color:var(--chip-trigger-color-text, var(--chipper-text-primary));background:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);transition:all .15s ease}.chipper-reference-popup__item--non-selectable.chipper-popup-option:hover,.chipper-reference-popup__item--non-selectable.chipper-popup-option.chipper-popup-option--active{background:rgba(0,0,0,0);border-color:var(--chip-trigger-color-text, var(--chipper-border));color:var(--chip-trigger-color-text, var(--chipper-text-primary))}.chipper-reference-popup__item--non-selectable.chipper-popup-option .chipper-reference-popup__item-label{background:rgba(0,0,0,0);color:inherit;border-color:rgba(0,0,0,0)}.chipper-reference-popup__search{border:1px solid var(--chipper-border);border-radius:.5rem;background:var(--chipper-bg-elevated);color:var(--chipper-text-primary);font-family:var(--chipper-font);transition:border-color .2s ease}.chipper-reference-popup__search:focus{outline:none;border-color:var(--chip-trigger-color-bg, var(--chipper-accent));box-shadow:0 0 0 2px var(--chip-trigger-color-bg, var(--chipper-accent-glow))}.chipper-reference-popup__search::placeholder{color:var(--chipper-text-muted)}.chipper-reference-popup__loading{color:var(--chipper-text-muted);font-style:italic}.chipper-reference-popup__empty{color:var(--chipper-text-muted)}.chipper-reference-popup__retry{color:var(--chipper-accent);font-family:var(--chipper-font);text-decoration:underline}.chipper-reference-popup__retry:hover{color:var(--chipper-accent-bright, var(--chipper-accent))}:root{--chipper-bg-primary: #fbf9f5;--chipper-bg-secondary: #f5f3ef;--chipper-bg-tertiary: #ebe8e2;--chipper-bg-elevated: #ffffff;--chipper-text-primary: #1b1c1a;--chipper-text-secondary: #4a4a48;--chipper-text-muted: #726f6c;--chipper-border: #d0c5af;--chipper-border-subtle: rgba(208, 197, 175, 0.4);--chipper-accent: #735c00;--chipper-accent-bright: #d4af37;--chipper-accent-dim: #5a4700;--chipper-accent-glow: #f7e1a6;--chipper-success: #2e7d32;--chipper-warning: #f57c00;--chipper-error: #8c0d27;--chipper-info: #1565c0;--chipper-color-gold-text: #8a5a00;--chipper-color-gold-bg: #ffecd0;--chipper-color-gold-hover: rgb(241, 218, 183);--chipper-color-plum-text: #5c3d7a;--chipper-color-plum-bg: #e8daef;--chipper-color-plum-hover: rgb(215, 199, 225);--chipper-color-copper-text: #8f5a28;--chipper-color-copper-bg: #fde8d4;--chipper-color-copper-hover: rgb(240, 215, 191);--chipper-color-sage-text: #2e5a30;--chipper-color-sage-bg: #d4edda;--chipper-color-sage-hover: rgb(192, 219, 198);--chipper-color-slate-text: #2a5082;--chipper-color-slate-bg: #d6e5f5;--chipper-color-slate-hover: rgb(193, 211, 231);--chipper-color-stone-text: #6b5e4f;--chipper-color-stone-bg: #e8e4dc;--chipper-color-stone-hover: rgb(217, 212, 203);--chipper-color-teal-text: #246e67;--chipper-color-teal-bg: #d6f0ee;--chipper-color-teal-hover: rgb(193, 224, 222);--chipper-color-rose-text: #994d5a;--chipper-color-rose-bg: #f5dfe0;--chipper-color-rose-hover: rgb(234, 205, 208);--chipper-color-umber-text: #736130;--chipper-color-umber-bg: #f5ecd6;--chipper-color-umber-hover: rgb(229, 219, 194);--chipper-color-indigo-text: #3d4a8c;--chipper-color-indigo-bg: #dfe3f5;--chipper-color-indigo-hover: rgb(204, 209, 232);--chipper-focus-ring: 0 0 0 2px rgba(115, 92, 0, 0.3)}