PageRenderTime 87ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/files/mui/0.1.18/react/mui-react.js

https://gitlab.com/Mirros/jsdelivr
JavaScript | 1257 lines | 828 code | 215 blank | 214 comment | 103 complexity | 4cb10c33c04b73bd26c3132021a9a571 MD5 | raw file
  1. (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
  2. /**
  3. * MUI config module
  4. * @module config
  5. */
  6. /** Define module API */
  7. module.exports = {
  8. /** Use debug mode */
  9. debug: true
  10. };
  11. },{}],2:[function(require,module,exports){
  12. /**
  13. * MUI CSS/JS jqLite module
  14. * @module lib/jqLite
  15. */
  16. 'use strict';
  17. /**
  18. * Add a class to an element.
  19. * @param {Element} element - The DOM element.
  20. * @param {string} cssClasses - Space separated list of class names.
  21. */
  22. function jqLiteAddClass(element, cssClasses) {
  23. if (!cssClasses || !element.setAttribute) return;
  24. var existingClasses = _getExistingClasses(element),
  25. splitClasses = cssClasses.split(' '),
  26. cssClass;
  27. for (var i=0; i < splitClasses.length; i++) {
  28. cssClass = splitClasses[i].trim();
  29. if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {
  30. existingClasses += cssClass + ' ';
  31. }
  32. }
  33. element.setAttribute('class', existingClasses.trim());
  34. }
  35. /**
  36. * Get or set CSS properties.
  37. * @param {Element} element - The DOM element.
  38. * @param {string} [name] - The property name.
  39. * @param {string} [value] - The property value.
  40. */
  41. function jqLiteCss(element, name, value) {
  42. // Return full style object
  43. if (name === undefined) {
  44. return getComputedStyle(element);
  45. }
  46. var nameType = jqLiteType(name);
  47. // Set multiple values
  48. if (nameType === 'object') {
  49. for (var key in name) element.style[_camelCase(key)] = name[key];
  50. return;
  51. }
  52. // Set a single value
  53. if (nameType === 'string' && value !== undefined) {
  54. element.style[_camelCase(name)] = value;
  55. }
  56. var styleObj = getComputedStyle(element),
  57. isArray = (jqLiteType(name) === 'array');
  58. // Read single value
  59. if (!isArray) return _getCurrCssProp(element, name, styleObj);
  60. // Read multiple values
  61. var outObj = {},
  62. key;
  63. for (var i=0; i < name.length; i++) {
  64. key = name[i];
  65. outObj[key] = _getCurrCssProp(element, key, styleObj);
  66. }
  67. return outObj;
  68. }
  69. /**
  70. * Check if element has class.
  71. * @param {Element} element - The DOM element.
  72. * @param {string} cls - The class name string.
  73. */
  74. function jqLiteHasClass(element, cls) {
  75. if (!cls || !element.getAttribute) return false;
  76. return (_getExistingClasses(element).indexOf(' ' + cls + ' ') > -1);
  77. }
  78. /**
  79. * Return the type of a variable.
  80. * @param {} somevar - The JavaScript variable.
  81. */
  82. function jqLiteType(somevar) {
  83. // handle undefined
  84. if (somevar === undefined) return 'undefined';
  85. // handle others (of type [object <Type>])
  86. var typeStr = Object.prototype.toString.call(somevar);
  87. if (typeStr.indexOf('[object ') === 0) {
  88. return typeStr.slice(8, -1).toLowerCase();
  89. } else {
  90. throw "Could not understand type: " + typeStr;
  91. }
  92. }
  93. /**
  94. * Attach an event handler to a DOM element
  95. * @param {Element} element - The DOM element.
  96. * @param {string} type - The event type name.
  97. * @param {Function} callback - The callback function.
  98. * @param {Boolean} useCapture - Use capture flag.
  99. */
  100. function jqLiteOn(element, type, callback, useCapture) {
  101. useCapture = (useCapture === undefined) ? false : useCapture;
  102. // add to DOM
  103. element.addEventListener(type, callback, useCapture);
  104. // add to cache
  105. var cache = element._muiEventCache = element._muiEventCache || {};
  106. cache[type] = cache[type] || [];
  107. cache[type].push([callback, useCapture]);
  108. }
  109. /**
  110. * Remove an event handler from a DOM element
  111. * @param {Element} element - The DOM element.
  112. * @param {string} type - The event type name.
  113. * @param {Function} callback - The callback function.
  114. * @param {Boolean} useCapture - Use capture flag.
  115. */
  116. function jqLiteOff(element, type, callback, useCapture) {
  117. useCapture = (useCapture === undefined) ? false : useCapture;
  118. // remove from cache
  119. var cache = element._muiEventCache = element._muiEventCache || {},
  120. argsList = cache[type] || [],
  121. args,
  122. i;
  123. i = argsList.length;
  124. while (i--) {
  125. args = argsList[i];
  126. // remove all events if callback is undefined
  127. if (callback === undefined ||
  128. (args[0] === callback && args[1] === useCapture)) {
  129. // remove from cache
  130. argsList.splice(i, 1);
  131. // remove from DOM
  132. element.removeEventListener(type, args[0], args[1]);
  133. }
  134. }
  135. }
  136. /**
  137. * Attach an event hander which will only execute once
  138. * @param {Element} element - The DOM element.
  139. * @param {string} type - The event type name.
  140. * @param {Function} callback - The callback function.
  141. * @param {Boolean} useCapture - Use capture flag.
  142. */
  143. function jqLiteOne(element, type, callback, useCapture) {
  144. jqLiteOn(element, type, function onFn(ev) {
  145. // execute callback
  146. if (callback) callback.apply(this, arguments);
  147. // remove wrapper
  148. jqLiteOff(element, type, onFn);
  149. }, useCapture);
  150. }
  151. /**
  152. * Return object representing top/left offset and element height/width.
  153. * @param {Element} element - The DOM element.
  154. */
  155. function jqLiteOffset(element) {
  156. var win = window,
  157. docEl = document.documentElement,
  158. rect = element.getBoundingClientRect(),
  159. viewLeft,
  160. viewTop;
  161. viewLeft = (win.pageXOffset || docEl.scrollLeft) - (docEl.clientLeft || 0);
  162. viewTop = (win.pageYOffset || docEl.scrollTop) - (docEl.clientTop || 0);
  163. return {
  164. top: rect.top + viewTop,
  165. left: rect.left + viewLeft,
  166. height: rect.height,
  167. width: rect.width
  168. };
  169. }
  170. /**
  171. * Attach a callback to the DOM ready event listener
  172. * @param {Function} fn - The callback function.
  173. */
  174. function jqLiteReady(fn) {
  175. var done = false,
  176. top = true,
  177. doc = document,
  178. win = doc.defaultView,
  179. root = doc.documentElement,
  180. add = doc.addEventListener ? 'addEventListener' : 'attachEvent',
  181. rem = doc.addEventListener ? 'removeEventListener' : 'detachEvent',
  182. pre = doc.addEventListener ? '' : 'on';
  183. var init = function(e) {
  184. if (e.type == 'readystatechange' && doc.readyState != 'complete') {
  185. return;
  186. }
  187. (e.type == 'load' ? win : doc)[rem](pre + e.type, init, false);
  188. if (!done && (done = true)) fn.call(win, e.type || e);
  189. };
  190. var poll = function() {
  191. try { root.doScroll('left'); } catch(e) { setTimeout(poll, 50); return; }
  192. init('poll');
  193. };
  194. if (doc.readyState == 'complete') {
  195. fn.call(win, 'lazy');
  196. } else {
  197. if (doc.createEventObject && root.doScroll) {
  198. try { top = !win.frameElement; } catch(e) { }
  199. if (top) poll();
  200. }
  201. doc[add](pre + 'DOMContentLoaded', init, false);
  202. doc[add](pre + 'readystatechange', init, false);
  203. win[add](pre + 'load', init, false);
  204. }
  205. }
  206. /**
  207. * Remove classes from a DOM element
  208. * @param {Element} element - The DOM element.
  209. * @param {string} cssClasses - Space separated list of class names.
  210. */
  211. function jqLiteRemoveClass(element, cssClasses) {
  212. if (!cssClasses || !element.setAttribute) return;
  213. var existingClasses = _getExistingClasses(element),
  214. splitClasses = cssClasses.split(' '),
  215. cssClass;
  216. for (var i=0; i < splitClasses.length; i++) {
  217. cssClass = splitClasses[i].trim();
  218. while (existingClasses.indexOf(' ' + cssClass + ' ') >= 0) {
  219. existingClasses = existingClasses.replace(' ' + cssClass + ' ', ' ');
  220. }
  221. }
  222. element.setAttribute('class', existingClasses.trim());
  223. }
  224. // ------------------------------
  225. // Utilities
  226. // ------------------------------
  227. var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g,
  228. MOZ_HACK_REGEXP = /^moz([A-Z])/,
  229. ESCAPE_REGEXP = /([.*+?^=!:${}()|\[\]\/\\])/g,
  230. BOOLEAN_ATTRS;
  231. BOOLEAN_ATTRS = {
  232. multiple: true,
  233. selected: true,
  234. checked: true,
  235. disabled: true,
  236. readonly: true,
  237. required: true,
  238. open: true
  239. }
  240. function _getExistingClasses(element) {
  241. var classes = (element.getAttribute('class') || '').replace(/[\n\t]/g, '');
  242. return ' ' + classes + ' ';
  243. }
  244. function _camelCase(name) {
  245. return name.
  246. replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {
  247. return offset ? letter.toUpperCase() : letter;
  248. }).
  249. replace(MOZ_HACK_REGEXP, 'Moz$1');
  250. }
  251. function _escapeRegExp(string) {
  252. return string.replace(ESCAPE_REGEXP, "\\$1");
  253. }
  254. function _getCurrCssProp(elem, name, computed) {
  255. var ret;
  256. // try computed style
  257. ret = computed.getPropertyValue(name);
  258. // try style attribute (if element is not attached to document)
  259. if (ret === '' && !elem.ownerDocument) ret = elem.style[_camelCase(name)];
  260. return ret;
  261. }
  262. /**
  263. * Module API
  264. */
  265. module.exports = {
  266. /** Add classes */
  267. addClass: jqLiteAddClass,
  268. /** Get or set CSS properties */
  269. css: jqLiteCss,
  270. /** Check for class */
  271. hasClass: jqLiteHasClass,
  272. /** Remove event handlers */
  273. off: jqLiteOff,
  274. /** Return offset values */
  275. offset: jqLiteOffset,
  276. /** Add event handlers */
  277. on: jqLiteOn,
  278. /** Add an execute-once event handler */
  279. one: jqLiteOne,
  280. /** DOM ready event handler */
  281. ready: jqLiteReady,
  282. /** Remove classes */
  283. removeClass: jqLiteRemoveClass,
  284. /** Check JavaScript variable instance type */
  285. type: jqLiteType
  286. };
  287. },{}],3:[function(require,module,exports){
  288. /**
  289. * MUI CSS/JS utilities module
  290. * @module lib/util
  291. */
  292. 'use strict';
  293. var config = require('../config.js'),
  294. jqLite = require('./jqLite.js'),
  295. win = window,
  296. doc = window.document,
  297. nodeInsertedCallbacks = [],
  298. head,
  299. _supportsPointerEvents;
  300. head = doc.head || doc.getElementsByTagName('head')[0] || doc.documentElement;
  301. /**
  302. * Logging function
  303. */
  304. function logFn() {
  305. if (config.debug && typeof win.console !== "undefined") {
  306. try {
  307. win.console.log.apply(win.console, arguments);
  308. } catch (a) {
  309. var e = Array.prototype.slice.call(arguments);
  310. win.console.log(e.join("\n"));
  311. }
  312. }
  313. }
  314. /**
  315. * Load CSS text in new stylesheet
  316. * @param {string} cssText - The css text.
  317. */
  318. function loadStyleFn(cssText) {
  319. if (doc.createStyleSheet) {
  320. doc.createStyleSheet().cssText = cssText;
  321. } else {
  322. var e = doc.createElement('style');
  323. e.type = 'text/css';
  324. if (e.styleSheet) e.styleSheet.cssText = cssText;
  325. else e.appendChild(doc.createTextNode(cssText));
  326. // add to document
  327. head.insertBefore(e, head.firstChild);
  328. }
  329. }
  330. /**
  331. * Raise an error
  332. * @param {string} msg - The error message.
  333. */
  334. function raiseErrorFn(msg) {
  335. throw "MUI Error: " + msg;
  336. }
  337. /**
  338. * Register callbacks on muiNodeInserted event
  339. * @param {function} callbackFn - The callback function.
  340. */
  341. function onNodeInsertedFn(callbackFn) {
  342. nodeInsertedCallbacks.push(callbackFn);
  343. // initalize listeners
  344. if (nodeInsertedCallbacks._initialized === undefined) {
  345. jqLite.on(doc, 'animationstart', animationHandlerFn);
  346. jqLite.on(doc, 'mozAnimationStart', animationHandlerFn);
  347. jqLite.on(doc, 'webkitAnimationStart', animationHandlerFn);
  348. nodeInsertedCallbacks._initialized = true;
  349. }
  350. }
  351. /**
  352. * Execute muiNodeInserted callbacks
  353. * @param {Event} ev - The DOM event.
  354. */
  355. function animationHandlerFn(ev) {
  356. // check animation name
  357. if (ev.animationName !== 'mui-node-inserted') return;
  358. var el = ev.target;
  359. // iterate through callbacks
  360. for (var i=nodeInsertedCallbacks.length - 1; i >= 0; i--) {
  361. nodeInsertedCallbacks[i](el);
  362. }
  363. }
  364. /**
  365. * Convert Classname object, with class as key and true/false as value, to an
  366. * class string.
  367. * @param {Object} classes The classes
  368. * @return {String} class string
  369. */
  370. function classNamesFn(classes) {
  371. var cs = '';
  372. for (var i in classes) {
  373. cs += (classes[i]) ? i + ' ' : '';
  374. }
  375. return cs.trim();
  376. }
  377. /**
  378. * Check if client supports pointer events.
  379. */
  380. function supportsPointerEventsFn() {
  381. // check cache
  382. if (_supportsPointerEvents !== undefined) return _supportsPointerEvents;
  383. var element = document.createElement('x');
  384. element.style.cssText = 'pointer-events:auto';
  385. _supportsPointerEvents = (element.style.pointerEvents === 'auto');
  386. return _supportsPointerEvents;
  387. }
  388. /**
  389. * Create callback closure.
  390. * @param {Object} instance - The object instance.
  391. * @param {String} funcName - The name of the callback function.
  392. */
  393. function callbackFn(instance, funcName) {
  394. return function() {instance[funcName].apply(instance, arguments);};
  395. }
  396. /**
  397. * Dispatch event.
  398. * @param {Element} element - The DOM element.
  399. * @param {String} eventType - The event type.
  400. * @param {Boolean} bubbles=true - If true, event bubbles.
  401. * @param {Boolean} cancelable=true = If true, event is cancelable
  402. */
  403. function dispatchEventFn(element, eventType, bubbles, cancelable) {
  404. var ev = document.createEvent('HTMLEvents'),
  405. bubbles = (bubbles !== undefined) ? bubbles : true,
  406. cancelable = (cancelable !== undefined) ? cancelable : true;
  407. ev.initEvent(eventType, bubbles, cancelable);
  408. element.dispatchEvent(ev);
  409. }
  410. /**
  411. * Define the module API
  412. */
  413. module.exports = {
  414. /** Create callback closures */
  415. callback: callbackFn,
  416. /** Classnames object to string */
  417. classNames: classNamesFn,
  418. /** Dispatch event */
  419. dispatchEvent: dispatchEventFn,
  420. /** Log messages to the console when debug is turned on */
  421. log: logFn,
  422. /** Load CSS text as new stylesheet */
  423. loadStyle: loadStyleFn,
  424. /** Register muiNodeInserted handler */
  425. onNodeInserted: onNodeInsertedFn,
  426. /** Raise MUI error */
  427. raiseError: raiseErrorFn,
  428. /** Support Pointer Events check */
  429. supportsPointerEvents: supportsPointerEventsFn
  430. };
  431. },{"../config.js":1,"./jqLite.js":2}],4:[function(require,module,exports){
  432. /**
  433. * MUI React buttons module
  434. * @module react/buttons
  435. */
  436. 'use strict';
  437. var buttonClass = 'mui-btn';
  438. var flatClass = buttonClass + '-flat',
  439. raisedClass = buttonClass + '-raised',
  440. largeClass = buttonClass + '-lg',
  441. floatingClass = buttonClass + '-floating';
  442. var Ripple = require('./ripple.jsx');
  443. var util = require('../js/lib/util.js');
  444. var Button = React.createClass({displayName: "Button",
  445. mixins: [Ripple],
  446. getDefaultProps: function() {
  447. return {
  448. type: 'default', // one of default, primary, danger or accent
  449. disabled: false
  450. };
  451. },
  452. render: function() {
  453. var cs = {};
  454. cs[buttonClass] = true;
  455. cs[buttonClass + '-' + this.props.type] = true;
  456. cs[flatClass] = this.props.flat;
  457. cs[raisedClass] = this.props.raised;
  458. cs[largeClass] = this.props.large;
  459. cs = util.classNames(cs);
  460. return (
  461. React.createElement("button", {className: cs, disabled: this.props.disabled, onMouseDown: this.ripple, onTouchStart: this.ripple, onClick: this.props.onClick},
  462. this.props.children,
  463. this.state.ripples && this.renderRipples()
  464. )
  465. );
  466. }
  467. });
  468. var RoundButton = React.createClass({displayName: "RoundButton",
  469. mixins: [Ripple],
  470. getDefaultProps: function() {
  471. return {
  472. floating: true
  473. };
  474. },
  475. render: function() {
  476. var cs = {};
  477. cs[buttonClass] = true;
  478. cs[floatingClass] = true;
  479. cs[floatingClass + '-mini'] = this.props.mini;
  480. cs = util.classNames(cs);
  481. return (
  482. React.createElement("button", {className: cs, disabled: this.props.disabled, onMouseDown: this.ripple, onTouchStart: this.ripple, onClick: this.props.onClick},
  483. this.props.children,
  484. this.state.ripples && this.renderRipples()
  485. )
  486. );
  487. }
  488. })
  489. module.exports = {
  490. Button: Button,
  491. RoundButton: RoundButton
  492. };
  493. },{"../js/lib/util.js":3,"./ripple.jsx":9}],5:[function(require,module,exports){
  494. /**
  495. * MUI React dropdowns module
  496. * @module react/dropdowns
  497. */
  498. /* jshint quotmark:false */
  499. // jscs:disable validateQuoteMarks
  500. 'use strict';
  501. var dropdownClass = 'mui-dropdown',
  502. caretClass = 'mui-caret',
  503. menuClass = 'mui-dropdown-menu',
  504. openClass = 'mui-open',
  505. rightClass = 'mui-dropdown-menu-right';
  506. var util = require('../js/lib/util'),
  507. jqLite = require('../js/lib/jqLite');
  508. var buttons = require('./buttons.jsx');
  509. var Button = buttons.Button;
  510. var RoundButton = buttons.RoundButton;
  511. var Dropdown = React.createClass({displayName: "Dropdown",
  512. menuStyle: { top: 0 },
  513. getInitialState: function() {
  514. return {
  515. opened: false
  516. };
  517. },
  518. componentWillMount: function() {
  519. document.addEventListener('click', this._outsideClick);
  520. },
  521. componentWillUnmount: function() {
  522. document.removeEventListener('click', this._outsideClick);
  523. },
  524. render: function() {
  525. var button;
  526. if (this.props.round) {
  527. button = (
  528. React.createElement(RoundButton, {ref: "button", onClick: this._click, mini: this.props.mini, disabled: this.props.disabled},
  529. this.props.label,
  530. React.createElement("span", {className: caretClass })
  531. )
  532. );
  533. } else {
  534. button = (
  535. React.createElement(Button, {ref: "button", onClick: this._click, type: this.props.type, flat: this.props.flat, raised: this.props.raised, large: this.props.large, disabled: this.props.disabled},
  536. this.props.label,
  537. React.createElement("span", {className: caretClass })
  538. )
  539. );
  540. }
  541. var cs = {};
  542. cs[menuClass] = true;
  543. cs[openClass] = this.state.opened;
  544. cs[rightClass] = this.props.right;
  545. cs = util.classNames(cs);
  546. return (
  547. React.createElement("div", {className: dropdownClass, style: {padding: '0px 2px 0px'} },
  548. button,
  549. this.state.opened && (
  550. React.createElement("ul", {className: cs, style: this.menuStyle, ref: "menu", onClick: this._select},
  551. this.props.children
  552. ))
  553. )
  554. );
  555. },
  556. _click: function (ev) {
  557. // only left clicks
  558. if (ev.button !== 0) return;
  559. // exit if toggle button is disabled
  560. if (this.props.disabled) return;
  561. setTimeout(function () {
  562. if (!ev.defaultPrevented) this._toggle();
  563. }.bind(this), 0);
  564. },
  565. _toggle: function () {
  566. // exit if no menu element
  567. if (!this.props.children) {
  568. return util.raiseError('Dropdown menu element not found');
  569. }
  570. if (this.state.opened) this._close();
  571. else this._open();
  572. },
  573. _open: function () {
  574. // position menu element below toggle button
  575. var wrapperRect = React.findDOMNode(this).getBoundingClientRect(),
  576. toggleRect = React.findDOMNode(this.refs.button).getBoundingClientRect();
  577. this.menuStyle.top = toggleRect.top - wrapperRect.top + toggleRect.height;
  578. this.setState({
  579. opened: true
  580. });
  581. },
  582. _close: function () {
  583. this.setState({
  584. opened: false
  585. });
  586. },
  587. _select: function (ev) {
  588. if (this.props.onClick) this.props.onClick(this, ev);
  589. },
  590. _outsideClick: function (ev) {
  591. var isClickInside = React.findDOMNode(this).contains(event.target);
  592. if (!isClickInside) {
  593. this._close();
  594. }
  595. }
  596. });
  597. var DropdownItem = React.createClass({displayName: "DropdownItem",
  598. render: function () {
  599. return (
  600. React.createElement("li", null,
  601. React.createElement("a", {href: this.props.link || '#', onClick: this._click},
  602. this.props.children
  603. )
  604. )
  605. );
  606. },
  607. _click: function (ev) {
  608. if (this.props.onClick) this.props.onClick(this, ev);
  609. }
  610. });
  611. module.exports = {
  612. Dropdown: Dropdown,
  613. DropdownItem: DropdownItem
  614. };
  615. },{"../js/lib/jqLite":2,"../js/lib/util":3,"./buttons.jsx":4}],6:[function(require,module,exports){
  616. /**
  617. * MUI React main module
  618. * @module react/main
  619. */
  620. (function(win) {
  621. // return if library has been loaded already
  622. if (win._muiReactLoaded) return;
  623. else win._muiReactLoaded = true;
  624. // load dependencies
  625. var layout = require('./layout.jsx'),
  626. forms = require('./forms.jsx'),
  627. buttons = require('./buttons.jsx'),
  628. dropdowns = require('./dropdowns.jsx'),
  629. tabs = require('./tabs.jsx'),
  630. doc = win.document;
  631. // export React classes
  632. win.MUIContainer = layout.Container;
  633. win.MUIFluidContainer = layout.FluidContainer;
  634. win.MUIPanel = layout.Panel;
  635. win.MUIFormControl = forms.FormControl;
  636. win.MUIFormGroup = forms.FormGroup;
  637. win.MUIButton = buttons.Button;
  638. win.MUIRoundButton = buttons.RoundButton;
  639. win.MUIDropdown = dropdowns.Dropdown;
  640. win.MUIDropdownItem = dropdowns.DropdownItem;
  641. win.MUITabs = tabs.Tabs;
  642. win.MUITabItem = tabs.TabItem;
  643. })(window);
  644. },{"./buttons.jsx":4,"./dropdowns.jsx":5,"./forms.jsx":7,"./layout.jsx":8,"./tabs.jsx":10}],7:[function(require,module,exports){
  645. /**
  646. * MUI React forms module
  647. * @module react/forms
  648. */
  649. 'use strict';
  650. var formControlClass = 'mui-form-control',
  651. formGroupClass = 'mui-form-group',
  652. floatingLabelBaseClass = 'mui-form-floating-label',
  653. floatingLabelActiveClass = floatingLabelBaseClass + '-active';
  654. var util = require('../js/lib/util.js');
  655. /**
  656. * Constructs a FormControl element.
  657. * @class
  658. */
  659. var FormControl = React.createClass({displayName: "FormControl",
  660. render: function() {
  661. return (
  662. React.createElement("input", {
  663. type: this.props.type || 'text',
  664. className: formControlClass,
  665. value: this.props.value,
  666. autoFocus: this.props.autofocus,
  667. onInput: this.props.onInput}
  668. )
  669. );
  670. }
  671. });
  672. var FormLabel = React.createClass({displayName: "FormLabel",
  673. getInitialState: function() {
  674. return {
  675. style: {}
  676. };
  677. },
  678. componentDidMount: function() {
  679. setTimeout(function() {
  680. var s = '.15s ease-out';
  681. var style = {
  682. transition: s,
  683. WebkitTransition: s,
  684. MozTransition: s,
  685. OTransition: s,
  686. msTransform: s
  687. }
  688. this.setState({
  689. style: style
  690. });
  691. }.bind(this), 150);
  692. },
  693. render: function() {
  694. var labelText = this.props.text;
  695. if (labelText) {
  696. var labelClass = {};
  697. labelClass[floatingLabelBaseClass] = this.props.floating;
  698. labelClass[floatingLabelActiveClass] = this.props.active;
  699. labelClass = util.classNames(labelClass);
  700. }
  701. return (
  702. React.createElement("label", {className: labelClass, style: this.state.style, onClick: this.props.onClick},
  703. labelText
  704. )
  705. );
  706. }
  707. });
  708. /**
  709. * Constructs a FormGroup element.
  710. * @class
  711. */
  712. var FormGroup = React.createClass({displayName: "FormGroup",
  713. getInitialState: function() {
  714. return {
  715. hasInput: false
  716. };
  717. },
  718. componentDidMount: function() {
  719. if (this.props.value) {
  720. this.setState({
  721. hasInput: true
  722. });
  723. }
  724. },
  725. render: function() {
  726. var labelText = this.props.label;
  727. return (
  728. React.createElement("div", {className: formGroupClass },
  729. React.createElement(FormControl, {
  730. type: this.props.type,
  731. value: this.props.value,
  732. autoFocus: this.props.autofocus,
  733. onInput: this._input}
  734. ),
  735. labelText && React.createElement(FormLabel, {text: labelText, onClick: this._focus, active: this.state.hasInput, floating: this.props.isLabelFloating})
  736. )
  737. );
  738. },
  739. _focus: function (e) {
  740. // pointer-events shim
  741. if (util.supportsPointerEvents() === false) {
  742. var labelEl = e.target;
  743. labelEl.style.cursor = 'text';
  744. if (!this.state.hasInput) {
  745. var inputEl = React.findDOMNode(this.refs.input);
  746. inputEl.focus();
  747. }
  748. }
  749. },
  750. _input: function (e) {
  751. if (e.target.value) {
  752. this.setState({
  753. hasInput: true
  754. });
  755. } else {
  756. this.setState({
  757. hasInput: false
  758. });
  759. }
  760. if (this.props.onClick) {
  761. this.props.onClick(e);
  762. }
  763. }
  764. });
  765. /** Define module API */
  766. module.exports = {
  767. /** FormControl constructor */
  768. FormControl: FormControl,
  769. /** FormGroup constructor */
  770. FormGroup: FormGroup
  771. };
  772. },{"../js/lib/util.js":3}],8:[function(require,module,exports){
  773. /**
  774. * MUI React layout module
  775. * @module react/layout
  776. */
  777. 'use strict';
  778. var containerClass = 'mui-container',
  779. fluidClass = 'mui-container-fluid',
  780. panelClass = 'mui-panel';
  781. var Container = React.createClass({displayName: "Container",
  782. render: function() {
  783. return (
  784. React.createElement("div", {className: containerClass },
  785. this.props.children
  786. )
  787. );
  788. }
  789. });
  790. var FluidContainer = React.createClass({displayName: "FluidContainer",
  791. render: function() {
  792. return (
  793. React.createElement("div", {className: fluidClass },
  794. this.props.children
  795. )
  796. );
  797. }
  798. });
  799. var Panel = React.createClass({displayName: "Panel",
  800. render: function() {
  801. return (
  802. React.createElement("div", {className: panelClass },
  803. this.props.children
  804. )
  805. );
  806. }
  807. });
  808. module.exports = {
  809. Container: Container,
  810. FluidContainer: FluidContainer,
  811. Panel: Panel
  812. };
  813. },{}],9:[function(require,module,exports){
  814. /**
  815. * MUI React ripple module
  816. * @module react/ripple
  817. */
  818. 'use strict';
  819. var rippleClass = 'mui-ripple-effect';
  820. var jqLite = require('../js/lib/jqLite.js');
  821. var Ripple = {
  822. getInitialState: function() {
  823. return {
  824. touchFlag: false,
  825. ripples: []
  826. };
  827. },
  828. getDefaultProps: function() {
  829. return {
  830. rippleClass: rippleClass
  831. };
  832. },
  833. ripple: function (ev) {
  834. // only left clicks
  835. if (ev.button !== 0) return;
  836. var buttonEl = React.findDOMNode(this);
  837. // exit if button is disabled
  838. if (this.props.disabled === true) return;
  839. // de-dupe touchstart and mousedown with 100msec flag
  840. if (this.state.touchFlag === true) {
  841. return;
  842. } else {
  843. this.setState({ touchFlag: true });
  844. setTimeout(function() {
  845. this.setState({ touchFlag: false });
  846. }.bind(this), 100);
  847. }
  848. var offset = jqLite.offset(buttonEl),
  849. xPos = ev.pageX - offset.left,
  850. yPos = ev.pageY - offset.top,
  851. diameter,
  852. radius;
  853. // get height
  854. if (this.props.floating) {
  855. diameter = offset.height / 2;
  856. } else {
  857. diameter = offset.height;
  858. }
  859. radius = diameter / 2;
  860. var style = {
  861. height: diameter,
  862. width: diameter,
  863. top: yPos - radius,
  864. left: xPos - radius
  865. };
  866. var ripples = this.state.ripples || [];
  867. window.setTimeout(function() {
  868. this._removeRipple();
  869. }.bind(this), 2000);
  870. ripples.push({ style: style });
  871. this.setState({
  872. ripples: ripples
  873. });
  874. },
  875. _removeRipple: function () {
  876. this.state.ripples.shift();
  877. this.setState({
  878. ripples: this.state.ripples
  879. });
  880. },
  881. renderRipples: function () {
  882. if (this.state.ripples.length === 0) return;
  883. var i = 0;
  884. return this.state.ripples.map(function (ripple) {
  885. i++;
  886. return (React.createElement("div", {className: this.props.rippleClass, key: i, style: ripple.style}));
  887. }.bind(this));
  888. }
  889. };
  890. module.exports = Ripple;
  891. },{"../js/lib/jqLite.js":2}],10:[function(require,module,exports){
  892. /**
  893. * MUI React tabs module
  894. * @module react/tabs
  895. */
  896. /* jshint quotmark:false */
  897. // jscs:disable validateQuoteMarks
  898. 'use strict';
  899. var tabClass = 'mui-tabs',
  900. contentClass = 'mui-tab-content',
  901. paneClass = 'mui-tab-pane',
  902. justifiedClass = 'mui-tabs-justified',
  903. activeClass = 'mui-active';
  904. var util = require('../js/lib/util.js');
  905. var Tabs = React.createClass({displayName: "Tabs",
  906. getDefaultProps: function() {
  907. return {
  908. justified: false
  909. };
  910. },
  911. getInitialState: function() {
  912. return {
  913. activeTab: ""
  914. };
  915. },
  916. componentDidMount: function() {
  917. if (this.props.activeTab) {
  918. this.setState({
  919. activeTab: this.props.activeTab
  920. });
  921. } else {
  922. this.setState({
  923. activeTab: this.props.children && this.props.children[0].props.id
  924. });
  925. }
  926. },
  927. render: function() {
  928. var items = this.props.children.map(function (item) {
  929. return { name: item.props.id, label: item.props.label, pane: item.props.children }
  930. });
  931. return (
  932. React.createElement("div", {className: "tabs"},
  933. React.createElement(TabHeaders, {items: items, justified: this.props.justified, active: this.state.activeTab, onClick: this._changeTab}),
  934. React.createElement(TabContainers, {items: items, active: this.state.activeTab})
  935. )
  936. );
  937. },
  938. _changeTab: function (toWhich, e) {
  939. // only left clicks
  940. if (e.button !== 0) return;
  941. if (e.target.getAttribute('disabled') !== null) return;
  942. setTimeout(function () {
  943. if (!e.defaultPrevented) {
  944. this.setState({
  945. activeTab: toWhich
  946. });
  947. }
  948. }.bind(this), 0);
  949. }
  950. });
  951. var TabHeaders = React.createClass({displayName: "TabHeaders",
  952. getDefaultProps: function() {
  953. return {
  954. items: []
  955. };
  956. },
  957. render: function() {
  958. var classes = {};
  959. classes[tabClass] = true;
  960. classes[justifiedClass] = this.props.justified;
  961. classes = util.classNames(classes);
  962. var items = this.props.items.map(function (item) {
  963. return (
  964. React.createElement(TabHeaderItem, {key: item.name,
  965. name: item.name,
  966. label: item.label,
  967. active: item.name === this.props.active,
  968. onClick: this.props.onClick})
  969. );
  970. }.bind(this));
  971. return (
  972. React.createElement("ul", {className: classes },
  973. items
  974. )
  975. );
  976. }
  977. });
  978. var TabHeaderItem = React.createClass({displayName: "TabHeaderItem",
  979. render: function () {
  980. var classes = {};
  981. classes[activeClass] = this.props.active;
  982. classes = util.classNames(classes);
  983. return (
  984. React.createElement("li", {className: classes },
  985. React.createElement("a", {onClick: this._click},
  986. this.props.label
  987. )
  988. )
  989. );
  990. },
  991. _click: function (e) {
  992. if (this.props.onClick) {
  993. this.props.onClick(this.props.name, e);
  994. }
  995. }
  996. });
  997. var TabContainers = React.createClass({displayName: "TabContainers",
  998. getDefaultProps: function() {
  999. return {
  1000. items: []
  1001. };
  1002. },
  1003. render: function() {
  1004. var items = this.props.items.map(function (item) {
  1005. return (
  1006. React.createElement(TabPane, {key: item.name,
  1007. active: item.name === this.props.active},
  1008. item.pane
  1009. )
  1010. );
  1011. }.bind(this));
  1012. return (
  1013. React.createElement("div", {className: contentClass },
  1014. items
  1015. )
  1016. );
  1017. }
  1018. });
  1019. var TabPane = React.createClass({displayName: "TabPane",
  1020. render: function () {
  1021. var classes = {};
  1022. classes[paneClass] = true;
  1023. classes[activeClass] = this.props.active;
  1024. classes = util.classNames(classes);
  1025. return (
  1026. React.createElement("div", {className: classes },
  1027. this.props.children
  1028. )
  1029. );
  1030. }
  1031. });
  1032. // Just a container to hold data
  1033. var TabItem = React.createClass({displayName: "TabItem",
  1034. render: function() {
  1035. return null;
  1036. }
  1037. });
  1038. module.exports = {
  1039. Tabs: Tabs,
  1040. TabItem: TabItem
  1041. };
  1042. },{"../js/lib/util.js":3}]},{},[6])