@kolkrabbi/kol-component 0.25.0 → 0.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/package.json +1 -1
  2. package/src/{molecules → atoms}/ColorSwatch.jsx +1 -1
  3. package/src/{molecules → atoms}/Image.jsx +1 -1
  4. package/src/atoms/Popover.jsx +4 -1
  5. package/src/hooks/glyphLadders.js +15 -0
  6. package/src/index.js +21 -21
  7. package/src/molecules/Accordion.jsx +0 -3
  8. package/src/{organisms → molecules}/BentoCard.jsx +1 -1
  9. package/src/molecules/ButtonGroup.jsx +0 -2
  10. package/src/molecules/CodeBlock.jsx +0 -4
  11. package/src/molecules/ColorInputRow.jsx +1 -1
  12. package/src/molecules/ColorRamp.jsx +1 -1
  13. package/src/{atoms → molecules}/DocsToc.jsx +0 -4
  14. package/src/molecules/Dropdown.jsx +24 -31
  15. package/src/{atoms → molecules}/FullscreenOverlay.jsx +1 -1
  16. package/src/molecules/ImageBlock.jsx +1 -1
  17. package/src/{organisms → molecules}/LoaderOverlay.jsx +1 -1
  18. package/src/molecules/PropertyInput.jsx +1 -1
  19. package/src/molecules/SwatchControls.jsx +1 -6
  20. package/src/organisms/FeaturedCarousel.jsx +1 -1
  21. package/src/{molecules → organisms}/FramedMediaBand.jsx +1 -1
  22. package/src/organisms/FullBleedHero.jsx +1 -1
  23. package/src/organisms/GalleryCarousel.jsx +1 -1
  24. package/src/organisms/MediaLibrary.jsx +1 -1
  25. package/src/organisms/MediaViewer.jsx +1 -1
  26. package/src/organisms/RecordManager.jsx +1 -1
  27. package/src/{molecules → organisms}/ShellSearchOverlay.jsx +1 -1
  28. package/src/organisms/SpectrumGrid.jsx +1 -1
  29. package/src/organisms/Table.jsx +2 -1
  30. /package/src/{organisms → atoms}/AsciiCursor.jsx +0 -0
  31. /package/src/{molecules → atoms}/PaletteHarmonyWheel.jsx +0 -0
  32. /package/src/{molecules → atoms}/SelectionOverlay.jsx +0 -0
  33. /package/src/{organisms → molecules}/Carousel.jsx +0 -0
  34. /package/src/{atoms → molecules}/DropdownTagFilter.jsx +0 -0
  35. /package/src/{organisms → molecules}/ErrorBoundary.jsx +0 -0
  36. /package/src/{atoms → molecules}/LabeledControl.jsx +0 -0
  37. /package/src/{atoms → molecules}/QuantityInput.jsx +0 -0
  38. /package/src/{atoms → molecules}/SearchInput.jsx +0 -0
  39. /package/src/{atoms → molecules}/Section.jsx +0 -0
  40. /package/src/{atoms → molecules}/Stepper.jsx +0 -0
  41. /package/src/{molecules → organisms}/SpectrumControls.jsx +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-component",
3
- "version": "0.25.0",
3
+ "version": "0.26.1",
4
4
  "description": "KOL design-system components — atoms through organisms, emitting canonical kol-* classes. Pairs with @kolkrabbi/kol-theme for styling.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -34,7 +34,7 @@
34
34
  * onClick — if provided, renders as <button>; else <span>.
35
35
  * title — passes through.
36
36
  */
37
- import TransparentX from '../atoms/TransparentX'
37
+ import TransparentX from './TransparentX'
38
38
 
