or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

built-in-modifiers.mdcore-positioning.mdindex.mdvariants-tree-shaking.mdvirtual-elements.md

variants-tree-shaking.mddocs/

0

# Variants and Tree-shaking

1

2

Three different builds for various bundle size requirements and tree-shaking optimization, allowing developers to import only the functionality they need.

3

4

## Capabilities

5

6

### Full Version (createPopper)

7

8

The complete version with all built-in modifiers included by default.

9

10

```javascript { .api }

11

/**

12

* Full-featured createPopper with all modifiers enabled by default

13

* Includes: eventListeners, popperOffsets, computeStyles, applyStyles,

14

* offset, flip, preventOverflow, arrow, hide

15

*/

16

function createPopper(

17

reference: Element | VirtualElement,

18

popper: HTMLElement,

19

options?: Partial<Options>

20

): Instance;

21

```

22

23

**Usage Examples:**

24

25

```javascript

26

import { createPopper } from '@popperjs/core';

27

28

// All modifiers available by default

29

const popper = createPopper(button, tooltip, {

30

placement: 'top',

31

// flip, preventOverflow, etc. work automatically

32

});

33

34

// Bundle size: ~5 kB minzipped

35

```

36

37

### Lite Version (createPopperLite)

38

39

Lightweight version with only essential modifiers for basic positioning.

40

41

```javascript { .api }

42

/**

43

* Lightweight createPopper with minimal modifiers

44

* Includes only: eventListeners, popperOffsets, computeStyles, applyStyles

45

* Missing: offset, flip, preventOverflow, arrow, hide

46

*/

47

function createPopperLite(

48

reference: Element | VirtualElement,

49

popper: HTMLElement,

50

options?: Partial<Options>

51

): Instance;

52

```

53

54

**Usage Examples:**

55

56

```javascript

57

import { createPopperLite } from '@popperjs/core';

58

59

// Basic positioning only

60

const popper = createPopperLite(button, tooltip, {

61

placement: 'bottom',

62

});

63

64

// Add specific modifiers as needed

65

import { createPopperLite, preventOverflow, flip } from '@popperjs/core';

66

67

const popper = createPopperLite(button, tooltip, {

68

placement: 'top',

69

modifiers: [preventOverflow, flip],

70

});

71

72

// Smaller bundle size than full version

73

```

74

75

### Base Version (createPopperBase)

76

77

Minimal version with no default modifiers - all functionality must be explicitly imported.

78

79

```javascript { .api }

80

/**

81

* Base createPopper with no default modifiers

82

* Requires all modifiers to be explicitly provided

83

*/

84

function createPopperBase(

85

reference: Element | VirtualElement,

86

popper: HTMLElement,

87

options?: Partial<Options>

88

): Instance;

89

```

90

91

**Usage Examples:**

92

93

```javascript

94

import {

95

createPopperBase,

96

popperOffsets,

97

computeStyles,

98

applyStyles,

99

eventListeners

100

} from '@popperjs/core';

101

102

// Must provide all required modifiers

103

const popper = createPopperBase(button, tooltip, {

104

placement: 'top',

105

modifiers: [

106

eventListeners,

107

popperOffsets,

108

computeStyles,

109

applyStyles,

110

],

111

});

112

113

// Smallest possible bundle - only what you use

114

```

115

116

### popperGenerator Factory

117

118

Factory function for creating custom createPopper functions with predefined defaults.

119

120

```javascript { .api }

121

/**

122

* Creates a custom createPopper function with predefined modifiers and options

123

* @param generatorOptions - Default modifiers and options configuration

124

* @returns Custom createPopper function

125

*/

126

function popperGenerator(generatorOptions?: PopperGeneratorArgs): typeof createPopper;

127

128

interface PopperGeneratorArgs {

129

/** Default modifiers to include */

130

defaultModifiers?: Array<Modifier<any, any>>;

131

/** Default options to apply */

132

defaultOptions?: Partial<Options>;

133

}

134

```

135

136

**Usage Examples:**

137

138

```javascript

139

import {

140

popperGenerator,

141

popperOffsets,

142

computeStyles,

143

applyStyles,

144

eventListeners,

145

flip,

146

preventOverflow

147

} from '@popperjs/core';

148

149

// Create custom build with specific modifiers

150

const createCustomPopper = popperGenerator({

151

defaultModifiers: [

152

eventListeners,

153

popperOffsets,

154

computeStyles,

155

applyStyles,

156

flip,

157

preventOverflow,

158

],

159

defaultOptions: {

160

placement: 'auto',

161

strategy: 'absolute',

162

},

163

});

164

165

// Use like standard createPopper

166

const popper = createCustomPopper(button, tooltip, {

167

// placement: 'auto' is default from generator

168

modifiers: [

169

{ name: 'flip', options: { boundary: 'viewport' } },

170

],

171

});

172

```

173

174

### Tree-shaking Optimization

175

176

Import only the modifiers and utilities you need for optimal bundle size.

177

178

```javascript { .api }

179

// Individual modifier imports for tree-shaking

180

import {

181

createPopperLite,

182

flip,

183

preventOverflow,

184

offset,

185

arrow,

186

hide

187

} from '@popperjs/core';

188

189

// Utility function imports

190

import {

191

detectOverflow,

192

popperGenerator

193

} from '@popperjs/core';

194

```

195

196

**Usage Examples:**

197

198

```javascript

199

// Minimal import for basic tooltip

200

import { createPopperLite } from '@popperjs/core';

201

202

const basicPopper = createPopperLite(button, tooltip, {

203

placement: 'top',

204

});

205

206

// Progressive enhancement - add features as needed

207

import { createPopperLite, flip, preventOverflow } from '@popperjs/core';

208

209

const enhancedPopper = createPopperLite(button, tooltip, {

210

placement: 'top',

211

modifiers: [flip, preventOverflow],

212

});

213

214

// Advanced usage with custom modifiers

215

import {

216

createPopperBase,

217

popperOffsets,

218

computeStyles,

219

applyStyles,

220

eventListeners,

221

flip,

222

offset,

223

detectOverflow

224

} from '@popperjs/core';

225

226

const customModifier = {

227

name: 'customFlip',

228

enabled: true,

229

phase: 'main',

230

requires: ['popperOffsets'],

231

fn({ state }) {

232

const overflow = detectOverflow(state);

233

if (overflow.top > 0) {

234

state.placement = 'bottom';

235

}

236

},

237

};

238

239

const advancedPopper = createPopperBase(button, tooltip, {

240

modifiers: [

241

eventListeners,

242

popperOffsets,

243

computeStyles,

244

applyStyles,

245

offset,

246

customModifier,

247

],

248

});

249

```

250

251

### Bundle Size Comparison

252

253

Approximate minzipped sizes for different configurations:

254

255

```javascript

256

// Full version (~5 kB)

257

import { createPopper } from '@popperjs/core';

258

259

// Lite version (~3.5 kB)

260

import { createPopperLite } from '@popperjs/core';

261

262

// Base version with minimal modifiers (~2.5 kB)

263

import {

264

createPopperBase,

265

popperOffsets,

266

computeStyles,

267

applyStyles

268

} from '@popperjs/core';

269

270

// Custom build with specific features (~3-4 kB)

271

import {

272

createPopperLite,

273

flip,

274

preventOverflow,

275

offset

276

} from '@popperjs/core';

277

```

278

279

### Import Patterns

280

281

Different ways to import and use Popper variants.

282

283

```javascript { .api }

284

// ESM imports (recommended)

285

import { createPopper, createPopperLite, createPopperBase } from '@popperjs/core';

286

287

// CommonJS

288

const { createPopper, createPopperLite, createPopperBase } = require('@popperjs/core');

289

290

// UMD (browser globals)

291

// Available as: Popper.createPopper, Popper.createPopperLite, etc.

292

```

293

294

**Usage Examples:**

295

296

```javascript

297

// ESM with tree-shaking

298

import { createPopperLite, flip, preventOverflow } from '@popperjs/core';

299

300

// CommonJS fallback

301

const Popper = require('@popperjs/core');

302

const { createPopperLite, flip, preventOverflow } = Popper;

303

304

// Browser with CDN

305

// <script src="https://unpkg.com/@popperjs/core@2"></script>

306

const popper = Popper.createPopper(button, tooltip);

307

308

// Dynamic imports for code splitting

309

async function createTooltip() {

310

const { createPopperLite, flip } = await import('@popperjs/core');

311

return createPopperLite(button, tooltip, {

312

modifiers: [flip],

313

});

314

}

315

```

316

317

### Version Selection Guide

318

319

Choose the right version based on your requirements:

320

321

```javascript

322

// Use createPopper (full) when:

323

// - You need most positioning features

324

// - Bundle size is not a primary concern

325

// - You want the "just works" experience

326

327

// Use createPopperLite when:

328

// - You need basic positioning with some advanced features

329

// - Bundle size matters but you still want tree-shaking

330

// - You'll add specific modifiers as needed

331

332

// Use createPopperBase when:

333

// - Bundle size is critical

334

// - You need only specific functionality

335

// - You're building a custom solution

336

// - You want maximum control over included features

337

338

// Use popperGenerator when:

339

// - You're building a library or framework

340

// - You need consistent defaults across multiple poppers

341

// - You want to encapsulate configuration

342

```