39
39
  const SIZE_CLASSES = {
40
40
  fill: 'w-full aspect-square',
@@ -6,7 +6,7 @@
6
6
  * visible at its intended size (aspect-ratio preserved).
7
7
  */
8
8
  import { useState } from 'react'
9
- import AssetPlaceholder from '../atoms/AssetPlaceholder'
9
+ import AssetPlaceholder from './AssetPlaceholder'
10
10
 
11
11
  export default function Image({
12
12
  src,
@@ -68,8 +68,11 @@ export function usePopover({
68
68
  middleware.push(
69
69
  sizeMw({
70
70
  apply({ rects, elements }) {
71
+ /* EXACT width, not a floor (2026-08-09) — "one piece means one
72
+ * width": with minWidth alone, a wide row let the panel outgrow the
73
+ * trigger it claims to continue. Sole consumer is Dropdown. */
71
74
  Object.assign(elements.floating.style, {
72
- minWidth: `${rects.reference.width}px`,
75
+ width: `${rects.reference.width}px`,
73
76
  })
74
77
  },
75
78
  })
@@ -29,6 +29,16 @@ export const SOLO = { sm: 16, md: 20, lg: 24 }
29
29
  /** Icon beside a label, inside the rung's line box. */
30
30
  export const ADJACENT = { sm: 14, md: 16, lg: 18 }
31
31
 
32
+ /**
33
+ * Indicator glyph — a caret/chevron that DECORATES a control rather than
34
+ * naming it (a dropdown caret, a sort arrow). Pairs 1:1 with the control's
35
+ * mono text rung, one step under ADJACENT: an indicator never outweighs the
36
+ * label it points at. Promoted 2026-08-09 — Table's sort chevron and
37
+ * Dropdown's caret each hand-typed their number (Dropdown took the ADJACENT
38
+ * rung, the oversize the user called): two transcriptions, the folklore
39
+ * threshold. */
40
+ export const INDICATOR = { sm: 12, md: 14, lg: 16 }
41
+
32
42
  /**
33
43
  * Resolve a glyph size. `solo` picks the ladder; `size` indexes it.
34
44
  * Falls back to the md rung so an unknown size never yields undefined.
@@ -37,3 +47,8 @@ export function glyphSize(size, solo = false) {
37
47
  const ladder = solo ? SOLO : ADJACENT
38
48
  return ladder[size] ?? ladder.md
39
49
  }
50
+
51
+ /** Resolve an indicator size. Separate helper — `solo` never applies. */
52
+ export function indicatorSize(size) {
53
+ return INDICATOR[size] ?? INDICATOR.md
54
+ }
package/src/index.js CHANGED
@@ -25,28 +25,28 @@ export { default as Button } from './atoms/Button.jsx'
25
25
  export { default as CopyButton } from './atoms/CopyButton.jsx'
26
26
  export { default as CurveOverlay } from './atoms/CurveOverlay.jsx'
27
27
  export { default as Divider } from './atoms/Divider.jsx'
28
- export { default as DocsToc } from './atoms/DocsToc.jsx'
29
- export { default as DropdownTagFilter } from './atoms/DropdownTagFilter.jsx'
28
+ export { default as DocsToc } from './molecules/DocsToc.jsx'
29
+ export { default as DropdownTagFilter } from './molecules/DropdownTagFilter.jsx'
30
30
  export { default as EmptyState } from './atoms/EmptyState.jsx'
31
31
  export { default as IconFrame } from './atoms/IconFrame.jsx'
32
32
  export { default as ExitPreview } from './atoms/ExitPreview.jsx'
33
33
  export { default as Figure } from './atoms/Figure.jsx'
34
- export { default as FullscreenOverlay } from './atoms/FullscreenOverlay.jsx'
34
+ export { default as FullscreenOverlay } from './molecules/FullscreenOverlay.jsx'
35
35
  export { default as HlsVideo } from './atoms/HlsVideo.jsx'
36
36
  export { default as Input } from './atoms/Input.jsx'
37
37
  export { default as Label } from './atoms/Label.jsx'
38
- export { default as LabeledControl } from './atoms/LabeledControl.jsx'
38
+ export { default as LabeledControl } from './molecules/LabeledControl.jsx'
39
39
  export { default as OverlayGlassPanel } from './atoms/OverlayGlassPanel.jsx'
40
40
  export { default as Pill } from './atoms/Pill.jsx'
41
41
  export { usePopover, PopoverPanel, Tooltip } from './atoms/Popover.jsx'
42
42
  export { default as ProsePreview } from './atoms/ProsePreview.jsx'
43
- export { default as QuantityInput } from './atoms/QuantityInput.jsx'
43
+ export { default as QuantityInput } from './molecules/QuantityInput.jsx'
44
44
  export { default as RotaryDial } from './atoms/RotaryDial.jsx'
45
- export { default as SearchInput } from './atoms/SearchInput.jsx'
46
- export { default as Section } from './atoms/Section.jsx'
45
+ export { default as SearchInput } from './molecules/SearchInput.jsx'
46
+ export { default as Section } from './molecules/Section.jsx'
47
47
  export { default as SectionLabel } from './atoms/SectionLabel.jsx'
48
48
  export { default as SegmentedToggle } from './atoms/SegmentedToggle.jsx'
49
- export { default as Stepper } from './atoms/Stepper.jsx'
49
+ export { default as Stepper } from './molecules/Stepper.jsx'
50
50
  export { default as Tag } from './atoms/Tag.jsx'
51
51
  export { default as Textarea } from './atoms/Textarea.jsx'
52
52
  export { default as ToggleBracket } from './atoms/ToggleBracket.jsx'
@@ -63,30 +63,30 @@ export { default as ButtonGroup } from './molecules/ButtonGroup.jsx'
63
63
  export { default as AlignmentGrid } from './molecules/AlignmentGrid.jsx'
64
64
  export { default as ImageBlock } from './molecules/ImageBlock.jsx'
65
65
  export { default as InteractiveImage } from './atoms/InteractiveImage.jsx'
66
- export { default as SelectionOverlay } from './molecules/SelectionOverlay.jsx'
66
+ export { default as SelectionOverlay } from './atoms/SelectionOverlay.jsx'
67
67
  export { default as VideoBlock, getEmbedUrl } from './molecules/VideoBlock.jsx'
68
68
  export { default as CardFeatureItem } from './molecules/CardFeatureItem.jsx'
69
69
  export { default as CodeBlock } from './molecules/CodeBlock.jsx'
70
70
  export { default as ColorInputRow } from './molecules/ColorInputRow.jsx'
71
71
  export { default as ColorRamp } from './molecules/ColorRamp.jsx'
72
- export { default as ColorSwatch } from './molecules/ColorSwatch.jsx'
72
+ export { default as ColorSwatch } from './atoms/ColorSwatch.jsx'
73
73
  export { default as Dropdown } from './molecules/Dropdown.jsx'
74
74
  export { default as FieldRow, StatusChip } from './molecules/FieldRow.jsx'
75
- export { default as FramedMediaBand } from './molecules/FramedMediaBand.jsx'
76
- export { default as Image } from './molecules/Image.jsx'
75
+ export { default as FramedMediaBand } from './organisms/FramedMediaBand.jsx'
76
+ export { default as Image } from './atoms/Image.jsx'
77
77
  export { default as MediaCard } from './molecules/MediaCard.jsx'
78
78
  export { default as MediaRow } from './molecules/MediaRow.jsx'
79
79
  export { MenuItem, MenuDropdownItem, MenuDropdownDivider, MenuDropdownNest } from './molecules/MenuItem.jsx'
80
80
  export { MenuPopover } from './molecules/MenuPopover.jsx'
81
81
  export { ModalProvider, useModal } from './molecules/Modal.jsx'
82
- export { default as PaletteHarmonyWheel } from './molecules/PaletteHarmonyWheel.jsx'
82
+ export { default as PaletteHarmonyWheel } from './atoms/PaletteHarmonyWheel.jsx'
83
83
  export { default as PropertyInput } from './molecules/PropertyInput.jsx'
84
84
  export { default as ShapeDropdown } from './molecules/ShapeDropdown.jsx'
85
85
  export { default as ShellDrawer } from './molecules/ShellDrawer.jsx'
86
- export { default as ShellSearchOverlay } from './molecules/ShellSearchOverlay.jsx'
86
+ export { default as ShellSearchOverlay } from './organisms/ShellSearchOverlay.jsx'
87
87
  export { default as Slider } from './molecules/Slider.jsx'
88
88
  export { default as SpecList } from './molecules/SpecList.jsx'
89
- export { default as SpectrumControls, HueStrip, SBSquare, WheelTriangle } from './molecules/SpectrumControls.jsx'
89
+ export { default as SpectrumControls, HueStrip, SBSquare, WheelTriangle } from './organisms/SpectrumControls.jsx'
90
90
  export { default as SplitToolButton } from './molecules/SplitToolButton.jsx'
91
91
  export { default as SwatchControls, SwatchStack, EyedropPick } from './molecules/SwatchControls.jsx'
92
92
  export { default as TabsRow } from './molecules/TabsRow.jsx'
@@ -98,18 +98,18 @@ export { default as TabsRow } from './molecules/TabsRow.jsx'
98
98
  export { default as Canvas, CanvasFrame, PanViewport, CANVAS_VIRTUAL_W, DEFAULT_ASPECTS, CANVAS_DEFAULTS } from './organisms/Canvas.jsx'
99
99
  export { default as EditorShell } from './organisms/EditorShell.jsx'
100
100
  export { default as GalleryCarousel } from './organisms/GalleryCarousel.jsx'
101
- export { default as AsciiCursor } from './organisms/AsciiCursor.jsx'
102
- export { default as BentoCard } from './organisms/BentoCard.jsx'
103
- export { default as Carousel } from './organisms/Carousel.jsx'
101
+ export { default as AsciiCursor } from './atoms/AsciiCursor.jsx'
102
+ export { default as BentoCard } from './molecules/BentoCard.jsx'
103
+ export { default as Carousel } from './molecules/Carousel.jsx'
104
104
  export { default as ContentFilters } from './organisms/ContentFilters.jsx'
105
105
  export { default as CtaGlobal } from './organisms/CtaGlobal.jsx'
106
- export { default as ErrorBoundary } from './organisms/ErrorBoundary.jsx'
106
+ export { default as ErrorBoundary } from './molecules/ErrorBoundary.jsx'
107
107
  export { default as FeatureSplit } from './organisms/FeatureSplit.jsx'
108
108
  export { default as FeaturedCarousel } from './organisms/FeaturedCarousel.jsx'
109
109
  export { default as FeaturesCardSection } from './organisms/FeaturesCardSection.jsx'
110
110
  export { default as FoundryCTA } from './organisms/FoundryCTA.jsx'
111
111
  export { default as FullBleedHero } from './organisms/FullBleedHero.jsx'
112
- export { default as LoaderOverlay } from './organisms/LoaderOverlay.jsx'
112
+ export { default as LoaderOverlay } from './molecules/LoaderOverlay.jsx'
113
113
  export { default as MediaLibrary, MediaLibraryProvider, useMediaLibrary, MediaPicker, MediaBrowser } from './organisms/MediaLibrary.jsx'
114
114
  export { default as MediaTileGallery } from './organisms/MediaTileGallery.jsx'
115
115
  export { default as MediaViewer } from './organisms/MediaViewer.jsx'
@@ -131,7 +131,7 @@ export { GRAPHIC_RAW } from './graphics/graphicData.js'
131
131
  * took `20`, and neither could reference the rule it was meant to follow.
132
132
  * Cross-package imports go through the `@kolkrabbi/*` specifier (ARCHITECTURE
133
133
  * §3), so an export is the only way another package can obey the ladder. */
134
- export { SOLO, ADJACENT, glyphSize } from './hooks/glyphLadders.js'
134
+ export { SOLO, ADJACENT, INDICATOR, glyphSize, indicatorSize } from './hooks/glyphLadders.js'
135
135
 
136
136
  // hooks
137
137
  export { default as usePrefersReducedMotion } from './hooks/usePrefersReducedMotion.js'
@@ -1,9 +1,6 @@
1
1
  /**
2
2
  * Accordion — collapsible panel group.
3
3
  *
4
- * taxonomy-ok: molecule — Accordion nests AccordionPanel in this same file,
5
- * which the import-based validator can't see.
6
- *
7
4
  * Composition-based: <Accordion> wraps <AccordionPanel> children. Each panel
8
5
  * owns its open/closed state independently (additive — multiple can be open).
9
6
  * For single-open behavior, manage state from the parent and pass controlled
@@ -3,7 +3,7 @@ import { motion } from 'framer-motion'
3
3
  import HlsVideo from '../atoms/HlsVideo.jsx'
4
4
  import AssetPlaceholder from '../atoms/AssetPlaceholder.jsx'
5
5
  import Button from '../atoms/Button.jsx'
6
- import Image from '../molecules/Image.jsx'
6
+ import Image from '../atoms/Image.jsx'
7
7
  import useTilt from '../hooks/useTilt.js'
8
8
  import usePrefersReducedMotion from '../hooks/usePrefersReducedMotion.js'
9
9
 
@@ -1,5 +1,3 @@
1
- /* taxonomy-ok: composes consumer-passed Buttons via children — nesting happens at the call site */
2
-
3
1
  /**
4
2
  * ButtonGroup — responsive layout wrapper for a group of Buttons: stacked
5
3
  * full-width on mobile, horizontal row from `sm` up, aligned left / center /
@@ -3,10 +3,6 @@ import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'
3
3
  import { oneDark } from 'react-syntax-highlighter/dist/esm/styles/prism'
4
4
  import { Icon } from '@kolkrabbi/kol-icons'
5
5
 
6
- /* taxonomy-ok: molecule — nests <Icon> from @kolkrabbi/kol-icons (the copy
7
- * affordance). The gate only counts kol-component nesting, so a molecule whose
8
- * only KOL child lives in a sibling package reads as an atom to it. */
9
-
10
6
  /**
11
7
  * CodeBlock — REPLICATED from the elder reference
12
8
  * (kol-website/packages/ui/src/molecules/CodeBlock.jsx, 2026-07-28 user
@@ -1,6 +1,6 @@
1
1
  import { useState } from 'react'
2
2
  import { Icon } from '@kolkrabbi/kol-icons'
3
- import ColorSwatch from './ColorSwatch'
3
+ import ColorSwatch from '../atoms/ColorSwatch'
4
4
  import Input from '../atoms/Input'
5
5
  import { usePopover, PopoverPanel } from '../atoms/Popover'
6
6
 
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useState } from 'react'
2
- import ColorSwatch from './ColorSwatch.jsx'
2
+ import ColorSwatch from '../atoms/ColorSwatch.jsx'
3
3
  import { resolveCssVar, isLight } from '../hooks/cssVar.js'
4
4
 
5
5
  /**
@@ -1,9 +1,5 @@
1
1
  import useScrollSpy from '../hooks/useScrollSpy.js'
2
2
 
3
- /* taxonomy-ok: atoms despite being interactive — it composes only the
4
- * useScrollSpy hook, and hooks don't count as nesting; no KOL component
5
- * is rendered (nav + anchors only). */
6
-
7
3
  /**
8
4
  * DocsToc — on-page table of contents for long docs pages: a flat list of
9
5
  * anchor links that highlights the heading currently in view. The scroll
@@ -1,7 +1,8 @@
1
- import { useEffect, useState } from 'react'
1
+ import { useState } from 'react'
2
2
  import { Icon } from '@kolkrabbi/kol-icons'
3
3
  import { MenuDropdownItem } from './MenuItem.jsx'
4
4
  import { PopoverPanel, usePopover } from '../atoms/Popover.jsx'
5
+ import { indicatorSize } from '../hooks/glyphLadders.js'
5
6
 
6
7
  /**
7
8
  * Dropdown — trigger IS button chrome (2026-07-08 chrome law).
@@ -28,7 +29,10 @@ import { PopoverPanel, usePopover } from '../atoms/Popover.jsx'
28
29
  */
29
30
 
30
31
  const SIZE_TYPE = { sm: 'kol-mono-12', md: 'kol-mono-14', lg: 'kol-mono-16' }
31
- const ICON_SIZE = { sm: 14, md: 16, lg: 18 }
32
+ /* Caret size comes from the INDICATOR ladder (glyphLadders.js) the private
33
+ * map that lived here was a transcription of ADJACENT, which is the wrong
34
+ * ladder for a decoration: it put a caret one rung HEAVIER than the label
35
+ * beside it (2026-08-09 user call). */
32
36
 
33
37
  const LEGACY_VARIANTS = { default: 'primary', subtle: 'primary', minimal: 'outline' }
34
38
 
@@ -42,7 +46,6 @@ const Dropdown = ({
42
46
  className = ''
43
47
  }) => {
44
48
  const [isOpen, setIsOpen] = useState(defaultOpen)
45
- const [dropdownWidth, setDropdownWidth] = useState('100px')
46
49
 
47
50
  // sm everywhere unless explicitly overridden (see docblock size law).
48
51
  const resolvedSize = size || 'sm'
@@ -63,23 +66,11 @@ const Dropdown = ({
63
66
  role: 'listbox',
64
67
  })
65
68
 
66
- // Width management 100px mobile, 140px tablet, 180px desktop
67
- useEffect(() => {
68
- const updateWidth = () => {
69
- if (typeof window === 'undefined') return
70
-
71
- if (window.innerWidth >= 1024) {
72
- setDropdownWidth('180px')
73
- } else if (window.innerWidth >= 768) {
74
- setDropdownWidth('140px')
75
- } else {
76
- setDropdownWidth('100px')
77
- }
78
- }
79
- updateWidth()
80
- window.addEventListener('resize', updateWidth)
81
- return () => window.removeEventListener('resize', updateWidth)
82
- }, [])
69
+ /* Width belongs to the CALL SITE (2026-08-09 user call — "width without any
70
+ * regard to context"). The viewport-keyed resize listener that handed every
71
+ * dropdown a fixed width by window size is gone: default is hug-content,
72
+ * and the consumer sizes it through className exactly as on Input. The open
73
+ * panel follows the trigger via matchReferenceWidth either way. */
83
74
 
84
75
  const handleSelect = (option) => {
85
76
  onChange?.(option.value)
@@ -100,15 +91,7 @@ const Dropdown = ({
100
91
  ].filter(Boolean).join(' ')
101
92
 
102
93
  return (
103
- <div
104
- className={`relative block ${className}`}
105
- style={{
106
- ...(dropdownWidth && !className.includes('w-full') && {
107
- width: dropdownWidth,
108
- minWidth: dropdownWidth
109
- })
110
- }}
111
- >
94
+ <div className={`relative inline-block align-middle ${className}`}>
112
95
  <button
113
96
  ref={popover.refs.setReference}
114
97
  {...popover.getReferenceProps()}
@@ -118,10 +101,20 @@ const Dropdown = ({
118
101
  aria-expanded={isOpen}
119
102
  data-state={isOpen ? 'open' : 'closed'}
120
103
  >
121
- <span>{currentOption?.label}</span>
104
+ {/* every option's label rides along hidden so the trigger is as wide
105
+ * as its widest value — the panel matches the trigger's width, so
106
+ * trigger and list stay one piece at every selection */}
107
+ <span className="kol-dd-label">
108
+ <span>{currentOption?.label}</span>
109
+ {options.map((option) => (
110
+ <span key={option.value} className="kol-dd-ghost" aria-hidden="true">
111
+ {option.label}
112
+ </span>
113
+ ))}
114
+ </span>
122
115
  {/* chrome lives in .kol-dd-caret (trailing edge + open-state flip) —
123
116
  * keyed off the trigger's data-state, no inline styles */}
124
- <Icon name="chevron-down" size={ICON_SIZE[resolvedSize]} className="kol-dd-caret" />
117
+ <Icon name="chevron-down" size={indicatorSize(resolvedSize)} className="kol-dd-caret" />
125
118
  </button>
126
119
 
127
120
  <PopoverPanel
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useRef } from 'react'
2
- import Button from './Button.jsx'
2
+ import Button from '../atoms/Button.jsx'
3
3
 
4
4
  /**
5
5
  * FullscreenOverlay — the scrim + centred sheet every overlay in the repo
@@ -1,5 +1,5 @@
1
1
  import Figure from '../atoms/Figure.jsx'
2
- import Image from './Image.jsx'
2
+ import Image from '../atoms/Image.jsx'
3
3
 
4
4
  /**
5
5
  * ImageBlock — a captioned prose image: the DS Figure shell (optional label,
@@ -1,4 +1,4 @@
1
- import FullscreenOverlay from '../atoms/FullscreenOverlay.jsx'
1
+ import FullscreenOverlay from './FullscreenOverlay.jsx'
2
2
 
3
3
  /**
4
4
  * LoaderOverlay — mounts a loading curtain over everything, dead center. A thin
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import Label from '../atoms/Label'
9
9
  import Input from '../atoms/Input.jsx'
10
- import Stepper from '../atoms/Stepper'
10
+ import Stepper from './Stepper'
11
11
 
12
12
  export default function PropertyInput({
13
13
  label,
@@ -1,11 +1,6 @@
1
1
  import { useEffect, useState } from 'react'
2
2
  import { Icon } from '@kolkrabbi/kol-icons'
3
- import ColorSwatch from './ColorSwatch.jsx'
4
-
5
- /* taxonomy-ok: the default composed control nests the same-file SwatchStack
6
- * and EyedropPick (KOL named exports the relative-import check can't see);
7
- * both collapse the source's internal FramedSwatch onto the sibling molecule
8
- * ColorSwatch (a same-tier relative import). */
3
+ import ColorSwatch from '../atoms/ColorSwatch.jsx'
9
4
 
10
5
  /*
11
6
  * SwatchControls — the Photoshop-style top row of the colour panel, in two
@@ -1,6 +1,6 @@
1
1
  import { isValidElement, useCallback, useEffect, useState } from 'react'
2
2
  import useEmblaCarousel from 'embla-carousel-react'
3
- import Image from '../molecules/Image.jsx'
3
+ import Image from '../atoms/Image.jsx'
4
4
  import HlsVideo from '../atoms/HlsVideo.jsx'
5
5
  import OverlayGlassPanel from '../atoms/OverlayGlassPanel.jsx'
6
6
 
@@ -1,4 +1,4 @@
1
- import Image from './Image'
1
+ import Image from '../atoms/Image'
2
2
 
3
3
  /**
4
4
  * FramedMediaBand — full-width media breather band: a centered, aspect-locked
@@ -1,6 +1,6 @@
1
1
  import { isValidElement } from 'react'
2
2
  import HlsVideo from '../atoms/HlsVideo.jsx'
3
- import Image from '../molecules/Image.jsx'
3
+ import Image from '../atoms/Image.jsx'
4
4
 
5
5
  /** Height presets; anything else is passed through as a class string. */
6
6
  const HEIGHTS = {
@@ -1,5 +1,5 @@
1
1
  import { useRef, useState } from 'react'
2
- import Carousel from './Carousel.jsx'
2
+ import Carousel from '../molecules/Carousel.jsx'
3
3
  import MediaViewer from './MediaViewer.jsx'
4
4
 
5
5
  /* Drag-vs-click guard: DS Carousel owns Embla's drag physics but does NOT
@@ -2,7 +2,7 @@ import { createContext, useContext, useEffect, useMemo, useState } from 'react'
2
2
  import { Icon } from '@kolkrabbi/kol-icons'
3
3
  import Button from '../atoms/Button.jsx'
4
4
  import SegmentedToggle from '../atoms/SegmentedToggle.jsx'
5
- import FullscreenOverlay from '../atoms/FullscreenOverlay.jsx'
5
+ import FullscreenOverlay from '../molecules/FullscreenOverlay.jsx'
6
6
  import MediaCard from '../molecules/MediaCard.jsx'
7
7
  import MediaRow from '../molecules/MediaRow.jsx'
8
8
  import ContentFilters from './ContentFilters.jsx'
@@ -1,7 +1,7 @@
1
1
  import { useEffect, useState } from 'react'
2
2
  import useEmblaCarousel from 'embla-carousel-react'
3
3
  import { Icon } from '@kolkrabbi/kol-icons'
4
- import FullscreenOverlay from '../atoms/FullscreenOverlay.jsx'
4
+ import FullscreenOverlay from '../molecules/FullscreenOverlay.jsx'
5
5
 
6
6
  /**
7
7
  * MediaViewer — THE fullscreen paged media viewer. One viewer for every
@@ -2,7 +2,7 @@ import { useMemo, useRef, useState } from 'react'
2
2
  import { createPortal } from 'react-dom'
3
3
  import { Icon } from '@kolkrabbi/kol-icons'
4
4
  import Button from '../atoms/Button'
5
- import SearchInput from '../atoms/SearchInput'
5
+ import SearchInput from '../molecules/SearchInput'
6
6
  import ToggleCheckbox from '../atoms/ToggleCheckbox'
7
7
  import ShellDrawer from '../molecules/ShellDrawer'
8
8
  import Dropdown from '../molecules/Dropdown'
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useId, useRef, useState } from 'react'
2
- import SearchInput from '../atoms/SearchInput.jsx'
2
+ import SearchInput from '../molecules/SearchInput.jsx'
3
3
  import Tag from '../atoms/Tag.jsx'
4
4
 
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useState } from 'react'
2
- import ColorSwatch from '../molecules/ColorSwatch.jsx'
2
+ import ColorSwatch from '../atoms/ColorSwatch.jsx'
3
3
  import { resolveCssVar, resolveCssColor, isLight } from '../hooks/cssVar.js'
4
4
 
5
5
  /**
@@ -1,5 +1,6 @@
1
1
  import { useMemo, useState } from 'react'
2
2
  import { Icon } from '@kolkrabbi/kol-icons'
3
+ import { INDICATOR } from '../hooks/glyphLadders.js'
3
4
 
4
5
  /**
5
6
  * Table — data table.
@@ -79,7 +80,7 @@ const Table = ({ caption, columns, rows, variant = 'default', className = '', wi
79
80
  {column.header}
80
81
  <Icon
81
82
  name={sort.key === column.accessor && sort.dir === 'desc' ? 'chevron-down' : 'chevron-up'}
82
- size={12}
83
+ size={INDICATOR.sm}
83
84
  className={sort.key === column.accessor ? 'opacity-100' : 'opacity-0 group-hover:opacity-40'}
84
85
  />
85
86
  </button>
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes